btm_ble.cc revision c2276b06572ab6fc1f900fbb1f41087e77d47e2a
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 ******************************************************************************/ 2549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 2649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btm_ble" 2749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 28bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#include "bt_target.h" 29bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen 300c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski#include <base/bind.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 3549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_ble_api.h" 3649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_int.h" 3749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h" 38444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "device/include/controller.h" 3949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "gap_api.h" 40b2a292b5d8df2f359c38b0787bc01181225a9bc9Pavlin Radoslavov#include "gatt_api.h" 4149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "hcimsgs.h" 4249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "l2c_int.h" 43f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#include "osi/include/log.h" 44d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 4549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "smp_api.h" 46ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern bool aes_cipher_msg_auth_code(BT_OCTET16 key, uint8_t* input, 48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t length, uint16_t tlen, 49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_signature); 50426da5ad3cc43336e48620605e37e9432b3cd126Andre Eisenbach 51ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 529ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* External Function to be called by other modules */ 53ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************** 55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 56ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecAddBleDevice 57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 58ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Add/modify device. This function will be normally called 59ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * during host startup to restore all required information 60ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * for a LE device stored in the NVRAM. 61ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - BD address of the peer 639ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * bd_name - Name of the peer device. NULL if unknown. 64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * dev_type - Remote device's device type. 65ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * addr_type - LE device address type. 66ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 67ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 70c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_SecAddBleDevice(const bt_bdaddr_t& bd_addr, BD_NAME bd_name, 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_DEVICE_TYPE dev_type, tBLE_ADDR_TYPE addr_type) { 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: dev_type=0x%x", __func__, dev_type); 73c9f86da73bfb637426c83b86497c50fede4e0f63Jakub Pawlowski 74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_allocate_dev_rec(); 77cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 78c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->bd_addr = bd_addr; 79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_BR_EDR); 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_LE); 81cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update conn params, use default value for background connection params */ 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.min_conn_int = BTM_BLE_CONN_PARAM_UNDEF; 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.max_conn_int = BTM_BLE_CONN_PARAM_UNDEF; 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_PARAM_UNDEF; 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF; 87cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: Device added, handle=0x%x ", __func__, 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble_hci_handle); 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (bd_name && bd_name[0]) { 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)p_dev_rec->sec_bd_name, (char*)bd_name, 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_MAX_REM_BD_NAME_LEN); 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->device_type |= dev_type; 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.ble_addr_type = addr_type; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 102c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.pseudo_addr = bd_addr; 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* sync up with the Inq Data base*/ 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_INFO* p_info = BTM_InqDbRead(bd_addr); 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_info) { 106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type; 107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_info->results.device_type = p_dev_rec->device_type; 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("InqDb device_type =0x%x addr_type=0x%x", 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_info->results.device_type, p_info->results.ble_addr_type); 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 116ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecAddBleKey 118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 119ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Add/modify LE device information. This function will be 120ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * normally called during host startup to restore all required 121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * information stored in the NVRAM. 122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - BD address of the peer 124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_le_key - LE key values. 125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * key_type - LE SMP key type. 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* 127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 130c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_SecAddBleKey(const bt_bdaddr_t& bd_addr, tBTM_LE_KEY_VALUE* p_le_key, 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_KEY_TYPE key_type) { 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_SecAddBleKey"); 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec || !p_le_key || 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID && 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC && 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type != BTM_LE_KEY_LCSRK && key_type != BTM_LE_KEY_LID)) { 139c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(WARNING) << __func__ 140c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " Wrong Type, or No Device record for bdaddr: " << bd_addr 141c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << ", Type: " << key_type; 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 145c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " BDA: " << bd_addr << ", Type: " << key_type; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(bd_addr, key_type, p_le_key, false); 148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (key_type == BTM_LE_KEY_PID || key_type == BTM_LE_KEY_LID) 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_resolving_list_load_dev(p_dev_rec); 152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleLoadLocalKeys 160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Local local identity key, encryption root or sign counter. 162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1639ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: key_type: type of key, can be BTM_BLE_KEY_TYPE_ID, 1649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_BLE_KEY_TYPE_ER 1659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * or BTM_BLE_KEY_TYPE_COUNTER. 166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_key: pointer to the key. 1679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * 168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns non2. 169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleLoadLocalKeys(uint8_t key_type, tBTM_BLE_LOCAL_KEYS* p_key) { 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_DEVCB* p_devcb = &btm_cb.devcb; 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_key != NULL) { 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (key_type) { 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ID: 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&p_devcb->id_keys, &p_key->id_keys, 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ER: 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_devcb->ble_encryption_key_value, p_key->er, 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(BT_OCTET16)); 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("unknow local key type: %d", key_type); 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetDeviceEncRoot 196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 197ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device encryption 198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * root. 199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device ER is copied into ble_encr_key_value 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceEncRoot(BT_OCTET16 ble_encr_key_value) { 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(ble_encr_key_value, btm_cb.devcb.ble_encryption_key_value, 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET16_LEN); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetDeviceIDRoot 213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device identity 215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * root. 216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device IR is copied into irk 219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceIDRoot(BT_OCTET16 irk) { 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_GetDeviceIDRoot "); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN); 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 228ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 229ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetDeviceDHK 230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device DHK. 232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device DHK is copied into dhk 235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceDHK(BT_OCTET16 dhk) { 238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_GetDeviceDHK"); 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN); 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadConnectionAddr 245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2469ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to get the local device address 2479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * information. 248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 250ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 251ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 252c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_ReadConnectionAddr(const bt_bdaddr_t& remote_bda, 253c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bt_bdaddr_t& local_conn_addr, 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE* p_addr_type) { 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_LE); 256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl == NULL) { 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("No connection exist!"); 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 261c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski local_conn_addr = p_acl->conn_addr; 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_acl->conn_addr_type; 263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_ReadConnectionAddr address type: %d addr: 0x%02x", 265c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_acl->conn_addr_type, p_acl->conn_addr.address[0]); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 267bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen 2686975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************* 269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_IsBleConnection 271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if the connection handle 273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * for an LE link 274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if connection is LE link, otherwise false. 276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_IsBleConnection(uint16_t conn_handle) { 279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx; 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p; 2816975b4d711142b885af479721cada448952c6b41Andre Eisenbach 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_IsBleConnection: conn_handle: %d", conn_handle); 2836975b4d711142b885af479721cada448952c6b41Andre Eisenbach 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx = btm_handle_to_acl_index(conn_handle); 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx >= MAX_L2CAP_LINKS) return false; 2866975b4d711142b885af479721cada448952c6b41Andre Eisenbach 287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.acl_db[xx]; 2886975b4d711142b885af479721cada448952c6b41Andre Eisenbach 289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->transport == BT_TRANSPORT_LE); 2906975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2949ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Function BTM_ReadRemoteConnectionAddr 295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is read the remote device address currently used 297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters pseudo_addr: pseudo random address available 299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * conn_addr:connection address used 3009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_addr_type : BD Address type, Public or Random of the address 3019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * used 302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3039ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns bool, true if connection to remote device exists, else false 304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 306c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_ReadRemoteConnectionAddr(const bt_bdaddr_t& pseudo_addr, 307c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bt_bdaddr_t& conn_addr, 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE* p_addr_type) { 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool st = true; 3107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_PRIVACY_SPT == TRUE) 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p = btm_bda_to_acl(pseudo_addr, BT_TRANSPORT_LE); 312ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p == NULL) { 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR( 315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_ReadRemoteConnectionAddr can not find connection" 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " with matching address"); 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3198b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 320c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski conn_addr = p->active_remote_addr; 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p->active_remote_addr_type; 3228b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#else 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(pseudo_addr); 3247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 325c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski conn_addr = pseudo_addr; 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_dev_rec->ble.ble_addr_type; 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3298b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return st; 331ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 332ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 333ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 334ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecurityGrant 335ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to grant security process. 337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters bd_addr - peer device bd address. 339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - result of the operation BTM_SUCCESS if success. 3409ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Otherwise, BTM_REPEATED_ATTEMPTS if too many 3419ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * attempts. 342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 346c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_SecurityGrant(const bt_bdaddr_t& bd_addr, uint8_t res) { 347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS; 349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_SecurityGrant"); 350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_SecurityGrant(bd_addr, res_smp); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BlePasskeyReply 356ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 357ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called after Security Manager submitted 358ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * passkey request to the application. 359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3609ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: bd_addr - Address of the device for which passkey was 3619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * requested 3629ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * res - result of the operation BTM_SUCCESS if success 3639ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * key_len - length in bytes of the Passkey 3649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_passkey - pointer to array with the passkey 3659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * trusted_mask - bitwise OR of trusted services (array of 3669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * uint32_t) 367ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 369c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_BlePasskeyReply(const bt_bdaddr_t& bd_addr, uint8_t res, 370c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint32_t passkey) { 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Passkey reply to Unknown device"); 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 379ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_BlePasskeyReply"); 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_PasskeyReply(bd_addr, res_smp, passkey); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 386ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleConfirmReply 388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called after Security Manager submitted 390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * numeric comparison request to the application. 391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device with which numeric 393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * comparison was requested 394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - comparison result BTM_SUCCESS if success 395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 397c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_BleConfirmReply(const bt_bdaddr_t& bd_addr, uint8_t res) { 398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = 400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL; 401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Passkey reply to Unknown device"); 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_ConfirmReply(bd_addr, res_smp); 410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleOobDataReply 415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the OOB data for 417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SMP in response to BTM_LE_OOB_REQ_EVT 418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - result of the operation SMP_SUCCESS if success 4219ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_data - oob data, depending on transport and 4229ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * capabilities. 423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Might be "Simple Pairing Randomizer", or 424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * "Security Manager TK Value". 425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 426ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 427c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_BleOobDataReply(const bt_bdaddr_t& bd_addr, uint8_t res, uint8_t len, 428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_data) { 429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL; 430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s:", __func__); 433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: Unknown device", __func__); 436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 438ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_OobDataReply(bd_addr, res_smp, len, p_data); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 443bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski/******************************************************************************* 444ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 445ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSecureConnectionOobDataReply 446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the OOB data for 448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SMP in response to BTM_LE_OOB_REQ_EVT when secure connection 449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * data is available 450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_c - pointer to Confirmation. 453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_r - pointer to Randomizer 454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 456c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_BleSecureConnectionOobDataReply(const bt_bdaddr_t& bd_addr, 457c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_c, uint8_t* p_r) { 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 459bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s:", __func__); 461bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: Unknown device", __func__); 464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 466bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 468bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_SC_OOB_DATA oob; 470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&oob, 0, sizeof(tSMP_SC_OOB_DATA)); 471bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson oob.peer_oob_data.present = true; 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&oob.peer_oob_data.randomizer, p_r, BT_OCTET16_LEN); 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&oob.peer_oob_data.commitment, p_c, BT_OCTET16_LEN); 475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson oob.peer_oob_data.addr_rcvd_from.type = p_dev_rec->ble.ble_addr_type; 476c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski memcpy(oob.peer_oob_data.addr_rcvd_from.bda, to_BD_ADDR(bd_addr), 477c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski BD_ADDR_LEN); 478bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_SecureConnectionOobDataReply((uint8_t*)&oob); 480bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski} 481bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 483ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 484ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSetConnScanParams 485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Set scan parameter used in BLE connection request 487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: scan_interval: scan interval 489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * scan_window: scan window 490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleSetConnScanParams(uint32_t scan_interval, uint32_t scan_window) { 495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb; 496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool new_param = false; 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_SCAN_INT_MAX) && 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_SCAN_WIN_MAX)) { 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ble_cb->scan_int != scan_interval) { 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ble_cb->scan_int = scan_interval; 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson new_param = true; 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ble_cb->scan_win != scan_window) { 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ble_cb->scan_win = scan_window; 509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson new_param = true; 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (new_param && p_ble_cb->conn_state == BLE_BG_CONN) { 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_suspend_bg_conn(); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Illegal Connection Scan Parameters"); 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************** 521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSetPrefConnParams 523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Set a peripheral's preferred connection parameters 525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - BD address of the peripheral 527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * scan_interval: scan interval 528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * scan_window: scan window 529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * min_conn_int - minimum preferred connection interval 530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * max_conn_int - maximum preferred connection interval 531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * slave_latency - preferred slave latency 532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * supervision_tout - preferred supervision timeout 533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 537c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_BleSetPrefConnParams(const bt_bdaddr_t& bd_addr, uint16_t min_conn_int, 538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t max_conn_int, uint16_t slave_latency, 539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t supervision_tout) { 540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_BleSetPrefConnParams min: %u max: %u latency: %u \ 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tout: %u", 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson min_conn_int, max_conn_int, slave_latency, supervision_tout); 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_BLE_ISVALID_PARAM(min_conn_int, BTM_BLE_CONN_INT_MIN, 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_CONN_INT_MAX) && 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_ISVALID_PARAM(max_conn_int, BTM_BLE_CONN_INT_MIN, 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_CONN_INT_MAX) && 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_ISVALID_PARAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_CONN_SUP_TOUT_MAX) && 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (slave_latency <= BTM_BLE_CONN_LATENCY_MAX || 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson slave_latency == BTM_BLE_CONN_PARAM_UNDEF)) { 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* expect conn int and stout and slave latency to be updated all together 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF || 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) { 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.min_conn_int = min_conn_int; 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.min_conn_int = max_conn_int; 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.max_conn_int = max_conn_int; 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.max_conn_int = min_conn_int; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF) 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.slave_latency = slave_latency; 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.supervision_tout = supervision_tout; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF; 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Unknown Device, setting rejected"); 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Illegal Connection Parameters"); 586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadDevInfo 592ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 593ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the device/address type 594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * of BD address. 595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter remote_bda: remote device address 597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_dev_type: output parameter to read the device type. 598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_addr_type: output parameter to read the address type. 599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 601c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid BTM_ReadDevInfo(const bt_bdaddr_t& remote_bda, tBT_DEVICE_TYPE* p_dev_type, 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE* p_addr_type) { 603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(remote_bda); 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_INFO* p_inq_info = BTM_InqDbRead(remote_bda); 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = BLE_ADDR_PUBLIC; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = BT_DEVICE_TYPE_BREDR; 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check with the BT manager if details about remote device are known */ 611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq_info != NULL) { 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = p_inq_info->results.device_type; 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_inq_info->results.ble_addr_type; 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* unknown device, assume BR/EDR */ 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_find_dev_type - unknown device, BR/EDR assumed"); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* there is a security device record exisitng */ 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* new inquiry result, overwrite device type in security device record */ 621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq_info) { 622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->device_type = p_inq_info->results.device_type; 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; 624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 625c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (p_dev_rec->bd_addr == remote_bda && 626c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.pseudo_addr == remote_bda) { 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = p_dev_rec->device_type; 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_dev_rec->ble.ble_addr_type; 629c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski } else if (p_dev_rec->ble.pseudo_addr == remote_bda) { 630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = BT_DEVICE_TYPE_BLE; 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_dev_rec->ble.ble_addr_type; 632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* matching static adddress only */ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = BT_DEVICE_TYPE_BREDR; 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = BLE_ADDR_PUBLIC; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_find_dev_type - device_type = %d addr_type = %d", 640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type, *p_addr_type); 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6431f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji/******************************************************************************* 644ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 645ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadConnectedTransportAddress 646ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to read the paired device/address 6489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * type of other device paired corresponding to the BD_address 649ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameter remote_bda: remote device address, carry out the transport 6519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * address 652ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * transport: active transport 653ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 654ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Return true if an active link is identified; false otherwise 655ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 656ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 657c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_ReadConnectedTransportAddress(bt_bdaddr_t* remote_bda, 658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport) { 659c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(*remote_bda); 6601f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if no device can be located, return */ 662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) return false; 6631f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_BR_EDR) { 665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_bda_to_acl(p_dev_rec->bd_addr, transport) != NULL) { 666c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski *remote_bda = p_dev_rec->bd_addr; 667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_dev_rec->device_type & BT_DEVICE_TYPE_BREDR) { 669c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski *remote_bda = p_dev_rec->bd_addr; 670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 671c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski *remote_bda = {.address = {0}}; 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6741f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_LE) { 676c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski *remote_bda = p_dev_rec->ble.pseudo_addr; 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_bda_to_acl(p_dev_rec->ble.pseudo_addr, transport) != NULL) 678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6821f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 6841f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji} 6851f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 688ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleReceiverTest 689ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start the LE Receiver test 691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter rx_freq - Frequency Range 693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_cmd_cmpl_cback - Command Complete callback 694ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleReceiverTest(uint8_t rx_freq, tBTM_CMPL_CB* p_cmd_cmpl_cback) { 697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; 698ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_receiver_test(rx_freq); 700ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 703ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 704ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleTransmitterTest 705ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start the LE Transmitter test 707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter tx_freq - Frequency Range 7099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * test_data_len - Length in bytes of payload data in each 7109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * packet 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * packet_payload - Pattern to use in the payload 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_cmd_cmpl_cback - Command Complete callback 713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 715d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenvoid BTM_BleTransmitterTest(uint8_t tx_freq, uint8_t test_data_len, 716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t packet_payload, 717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cmd_cmpl_cback) { 718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; 719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload); 720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 723ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 724ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleTestEnd 725ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to stop the in-progress TX or RX 7279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * test 728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter p_cmd_cmpl_cback - Command complete callback 730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleTestEnd(tBTM_CMPL_CB* p_cmd_cmpl_cback) { 733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; 734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_test_end(); 736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 739ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Internal Functions 740ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_test_command_complete(uint8_t* p) { 742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_le_test_cmd_cmpl_cb; 743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = NULL; 745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) { 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb)(p); 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 753ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_UseLeLink 754ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7559ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is to select the underlying physical link to 7569ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * use. 757ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 758ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true to use LE, false use BR/EDR. 759ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 760ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 761c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_UseLeLink(const bt_bdaddr_t& bd_addr) { 762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p; 763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_DEVICE_TYPE dev_type; 764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE addr_type; 765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool use_le = false; 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR); 768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != NULL) { 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return use_le; 770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE); 772f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p != NULL) { 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson use_le = true; 774f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } else { 775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); 776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson use_le = (dev_type == BT_DEVICE_TYPE_BLE); 7776975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return use_le; 7806975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 781636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 782636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera/******************************************************************************* 783ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetBleDataLength 785ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to set maximum BLE transmission packet size 787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if success; otherwise failed. 789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 791c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub PawlowskitBTM_STATUS BTM_SetBleDataLength(const bt_bdaddr_t& bd_addr, 792c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint16_t tx_pdu_length) { 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE); 7947d1faf334e83332d733d8886069ffb2585cf1b8dliuchao 795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl == NULL) { 796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported", 797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_WRONG_MODE; 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8007d1faf334e83332d733d8886069ffb2585cf1b8dliuchao 801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: tx_pdu_length =%d", __func__, tx_pdu_length); 802636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->supports_ble_packet_extension()) { 804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s failed, request not supported", __func__); 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_ILLEGAL_VALUE; 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 807636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) { 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s failed, peer does not support request", __func__); 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_ILLEGAL_VALUE; 811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 812636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (tx_pdu_length > BTM_BLE_DATA_SIZE_MAX) 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tx_pdu_length = BTM_BLE_DATA_SIZE_MAX; 815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (tx_pdu_length < BTM_BLE_DATA_SIZE_MIN) 816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tx_pdu_length = BTM_BLE_DATA_SIZE_MIN; 817636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* always set the TxTime to be max, as controller does not care for now */ 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_set_data_length(p_acl->hci_handle, tx_pdu_length, 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_DATA_TX_TIME_MAX); 821636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SUCCESS; 823636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera} 824636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 827ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_determine_security_act 828ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function checks the security of current LE link 830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and returns the appropriate action that needs to be 831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * taken to achieve the required security. 832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 833ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter is_originator - True if outgoing connection 834ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * bdaddr: remote device address 835ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * security_required: Security required for the service. 836ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 837ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns The appropriate security action required. 838ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 839ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 840911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SEC_ACTION btm_ble_determine_security_act(bool is_originator, 841c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski const bt_bdaddr_t& bdaddr, 842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t security_required) { 843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_AUTH_REQ auth_req = 0x00; 8446721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) { 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((security_required & BTM_SEC_OUT_FLAGS) == 0 && 847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (security_required & BTM_SEC_OUT_MITM) == 0) { 848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s No security required for outgoing connection", 849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 8516721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } 8526721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (security_required & BTM_SEC_OUT_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM; 854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((security_required & BTM_SEC_IN_FLAGS) == 0 && 856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (security_required & BTM_SEC_IN_MITM) == 0) { 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s No security required for incoming connection", 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 8606721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } 8616721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (security_required & BTM_SEC_IN_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM; 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8646721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_REQ_ACT ble_sec_act; 866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_link_sec_check(bdaddr, auth_req, &ble_sec_act); 8676721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s ble_sec_act %d", __func__, ble_sec_act); 8696721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_DISCARD) return BTM_SEC_ENC_PENDING; 8716721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_NONE) return BTM_SEC_OK; 8736721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t sec_flag = 0; 875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_GetSecurityFlagsByTransport(bdaddr, &sec_flag, BT_TRANSPORT_LE); 8766721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_link_encrypted = false; 878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_key_mitm = false; 879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED | BTM_SEC_FLAG_LKEY_KNOWN)) { 880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) is_link_encrypted = true; 8816721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) is_key_mitm = true; 883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (auth_req & BTM_LE_AUTH_REQ_MITM) { 886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!is_key_mitm) { 887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_ENCRYPT_MITM; 8886721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } else { 889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_link_encrypted) 890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_ENCRYPT; 8936721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } 894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_link_encrypted) 896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_ENCRYPT_NO_MITM; 899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9006721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 9026721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar} 9036721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 9046721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar/******************************************************************************* 905ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_start_sec_check 907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to check and set the security required for 909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * LE link for LE COC. 910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter bdaddr: remote device address. 912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * psm : PSM of the LE COC sevice. 913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is_originator: true if outgoing connection. 914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_callback : Pointer to the callback function. 915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_ref_data : Pointer to be returned along with the callback. 916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 9179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns true if link already meets the required security; otherwise 9189ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * false. 919ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 920ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 921c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool btm_ble_start_sec_check(const bt_bdaddr_t& bd_addr, uint16_t psm, 922c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bool is_originator, tBTM_SEC_CALLBACK* p_callback, 923c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski void* p_ref_data) { 924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the service record for the PSM */ 925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec = btm_sec_find_first_serv(is_originator, psm); 9266721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is no application registered with this PSM do not allow connection 928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_serv_rec) { 930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s PSM: %d no application registerd", __func__, psm); 931c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_MODE_UNSUPPORTED); 932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9346721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_ACTION sec_act = btm_ble_determine_security_act( 936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator, bd_addr, p_serv_rec->security_flags); 9376721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_ACT ble_sec_act = BTM_BLE_SEC_NONE; 939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool status = false; 9406721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (sec_act) { 942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_OK: 943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Security met", __func__); 944c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_callback(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_SUCCESS); 945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = true; 946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 9476721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENCRYPT: 949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Encryption needs to be done", __func__); 950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act = BTM_BLE_SEC_ENCRYPT; 951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 9526721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENCRYPT_MITM: 954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Pairing with MITM needs to be done", __func__); 955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act = BTM_BLE_SEC_ENCRYPT_MITM; 956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 9576721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENCRYPT_NO_MITM: 959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Pairing with No MITM needs to be done", __func__); 960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act = BTM_BLE_SEC_ENCRYPT_NO_MITM; 961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENC_PENDING: 964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Ecryption pending", __func__); 965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ble_sec_act == BTM_BLE_SEC_NONE) return status; 969911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE); 971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_lcb->sec_act = sec_act; 972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetEncryption(bd_addr, BT_TRANSPORT_LE, p_callback, p_ref_data, 973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act); 974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 9766721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar} 9776721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 9786721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar/******************************************************************************* 979ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 980ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_rand_enc_complete 981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is the callback functions for HCI_Rand command 983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and HCI_Encrypt command is completed. 984ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This message is received from the HCI. 985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 986ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_rand_enc_complete(uint8_t* p, uint16_t op_code, 990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_RAND_ENC_CB* p_enc_cplt_cback) { 991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_RAND_ENC params; 992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_dest = params.param_buf; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_rand_enc_complete"); 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(¶ms, 0, sizeof(tBTM_RAND_ENC)); 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there was a callback address for vcs complete, call it */ 999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_enc_cplt_cback && p) { 1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Pass paramters to the callback function */ 1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(params.status, p); /* command status */ 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (params.status == HCI_SUCCESS) { 1004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson params.opcode = op_code; 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (op_code == HCI_BLE_RAND) 1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson params.param_len = BT_OCTET8_LEN; 1008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson params.param_len = BT_OCTET16_LEN; 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Fetch return info from HCI event message */ 1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_dest, p, params.param_len); 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_enc_cplt_cback) /* Call the Encryption complete callback function */ 1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_enc_cplt_cback)(¶ms); 1016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1020ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1021ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_get_enc_key_type 1022ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1023ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to increment local sign counter 1024ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 1025ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1026ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1027c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_ble_increment_sign_ctr(const bt_bdaddr_t& bd_addr, bool is_local) { 1028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_increment_sign_ctr is_local=%d", is_local); 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_local) 1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.keys.local_counter++; 1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.keys.counter++; 1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("is_local=%d local sign counter=%d peer sign counter=%d", 1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_local, p_dev_rec->ble.keys.local_counter, 1040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.keys.counter); 1041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1045ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1046ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_get_enc_key_type 1047ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 10489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is to get the BLE key type that has been 10499ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * exchanged betweem the local device and the peer device. 1050ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1051ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns p_key_type: output parameter to carry the key type value. 1052ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1053ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1054c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool btm_ble_get_enc_key_type(const bt_bdaddr_t& bd_addr, 1055c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_key_types) { 1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_get_enc_key_type"); 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_key_types = p_dev_rec->ble.key_type; 1063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 1064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1069ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1070ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_get_local_div 1071ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1072ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local DIV 1073ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1074ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns TURE - if a valid DIV is availavle 1075ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1076c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool btm_get_local_div(const bt_bdaddr_t& bd_addr, uint16_t* p_div) { 1077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 1078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool status = false; 1079c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " bd_addr: " << bd_addr; 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_div = 0; 1082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec && p_dev_rec->ble.keys.div) { 1085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = true; 1086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_div = p_dev_rec->ble.keys.div; 1087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, 1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_div); 1090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1094ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1095ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_save_le_key 1096ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1097ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the SMP to update 1098ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * an BLE key. SMP is internal, whereas all the keys shall 1099ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * be sent to the application. The function is also called 11009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * when application passes ble key stored in NVRAM to the 11019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * btm_sec. 1102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pass_to_application parameter is false in this case. 1103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1107c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_sec_save_le_key(const bt_bdaddr_t& bd_addr, tBTM_LE_KEY_TYPE key_type, 1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_KEY_VALUE* p_keys, bool pass_to_application) { 1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec; 1110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_EVT_DATA cb_data; 1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t i; 1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_sec_save_le_key key_type=0x%x pass_to_application=%d", 1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type, pass_to_application); 1115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Store the updated key in the device database */ 1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1117c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << "bd_addr:" << bd_addr; 1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_rec = btm_find_dev(bd_addr)) != NULL && 1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_keys || key_type == BTM_LE_KEY_LID)) { 1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_init_pseudo_addr(p_rec, bd_addr); 1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (key_type) { 1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_PENC: 1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.pltk, p_keys->penc_key.ltk, BT_OCTET16_LEN); 1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN); 1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level; 1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.ediv = p_keys->penc_key.ediv; 1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.key_size = p_keys->penc_key.key_size; 1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_PENC; 1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; 1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED) 1133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; 1134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; 1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x", 1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->sec_flags, p_rec->ble.keys.sec_level); 1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_PID: 1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BT_OCTET16_LEN; i++) { 1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.irk[i] = p_keys->pid_key.irk[i]; 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // memcpy( p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN); todo 1147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // will crash the system 1148c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_rec->ble.static_addr = p_keys->pid_key.static_addr; 1149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.static_addr_type = p_keys->pid_key.addr_type; 1150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_PID; 1151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_LE_KEY_PID key_type=0x%x save peer IRK", 1152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type); 1153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update device record address as static address */ 1154c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_rec->bd_addr = p_keys->pid_key.static_addr; 1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* combine DUMO device security record if needed */ 1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_consolidate_dev(p_rec); 1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_PCSRK: 1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.pcsrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN); 1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level; 1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.counter = p_keys->pcsrk_key.counter; 1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_PCSRK; 1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; 1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_keys->pcsrk_key.sec_level == SMP_SEC_AUTHENTICATED) 1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; 1167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; 1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x " 1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "peer_counter=%d", 1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->sec_flags, 1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.srk_sec_level, p_rec->ble.keys.counter); 1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_LENC: 1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.lltk, p_keys->lenc_key.ltk, BT_OCTET16_LEN); 1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */ 1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level; 1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.key_size = p_keys->lenc_key.key_size; 1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_LENC; 1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x " 1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "sec_level=0x%x", 1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->ble.keys.div, p_rec->ble.keys.key_size, 1188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.sec_level); 1189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_LCSRK: /* local CSRK has been delivered */ 1192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.lcsrk, p_keys->lcsrk_key.csrk, BT_OCTET16_LEN); 1193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */ 1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level; 1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter; 1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_LCSRK; 1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x " 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "local_counter=%d", 1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->ble.keys.div, 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_csrk_sec_level, 1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_counter); 1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_LID: 1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_LID; 1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)", 1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type); 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1214c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << "BLE key type 0x" << std::hex << key_type 1215c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " updated for BDA: " << bd_addr << " (btm_sec_save_le_key)"; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify the application that one of the BLE keys has been updated 1218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson If link key is in progress, it will get sent later.*/ 1219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pass_to_application && btm_cb.api.p_le_callback) { 1220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.key.p_key_value = p_keys; 1221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.key.key_type = key_type; 1222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_le_callback)(BTM_LE_KEY_EVT, bd_addr, &cb_data); 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1228c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(WARNING) << "BLE key type 0x" << std::hex << key_type 1229c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " called for Unknown BDA or type: " << bd_addr 1230c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << "(btm_sec_save_le_key)"; 1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec) { 1233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("sec_flags=0x%x", p_rec->sec_flags); 1234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_update_sec_key_size 1240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description update the current lin kencryption key size 1242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1246c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_ble_update_sec_key_size(const bt_bdaddr_t& bd_addr, 1247c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t enc_key_size) { 1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec; 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_update_sec_key_size enc_key_size = %d", 1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson enc_key_size); 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec = btm_find_dev(bd_addr); 1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec != NULL) { 1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->enc_key_size = enc_key_size; 1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_read_sec_key_size 1262ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1263ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description update the current lin kencryption key size 1264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1266ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1267ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1268c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskiuint8_t btm_ble_read_sec_key_size(const bt_bdaddr_t& bd_addr) { 1269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec; 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec = btm_find_dev(bd_addr); 1272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec != NULL) { 1273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return p_rec->enc_key_size; 1274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_link_sec_check 1281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Check BLE link security level match. 1283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true: check is OK and the *p_sec_req_act contain the action 1285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1287c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_ble_link_sec_check(const bt_bdaddr_t& bd_addr, 1288c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_LE_AUTH_REQ auth_req, 1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_REQ_ACT* p_sec_req_act) { 1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t req_sec_level = BTM_LE_SEC_NONE, cur_sec_level = BTM_LE_SEC_NONE; 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_link_sec_check auth_req =0x%x", auth_req); 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_ble_link_sec_check received for unknown device"); 1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING || 1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) { 1302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* race condition: discard the security request while master is encrypting 1303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * the link */ 1304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD; 1305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson req_sec_level = BTM_LE_SEC_UNAUTHENTICATE; 1307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (auth_req & BTM_LE_AUTH_REQ_MITM) { 1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson req_sec_level = BTM_LE_SEC_AUTHENTICATED; 1309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags); 1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* currently encrpted */ 1314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED) { 1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED) 1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = BTM_LE_SEC_AUTHENTICATED; 1317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE; 1319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* unencrypted link */ 1320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if bonded, get the key security level */ 1322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) 1323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = p_dev_rec->ble.keys.sec_level; 1324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = BTM_LE_SEC_NONE; 1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (cur_sec_level >= req_sec_level) { 1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* To avoid re-encryption on an encrypted link for an equal condition 1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * encryption */ 1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_ENCRYPT; 1332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start the pariring process to upgrade the keys*/ 1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_PAIR; 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("cur_sec_level=%d req_sec_level=%d sec_req_act=%d", 1339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level, req_sec_level, *p_sec_req_act); 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_encryption 1345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to ensure that LE connection is 1347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * encrypted. Should be called only on an open connection. 1348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Typically only needed for connections that first want to 1349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * bring up unencrypted links, then later encrypt them. 1350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1351ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device ER is copied into er 1353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1355c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub PawlowskitBTM_STATUS btm_ble_set_encryption(const bt_bdaddr_t& bd_addr, 1356c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_BLE_SEC_ACT sec_act, 1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t link_role) { 1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS cmd = BTM_NO_RESOURCES; 1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr); 1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_REQ_ACT sec_req_act; 1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_AUTH_REQ auth_req; 1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL) { 1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 1365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act); 1366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 1367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, 1370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->role_master); 1371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM) { 1373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->security_required |= BTM_SEC_IN_MITM; 1374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (sec_act) { 1377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_ENCRYPT: 1378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (link_role == BTM_ROLE_MASTER) { 1379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start link layer encryption using the security info stored */ 1380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = btm_ble_start_encrypt(bd_addr, false, NULL); 1381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if salve role then fall through to call SMP_Pair below which will send a 1384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sec_request to request the master to encrypt the link */ 1385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_ENCRYPT_NO_MITM: 1386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_ENCRYPT_MITM: 1387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson auth_req = (sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) 1388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? SMP_AUTH_GEN_BOND 1389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT); 1390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_link_sec_check(bd_addr, auth_req, &sec_req_act); 1391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_req_act == BTM_BLE_SEC_REQ_ACT_NONE || 1392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sec_req_act == BTM_BLE_SEC_REQ_ACT_DISCARD) { 1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s, no action needed. Ignore", __func__); 1394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = BTM_SUCCESS; 1395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (link_role == BTM_ROLE_MASTER) { 1398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_req_act == BTM_BLE_SEC_REQ_ACT_ENCRYPT) { 1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = btm_ble_start_encrypt(bd_addr, false, NULL); 1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (SMP_Pair(bd_addr) == SMP_STARTED) { 1405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = BTM_CMD_STARTED; 1406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 1407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = BTM_WRONG_MODE; 1412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return cmd; 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_ltk_request 1420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when encryption request is received 1422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on a slave device. 1423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1426ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1427ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_ltk_request(uint16_t handle, uint8_t rand[8], uint16_t ediv) { 1429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 1430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle); 1431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET8 dummy_stk = {0}; 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_ltk_request"); 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->ediv = ediv; 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN); 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!smp_proc_ltk_request(p_dev_rec->bd_addr)) 1441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_ltk_request_reply(p_dev_rec->bd_addr, false, dummy_stk); 1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_start_encrypt 1448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start LE encryption. 1450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if encryption was started successfully 1453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1455c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub PawlowskitBTM_STATUS btm_ble_start_encrypt(const bt_bdaddr_t& bda, bool use_stk, 1456c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski BT_OCTET16 stk) { 1457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 1458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda); 1459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET8 dummy_rand = {0}; 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_start_encrypt"); 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_rec) { 1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Link is not active, can not encrypt!"); 1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_WRONG_MODE; 1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) { 1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("Link Encryption is active, Busy!"); 1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_BUSY; 1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->enc_handle = p_rec->ble_hci_handle; 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (use_stk) { 1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk); 1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_rec->ble.key_type & BTM_LE_KEY_PENC) { 1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand, 1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.ediv, p_rec->ble.keys.pltk); 1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("No key available to encrypt the link"); 1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NO_RESOURCES; 1483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1484ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->sec_state == BTM_SEC_STATE_IDLE) 1486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 1487b6ab9b3af6b8793ff781e0359a78611726ab2300Jakub Pawlowski 1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_link_encrypted 1494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 14959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called when LE link encrption status is 14969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * changed. 1497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1500ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1501c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_ble_link_encrypted(const bt_bdaddr_t& bd_addr, uint8_t encr_enable) { 1502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool enc_cback; 1504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 1506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_link_encrypted (No Device Found!) encr_enable=%d", 1508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson encr_enable); 1509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_link_encrypted encr_enable=%d", encr_enable); 1513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson enc_cback = (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING); 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_link_encrypted(bd_addr, encr_enable); 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags); 1519ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (encr_enable && p_dev_rec->enc_key_size == 0) 1521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size; 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 1524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->p_callback && enc_cback) { 1525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (encr_enable) 1526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS, true); 1527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (p_dev_rec->role_master) 1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, true); 1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* to notify GATT to send data if any request is pending */ 1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson gatt_notify_enc_cmpl(p_dev_rec->ble.pseudo_addr); 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_ltk_request_reply 1537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 15389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to send a LTK request reply on a 15399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * slave 1540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * device. 1541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1544ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1545c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_ble_ltk_request_reply(const bt_bdaddr_t& bda, bool use_stk, 1546c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski BT_OCTET16 stk) { 1547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda); 1548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL) { 1551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_ble_ltk_request_reply received for unknown device"); 1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_ltk_request_reply"); 1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->enc_handle = p_rec->ble_hci_handle; 1557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->key_size = p_rec->ble.keys.key_size; 1558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("key size = %d", p_rec->ble.keys.key_size); 1560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (use_stk) { 1561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk); 1562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* calculate LTK using peer device */ 1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->ble.key_type & BTM_LE_KEY_LENC) 1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p_rec->ble.keys.lltk); 1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_ltk_req_neg_reply(btm_cb.enc_handle); 1568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_io_capabilities_req 1574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 15759ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to handle SMP get IO capability 15769ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * request. 1577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1580ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC* p_dev_rec, 1582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_IO_REQ* p_data) { 1583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t callback_rc = BTM_SUCCESS; 1584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req"); 1585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback) { 1586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the callback function implementation may change the IO capability... */ 1587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = (*btm_cb.api.p_le_callback)( 1588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data); 1589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != p_data->oob_data)) { 1591d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_BLE_CONFORMANCE_TESTING == TRUE) 1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.keep_rfu_in_auth_req) { 1593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req keep_rfu_in_auth_req = %u", 1594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.keep_rfu_in_auth_req); 1595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= BTM_LE_AUTH_REQ_MASK_KEEP_RFU; 1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.keep_rfu_in_auth_req = false; 1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { /* default */ 1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= BTM_LE_AUTH_REQ_MASK; 1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1600a6ce7751d84218c193eb90d390aef23217b1737eWei Wang#else 1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= BTM_LE_AUTH_REQ_MASK; 1602a6ce7751d84218c193eb90d390aef23217b1737eWei Wang#endif 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d " 1606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "auth_req:%d", 1607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required, p_data->auth_req); 1608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK " 1610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "1-IRK 2-CSRK)", 1611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys, p_data->resp_keys); 1612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if authentication requires MITM protection, put on the mask */ 1614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->security_required & BTM_SEC_IN_MITM) 1615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req |= BTM_LE_AUTH_REQ_MITM; 1616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_data->auth_req & SMP_AUTH_BOND)) { 1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Non bonding: No keys should be exchanged"); 1619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys = 0; 1620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->resp_keys = 0; 1621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 3: auth_req:%d", 1624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req); 1625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x", 1626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys, p_data->resp_keys); 1627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d", 1630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->io_cap, p_data->auth_req); 1631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* remove MITM protection requirement if IO cap does not allow it */ 1633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE) 1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM; 1635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_data->auth_req & SMP_SC_SUPPORT_BIT)) { 1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if Secure Connections are not supported then remove LK derivation, 1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** and keypress notifications. 1639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s-SC not supported -> No LK derivation, no keypress notifications", 1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= ~SMP_KP_SUPPORT_BIT; 1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys &= ~SMP_SEC_KEY_TYPE_LK; 1645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->resp_keys &= ~SMP_SEC_KEY_TYPE_LK; 1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:0x%02x", 1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->io_cap, p_data->oob_data, p_data->auth_req); 1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return callback_rc; 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1655444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1656ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1657ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_br_keys_req 1658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to handle SMP request for keys sent 1660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * over BR/EDR. 1661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_ble_br_keys_req(tBTM_SEC_DEV_REC* p_dev_rec, 1666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_IO_REQ* p_data) { 1667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t callback_rc = BTM_SUCCESS; 1668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback) { 1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the callback function implementation may change the IO capability... */ 1671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = (*btm_cb.api.p_le_callback)( 1672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data); 1673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1674444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return callback_rc; 1676444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1677444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1678ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1679ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1680ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_connected 1681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is when a LE connection to the peer device is 1683ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * establsihed 1684ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1685ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1688c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_ble_connected(const bt_bdaddr_t& bda, uint16_t handle, 1689c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t enc_mode, uint8_t role, tBLE_ADDR_TYPE addr_type, 1690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UNUSED_ATTR bool addr_matched) { 1691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda); 1692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_CB* p_cb = &btm_cb.ble_ctr_cb; 1693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_ble_connected"); 1695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Commenting out trace due to obf/compilation problems. 1697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 1699c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " Security Manager: handle:" << handle 1700c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " enc_mode:" << enc_mode << " bda: " << bda 1701c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " RName: " << p_dev_rec->sec_bd_name; 1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_connected sec_flags=0x%x", p_dev_rec->sec_flags); 1704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1705c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " Security Manager: handle:" << handle 1706c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " enc_mode:" << enc_mode << " bda: " << bda; 1707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 1710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* There is no device record for new connection. Allocate one */ 1711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_alloc_dev(bda); 1712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) return; 1713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Update the timestamp for this device */ 1714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->timestamp = btm_cb.dev_rec_count++; 1716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update device information */ 1719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE; 1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble_hci_handle = handle; 1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.ble_addr_type = addr_type; 1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update pseudo address */ 1723c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.pseudo_addr = bda; 1724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->role_master = false; 1726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (role == HCI_ROLE_MASTER) p_dev_rec->role_master = true; 1727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1728d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 1729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!addr_matched) p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_PSEUDO; 17308b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 1731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched) 1732c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.cur_rand_addr = bda; 17338b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 17348b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 1735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->inq_var.directed_conn = BTM_BLE_CONNECT_EVT; 1736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1739ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/***************************************************************************** 1741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_conn_complete 1742ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description LE connection complete. 1744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/ 1746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_conn_complete(uint8_t* p, UNUSED_ATTR uint16_t evt_len, 1747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool enhanced) { 1748d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 17499462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski uint8_t peer_addr_type; 17508b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 1751c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bt_bdaddr_t local_rpa, peer_rpa; 1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t role, status, bda_type; 1753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t handle; 1754c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bt_bdaddr_t bda; 1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t conn_interval, conn_latency, conn_timeout; 1756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool match = false; 1757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(status, p); 1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(handle, p); 1760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(role, p); 1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(bda_type, p); 1762c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski STREAM_TO_BDADDR(to_BD_ADDR(bda), p); 1763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == 0) { 1765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (enhanced) { 1766c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski STREAM_TO_BDADDR(to_BD_ADDR(local_rpa), p); 1767c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski STREAM_TO_BDADDR(to_BD_ADDR(peer_rpa), p); 1768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 176916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 17709462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski STREAM_TO_UINT16(conn_interval, p); 17719462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski STREAM_TO_UINT16(conn_latency, p); 17729462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski STREAM_TO_UINT16(conn_timeout, p); 17739462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski handle = HCID_GET_HANDLE(handle); 17749462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski 17755d790e4732c68fc6a159138dd0bbde6086e063eeJakub Pawlowski#if (BLE_PRIVACY_SPT == TRUE) 1776c8e29efe4cf0c12cc301e91bfc89b3429c875849Jakub Pawlowski peer_addr_type = bda_type; 1777c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski match = btm_identity_addr_to_random_pseudo(&bda, &bda_type, true); 1778c8e29efe4cf0c12cc301e91bfc89b3429c875849Jakub Pawlowski 1779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* possiblly receive connection complete with resolvable random while 1780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson the device has been paired */ 1781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) { 17829462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski tBTM_SEC_DEV_REC* match_rec = btm_ble_resolve_random_addr(bda); 17839462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (match_rec) { 17849462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski LOG_INFO(LOG_TAG, "%s matched and resolved random address", __func__); 17859462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski match = true; 17869462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA; 1787c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski match_rec->ble.cur_rand_addr = bda; 17889462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (!btm_ble_init_pseudo_addr(match_rec, bda)) { 17899462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski /* assign the original address to be the current report address */ 1790c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bda = match_rec->ble.pseudo_addr; 17919462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } else { 1792c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bda = match_rec->bd_addr; 17939462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } 17949462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } else { 17959462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski LOG_INFO(LOG_TAG, "%s unable to match and resolve random address", 17969462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski __func__); 17979462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } 17989462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } 17998b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 1800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 18019462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski btm_ble_connected(bda, handle, HCI_ENCRYPT_MODE_DISABLED, role, bda_type, 18029462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski match); 1803444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 18049462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski l2cble_conn_comp(handle, role, bda, bda_type, conn_interval, conn_latency, 18059462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski conn_timeout); 1806444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1807444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 18089462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (enhanced) { 18099462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski btm_ble_refresh_local_resolvable_private_addr(bda, local_rpa); 1810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 18119462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (peer_addr_type & BLE_ADDR_TYPE_ID_BIT) 18129462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski btm_ble_refresh_peer_resolvable_private_addr(bda, peer_rpa, 18139462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski BLE_ADDR_RANDOM); 1814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 18159462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski#endif 1816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson role = HCI_ROLE_UNKNOWN; 1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) { 1819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_set_conn_st(BLE_CONN_IDLE); 1820d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, true); 1822a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#endif 1823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1824d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 1825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE; 1826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, true); 1827a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#endif 182870b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji } 1829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1830444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1831c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_ble_update_mode_operation(role, &bda, status); 1832ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1835ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_create_ll_conn_complete 1836ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1837ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description LE connection complete. 1838ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1839ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/ 1840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_create_ll_conn_complete(uint8_t status) { 1841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS) { 1842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_set_conn_st(BLE_CONN_IDLE); 1843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, NULL, status); 1844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 184524adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera} 184624adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera/***************************************************************************** 1847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_proc_smp_cback 1848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is the SMP callback handler. 1850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/ 1852c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskiuint8_t btm_proc_smp_cback(tSMP_EVT event, const bt_bdaddr_t& bd_addr, 1853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_EVT_DATA* p_data) { 1854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t res = 0; 1856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_proc_smp_cback event = %d", event); 1858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (event) { 1861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_IO_CAP_REQ_EVT: 1862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_io_capabilities_req(p_dev_rec, 1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_IO_REQ*)&p_data->io_req); 1864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_BR_KEYS_REQ_EVT: 1867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_br_keys_req(p_dev_rec, (tBTM_LE_IO_REQ*)&p_data->io_req); 1868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_PASSKEY_REQ_EVT: 1871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_PASSKEY_NOTIF_EVT: 1872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_OOB_REQ_EVT: 1873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_NC_REQ_EVT: 1874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_SC_OOB_REQ_EVT: 1875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* fall through */ 1876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 1877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_SEC_REQUEST_EVT: 1879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (event == SMP_SEC_REQUEST_EVT && 1880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) { 1881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: Ignoring SMP Security request", __func__); 1882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1884c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda = bd_addr; 1885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 1886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 1887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* fall through */ 1888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_COMPLT_EVT: 1890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback) { 1891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the callback function implementation may change the IO 1892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * capability... */ 1893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_cb.api.p_le_callback=0x%x", 1894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_le_callback); 1895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_le_callback)(event, bd_addr, 1896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_EVT_DATA*)p_data); 1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (event == SMP_COMPLT_EVT) { 1900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", 1902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->cmplt.sec_level, p_dev_rec->sec_flags); 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS 1905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_ERR_PROCESSING; 1906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "after update result=%d sec_level=0x%x sec_flags=0x%x", res, 1909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->cmplt.sec_level, p_dev_rec->sec_flags); 1910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data->cmplt.is_pair_cancel && 1912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_bond_cancel_cmpl_callback) { 1913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing Cancel completed"); 1914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS); 1915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1916d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_BLE_CONFORMANCE_TESTING == TRUE) 1917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_SUCCESS) { 1918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.devcb.no_disc_if_pair_fail && 1919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->cmplt.reason != SMP_CONN_TOUT) { 1920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL"); 1921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle); 1922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing failed - Not Removing ACL"); 1924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 1925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT) { 1929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL"); 1930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle); 1931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x", 1936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state, btm_cb.pairing_flags, btm_cb.pin_code_len); 1937c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << "btm_cb.pairing_bda: " << btm_cb.pairing_bda; 1938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reset btm state only if the callback address matches pairing 1940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * address*/ 1941c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (bd_addr == btm_cb.pairing_bda) { 1942c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda = { 1943c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski .address = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; 1944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; 1945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags = 0; 1946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res == BTM_SUCCESS) { 1949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 1950d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 1951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add all bonded device into resolving list if IRK is available*/ 1952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_resolving_list_load_dev(p_dev_rec); 1953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, res, true); 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("unknown event = %d", event); 1962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_proc_smp_cback received for unknown device"); 1966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleDataSignature 1974ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1975ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to sign the data using AES128 CMAC 1976ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * algorith. 1977ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1978ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter bd_addr: target device the data to be signed for. 1979ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_text: singing data 1980ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * len: length of the data to be signed. 1981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * signature: output parameter where data signature is going to 1982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * be stored. 1983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1984ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if signing sucessul, otherwise false. 1985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1986ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1987c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_BleDataSignature(const bt_bdaddr_t& bd_addr, uint8_t* p_text, 1988c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint16_t len, BLE_SIGNATURE signature) { 1989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr); 1990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 1992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool ret = false; 1993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL) { 1994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s-data signing can not be done from unknown device", 1995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_mac = (uint8_t*)signature; 1998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* pp; 1999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buf = (uint8_t*)osi_malloc(len + 4); 2000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s-Start to generate Local CSRK", __func__); 2002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pp = p_buf; 2003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* prepare plain text */ 2004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_text) { 2005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_buf, p_text, len); 2006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pp = (p_buf + len); 2007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter); 2010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter); 2011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ret = aes_cipher_msg_auth_code(p_rec->ble.keys.lcsrk, p_buf, 2013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint16_t)(len + 4), BTM_CMAC_TLEN_SIZE, 2014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_mac); 2015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ret == true) { 2016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_increment_sign_ctr(bd_addr, true); 2017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s p_mac = %d", __func__, p_mac); 2020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = " 2022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%02x", 2023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3)); 2024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = " 2026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%02x", 2027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7)); 2028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 2029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ret; 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2034ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2035ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleVerifySignature 2036ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2037ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to verify the data signature 2038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter bd_addr: target device the data to be signed for. 2040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_orig: original data before signature. 2041ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * len: length of the signing data 2042ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * counter: counter used when doing data signing 2043ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_comp: signature to be compared against. 2044ee96a3c60fca590d38025925c072d264e06493c4Myles Watson 2045ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if signature verified correctly; otherwise false. 2046ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2047ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2048c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_BleVerifySignature(const bt_bdaddr_t& bd_addr, uint8_t* p_orig, 2049c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint16_t len, uint32_t counter, uint8_t* p_comp) { 2050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool verified = false; 2051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr); 2052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t p_mac[BTM_CMAC_TLEN_SIZE]; 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK))) { 2055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("can not verify signature for unknown device"); 2056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (counter < p_rec->ble.keys.counter) { 2057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("signature received with out dated sign counter"); 2058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_orig == NULL) { 2059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("No signature to verify"); 2060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s rcv_cnt=%d >= expected_cnt=%d", __func__, counter, 2062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.counter); 2063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (aes_cipher_msg_auth_code(p_rec->ble.keys.pcsrk, p_orig, len, 2065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMAC_TLEN_SIZE, p_mac)) { 2066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0) { 2067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_increment_sign_ctr(bd_addr, false); 2068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson verified = true; 2069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return verified; 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2076ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2077ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetLeSecurityState 2078ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2079ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to get security mode 1 flags and 2080ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * encryption key size for LE peer. 2081ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2082ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true if LE device is found, false otherwise. 2083ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2084ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2085c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_GetLeSecurityState(const bt_bdaddr_t& bd_addr, 2086c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_le_dev_sec_flags, 2087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_le_key_size) { 2088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 2089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t dev_rec_sec_flags; 2090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags = 0; 2092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_key_size = 0; 2093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 2095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 2096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s fails", __func__); 2097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 2098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2099444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) { 2101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s-this is not LE device", __func__); 2102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 2103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dev_rec_sec_flags = p_dev_rec->sec_flags; 2106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (dev_rec_sec_flags & BTM_SEC_LE_ENCRYPTED) { 2108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* link is encrypted with LTK or STK */ 2109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_key_size = p_dev_rec->enc_key_size; 2110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags |= BTM_SEC_LE_LINK_ENCRYPTED; 2111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags |= 2113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (dev_rec_sec_flags & BTM_SEC_LE_AUTHENTICATED) 2114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ 2115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ 2116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) { 2117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* link is unencrypted, still LTK is available */ 2118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_key_size = p_dev_rec->ble.keys.key_size; 2119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags |= 2121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (dev_rec_sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) 2122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ 2123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ 2124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s - le_dev_sec_flags: 0x%02x, le_key_size: %d", __func__, 2127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags, *p_le_key_size); 2128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 2130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSecurityProcedureIsRunning 2135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function indicates if LE security procedure is 2137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * currently running with the peer. 2138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 21399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns bool true if security procedure is running, false 21409ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * otherwise. 2141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2143c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskibool BTM_BleSecurityProcedureIsRunning(const bt_bdaddr_t& bd_addr) { 2144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 2145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 2147c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(ERROR) << __func__ << " device with BDA: " << bd_addr 2148c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " is not found"; 2149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 2150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING || 2153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING); 2154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2157ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleGetSupportedKeySize 2159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function gets the maximum encryption key size in bytes 2161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device can suport. 2162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * record. 2163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns the key size or 0 if the size can't be retrieved. 2165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2167c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskiextern uint8_t BTM_BleGetSupportedKeySize(const bt_bdaddr_t& bd_addr) { 216884baa7f16e830394408278dbb8c508dd9fa02887Myles Watson#if (L2CAP_LE_COC_INCLUDED == TRUE) 2169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 2170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_IO_REQ dev_io_cfg; 2171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t callback_rc; 2172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 2174c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(ERROR) << __func__ << " device with BDA: " << bd_addr 2175c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " is not found"; 2176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback == NULL) { 2180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s can't access supported key size", __func__); 2181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = (*btm_cb.api.p_le_callback)( 2185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)&dev_io_cfg); 2186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (callback_rc != BTM_SUCCESS) { 2188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s can't access supported key size", __func__); 2189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s device supports key size = %d", __func__, 2193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dev_io_cfg.max_key_size); 2194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (dev_io_cfg.max_key_size); 2195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else 2196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2197444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2198444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2199444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Utility functions for LE device IR/ER generation 2202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_notify_new_key 2206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to notify application new keys have been 2208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * generated. 2209ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2210ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_notify_new_key(uint8_t key_type) { 2214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_LOCAL_KEYS* p_locak_keys = NULL; 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_notify_new_key key_type=%d", key_type); 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_key_callback) { 2219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (key_type) { 2220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ID: 2221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ID"); 2222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_locak_keys = (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.id_keys; 2223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ER: 2226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ER"); 2227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_locak_keys = 2228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.ble_encryption_key_value; 2229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 2232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("unknown key type: %d", key_type); 2233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_locak_keys != NULL) 2236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_le_key_callback)(key_type, p_locak_keys); 2237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_process_irk 2243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when IRK is generated, store it in 2245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * local control block. 2246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_ble_process_irk(tSMP_ENC* p) { 2251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_process_irk"); 2252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p && p->opcode == HCI_BLE_ENCRYPT) { 2253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN); 2254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_notify_new_key(BTM_BLE_KEY_TYPE_ID); 22552808a249c7fc1230eb8955481f94ea0e083165e4Satya Calloji 2256d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 2257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if privacy is enabled, new RPA should be calculated */ 2258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) { 22590c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btm_gen_resolvable_private_addr(base::Bind(&btm_gen_resolve_paddr_low)); 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif 2262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Generating IRK exception."); 2264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* proceed generate ER */ 22670c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand1) { 22680c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(&btm_cb.devcb.ble_encryption_key_value[0], rand1, BT_OCTET8_LEN); 22690c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski 22700c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand2) { 22710c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(&btm_cb.devcb.ble_encryption_key_value[8], rand2, BT_OCTET8_LEN); 22720c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btm_notify_new_key(BTM_BLE_KEY_TYPE_ER); 22730c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 22740c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski 22750c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_process_dhk 2281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when DHK is calculated, store it in 2283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * local control block, and proceed to generate ER, a 128-bits 2284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * random number. 2285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_ble_process_dhk(tSMP_ENC* p) { 2290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t btm_ble_irk_pt = 0x01; 2291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_ENC output; 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_process_dhk"); 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p && p->opcode == HCI_BLE_ENCRYPT) { 2296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN); 2297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BLE DHK generated."); 2298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* IRK = D1(IR, 1) */ 2300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt, 2301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1, &output)) { 2302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* reset all identity root related key */ 2303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 2304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_process_irk(&output); 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* reset all identity root related key */ 2309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 2310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 23150c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski * Function btm_ble_reset_id 2316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 23170c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski * Description This function is called to reset LE device identity. 2318ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2319ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 23220c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowskivoid btm_ble_reset_id(void) { 23230c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("btm_ble_reset_id"); 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23250c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski /* Regenerate Identity Root*/ 23260c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) { 23270c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("btm_ble_process_ir1"); 23280c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(btm_cb.devcb.id_keys.ir, rand, BT_OCTET8_LEN); 23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23300c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) { 23310c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski uint8_t btm_ble_dhk_pt = 0x03; 23320c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski tSMP_ENC output; 23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23340c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("btm_ble_process_ir2"); 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23360c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski /* remembering in control block */ 23370c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(&btm_cb.devcb.id_keys.ir[8], rand, BT_OCTET8_LEN); 23380c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski /* generate DHK= Eir({0x03, 0x00, 0x00 ...}) */ 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23400c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_dhk_pt, 1, 23410c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski &output); 23420c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btm_ble_process_dhk(&output); 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23440c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("BLE IR generated."); 23450c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 23460c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23496bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski/* This function set a random address to local controller. It also temporarily 23506bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski * disable scans and adv before sending the command to the controller. */ 2351c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btm_ble_set_random_address(const bt_bdaddr_t& random_bda) { 23526bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski tBTM_LE_RANDOM_CB* p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 23536bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb; 23546bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski bool adv_mode = btm_cb.ble_ctr_cb.inq_var.adv_mode; 23556bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 23566bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski BTM_TRACE_DEBUG("%s", __func__); 23576bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (btm_ble_get_conn_st() == BLE_DIR_CONN) { 23586bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski BTM_TRACE_ERROR("%s: Cannot set random address. Direct conn ongoing", 23596bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski __func__); 23606bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski return; 23616bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski } 23626bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 23636bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (adv_mode == BTM_BLE_ADV_ENABLE) 23646bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_DISABLE); 23656bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_stop_scan(); 23666bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btm_ble_suspend_bg_conn(); 23676bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 2368c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_cb->private_addr = random_bda; 23696bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btsnd_hcic_ble_set_random_addr(p_cb->private_addr); 23706bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 23716bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (adv_mode == BTM_BLE_ADV_ENABLE) 23726bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_ENABLE); 23736bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_start_scan(); 23746bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btm_ble_resume_bg_conn(); 23756bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski} 23766bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 2377bdd2f5001ffc7c53f0e38c2a98e393b1855f9ce6Myles Watson#if BTM_BLE_CONFORMANCE_TESTING == TRUE 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_no_disc_if_pair_fail 2381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 23829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function indicates whether no disconnect of the ACL 2383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * should be used if pairing failed 2384ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2385ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2386ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_no_disc_if_pair_fail(bool disable_disc) { 2389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", 2390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson disable_disc); 2391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.no_disc_if_pair_fail = disable_disc; 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_test_mac_value 2397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function set test MAC value 2399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_test_mac_value(bool enable, uint8_t* p_test_mac_val) { 2404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_test_mac_value enable=%d", enable); 2405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.enable_test_mac_val = enable; 2406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN); 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_test_local_sign_cntr_value 2412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function set test local sign counter value 2414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_test_local_sign_cntr_value(bool enable, 2419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t test_local_sign_cntr) { 2420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d", 2422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson enable, test_local_sign_cntr); 2423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.enable_test_local_sign_cntr = enable; 2424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.test_local_sign_cntr = test_local_sign_cntr; 24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 2428ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_keep_rfu_in_auth_req 2430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function indicates if RFU bits have to be kept as is 2432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (by default they have to be set to 0 by the sender). 2433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_keep_rfu_in_auth_req(bool keep_rfu) { 2438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_keep_rfu_in_auth_req keep_rfus=%d", keep_rfu); 2439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.keep_rfu_in_auth_req = keep_rfu; 2440a6ce7751d84218c193eb90d390aef23217b1737eWei Wang} 2441a6ce7751d84218c193eb90d390aef23217b1737eWei Wang 24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_BLE_CONFORMANCE_TESTING */ 2443