btm_ble.c revision 5738f83aeb59361a0a2eda2460113f6dc919427
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains functions for BLE device control utilities, and LE
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  security functions.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_ble_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "smp_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN AES_CMAC ( BT_OCTET16 key, UINT8 *input, UINT16 length, UINT16 tlen, UINT8 *p_signature);
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable);
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN smp_proc_ltk_request(BD_ADDR bda);
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_active_bgconn_scan_params(void);
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* External Function to be called by other modules                             */
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************/
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecAddBleDevice
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Add/modify device.  This function will be normally called
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  during host startup to restore all required information
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  for a LE device stored in the NVRAM.
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr          - BD address of the peer
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_name          - Name of the peer device.  NULL if unknown.
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dev_type         - Remote device's device type.
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  addr_type        - LE device address type.
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddBleDevice (BD_ADDR bd_addr, BD_NAME bd_name, tBT_DEVICE_TYPE dev_type,
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             tBLE_ADDR_TYPE addr_type)
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               i = 0;
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO      *p_info=NULL;
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("BTM_SecAddBleDevice dev_type=0x%x", dev_type);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("Add a new device");
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no device record, allocate one.
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * If we can not find an empty spot for this one, let it fail. */
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++)
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE))
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1 ("allocate a new dev rec idx=0x%x ", i );
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec = &btm_cb.sec_dev_rec[i];
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Mark this record as in use and initialize */
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC));
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags = BTM_SEC_IN_USE;
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update conn params, use default value for background connection params */
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->conn_params.min_conn_int     =
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->conn_params.max_conn_int     =
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->conn_params.supervision_tout =
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->conn_params.slave_latency    = BTM_BLE_CONN_PARAM_UNDEF;
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1 ("hci_handl=0x%x ",  p_dev_rec->hci_handle );
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(FALSE);
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("Device already exist");
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME));
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bd_name && bd_name[0])
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name),
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN);
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->device_type = dev_type;
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->ble.ble_addr_type = addr_type;
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG3 ("p_dev_rec->device_type =0x%x  addr_type=0x%x sec_flags=0x%x",
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      dev_type,  addr_type, p_dev_rec->sec_flags);
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sync up with the Inq Data base*/
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_info = BTM_InqDbRead(bd_addr);
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_info)
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type ;
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_info->results.device_type = p_dev_rec->device_type;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG2 ("InqDb  device_type =0x%x  addr_type=0x%x",
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_info->results.device_type, p_info->results.ble_addr_type);
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecAddBleKey
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Add/modify LE device information.  This function will be
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  normally called during host startup to restore all required
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  information stored in the NVRAM.
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr          - BD address of the peer
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_le_key         - LE key values.
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  key_type         - LE SMP key type.
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if added OK, else FALSE
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddBleKey (BD_ADDR bd_addr, tBTM_LE_KEY_VALUE *p_le_key, tBTM_LE_KEY_TYPE key_type)
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_SecAddBleKey");
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec || !p_le_key ||
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID &&
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC))
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_WARNING3 ("BTM_SecAddLeKey()  No BT Link Key, Wrong Type, or No Device record \
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        for bdaddr: %08x%04x, Type: %d",
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            (bd_addr[4]<<8)+bd_addr[5], key_type);
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG3 ("BTM_SecAddLeKey()  BDA: %08x%04x, Type: 0x%02x",
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (bd_addr[4]<<8)+bd_addr[5], key_type);
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type == BTM_LE_KEY_PENC || key_type == BTM_LE_KEY_PID ||
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        key_type == BTM_LE_KEY_PCSRK || key_type == BTM_LE_KEY_LENC ||
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        key_type == BTM_LE_KEY_LCSRK)
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_save_le_key (bd_addr, key_type, p_le_key, FALSE);
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleLoadLocalKeys
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Local local identity key, encryption root or sign counter.
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      key_type: type of key, can be BTM_BLE_KEY_TYPE_ID, BTM_BLE_KEY_TYPE_ER
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            or BTM_BLE_KEY_TYPE_COUNTER.
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_key: pointer to the key.
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          non2.
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleLoadLocalKeys(UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_DEVCB *p_devcb = &btm_cb.devcb;
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_BleLoadLocalKeys");
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_key != NULL)
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (key_type)
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_KEY_TYPE_ID:
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&p_devcb->id_keys, &p_key->id_keys, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_KEY_TYPE_ER:
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_devcb->er, p_key->er, sizeof(BT_OCTET16));
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_ERROR1("unknow local key type: %d", key_type);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetDeviceEncRoot
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local device encryption
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  root.
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the local device ER is copied into er
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_GetDeviceEncRoot (BT_OCTET16 er)
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_GetDeviceEncRoot");
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (er, btm_cb.devcb.er, BT_OCTET16_LEN);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetDeviceIDRoot
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local device identity
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  root.
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the local device IR is copied into irk
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_GetDeviceIDRoot (BT_OCTET16 irk)
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_GetDeviceIDRoot ");
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN);
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetDeviceDHK
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local device DHK.
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the local device DHK is copied into dhk
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_GetDeviceDHK (BT_OCTET16 dhk)
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_GetDeviceDHK");
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN);
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadConnectionAddr
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the local device random address
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  .
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ReadConnectionAddr (BD_ADDR conn_addr)
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_ReadConnectionAddr");
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.inq_var.own_addr_type == BLE_ADDR_PUBLIC)
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_GetLocalDeviceAddr(conn_addr);
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (conn_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecurityGrant
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to grant security process.
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       bd_addr - peer device bd address.
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res     - result of the operation BTM_SUCCESS if success.
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            Otherwise, BTM_REPEATED_ATTEMPTS is too many attempts.
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SecurityGrant(BD_ADDR bd_addr, UINT8 res)
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_SecurityGrant");
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SMP_SecurityGrant(bd_addr, res_smp);
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BlePasskeyReply
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after Security Manager submitted
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey request to the application.
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device for which passkey was requested
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res          - result of the operation BTM_SUCCESS if success
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  key_len      - length in bytes of the Passkey
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_passkey        - pointer to array with the passkey
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BlePasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey)
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_STATUS      res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags   |= BTM_SEC_LINK_KEY_AUTHED;
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_BlePasskeyReply");
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SMP_PasskeyReply(bd_addr, res_smp, passkey);
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleOobDataReply
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the OOB data for
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  SMP in response to BTM_LE_OOB_REQ_EVT
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr     - Address of the peer device
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res         - result of the operation SMP_SUCCESS if success
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_data      - simple pairing Randomizer  C.
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleOobDataReply(BD_ADDR bd_addr, UINT8 res, UINT8 len, UINT8 *p_data)
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_BleOobDataReply");
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SMP_OobDataReply(bd_addr, res_smp, len, p_data);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetConnScanParams
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set scan parameter used in BLE connection request
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      scan_interval: scan interval
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  scan_window: scan window
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleSetConnScanParams (UINT16 scan_interval, UINT16 scan_window)
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     new_param = FALSE;
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX))
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer(&p_ble_cb->scan_param_idle_timer);
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ble_cb->scan_int != scan_interval)
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ble_cb->scan_int = scan_interval;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            new_param = TRUE;
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ble_cb->scan_win != scan_window)
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ble_cb->scan_win = scan_window;
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            new_param = TRUE;
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (new_param)
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_update_active_bgconn_scan_params();
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("Illegal Connection Scan Parameters");
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetPrefConnParams
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set a peripheral's preferred connection parameters
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr          - BD address of the peripheral
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  scan_interval: scan interval
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  scan_window: scan window
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  min_conn_int     - minimum preferred connection interval
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_conn_int     - maximum preferred connection interval
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  slave_latency    - preferred slave latency
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  supervision_tout - preferred supervision timeout
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleSetPrefConnParams (BD_ADDR bd_addr,
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT16 min_conn_int, UINT16 max_conn_int,
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT16 slave_latency, UINT16 supervision_tout)
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_API4 ("BTM_BleSetPrefConnParams min: %u  max: %u  latency: %u  \
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    tout: %u",
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    min_conn_int, max_conn_int, slave_latency, supervision_tout);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_BLE_VALID_PRAM(min_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) &&
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_BLE_VALID_PRAM(max_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) &&
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_BLE_VALID_PRAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, BTM_BLE_CONN_SUP_TOUT_MAX) &&
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        slave_latency <= BTM_BLE_CONN_LATENCY_MAX)
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec)
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* expect conn int and stout and slave latency to be updated all together */
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF || max_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.min_conn_int = min_conn_int;
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.min_conn_int = max_conn_int;
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.max_conn_int = max_conn_int;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.max_conn_int = min_conn_int;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF)
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.slave_latency = slave_latency;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF;
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF)
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.supervision_tout = supervision_tout;
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_TIMEOUT_DEF;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_ERROR0("Unknown Device, setting rejected");
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("Illegal Connection Parameters");
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadDevInfo
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the device/address type
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  of BD address.
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        remote_bda: remote device address
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dev_type: output parameter to read the device type.
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_addr_type: output parameter to read the address type.
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ReadDevInfo (BD_ADDR remote_bda, tBT_DEVICE_TYPE *p_dev_type, tBLE_ADDR_TYPE *p_addr_type)
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (remote_bda);
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO     *p_inq_info = BTM_InqDbRead(remote_bda);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_dev_type = BT_DEVICE_TYPE_BREDR;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_addr_type = BLE_ADDR_PUBLIC;
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check with the BT manager if details about remote device are known */
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq_info != NULL)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_dev_type = p_inq_info->results.device_type ;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_addr_type = p_inq_info->results.ble_addr_type;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* unknown device, assume BR/EDR */
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* there is a security device record exisitng */
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* new inquiry result, overwrite device type in security device record */
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq_info)
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->device_type          = p_inq_info->results.device_type;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->ble.ble_addr_type    = p_inq_info->results.ble_addr_type;
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_dev_type = p_dev_rec->device_type;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_addr_type = p_dev_rec->ble.ble_addr_type;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG2 ("btm_find_dev_type - device_type = %d addr_type = %d", *p_dev_type , *p_addr_type);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Internal Functions
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_update_active_bgconn_scan_params
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to update the scan parameter if background
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection has been active.
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_active_bgconn_scan_params(void)
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_SEL_CBACK   *p_select_cback;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if active , cancel and restart and apply the params */
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->bg_conn_state == BLE_BG_CONN_ACTIVE)
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO)
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_ble_start_auto_conn(FALSE))
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_start_auto_conn(TRUE);
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE)
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_select_cback = p_cb->p_select_cback;
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_ble_start_select_conn(FALSE, NULL))
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_start_select_conn(TRUE, p_select_cback);
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_check_link_type
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is to check the link type is BLE or BR/EDR.
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if BLE link; FALSE if BR/EDR.
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_check_link_type (BD_ADDR bd_addr)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN         *p;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_check_link_type");
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = btm_bda_to_acl(bd_addr)) != NULL)
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return p->is_le_link;
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_rand_enc_complete
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is the callback functions for HCI_Rand command
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and HCI_Encrypt command is completed.
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This message is received from the HCI.
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_rand_enc_complete (UINT8 *p, UINT16 op_code, tBTM_RAND_ENC_CB *p_enc_cplt_cback)
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_RAND_ENC   params;
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_dest = params.param_buf;
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_rand_enc_complete");
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&params, 0, sizeof(tBTM_RAND_ENC));
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there was a callback address for vcs complete, call it */
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_enc_cplt_cback && p)
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Pass paramters to the callback function */
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(params.status, p); /* command status */
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (params.status == HCI_SUCCESS)
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            params.opcode = op_code;
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (op_code == HCI_BLE_RAND)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                params.param_len = BT_OCTET8_LEN;
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                params.param_len = BT_OCTET16_LEN;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p_dest, p, params.param_len);  /* Fetch return info from HCI event message */
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_enc_cplt_cback)
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_enc_cplt_cback)(&params);  /* Call the Encryption complete callback function */
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED == TRUE)
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_get_enc_key_type
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is to increment local sign counter
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_increment_sign_ctr(BD_ADDR bd_addr, BOOLEAN is_local )
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_ble_increment_sign_ctr is_local=%d", is_local);
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_local)
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->ble.keys.local_counter++;
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->ble.keys.counter++;
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG3 ("is_local=%d local sign counter=%d peer sign counter=%d",
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          is_local,
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->ble.keys.local_counter,
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->ble.keys.counter);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_get_enc_key_type
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is to get the BLE key type that has been exchanged
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in betweem local device and peer device.
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          p_key_type: output parameter to carry the key type value.
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_get_enc_key_type(BD_ADDR bd_addr, UINT8 *p_key_types)
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_get_enc_key_type");
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_key_types = p_dev_rec->ble.key_type;
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_get_local_div
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local DIV
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TURE - if a valid DIV is availavle
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_get_local_div (BD_ADDR bd_addr, UINT16 *p_div)
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC   *p_dev_rec;
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN            status = FALSE;
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_get_local_div");
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bd_addr[0],bd_addr[1],
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bd_addr[2],bd_addr[3],
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bd_addr[4],bd_addr[5]);
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec && p_dev_rec->ble.keys.div)
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = TRUE;
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_div = p_dev_rec->ble.keys.div;
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG2 ("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, *p_div);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_save_le_key
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the SMP to update
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  an  BLE key.  SMP is internal, whereas all the keys shall
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  be sent to the application.  The function is also called
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  when application passes ble key stored in NVRAM to the btm_sec.
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pass_to_application parameter is false in this case.
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY_VALUE *p_keys,
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         BOOLEAN pass_to_application)
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_rec;
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_EVT_DATA    cb_data;
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG2 ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",key_type, pass_to_application);
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Store the updated key in the device database */
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bd_addr[0],bd_addr[1],
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bd_addr[2],bd_addr[3],
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bd_addr[4],bd_addr[5]);
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rec = btm_find_dev (bd_addr)) != NULL && p_keys)
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (key_type)
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_LE_KEY_PENC:
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_rec->ble.keys.ltk, p_keys->penc_key.ltk, BT_OCTET16_LEN);
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN);
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level;
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.ediv = p_keys->penc_key.ediv;
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.key_size = p_keys->penc_key.key_size;
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.key_type |= BTM_LE_KEY_PENC;
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED)
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG3("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x",
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.key_type,
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->sec_flags,
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.sec_level);
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_LE_KEY_PID:
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN);
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.key_type |= BTM_LE_KEY_PID;
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1("BTM_LE_KEY_PID key_type=0x%x save peer IRK",  p_rec->ble.key_type);
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_LE_KEY_PCSRK:
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_rec->ble.keys.csrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN);
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level;
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.counter  = p_keys->pcsrk_key.counter;
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.key_type |= BTM_LE_KEY_PCSRK;
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->sec_flags |=  BTM_SEC_LINK_KEY_KNOWN;
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( p_keys->pcsrk_key.sec_level== SMP_SEC_AUTHENTICATED)
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG4("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d",
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.key_type,
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->sec_flags,
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.srk_sec_level,
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.counter );
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_LE_KEY_LENC:
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level;
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.key_size = p_keys->lenc_key.key_size;
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.key_type |= BTM_LE_KEY_LENC;
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG4("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x",
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.key_type,
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.div,
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.key_size,
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.sec_level );
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_LE_KEY_LCSRK:/* local CSRK has been delivered */
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level;
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.keys.local_counter  = p_keys->lcsrk_key.counter;
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->ble.key_type |= BTM_LE_KEY_LCSRK;
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG4("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d",
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.key_type,
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.div,
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.local_csrk_sec_level,
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_rec->ble.keys.local_counter );
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_WARNING1("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type);
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG3 ("BLE key type 0x%02x updated for BDA: %08x%04x (btm_sec_save_le_key)", key_type,
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bd_addr[4]<<8)+bd_addr[5]);
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify the application that one of the BLE keys has been updated
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           If link key is in progress, it will get sent later.*/
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pass_to_application && btm_cb.api.p_le_callback)
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.key.p_key_value = p_keys;
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.key.key_type = key_type;
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_le_callback) (BTM_LE_KEY_EVT, bd_addr, &cb_data);
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_WARNING3 ("BLE key type 0x%02x called for Unknown BDA or type: %08x%04x !! (btm_sec_save_le_key)", key_type,
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (bd_addr[4]<<8)+bd_addr[5]);
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rec)
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG1 ("sec_flags=0x%x", p_rec->sec_flags);
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_update_sec_key_size
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      update the current lin kencryption key size
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size)
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_rec;
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1("btm_ble_update_sec_key_size enc_key_size = %d", enc_key_size);
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rec = btm_find_dev (bd_addr)) != NULL )
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->enc_key_size = enc_key_size;
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_read_sec_key_size
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      update the current lin kencryption key size
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr)
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_rec;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_rec = btm_find_dev (bd_addr)) != NULL )
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return p_rec->enc_key_size;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_link_sec_check
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Check BLE link security level match.
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE: check is OK and the *p_sec_req_act contain the action
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_link_sec_check(BD_ADDR bd_addr, tBTM_LE_AUTH_REQ auth_req, tBTM_BLE_SEC_REQ_ACT *p_sec_req_act)
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 req_sec_level, cur_sec_level;
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_ble_link_sec_check auth_req =0x%x", auth_req);
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec == NULL)
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0 ("btm_ble_link_sec_check received for unknown device");
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* race condition: discard the security request while master is encrypting the link */
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD;
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        req_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((auth_req == (BTM_LE_AUTH_REQ_BOND|BTM_LE_AUTH_REQ_MITM)) ||
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (auth_req == (BTM_LE_AUTH_REQ_MITM)) )
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            req_sec_level = BTM_LE_SEC_AUTHENTICATED;
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG1 ("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags);
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* currently encrpted  */
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cur_sec_level = BTM_LE_SEC_AUTHENTICATED;
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* unencrypted link */
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if bonded, get the key security level */
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC)
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cur_sec_level = p_dev_rec->ble.keys.sec_level;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cur_sec_level = BTM_LE_SEC_NONE;
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (cur_sec_level >= req_sec_level)
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (cur_sec_level == BTM_LE_SEC_NONE)
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_NONE;
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* To avoid re-encryption on an encrypted link for an equal condition encryption
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD;
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                */
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_ENCRYPT;
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_sec_req_act =  BTM_BLE_SEC_REQ_ACT_PAIR; /* start the pariring process to upgrade the keys*/
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG3("cur_sec_level=%d req_sec_level=%d sec_req_act=%d",
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     cur_sec_level,
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     req_sec_level,
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     *p_sec_req_act);
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_encryption
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to ensure that LE connection is
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  encrypted.  Should be called only on an open connection.
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically only needed for connections that first want to
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bring up unencrypted links, then later encrypt them.
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the local device ER is copied into er
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_set_encryption (BD_ADDR bd_addr, void *p_ref_data, UINT8 link_role)
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS         cmd = BTM_NO_RESOURCES;
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_SEC_ACT    sec_act = *(tBTM_BLE_SEC_ACT *)p_ref_data ;
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_rec = btm_find_dev (bd_addr);
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG2 ("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, p_rec->role_master);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rec == NULL)
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM)
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->security_required |= BTM_SEC_IN_MITM;
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (sec_act)
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BLE_SEC_ENCRYPT:
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (link_role == BTM_ROLE_MASTER)
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* start link layer encryption using the security info stored */
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_start_encrypt(bd_addr, FALSE, NULL);
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cmd = BTM_CMD_STARTED;
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if salve role then fall through to call SMP_Pair below which will send a
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               sec_request to request the master to encrypt the link */
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BLE_SEC_ENCRYPT_NO_MITM:
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BLE_SEC_ENCRYPT_MITM:
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (SMP_Pair(bd_addr) == SMP_STARTED)
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cmd = BTM_CMD_STARTED;
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cmd = BTM_SUCCESS;
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return cmd;
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_ltk_request
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when encryption request is received
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on a slave device.
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_ltk_request(UINT16 handle, UINT8 rand[8], UINT16 ediv)
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET8 dummy_stk = {0};
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_ltk_request");
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->ediv = ediv;
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN);
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!smp_proc_ltk_request(p_dev_rec->bd_addr))
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_ltk_request_reply(p_dev_rec->bd_addr, FALSE, dummy_stk);
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_start_encrypt
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start LE encryption.
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk)
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_rec = btm_find_dev (bda);
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET8    dummy_rand = {0};
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_start_encrypt");
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_rec ||
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_rec && p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING))
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rec->sec_state == BTM_SEC_STATE_IDLE)
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->enc_handle = p_rec->hci_handle;
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (use_stk)
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_ble_start_enc(p_rec->hci_handle, dummy_rand, 0, stk))
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return FALSE;
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_ble_start_enc(p_rec->hci_handle, p_rec->ble.keys.rand,
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_rec->ble.keys.ediv, p_rec->ble.keys.ltk))
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return FALSE;
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_link_encrypted
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when LE link encrption status is changed.
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_link_encrypted(BD_ADDR bd_addr, UINT8 encr_enable)
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (bd_addr);
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_ble_link_encrypted encr_enable=%d", encr_enable);
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    smp_link_encrypted(bd_addr, encr_enable);
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG1(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (encr_enable && p_dev_rec->enc_key_size == 0)
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size;
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->p_callback)
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (encr_enable)
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS);
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (p_dev_rec->role_master)
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING);
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_enc_proc_ltk
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      send LTK reply when it's ready.
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_enc_proc_ltk(tSMP_ENC *p)
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_enc_proc_ltk");
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->param_len == BT_OCTET16_LEN)
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < (BT_OCTET16_LEN - btm_cb.key_size); i ++)
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p->param_buf[BT_OCTET16_LEN - i - 1] = 0;
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p->param_buf);
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_enc_proc_slave_y
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      calculate LTK when Y is ready
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_enc_proc_slave_y(tSMP_ENC *p)
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  div, y;
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *pp = p->param_buf;
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ENC output;
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_enc_proc_slave_y");
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p != NULL)
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(y, pp);
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        div = p_cb->ediv ^ y;
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = btm_find_dev_by_handle (p_cb->enc_handle);
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( p_dev_rec &&
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->ble.keys.div == div )
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_DEBUG0 ("LTK request OK");
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* calculating LTK , LTK = E er(div) */
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            SMP_Encrypt(p_cb->devcb.er, BT_OCTET16_LEN, (UINT8 *)&div, 2, &output);
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_enc_proc_ltk(&output);
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_DEBUG0 ("LTK request failed - send negative reply");
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_ble_ltk_req_neg_reply(p_cb->enc_handle);
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec)
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_link_encrypted(p_dev_rec->bd_addr, 0);
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_ltk_request_reply
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a LTK request reply on a slave
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  device.
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_ltk_request_reply(BD_ADDR bda,  BOOLEAN use_stk, BT_OCTET16 stk)
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_rec = btm_find_dev (bda);
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ENC output;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rec == NULL)
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("btm_ble_ltk_request_reply received for unknown device");
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_ltk_request_reply");
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->enc_handle = p_rec->hci_handle;
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->key_size = p_rec->ble.keys.key_size;
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_ERROR1("key size = %d", p_rec->ble.keys.key_size);
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (use_stk)
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk);
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* calculate LTK using peer device  */
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* generate Y= Encrypt(DHK, Rand) received from encrypt request  */
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SMP_Encrypt(p_cb->devcb.id_keys.dhk, BT_OCTET16_LEN, p_cb->enc_rand,
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BT_OCTET8_LEN, &output);
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_enc_proc_slave_y(&output);
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_io_capabilities_req
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to handle SMP get IO capability request.
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p_data)
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           callback_rc = BTM_SUCCESS;
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_io_capabilities_req");
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_le_callback)
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* the callback function implementation may change the IO capability... */
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        callback_rc = (*btm_cb.api.p_le_callback) (BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA *)p_data);
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != p_data->oob_data))
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (callback_rc == BTM_SUCCESS)
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d auth_req:%d",
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->security_required, p_data->auth_req);
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK 1-IRK 2-CSRK)",
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_data->init_keys,
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_data->resp_keys);
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if authentication requires MITM protection, put on the mask */
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->security_required & BTM_SEC_IN_MITM)
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->auth_req |= BTM_LE_AUTH_REQ_MITM;
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_data->auth_req & SMP_AUTH_BOND))
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_DEBUG0("Non bonding: No keys should be exchanged");
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->init_keys = 0;
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->resp_keys = 0;
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG1 ("btm_ble_io_capabilities_req 3: auth_req:%d", p_data->auth_req);
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x",
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_data->init_keys,
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_data->resp_keys);
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d",
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_data->io_cap, p_data->auth_req);
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remove MITM protection requirement if IO cap does not allow it */
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE)
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM;
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG3 ("btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:%d",
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_data->io_cap, p_data->oob_data, p_data->auth_req);
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return callback_rc;
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        btm_proc_smp_cback
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     This function is the SMP callback handler.
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_proc_smp_cback(tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data)
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (bd_addr);
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 res;
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_proc_smp_cback event = %d", event);
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec != NULL)
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case SMP_IO_CAP_REQ_EVT:
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_io_capabilities_req(p_dev_rec, (tBTM_LE_IO_REQ *)&p_data->io_req);
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case SMP_PASSKEY_REQ_EVT:
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case SMP_PASSKEY_NOTIF_EVT:
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case SMP_OOB_REQ_EVT:
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case SMP_SEC_REQUEST_EVT:
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case SMP_COMPLT_EVT:
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.api.p_le_callback)
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* the callback function implementation may change the IO capability... */
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG1 ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback );
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_le_callback) (event, bd_addr, (tBTM_LE_EVT_DATA *)p_data);
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_ERROR0 ("btm_proc_smp_cback: btm_cb.api.p_le_callback ==NULL");
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (event == SMP_COMPLT_EVT)
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG2 ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags );
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING;
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG3 ("after update result=%d sec_level=0x%x sec_flags=0x%x",
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      res, p_data->cmplt.sec_level , p_dev_rec->sec_flags );
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_dev_rec_cback_event(p_dev_rec, res);
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_data->cmplt.is_pair_cancel && btm_cb.api.p_bond_cancel_cmpl_callback )
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTM_TRACE_DEBUG0 ("Pairing Cancel completed");
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS);
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (res != BTM_SUCCESS)
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (!btm_cb.devcb.no_disc_if_pair_fail)
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            BTM_TRACE_DEBUG0 ("Pairing failed - Remove ACL");
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            btm_remove_acl(bd_addr);
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        else
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            BTM_TRACE_DEBUG0 ("Pairing failed - Not Removing ACL");
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	                        p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (res != BTM_SUCCESS)
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_remove_acl(bd_addr);
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG3 ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x",
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      btm_cb.pairing_state,
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      btm_cb.pairing_flags,
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      btm_cb.pin_code_len  );
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG6 ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x",
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      btm_cb.pairing_bda[0], btm_cb.pairing_bda[1], btm_cb.pairing_bda[2],
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      btm_cb.pairing_bda[3], btm_cb.pairing_bda[4], btm_cb.pairing_bda[5]);
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN);
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_cb.pairing_flags = 0;
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1 ("unknown event = %d", event);
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("btm_proc_smp_cback received for unknown device");
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* SMP_INCLUDED */
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleDataSignature
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to sign the data using AES128 CMAC
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  algorith.
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        bd_addr: target device the data to be signed for.
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_text: singing data
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  len: length of the data to be signed.
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  signature: output parameter where data signature is going to
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                             be stored.
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if signing sucessul, otherwise FALSE.
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleDataSignature (BD_ADDR bd_addr, UINT8 *p_text, UINT16 len,
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              BLE_SIGNATURE signature)
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     ret = FALSE;
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_rec = btm_find_dev (bd_addr);
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_buf, *pp;
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16  er;
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      div;
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       temp[4]; /* for (r || DIV)  r=1*/
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      r=1;
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p=temp, *p_mac = (UINT8 *)signature;
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ENC    output;
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16  local_csrk;
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("BTM_BleDataSignature");
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rec == NULL)
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("data signing can not be done from unknow device");
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(len + 4))) != NULL)
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_DEBUG0("Start to generate Local CSRK");
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* prepare plain text */
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_text)
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_buf, p_text, len);
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pp = (p_buf + len);
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( btm_cb.devcb.enable_test_local_sign_cntr)
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1 ("Use Test local counter value from script counter_val=%d", btm_cb.devcb.test_local_sign_cntr);
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT32_TO_STREAM(pp, btm_cb.devcb.test_local_sign_cntr);
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter);
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter);
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* compute local csrk */
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_get_local_div(bd_addr, &div))
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1 ("compute_csrk div=%x", div);
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_GetDeviceEncRoot(er);
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* CSRK = d1(ER, DIV, 1) */
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT16_TO_STREAM(p, div);
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT16_TO_STREAM(p, r);
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!SMP_Encrypt(er, BT_OCTET16_LEN, temp, 4, &output))
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_ERROR0("Local CSRK generation failed ");
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG0("local CSRK generation success");
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memcpy((void *)local_csrk, output.param_buf, BT_OCTET16_LEN);
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (btm_cb.devcb.enable_test_local_sign_cntr)
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        UINT32_TO_STREAM(p_mac, btm_cb.devcb.test_local_sign_cntr);
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter);
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter);
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if ((ret = AES_CMAC(local_csrk, p_buf, (UINT16)(len + 4), BTM_CMAC_TLEN_SIZE, p_mac)) == TRUE)
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_ble_increment_sign_ctr(bd_addr, TRUE);
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if ( btm_cb.devcb.enable_test_mac_val)
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            BTM_TRACE_DEBUG0 ("Use MAC value from script");
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            memcpy(p_mac, btm_cb.devcb.test_mac, BTM_CMAC_TLEN_SIZE);
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG1("BTM_BleDataSignature p_mac = %d", p_mac);
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG4("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3));
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG4("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7));
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    GKI_freebuf(p_buf);
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleVerifySignature
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to verify the data signature
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        bd_addr: target device the data to be signed for.
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_orig:  original data before signature.
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  len: length of the signing data
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  counter: counter used when doing data signing
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_comp: signature to be compared against.
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if signature verified correctly; otherwise FALSE.
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleVerifySignature (BD_ADDR bd_addr, UINT8 *p_orig, UINT16 len, UINT32 counter,
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             UINT8 *p_comp)
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             verified = FALSE;
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_rec = btm_find_dev (bd_addr);
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               p_mac[BTM_CMAC_TLEN_SIZE];
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK)))
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("can not verify signature for unknown device");
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (counter < p_rec->ble.keys.counter)
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("signature received with out dated sign counter");
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_orig == NULL)
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("No signature to verify");
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG2 ("BTM_BleVerifySignature rcv_cnt=%d >= expected_cnt=%d", counter, p_rec->ble.keys.counter);
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (AES_CMAC(p_rec->ble.keys.csrk, p_orig, len, BTM_CMAC_TLEN_SIZE, p_mac))
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0)
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_increment_sign_ctr(bd_addr, FALSE);
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                verified = TRUE;
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return verified;
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Utility functions for LE device IR/ER generation
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_notify_new_key
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is to notify application new keys have been
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  generated.
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_notify_new_key(UINT8 key_type)
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_LOCAL_KEYS *p_locak_keys = NULL;
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_notify_new_key key_type=%d", key_type);
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_le_key_callback)
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (key_type)
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_KEY_TYPE_ID:
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ID");
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.id_keys;
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_KEY_TYPE_ER:
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ER");
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.er;
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_ERROR1("unknown key type: %d", key_type);
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_locak_keys != NULL)
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_le_key_callback) (key_type, p_locak_keys);
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_er2
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when ER is generated, store it in
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  local control block.
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_er2(tBTM_RAND_ENC *p)
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_process_er2");
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p &&p->opcode == HCI_BLE_RAND)
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&btm_cb.devcb.er[8], p->param_buf, BT_OCTET8_LEN);
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_notify_new_key(BTM_BLE_KEY_TYPE_ER);
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("Generating ER2 exception.");
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16));
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_er
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when ER is generated, store it in
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  local control block.
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_er(tBTM_RAND_ENC *p)
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_process_er");
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p &&p->opcode == HCI_BLE_RAND)
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&btm_cb.devcb.er[0], p->param_buf, BT_OCTET8_LEN);
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er2))
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16));
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_ERROR0("Generating ER2 failed.");
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("Generating ER1 exception.");
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_irk
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when IRK is generated, store it in
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  local control block.
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_irk(tSMP_ENC *p)
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_process_irk");
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p &&p->opcode == HCI_BLE_ENCRYPT)
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN);
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_notify_new_key(BTM_BLE_KEY_TYPE_ID);
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("Generating IRK exception.");
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* proceed generate ER */
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er))
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("Generating ER failed.");
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_dhk
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when DHK is calculated, store it in
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  local control block, and proceed to generate ER, a 128-bits
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  random number.
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_dhk(tSMP_ENC *p)
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 btm_ble_irk_pt = 0x01;
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ENC output;
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_process_dhk");
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->opcode == HCI_BLE_ENCRYPT)
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN);
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("BLE DHK generated.");
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* IRK = D1(IR, 1) */
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt,
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         1,   &output))
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reset all identity root related key */
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_process_irk(&output);
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* reset all identity root related key */
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_ir2
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when IR is generated, proceed to calculate
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  DHK = Eir({0x03, 0, 0 ...})
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_ir2(tBTM_RAND_ENC *p)
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 btm_ble_dhk_pt = 0x03;
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ENC output;
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_process_ir2");
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->opcode == HCI_BLE_RAND)
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remembering in control block */
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&btm_cb.devcb.id_keys.ir[8], p->param_buf, BT_OCTET8_LEN);
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* generate DHK= Eir({0x03, 0x00, 0x00 ...}) */
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_dhk_pt,
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    1, &output);
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_process_dhk(&output);
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("BLE IR generated.");
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_ir
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when IR is generated, proceed to calculate
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  DHK = Eir({0x02, 0, 0 ...})
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_ir(tBTM_RAND_ENC *p)
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_process_ir");
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->opcode == HCI_BLE_RAND)
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remembering in control block */
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(btm_cb.devcb.id_keys.ir, p->param_buf, BT_OCTET8_LEN);
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir2))
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_ERROR0("Generating IR2 failed.");
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_reset_id
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to reset LE device identity.
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_reset_id( void )
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG0 ("btm_ble_reset_id");
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* regenrate Identity Root*/
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir))
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("Generating IR failed.");
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BLE_CONFORMANCE_TESTING == TRUE
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_no_disc_if_pair_fail
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function indicates that whether no disconnect of the ACL
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  should be used if pairing failed
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_set_no_disc_if_pair_fail(BOOLEAN disable_disc )
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", disable_disc);
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.devcb.no_disc_if_pair_fail = disable_disc;
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_test_mac_value
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function set test MAC value
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_set_test_mac_value(BOOLEAN enable, UINT8 *p_test_mac_val )
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_ble_set_test_mac_value enable=%d", enable);
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.devcb.enable_test_mac_val = enable;
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN);
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_test_local_sign_cntr_value
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function set test local sign counter value
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_set_test_local_sign_cntr_value(BOOLEAN enable, UINT32 test_local_sign_cntr )
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG2 ("btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d",
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      enable, test_local_sign_cntr);
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.devcb.enable_test_local_sign_cntr = enable;
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.devcb.test_local_sign_cntr =  test_local_sign_cntr;
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_BLE_CONFORMANCE_TESTING */
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */
1901