15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski * Copyright 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); 50d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowskiextern void gatt_notify_phy_updated(uint8_t status, uint16_t handle, 51d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski uint8_t tx_phy, uint8_t rx_phy); 52d88da92ae1e9dc81cd97cb30e920d588156cac11Jakub Pawlowskiextern void btm_ble_advertiser_notify_terminated_legacy( 53d88da92ae1e9dc81cd97cb30e920d588156cac11Jakub Pawlowski uint8_t status, uint16_t connection_handle); 54426da5ad3cc43336e48620605e37e9432b3cd126Andre Eisenbach 55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 569ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* External Function to be called by other modules */ 57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************** 59ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 60ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecAddBleDevice 61ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Add/modify device. This function will be normally called 63ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * during host startup to restore all required information 64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * for a LE device stored in the NVRAM. 65ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 66ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - BD address of the peer 679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * bd_name - Name of the peer device. NULL if unknown. 68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * dev_type - Remote device's device type. 69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * addr_type - LE device address type. 70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 74a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_SecAddBleDevice(const RawAddress& bd_addr, BD_NAME bd_name, 75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_DEVICE_TYPE dev_type, tBLE_ADDR_TYPE addr_type) { 76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: dev_type=0x%x", __func__, dev_type); 77c9f86da73bfb637426c83b86497c50fede4e0f63Jakub Pawlowski 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_allocate_dev_rec(); 81cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 82c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->bd_addr = bd_addr; 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_BR_EDR); 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_LE); 85cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update conn params, use default value for background connection params */ 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.min_conn_int = BTM_BLE_CONN_PARAM_UNDEF; 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.max_conn_int = BTM_BLE_CONN_PARAM_UNDEF; 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_PARAM_UNDEF; 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF; 91cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 92273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng BTM_TRACE_DEBUG("%s: Device added, handle=0x%x, p_dev_rec=%p, bd_addr=%s", 93273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng __func__, p_dev_rec->ble_hci_handle, p_dev_rec, 94273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng bd_addr.ToString().c_str()); 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (bd_name && bd_name[0]) { 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)p_dev_rec->sec_bd_name, (char*)bd_name, 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_MAX_REM_BD_NAME_LEN); 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->device_type |= dev_type; 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.ble_addr_type = addr_type; 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 107c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.pseudo_addr = bd_addr; 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* sync up with the Inq Data base*/ 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_INFO* p_info = BTM_InqDbRead(bd_addr); 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_info) { 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type; 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_info->results.device_type = p_dev_rec->device_type; 113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("InqDb device_type =0x%x addr_type=0x%x", 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_info->results.device_type, p_info->results.ble_addr_type); 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecAddBleKey 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Add/modify LE device information. This function will be 125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * normally called during host startup to restore all required 126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * information stored in the NVRAM. 127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - BD address of the peer 129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_le_key - LE key values. 130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * key_type - LE SMP key type. 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* 132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if added OK, else false 133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 135a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_SecAddBleKey(const RawAddress& bd_addr, tBTM_LE_KEY_VALUE* p_le_key, 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_KEY_TYPE key_type) { 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_SecAddBleKey"); 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec || !p_le_key || 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID && 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC && 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type != BTM_LE_KEY_LCSRK && key_type != BTM_LE_KEY_LID)) { 144c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(WARNING) << __func__ 145c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " Wrong Type, or No Device record for bdaddr: " << bd_addr 146c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << ", Type: " << key_type; 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 150c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " BDA: " << bd_addr << ", Type: " << key_type; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_save_le_key(bd_addr, key_type, p_le_key, false); 153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (key_type == BTM_LE_KEY_PID || key_type == BTM_LE_KEY_LID) 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_resolving_list_load_dev(p_dev_rec); 157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleLoadLocalKeys 165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Local local identity key, encryption root or sign counter. 167ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: key_type: type of key, can be BTM_BLE_KEY_TYPE_ID, 1699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_BLE_KEY_TYPE_ER 1709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * or BTM_BLE_KEY_TYPE_COUNTER. 171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_key: pointer to the key. 1729ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * 173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns non2. 174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 175ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleLoadLocalKeys(uint8_t key_type, tBTM_BLE_LOCAL_KEYS* p_key) { 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_DEVCB* p_devcb = &btm_cb.devcb; 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_key != NULL) { 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (key_type) { 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ID: 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&p_devcb->id_keys, &p_key->id_keys, 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ER: 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_devcb->ble_encryption_key_value, p_key->er, 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sizeof(BT_OCTET16)); 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("unknow local key type: %d", key_type); 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetDeviceEncRoot 201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device encryption 203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * root. 204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device ER is copied into ble_encr_key_value 207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceEncRoot(BT_OCTET16 ble_encr_key_value) { 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(ble_encr_key_value, btm_cb.devcb.ble_encryption_key_value, 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET16_LEN); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetDeviceIDRoot 218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device identity 220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * root. 221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device IR is copied into irk 224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceIDRoot(BT_OCTET16 irk) { 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_GetDeviceIDRoot "); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN); 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetDeviceDHK 235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device DHK. 237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device DHK is copied into dhk 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceDHK(BT_OCTET16 dhk) { 243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_GetDeviceDHK"); 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadConnectionAddr 250ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to get the local device address 2529ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * information. 253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 257a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_ReadConnectionAddr(const RawAddress& remote_bda, 258a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress& local_conn_addr, 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE* p_addr_type) { 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_LE); 261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl == NULL) { 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("No connection exist!"); 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 266c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski local_conn_addr = p_acl->conn_addr; 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_acl->conn_addr_type; 268ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_ReadConnectionAddr address type: %d addr: 0x%02x", 270c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_acl->conn_addr_type, p_acl->conn_addr.address[0]); 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 272bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen 2736975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************* 274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_IsBleConnection 276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if the connection handle 278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * for an LE link 279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if connection is LE link, otherwise false. 281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_IsBleConnection(uint16_t conn_handle) { 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx; 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p; 2866975b4d711142b885af479721cada448952c6b41Andre Eisenbach 287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_IsBleConnection: conn_handle: %d", conn_handle); 2886975b4d711142b885af479721cada448952c6b41Andre Eisenbach 289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx = btm_handle_to_acl_index(conn_handle); 290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx >= MAX_L2CAP_LINKS) return false; 2916975b4d711142b885af479721cada448952c6b41Andre Eisenbach 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.acl_db[xx]; 2936975b4d711142b885af479721cada448952c6b41Andre Eisenbach 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->transport == BT_TRANSPORT_LE); 2956975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2999ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Function BTM_ReadRemoteConnectionAddr 300ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is read the remote device address currently used 302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters pseudo_addr: pseudo random address available 304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * conn_addr:connection address used 3059ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_addr_type : BD Address type, Public or Random of the address 3069ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * used 307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns bool, true if connection to remote device exists, else false 309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 310ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 311a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_ReadRemoteConnectionAddr(const RawAddress& pseudo_addr, 312a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress& conn_addr, 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE* p_addr_type) { 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool st = true; 3157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_PRIVACY_SPT == TRUE) 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p = btm_bda_to_acl(pseudo_addr, BT_TRANSPORT_LE); 317ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p == NULL) { 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR( 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_ReadRemoteConnectionAddr can not find connection" 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " with matching address"); 322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3248b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 325c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski conn_addr = p->active_remote_addr; 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p->active_remote_addr_type; 3278b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#else 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(pseudo_addr); 3297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 330c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski conn_addr = pseudo_addr; 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_dev_rec->ble.ble_addr_type; 333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3348b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return st; 336ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 337ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SecurityGrant 340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to grant security process. 342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters bd_addr - peer device bd address. 344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - result of the operation BTM_SUCCESS if success. 3459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Otherwise, BTM_REPEATED_ATTEMPTS if too many 3469ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * attempts. 347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 351a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_SecurityGrant(const RawAddress& bd_addr, uint8_t res) { 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = 353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS; 354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_SecurityGrant"); 355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_SecurityGrant(bd_addr, res_smp); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 360ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BlePasskeyReply 361ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 362ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called after Security Manager submitted 363ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * passkey request to the application. 364ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters: bd_addr - Address of the device for which passkey was 3669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * requested 3679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * res - result of the operation BTM_SUCCESS if success 3689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * key_len - length in bytes of the Passkey 3699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_passkey - pointer to array with the passkey 3709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * trusted_mask - bitwise OR of trusted services (array of 3719ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * uint32_t) 372ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 374a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BlePasskeyReply(const RawAddress& bd_addr, uint8_t res, 375c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint32_t passkey) { 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL; 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Passkey reply to Unknown device"); 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 384ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_BlePasskeyReply"); 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_PasskeyReply(bd_addr, res_smp, passkey); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleConfirmReply 393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called after Security Manager submitted 395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * numeric comparison request to the application. 396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the device with which numeric 398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * comparison was requested 399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - comparison result BTM_SUCCESS if success 400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 402a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleConfirmReply(const RawAddress& bd_addr, uint8_t res) { 403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL; 406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Passkey reply to Unknown device"); 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_ConfirmReply(bd_addr, res_smp); 415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleOobDataReply 420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the OOB data for 422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SMP in response to BTM_LE_OOB_REQ_EVT 423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * res - result of the operation SMP_SUCCESS if success 4269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_data - oob data, depending on transport and 4279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * capabilities. 428ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Might be "Simple Pairing Randomizer", or 429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * "Security Manager TK Value". 430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 432a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleOobDataReply(const RawAddress& bd_addr, uint8_t res, uint8_t len, 433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_data) { 434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL; 435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s:", __func__); 438ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: Unknown device", __func__); 441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_OobDataReply(bd_addr, res_smp, len, p_data); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 448bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski/******************************************************************************* 449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSecureConnectionOobDataReply 451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to provide the OOB data for 453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SMP in response to BTM_LE_OOB_REQ_EVT when secure connection 454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * data is available 455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Address of the peer device 457ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_c - pointer to Confirmation. 458ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_r - pointer to Randomizer 459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 461a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleSecureConnectionOobDataReply(const RawAddress& bd_addr, 462c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_c, uint8_t* p_r) { 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 464bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s:", __func__); 466bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: Unknown device", __func__); 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 471bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 473bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_SC_OOB_DATA oob; 475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&oob, 0, sizeof(tSMP_SC_OOB_DATA)); 476bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson oob.peer_oob_data.present = true; 478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&oob.peer_oob_data.randomizer, p_r, BT_OCTET16_LEN); 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&oob.peer_oob_data.commitment, p_c, BT_OCTET16_LEN); 480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson oob.peer_oob_data.addr_rcvd_from.type = p_dev_rec->ble.ble_addr_type; 48178b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski oob.peer_oob_data.addr_rcvd_from.bda = bd_addr; 482bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SMP_SecureConnectionOobDataReply((uint8_t*)&oob); 484bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski} 485bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSetConnScanParams 489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Set scan parameter used in BLE connection request 491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: scan_interval: scan interval 493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * scan_window: scan window 494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleSetConnScanParams(uint32_t scan_interval, uint32_t scan_window) { 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb; 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool new_param = false; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_SCAN_INT_MAX) && 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_SCAN_WIN_MAX)) { 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ble_cb->scan_int != scan_interval) { 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ble_cb->scan_int = scan_interval; 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson new_param = true; 509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ble_cb->scan_win != scan_window) { 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ble_cb->scan_win = scan_window; 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson new_param = true; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (new_param && p_ble_cb->conn_state == BLE_BG_CONN) { 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_suspend_bg_conn(); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Illegal Connection Scan Parameters"); 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************** 525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSetPrefConnParams 527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Set a peripheral's preferred connection parameters 529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - BD address of the peripheral 531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * scan_interval: scan interval 532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * scan_window: scan window 533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * min_conn_int - minimum preferred connection interval 534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * max_conn_int - maximum preferred connection interval 535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * slave_latency - preferred slave latency 536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * supervision_tout - preferred supervision timeout 537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 541a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleSetPrefConnParams(const RawAddress& bd_addr, uint16_t min_conn_int, 542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t max_conn_int, uint16_t slave_latency, 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t supervision_tout) { 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_BleSetPrefConnParams min: %u max: %u latency: %u \ 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tout: %u", 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson min_conn_int, max_conn_int, slave_latency, supervision_tout); 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_BLE_ISVALID_PARAM(min_conn_int, BTM_BLE_CONN_INT_MIN, 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_CONN_INT_MAX) && 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_ISVALID_PARAM(max_conn_int, BTM_BLE_CONN_INT_MIN, 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_CONN_INT_MAX) && 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_ISVALID_PARAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_CONN_SUP_TOUT_MAX) && 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (slave_latency <= BTM_BLE_CONN_LATENCY_MAX || 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson slave_latency == BTM_BLE_CONN_PARAM_UNDEF)) { 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* expect conn int and stout and slave latency to be updated all together 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF || 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) { 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.min_conn_int = min_conn_int; 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.min_conn_int = max_conn_int; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.max_conn_int = max_conn_int; 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.max_conn_int = min_conn_int; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF) 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.slave_latency = slave_latency; 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.supervision_tout = supervision_tout; 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF; 583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Unknown Device, setting rejected"); 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Illegal Connection Parameters"); 590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadDevInfo 596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the device/address type 598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * of BD address. 599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter remote_bda: remote device address 601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_dev_type: output parameter to read the device type. 602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_addr_type: output parameter to read the address type. 603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 605a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_ReadDevInfo(const RawAddress& remote_bda, tBT_DEVICE_TYPE* p_dev_type, 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE* p_addr_type) { 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(remote_bda); 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_INFO* p_inq_info = BTM_InqDbRead(remote_bda); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = BLE_ADDR_PUBLIC; 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = BT_DEVICE_TYPE_BREDR; 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check with the BT manager if details about remote device are known */ 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq_info != NULL) { 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = p_inq_info->results.device_type; 617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_inq_info->results.ble_addr_type; 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* unknown device, assume BR/EDR */ 620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_find_dev_type - unknown device, BR/EDR assumed"); 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* there is a security device record exisitng */ 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* new inquiry result, overwrite device type in security device record */ 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq_info) { 626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->device_type = p_inq_info->results.device_type; 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 629c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (p_dev_rec->bd_addr == remote_bda && 630c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.pseudo_addr == remote_bda) { 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = p_dev_rec->device_type; 632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_dev_rec->ble.ble_addr_type; 633c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski } else if (p_dev_rec->ble.pseudo_addr == remote_bda) { 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = BT_DEVICE_TYPE_BLE; 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = p_dev_rec->ble.ble_addr_type; 636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* matching static adddress only */ 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type = BT_DEVICE_TYPE_BREDR; 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_addr_type = BLE_ADDR_PUBLIC; 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_find_dev_type - device_type = %d addr_type = %d", 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_dev_type, *p_addr_type); 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6471f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji/******************************************************************************* 648ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 649ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadConnectedTransportAddress 650ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to read the paired device/address 6529ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * type of other device paired corresponding to the BD_address 653ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6549ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameter remote_bda: remote device address, carry out the transport 6559ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * address 656ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * transport: active transport 657ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Return true if an active link is identified; false otherwise 659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 661a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_ReadConnectedTransportAddress(RawAddress* remote_bda, 662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport) { 663c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(*remote_bda); 6641f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if no device can be located, return */ 666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) return false; 6671f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_BR_EDR) { 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_bda_to_acl(p_dev_rec->bd_addr, transport) != NULL) { 670c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski *remote_bda = p_dev_rec->bd_addr; 671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_dev_rec->device_type & BT_DEVICE_TYPE_BREDR) { 673c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski *remote_bda = p_dev_rec->bd_addr; 674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 675b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski *remote_bda = RawAddress::kEmpty; 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6781f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_LE) { 680c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski *remote_bda = p_dev_rec->ble.pseudo_addr; 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_bda_to_acl(p_dev_rec->ble.pseudo_addr, transport) != NULL) 682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6861f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 6881f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji} 6891f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji 690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleReceiverTest 693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 694ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start the LE Receiver test 695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 696ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter rx_freq - Frequency Range 697ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_cmd_cmpl_cback - Command Complete callback 698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 699ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleReceiverTest(uint8_t rx_freq, tBTM_CMPL_CB* p_cmd_cmpl_cback) { 701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; 702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_receiver_test(rx_freq); 704ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleTransmitterTest 709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start the LE Transmitter test 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter tx_freq - Frequency Range 7139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * test_data_len - Length in bytes of payload data in each 7149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * packet 715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * packet_payload - Pattern to use in the payload 716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_cmd_cmpl_cback - Command Complete callback 717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 719d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenvoid BTM_BleTransmitterTest(uint8_t tx_freq, uint8_t test_data_len, 720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t packet_payload, 721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cmd_cmpl_cback) { 722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; 723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload); 724ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 727ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleTestEnd 729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7309ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to stop the in-progress TX or RX 7319ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * test 732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter p_cmd_cmpl_cback - Command complete callback 734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 735ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleTestEnd(tBTM_CMPL_CB* p_cmd_cmpl_cback) { 737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; 738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_test_end(); 740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Internal Functions 744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_test_command_complete(uint8_t* p) { 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_le_test_cmd_cmpl_cb; 747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_le_test_cmd_cmpl_cb = NULL; 749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) { 751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb)(p); 752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 756ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 757ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_UseLeLink 758ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7599ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is to select the underlying physical link to 7609ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * use. 761ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 762ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true to use LE, false use BR/EDR. 763ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 764ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 765a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_UseLeLink(const RawAddress& bd_addr) { 766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p; 767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_DEVICE_TYPE dev_type; 768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBLE_ADDR_TYPE addr_type; 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool use_le = false; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR); 772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != NULL) { 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return use_le; 774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE); 776f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p != NULL) { 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson use_le = true; 778f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } else { 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); 780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson use_le = (dev_type == BT_DEVICE_TYPE_BLE); 7816975b4d711142b885af479721cada448952c6b41Andre Eisenbach } 782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return use_le; 7846975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 785636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 786636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera/******************************************************************************* 787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetBleDataLength 789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to set maximum BLE transmission packet size 791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if success; otherwise failed. 793ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 794ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 795a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitBTM_STATUS BTM_SetBleDataLength(const RawAddress& bd_addr, 796c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint16_t tx_pdu_length) { 797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE); 7987d1faf334e83332d733d8886069ffb2585cf1b8dliuchao 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl == NULL) { 800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported", 801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_WRONG_MODE; 803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8047d1faf334e83332d733d8886069ffb2585cf1b8dliuchao 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: tx_pdu_length =%d", __func__, tx_pdu_length); 806636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->supports_ble_packet_extension()) { 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s failed, request not supported", __func__); 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_ILLEGAL_VALUE; 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 811636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) { 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s failed, peer does not support request", __func__); 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_ILLEGAL_VALUE; 815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 816636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (tx_pdu_length > BTM_BLE_DATA_SIZE_MAX) 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tx_pdu_length = BTM_BLE_DATA_SIZE_MAX; 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (tx_pdu_length < BTM_BLE_DATA_SIZE_MIN) 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tx_pdu_length = BTM_BLE_DATA_SIZE_MIN; 821636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* always set the TxTime to be max, as controller does not care for now */ 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_set_data_length(p_acl->hci_handle, tx_pdu_length, 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BLE_DATA_TX_TIME_MAX); 825636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SUCCESS; 827636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera} 828636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 8295a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid read_phy_cb( 8305a475e71a01322367a2ba591aecd62781902cfc2Avish Shah base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb, 8315a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t* data, uint16_t len) { 8325a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t status, tx_phy, rx_phy; 8335a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint16_t handle; 8345a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8355a475e71a01322367a2ba591aecd62781902cfc2Avish Shah LOG_ASSERT(len == 5) << "Received bad response length: " << len; 8365a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t* pp = data; 8375a475e71a01322367a2ba591aecd62781902cfc2Avish Shah STREAM_TO_UINT8(status, pp); 8385a475e71a01322367a2ba591aecd62781902cfc2Avish Shah STREAM_TO_UINT16(handle, pp); 8395a475e71a01322367a2ba591aecd62781902cfc2Avish Shah handle = handle & 0x0FFF; 8405a475e71a01322367a2ba591aecd62781902cfc2Avish Shah STREAM_TO_UINT8(tx_phy, pp); 8415a475e71a01322367a2ba591aecd62781902cfc2Avish Shah STREAM_TO_UINT8(rx_phy, pp); 8425a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8435a475e71a01322367a2ba591aecd62781902cfc2Avish Shah DVLOG(1) << __func__ << " Received read_phy_cb"; 8445a475e71a01322367a2ba591aecd62781902cfc2Avish Shah cb.Run(tx_phy, rx_phy, status); 8455a475e71a01322367a2ba591aecd62781902cfc2Avish Shah} 8465a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8475a475e71a01322367a2ba591aecd62781902cfc2Avish Shah/******************************************************************************* 8485a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 8495a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Function BTM_BleReadPhy 8505a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 8515a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Description To read the current PHYs for specified LE connection 8525a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 8535a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 8545a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Returns BTM_SUCCESS if command successfully sent to controller, 8555a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * BTM_MODE_UNSUPPORTED if local controller doesn't support LE 8565a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 2M or LE Coded PHY, 8575a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * BTM_WRONG_MODE if Device in wrong mode for request. 8585a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 8595a475e71a01322367a2ba591aecd62781902cfc2Avish Shah ******************************************************************************/ 8605a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid BTM_BleReadPhy( 861a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski const RawAddress& bd_addr, 8625a475e71a01322367a2ba591aecd62781902cfc2Avish Shah base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb) { 8635a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_DEBUG("%s", __func__); 8645a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8655a475e71a01322367a2ba591aecd62781902cfc2Avish Shah tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE); 8665a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8675a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (p_acl == NULL) { 8685a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported", 8695a475e71a01322367a2ba591aecd62781902cfc2Avish Shah __func__); 8705a475e71a01322367a2ba591aecd62781902cfc2Avish Shah cb.Run(0, 0, HCI_ERR_NO_CONNECTION); 8715a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return; 8725a475e71a01322367a2ba591aecd62781902cfc2Avish Shah } 8735a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8745a475e71a01322367a2ba591aecd62781902cfc2Avish Shah // checking if local controller supports it! 8755a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (!controller_get_interface()->supports_ble_2m_phy() && 8765a475e71a01322367a2ba591aecd62781902cfc2Avish Shah !controller_get_interface()->supports_ble_coded_phy()) { 8775a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_ERROR("%s failed, request not supported in local controller!", 8785a475e71a01322367a2ba591aecd62781902cfc2Avish Shah __func__); 879d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski cb.Run(0, 0, GATT_REQ_NOT_SUPPORTED); 8805a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return; 8815a475e71a01322367a2ba591aecd62781902cfc2Avish Shah } 8825a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8835a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint16_t handle = p_acl->hci_handle; 8845a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8855a475e71a01322367a2ba591aecd62781902cfc2Avish Shah const uint8_t len = HCIC_PARAM_SIZE_BLE_READ_PHY; 8865a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t data[len]; 8875a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t* pp = data; 8885a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT16_TO_STREAM(pp, handle); 8895a475e71a01322367a2ba591aecd62781902cfc2Avish Shah btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_READ_PHY, data, len, 8905a475e71a01322367a2ba591aecd62781902cfc2Avish Shah base::Bind(&read_phy_cb, std::move(cb))); 8915a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return; 8925a475e71a01322367a2ba591aecd62781902cfc2Avish Shah} 8935a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8945a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid doNothing(uint8_t* data, uint16_t len) {} 8955a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 8965a475e71a01322367a2ba591aecd62781902cfc2Avish Shah/******************************************************************************* 8975a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 8985a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Function BTM_BleSetDefaultPhy 8995a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9005a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Description To set preferred PHY for ensuing LE connections 9015a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9025a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9035a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Returns BTM_SUCCESS if command successfully sent to controller, 9045a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * BTM_MODE_UNSUPPORTED if local controller doesn't support LE 9055a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 2M or LE Coded PHY 9065a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9075a475e71a01322367a2ba591aecd62781902cfc2Avish Shah ******************************************************************************/ 9085a475e71a01322367a2ba591aecd62781902cfc2Avish ShahtBTM_STATUS BTM_BleSetDefaultPhy(uint8_t all_phys, uint8_t tx_phys, 9095a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t rx_phys) { 9105a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_DEBUG("%s: all_phys = 0x%02x, tx_phys = 0x%02x, rx_phys = 0x%02x", 9115a475e71a01322367a2ba591aecd62781902cfc2Avish Shah __func__, all_phys, tx_phys, rx_phys); 9125a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9135a475e71a01322367a2ba591aecd62781902cfc2Avish Shah // checking if local controller supports it! 9145a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (!controller_get_interface()->supports_ble_2m_phy() && 9155a475e71a01322367a2ba591aecd62781902cfc2Avish Shah !controller_get_interface()->supports_ble_coded_phy()) { 9165a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_ERROR("%s failed, request not supported in local controller!", 9175a475e71a01322367a2ba591aecd62781902cfc2Avish Shah __func__); 9185a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return BTM_MODE_UNSUPPORTED; 9195a475e71a01322367a2ba591aecd62781902cfc2Avish Shah } 9205a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9215a475e71a01322367a2ba591aecd62781902cfc2Avish Shah const uint8_t len = HCIC_PARAM_SIZE_BLE_SET_DEFAULT_PHY; 9225a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t data[len]; 9235a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t* pp = data; 9245a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT8_TO_STREAM(pp, all_phys); 9255a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT8_TO_STREAM(pp, tx_phys); 9265a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT8_TO_STREAM(pp, rx_phys); 9275a475e71a01322367a2ba591aecd62781902cfc2Avish Shah btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_SET_DEFAULT_PHY, data, len, 9285a475e71a01322367a2ba591aecd62781902cfc2Avish Shah base::Bind(doNothing)); 9295a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return BTM_SUCCESS; 9305a475e71a01322367a2ba591aecd62781902cfc2Avish Shah} 9315a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9325a475e71a01322367a2ba591aecd62781902cfc2Avish Shah/******************************************************************************* 9335a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9345a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Function BTM_BleSetPhy 9355a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9365a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Description To set PHY preferences for specified LE connection 9375a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9385a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9395a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Returns BTM_SUCCESS if command successfully sent to controller, 9405a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * BTM_MODE_UNSUPPORTED if local controller doesn't support LE 9415a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 2M or LE Coded PHY, 9425a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * BTM_ILLEGAL_VALUE if specified remote doesn't support LE 2M 9435a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * or LE Coded PHY, 9445a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * BTM_WRONG_MODE if Device in wrong mode for request. 9455a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * 9465a475e71a01322367a2ba591aecd62781902cfc2Avish Shah ******************************************************************************/ 947a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleSetPhy(const RawAddress& bd_addr, uint8_t tx_phys, uint8_t rx_phys, 9485a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint16_t phy_options) { 9495a475e71a01322367a2ba591aecd62781902cfc2Avish Shah tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE); 9505a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9515a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (p_acl == NULL) { 9525a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported", 9535a475e71a01322367a2ba591aecd62781902cfc2Avish Shah __func__); 9545a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return; 9555a475e71a01322367a2ba591aecd62781902cfc2Avish Shah } 9565a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9575a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t all_phys = 0; 9585a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (tx_phys == 0) all_phys &= 0x01; 9595a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (rx_phys == 0) all_phys &= 0x02; 9605a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9615a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_DEBUG( 9625a475e71a01322367a2ba591aecd62781902cfc2Avish Shah "%s: all_phys = 0x%02x, tx_phys = 0x%02x, rx_phys = 0x%02x, phy_options " 9635a475e71a01322367a2ba591aecd62781902cfc2Avish Shah "= 0x%04x", 9645a475e71a01322367a2ba591aecd62781902cfc2Avish Shah __func__, all_phys, tx_phys, rx_phys, phy_options); 9655a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 966d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski uint16_t handle = p_acl->hci_handle; 967d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski 9685a475e71a01322367a2ba591aecd62781902cfc2Avish Shah // checking if local controller supports it! 9695a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (!controller_get_interface()->supports_ble_2m_phy() && 9705a475e71a01322367a2ba591aecd62781902cfc2Avish Shah !controller_get_interface()->supports_ble_coded_phy()) { 9715a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_ERROR("%s failed, request not supported in local controller!", 9725a475e71a01322367a2ba591aecd62781902cfc2Avish Shah __func__); 973d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski gatt_notify_phy_updated(GATT_REQ_NOT_SUPPORTED, handle, tx_phys, rx_phys); 9745a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return; 9755a475e71a01322367a2ba591aecd62781902cfc2Avish Shah } 9765a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9775a475e71a01322367a2ba591aecd62781902cfc2Avish Shah if (!HCI_LE_2M_PHY_SUPPORTED(p_acl->peer_le_features) && 9785a475e71a01322367a2ba591aecd62781902cfc2Avish Shah !HCI_LE_CODED_PHY_SUPPORTED(p_acl->peer_le_features)) { 9795a475e71a01322367a2ba591aecd62781902cfc2Avish Shah BTM_TRACE_ERROR("%s failed, peer does not support request", __func__); 980d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski gatt_notify_phy_updated(GATT_REQ_NOT_SUPPORTED, handle, tx_phys, rx_phys); 9815a475e71a01322367a2ba591aecd62781902cfc2Avish Shah return; 9825a475e71a01322367a2ba591aecd62781902cfc2Avish Shah } 9835a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9845a475e71a01322367a2ba591aecd62781902cfc2Avish Shah const uint8_t len = HCIC_PARAM_SIZE_BLE_SET_PHY; 9855a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t data[len]; 9865a475e71a01322367a2ba591aecd62781902cfc2Avish Shah uint8_t* pp = data; 9875a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT16_TO_STREAM(pp, handle); 9885a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT8_TO_STREAM(pp, all_phys); 9895a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT8_TO_STREAM(pp, tx_phys); 9905a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT8_TO_STREAM(pp, rx_phys); 9915a475e71a01322367a2ba591aecd62781902cfc2Avish Shah UINT16_TO_STREAM(pp, phy_options); 9925a475e71a01322367a2ba591aecd62781902cfc2Avish Shah btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_SET_PHY, data, len, 9935a475e71a01322367a2ba591aecd62781902cfc2Avish Shah base::Bind(doNothing)); 9945a475e71a01322367a2ba591aecd62781902cfc2Avish Shah} 9955a475e71a01322367a2ba591aecd62781902cfc2Avish Shah 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 997ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 998ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_determine_security_act 999ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1000ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function checks the security of current LE link 1001ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and returns the appropriate action that needs to be 1002ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * taken to achieve the required security. 1003ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1004ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter is_originator - True if outgoing connection 1005ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * bdaddr: remote device address 1006ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * security_required: Security required for the service. 1007ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1008ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns The appropriate security action required. 1009ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1010ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1011911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SEC_ACTION btm_ble_determine_security_act(bool is_originator, 1012a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski const RawAddress& bdaddr, 1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t security_required) { 1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_AUTH_REQ auth_req = 0x00; 10156721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_originator) { 1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((security_required & BTM_SEC_OUT_FLAGS) == 0 && 1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (security_required & BTM_SEC_OUT_MITM) == 0) { 1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s No security required for outgoing connection", 1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 10226721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } 10236721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (security_required & BTM_SEC_OUT_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM; 1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((security_required & BTM_SEC_IN_FLAGS) == 0 && 1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (security_required & BTM_SEC_IN_MITM) == 0) { 1028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s No security required for incoming connection", 1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 10316721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } 10326721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (security_required & BTM_SEC_IN_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM; 1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10356721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_REQ_ACT ble_sec_act; 1037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_link_sec_check(bdaddr, auth_req, &ble_sec_act); 10386721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s ble_sec_act %d", __func__, ble_sec_act); 10406721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_DISCARD) return BTM_SEC_ENC_PENDING; 10426721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_NONE) return BTM_SEC_OK; 10446721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t sec_flag = 0; 1046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_GetSecurityFlagsByTransport(bdaddr, &sec_flag, BT_TRANSPORT_LE); 10476721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_link_encrypted = false; 1049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_key_mitm = false; 1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED | BTM_SEC_FLAG_LKEY_KNOWN)) { 1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) is_link_encrypted = true; 10526721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) is_key_mitm = true; 1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (auth_req & BTM_LE_AUTH_REQ_MITM) { 1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!is_key_mitm) { 1058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_ENCRYPT_MITM; 10596721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } else { 1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_link_encrypted) 1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_ENCRYPT; 10646721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar } 1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_link_encrypted) 1067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 1068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_ENCRYPT_NO_MITM; 1070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10716721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SEC_OK; 10736721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar} 10746721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 10756721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar/******************************************************************************* 1076ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1077ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_start_sec_check 1078ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1079ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to check and set the security required for 1080ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * LE link for LE COC. 1081ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1082ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter bdaddr: remote device address. 1083ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * psm : PSM of the LE COC sevice. 1084ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is_originator: true if outgoing connection. 1085ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_callback : Pointer to the callback function. 1086ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_ref_data : Pointer to be returned along with the callback. 1087ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 10889ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns true if link already meets the required security; otherwise 10899ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * false. 1090ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1091ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1092a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool btm_ble_start_sec_check(const RawAddress& bd_addr, uint16_t psm, 1093c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bool is_originator, tBTM_SEC_CALLBACK* p_callback, 1094c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski void* p_ref_data) { 1095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Find the service record for the PSM */ 1096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_SERV_REC* p_serv_rec = btm_sec_find_first_serv(is_originator, psm); 10976721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is no application registered with this PSM do not allow connection 1099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_serv_rec) { 1101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("%s PSM: %d no application registerd", __func__, psm); 1102c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski (*p_callback)(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_MODE_UNSUPPORTED); 1103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 1104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11056721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_ACTION sec_act = btm_ble_determine_security_act( 1107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_originator, bd_addr, p_serv_rec->security_flags); 11086721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_ACT ble_sec_act = BTM_BLE_SEC_NONE; 1110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool status = false; 11116721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (sec_act) { 1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_OK: 1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Security met", __func__); 1115c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_callback(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_SUCCESS); 1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = true; 1117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 11186721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENCRYPT: 1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Encryption needs to be done", __func__); 1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act = BTM_BLE_SEC_ENCRYPT; 1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 11236721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENCRYPT_MITM: 1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Pairing with MITM needs to be done", __func__); 1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act = BTM_BLE_SEC_ENCRYPT_MITM; 1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 11286721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENCRYPT_NO_MITM: 1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Pairing with No MITM needs to be done", __func__); 1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act = BTM_BLE_SEC_ENCRYPT_NO_MITM; 1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_SEC_ENC_PENDING: 1135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s Ecryption pending", __func__); 1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (ble_sec_act == BTM_BLE_SEC_NONE) return status; 1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE); 1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_lcb->sec_act = sec_act; 1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetEncryption(bd_addr, BT_TRANSPORT_LE, p_callback, p_ref_data, 1144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ble_sec_act); 1145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 11476721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar} 11486721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar 11496721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar/******************************************************************************* 1150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_rand_enc_complete 1152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is the callback functions for HCI_Rand command 1154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and HCI_Encrypt command is completed. 1155ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This message is received from the HCI. 1156ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1157ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_rand_enc_complete(uint8_t* p, uint16_t op_code, 1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_RAND_ENC_CB* p_enc_cplt_cback) { 1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_RAND_ENC params; 1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_dest = params.param_buf; 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_rand_enc_complete"); 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(¶ms, 0, sizeof(tBTM_RAND_ENC)); 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there was a callback address for vcs complete, call it */ 1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_enc_cplt_cback && p) { 1171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Pass paramters to the callback function */ 1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(params.status, p); /* command status */ 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (params.status == HCI_SUCCESS) { 1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson params.opcode = op_code; 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (op_code == HCI_BLE_RAND) 1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson params.param_len = BT_OCTET8_LEN; 1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson params.param_len = BT_OCTET16_LEN; 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Fetch return info from HCI event message */ 1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_dest, p, params.param_len); 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_enc_cplt_cback) /* Call the Encryption complete callback function */ 1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_enc_cplt_cback)(¶ms); 1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_get_enc_key_type 1193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to increment local sign counter 1195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 1196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1197ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1198a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_increment_sign_ctr(const RawAddress& bd_addr, bool is_local) { 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_increment_sign_ctr is_local=%d", is_local); 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_local) 1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.keys.local_counter++; 1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.keys.counter++; 1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("is_local=%d local sign counter=%d peer sign counter=%d", 1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_local, p_dev_rec->ble.keys.local_counter, 1211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.keys.counter); 1212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_get_enc_key_type 1218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 12199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is to get the BLE key type that has been 12209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * exchanged betweem the local device and the peer device. 1221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns p_key_type: output parameter to carry the key type value. 1223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1225a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool btm_ble_get_enc_key_type(const RawAddress& bd_addr, uint8_t* p_key_types) { 1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_get_enc_key_type"); 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_key_types = p_dev_rec->ble.key_type; 1233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 1234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_get_local_div 1241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local DIV 1243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns TURE - if a valid DIV is availavle 1245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1246a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool btm_get_local_div(const RawAddress& bd_addr, uint16_t* p_div) { 1247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool status = false; 1249c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " bd_addr: " << bd_addr; 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_div = 0; 1252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec && p_dev_rec->ble.keys.div) { 1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = true; 1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_div = p_dev_rec->ble.keys.div; 1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, 1259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_div); 1260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sec_save_le_key 1266ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1267ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the SMP to update 1268ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * an BLE key. SMP is internal, whereas all the keys shall 1269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * be sent to the application. The function is also called 12709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * when application passes ble key stored in NVRAM to the 12719ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * btm_sec. 1272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pass_to_application parameter is false in this case. 1273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1277a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_sec_save_le_key(const RawAddress& bd_addr, tBTM_LE_KEY_TYPE key_type, 1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_KEY_VALUE* p_keys, bool pass_to_application) { 1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec; 1280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_EVT_DATA cb_data; 1281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t i; 1282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_sec_save_le_key key_type=0x%x pass_to_application=%d", 1284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type, pass_to_application); 1285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Store the updated key in the device database */ 1286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1287c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << "bd_addr:" << bd_addr; 1288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_rec = btm_find_dev(bd_addr)) != NULL && 1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_keys || key_type == BTM_LE_KEY_LID)) { 1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_init_pseudo_addr(p_rec, bd_addr); 1292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (key_type) { 1294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_PENC: 1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.pltk, p_keys->penc_key.ltk, BT_OCTET16_LEN); 1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN); 1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level; 1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.ediv = p_keys->penc_key.ediv; 1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.key_size = p_keys->penc_key.key_size; 1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_PENC; 1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; 1302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED) 1303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; 1304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; 1306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x", 1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->sec_flags, p_rec->ble.keys.sec_level); 1309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_PID: 1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BT_OCTET16_LEN; i++) { 1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.irk[i] = p_keys->pid_key.irk[i]; 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // memcpy( p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN); todo 1317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // will crash the system 1318c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_rec->ble.static_addr = p_keys->pid_key.static_addr; 1319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.static_addr_type = p_keys->pid_key.addr_type; 1320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_PID; 1321273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng BTM_TRACE_DEBUG( 1322273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng "%s: BTM_LE_KEY_PID key_type=0x%x save peer IRK, change bd_addr=%s " 1323273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng "to static_addr=%s", 1324273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng __func__, p_rec->ble.key_type, p_rec->bd_addr.ToString().c_str(), 1325273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng p_keys->pid_key.static_addr.ToString().c_str()); 1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update device record address as static address */ 1327c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_rec->bd_addr = p_keys->pid_key.static_addr; 1328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* combine DUMO device security record if needed */ 1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_consolidate_dev(p_rec); 1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_PCSRK: 1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.pcsrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN); 1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level; 1335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.counter = p_keys->pcsrk_key.counter; 1336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_PCSRK; 1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; 1338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_keys->pcsrk_key.sec_level == SMP_SEC_AUTHENTICATED) 1339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; 1340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; 1342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x " 1345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "peer_counter=%d", 1346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->sec_flags, 1347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.srk_sec_level, p_rec->ble.keys.counter); 1348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_LENC: 1351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.lltk, p_keys->lenc_key.ltk, BT_OCTET16_LEN); 1352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */ 1353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level; 1354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.key_size = p_keys->lenc_key.key_size; 1355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_LENC; 1356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x " 1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "sec_level=0x%x", 1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->ble.keys.div, p_rec->ble.keys.key_size, 1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.sec_level); 1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_LCSRK: /* local CSRK has been delivered */ 1365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_rec->ble.keys.lcsrk, p_keys->lcsrk_key.csrk, BT_OCTET16_LEN); 1366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */ 1367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level; 1368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter; 1369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_LCSRK; 1370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x " 1372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "local_counter=%d", 1373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type, p_rec->ble.keys.div, 1374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_csrk_sec_level, 1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.local_counter); 1376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_LE_KEY_LID: 1379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.key_type |= BTM_LE_KEY_LID; 1380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)", 1383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson key_type); 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1387273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng VLOG(1) << "BLE key type 0x" << loghex(key_type) 1388c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " updated for BDA: " << bd_addr << " (btm_sec_save_le_key)"; 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify the application that one of the BLE keys has been updated 1391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson If link key is in progress, it will get sent later.*/ 1392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pass_to_application && btm_cb.api.p_le_callback) { 1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.key.p_key_value = p_keys; 1394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_data.key.key_type = key_type; 1395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_le_callback)(BTM_LE_KEY_EVT, bd_addr, &cb_data); 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1401273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng LOG(WARNING) << "BLE key type 0x" << loghex(key_type) 1402c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " called for Unknown BDA or type: " << bd_addr 1403c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << "(btm_sec_save_le_key)"; 1404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec) { 1406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("sec_flags=0x%x", p_rec->sec_flags); 1407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_update_sec_key_size 1413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description update the current lin kencryption key size 1415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1419a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_update_sec_key_size(const RawAddress& bd_addr, 1420c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t enc_key_size) { 1421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec; 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_update_sec_key_size enc_key_size = %d", 1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson enc_key_size); 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec = btm_find_dev(bd_addr); 1427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec != NULL) { 1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->enc_key_size = enc_key_size; 1429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_read_sec_key_size 1435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description update the current lin kencryption key size 1437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1441a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskiuint8_t btm_ble_read_sec_key_size(const RawAddress& bd_addr) { 1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec; 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec = btm_find_dev(bd_addr); 1445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec != NULL) { 1446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return p_rec->enc_key_size; 1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_link_sec_check 1454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Check BLE link security level match. 1456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1457ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true: check is OK and the *p_sec_req_act contain the action 1458ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1460a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_link_sec_check(const RawAddress& bd_addr, 1461c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_LE_AUTH_REQ auth_req, 1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_REQ_ACT* p_sec_req_act) { 1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t req_sec_level = BTM_LE_SEC_NONE, cur_sec_level = BTM_LE_SEC_NONE; 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_link_sec_check auth_req =0x%x", auth_req); 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_ble_link_sec_check received for unknown device"); 1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING || 1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) { 1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* race condition: discard the security request while master is encrypting 1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * the link */ 1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD; 1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson req_sec_level = BTM_LE_SEC_UNAUTHENTICATE; 1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (auth_req & BTM_LE_AUTH_REQ_MITM) { 1481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson req_sec_level = BTM_LE_SEC_AUTHENTICATED; 1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags); 1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* currently encrpted */ 1487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED) { 1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED) 1489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = BTM_LE_SEC_AUTHENTICATED; 1490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE; 1492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* unencrypted link */ 1493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if bonded, get the key security level */ 1495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) 1496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = p_dev_rec->ble.keys.sec_level; 1497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level = BTM_LE_SEC_NONE; 1499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (cur_sec_level >= req_sec_level) { 1502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* To avoid re-encryption on an encrypted link for an equal condition 1503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * encryption */ 1504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_ENCRYPT; 1505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start the pariring process to upgrade the keys*/ 1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_PAIR; 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("cur_sec_level=%d req_sec_level=%d sec_req_act=%d", 1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cur_sec_level, req_sec_level, *p_sec_req_act); 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1516ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1517ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_encryption 1518ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1519ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to ensure that LE connection is 1520ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * encrypted. Should be called only on an open connection. 1521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Typically only needed for connections that first want to 1522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * bring up unencrypted links, then later encrypt them. 1523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device ER is copied into er 1526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1528a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitBTM_STATUS btm_ble_set_encryption(const RawAddress& bd_addr, 1529c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_BLE_SEC_ACT sec_act, 1530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t link_role) { 1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS cmd = BTM_NO_RESOURCES; 1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr); 1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_SEC_REQ_ACT sec_req_act; 1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_AUTH_REQ auth_req; 1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL) { 1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 1538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act); 1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 1540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, 1543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->role_master); 1544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM) { 1546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->security_required |= BTM_SEC_IN_MITM; 1547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (sec_act) { 1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_ENCRYPT: 1551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (link_role == BTM_ROLE_MASTER) { 1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start link layer encryption using the security info stored */ 1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = btm_ble_start_encrypt(bd_addr, false, NULL); 1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if salve role then fall through to call SMP_Pair below which will send a 1557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sec_request to request the master to encrypt the link */ 1558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_ENCRYPT_NO_MITM: 1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_SEC_ENCRYPT_MITM: 1560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson auth_req = (sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) 1561b66829ab8b3bcfb83ec859f050fb5b3038fd658eMyles Watson ? SMP_AUTH_BOND 1562b66829ab8b3bcfb83ec859f050fb5b3038fd658eMyles Watson : (SMP_AUTH_BOND | SMP_AUTH_YN_BIT); 1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_link_sec_check(bd_addr, auth_req, &sec_req_act); 1564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_req_act == BTM_BLE_SEC_REQ_ACT_NONE || 1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sec_req_act == BTM_BLE_SEC_REQ_ACT_DISCARD) { 1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s, no action needed. Ignore", __func__); 1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = BTM_SUCCESS; 1568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (link_role == BTM_ROLE_MASTER) { 1571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sec_req_act == BTM_BLE_SEC_REQ_ACT_ENCRYPT) { 1572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = btm_ble_start_encrypt(bd_addr, false, NULL); 1573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (SMP_Pair(bd_addr) == SMP_STARTED) { 1578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = BTM_CMD_STARTED; 1579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 1584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cmd = BTM_WRONG_MODE; 1585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return cmd; 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1592ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_ltk_request 1593ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when encryption request is received 1595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on a slave device. 1596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_ltk_request(uint16_t handle, uint8_t rand[8], uint16_t ediv) { 1602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle); 1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET8 dummy_stk = {0}; 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_ltk_request"); 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->ediv = ediv; 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN); 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 1613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!smp_proc_ltk_request(p_dev_rec->bd_addr)) 1614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_ltk_request_reply(p_dev_rec->bd_addr, false, dummy_stk); 1615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_start_encrypt 1621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start LE encryption. 1623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1625ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if encryption was started successfully 1626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1628a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitBTM_STATUS btm_ble_start_encrypt(const RawAddress& bda, bool use_stk, 1629c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski BT_OCTET16 stk) { 1630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 1631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda); 1632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_OCTET8 dummy_rand = {0}; 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_start_encrypt"); 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_rec) { 1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Link is not active, can not encrypt!"); 1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_WRONG_MODE; 1639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) { 1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("Link Encryption is active, Busy!"); 1643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_BUSY; 1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->enc_handle = p_rec->ble_hci_handle; 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (use_stk) { 1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk); 1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_rec->ble.key_type & BTM_LE_KEY_PENC) { 1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand, 1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.ediv, p_rec->ble.keys.pltk); 1653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("No key available to encrypt the link"); 1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NO_RESOURCES; 1656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1657ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 1658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->sec_state == BTM_SEC_STATE_IDLE) 1659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 1660b6ab9b3af6b8793ff781e0359a78611726ab2300Jakub Pawlowski 1661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1665ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_link_encrypted 1667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 16689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called when LE link encrption status is 16699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * changed. 1670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1674a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_link_encrypted(const RawAddress& bd_addr, uint8_t encr_enable) { 1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 1676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool enc_cback; 1677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 1679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 1680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_link_encrypted (No Device Found!) encr_enable=%d", 1681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson encr_enable); 1682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_link_encrypted encr_enable=%d", encr_enable); 1686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson enc_cback = (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING); 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson smp_link_encrypted(bd_addr, encr_enable); 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags); 1692ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (encr_enable && p_dev_rec->enc_key_size == 0) 1694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size; 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 1697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->p_callback && enc_cback) { 1698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (encr_enable) 1699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS, true); 1700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (p_dev_rec->role_master) 1701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, true); 1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* to notify GATT to send data if any request is pending */ 1704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson gatt_notify_enc_cmpl(p_dev_rec->ble.pseudo_addr); 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_ltk_request_reply 1710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 17119ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to send a LTK request reply on a 17129ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * slave 1713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * device. 1714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1718a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_ltk_request_reply(const RawAddress& bda, bool use_stk, 1719c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski BT_OCTET16 stk) { 1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda); 1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CB* p_cb = &btm_cb; 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL) { 1724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_ble_ltk_request_reply received for unknown device"); 1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_ltk_request_reply"); 1729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->enc_handle = p_rec->ble_hci_handle; 1730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->key_size = p_rec->ble.keys.key_size; 1731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("key size = %d", p_rec->ble.keys.key_size); 1733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (use_stk) { 1734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk); 1735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* calculate LTK using peer device */ 1736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec->ble.key_type & BTM_LE_KEY_LENC) 1738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p_rec->ble.keys.lltk); 1739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_ltk_req_neg_reply(btm_cb.enc_handle); 1741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_io_capabilities_req 1747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 17489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to handle SMP get IO capability 17499ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * request. 1750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1751ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1753ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC* p_dev_rec, 1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_IO_REQ* p_data) { 1756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t callback_rc = BTM_SUCCESS; 1757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req"); 1758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback) { 1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the callback function implementation may change the IO capability... */ 1760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = (*btm_cb.api.p_le_callback)( 1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data); 1762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != p_data->oob_data)) { 1764d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_BLE_CONFORMANCE_TESTING == TRUE) 1765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.keep_rfu_in_auth_req) { 1766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req keep_rfu_in_auth_req = %u", 1767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.keep_rfu_in_auth_req); 1768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= BTM_LE_AUTH_REQ_MASK_KEEP_RFU; 1769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.keep_rfu_in_auth_req = false; 1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { /* default */ 1771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= BTM_LE_AUTH_REQ_MASK; 1772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1773a6ce7751d84218c193eb90d390aef23217b1737eWei Wang#else 1774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= BTM_LE_AUTH_REQ_MASK; 1775a6ce7751d84218c193eb90d390aef23217b1737eWei Wang#endif 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d " 1779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "auth_req:%d", 1780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->security_required, p_data->auth_req); 1781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK " 1783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "1-IRK 2-CSRK)", 1784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys, p_data->resp_keys); 1785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if authentication requires MITM protection, put on the mask */ 1787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->security_required & BTM_SEC_IN_MITM) 1788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req |= BTM_LE_AUTH_REQ_MITM; 1789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_data->auth_req & SMP_AUTH_BOND)) { 1791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Non bonding: No keys should be exchanged"); 1792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys = 0; 1793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->resp_keys = 0; 1794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 3: auth_req:%d", 1797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req); 1798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x", 1799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys, p_data->resp_keys); 1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d", 1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->io_cap, p_data->auth_req); 1804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* remove MITM protection requirement if IO cap does not allow it */ 1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE) 1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM; 1808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_data->auth_req & SMP_SC_SUPPORT_BIT)) { 1810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if Secure Connections are not supported then remove LK derivation, 1811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** and keypress notifications. 1812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s-SC not supported -> No LK derivation, no keypress notifications", 1815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 1816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->auth_req &= ~SMP_KP_SUPPORT_BIT; 1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->init_keys &= ~SMP_SEC_KEY_TYPE_LK; 1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->resp_keys &= ~SMP_SEC_KEY_TYPE_LK; 1819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:0x%02x", 1823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->io_cap, p_data->oob_data, p_data->auth_req); 1824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return callback_rc; 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_br_keys_req 1831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to handle SMP request for keys sent 1833ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * over BR/EDR. 1834ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1835ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1836ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1837ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_ble_br_keys_req(tBTM_SEC_DEV_REC* p_dev_rec, 1839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_LE_IO_REQ* p_data) { 1840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t callback_rc = BTM_SUCCESS; 1841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 1842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback) { 1843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the callback function implementation may change the IO capability... */ 1844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = (*btm_cb.api.p_le_callback)( 1845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data); 1846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return callback_rc; 1849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_connected 1854ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is when a LE connection to the peer device is 1856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * establsihed 1857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1861a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_connected(const RawAddress& bda, uint16_t handle, uint8_t enc_mode, 1862a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski uint8_t role, tBLE_ADDR_TYPE addr_type, 1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UNUSED_ATTR bool addr_matched) { 1864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda); 1865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_BLE_CB* p_cb = &btm_cb.ble_ctr_cb; 1866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_ble_connected"); 1868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Commenting out trace due to obf/compilation problems. 1870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec) { 1872c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " Security Manager: handle:" << handle 1873273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng << " enc_mode:" << loghex(enc_mode) << " bda: " << bda 1874273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng << " RName: " << p_dev_rec->sec_bd_name 1875273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng << " p_dev_rec:" << p_dev_rec; 1876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_connected sec_flags=0x%x", p_dev_rec->sec_flags); 1878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1879c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << __func__ << " Security Manager: handle:" << handle 1880273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng << " enc_mode:" << loghex(enc_mode) << " bda: " << bda 1881273ffd858ef8ef89c33c7a7d282f298c540d3c2cStanley Tng << " p_dev_rec:" << p_dev_rec; 1882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 1885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* There is no device record for new connection. Allocate one */ 1886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_sec_alloc_dev(bda); 1887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) return; 1888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Update the timestamp for this device */ 1889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->timestamp = btm_cb.dev_rec_count++; 1891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update device information */ 1894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE; 1895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble_hci_handle = handle; 1896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->ble.ble_addr_type = addr_type; 1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* update pseudo address */ 1898c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.pseudo_addr = bda; 1899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->role_master = false; 1901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (role == HCI_ROLE_MASTER) p_dev_rec->role_master = true; 1902ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1903d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 1904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!addr_matched) p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_PSEUDO; 19058b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 1906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched) 1907c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_dev_rec->ble.cur_rand_addr = bda; 19088b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 19098b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 1910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb->inq_var.directed_conn = BTM_BLE_CONNECT_EVT; 1911ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1913ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1915ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/***************************************************************************** 1916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_conn_complete 1917ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1918ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description LE connection complete. 1919ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1920ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/ 1921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_conn_complete(uint8_t* p, UNUSED_ATTR uint16_t evt_len, 1922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool enhanced) { 1923d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 19249462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski uint8_t peer_addr_type; 19258b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 1926a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress local_rpa, peer_rpa; 1927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t role, status, bda_type; 1928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t handle; 1929a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski RawAddress bda; 1930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t conn_interval, conn_latency, conn_timeout; 1931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool match = false; 1932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(status, p); 1934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(handle, p); 1935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(role, p); 1936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(bda_type, p); 1937b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(bda, p); 1938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == 0) { 1940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (enhanced) { 1941b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(local_rpa, p); 1942b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski STREAM_TO_BDADDR(peer_rpa, p); 1943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 194416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 19459462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski STREAM_TO_UINT16(conn_interval, p); 19469462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski STREAM_TO_UINT16(conn_latency, p); 19479462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski STREAM_TO_UINT16(conn_timeout, p); 19489462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski handle = HCID_GET_HANDLE(handle); 19499462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski 19505d790e4732c68fc6a159138dd0bbde6086e063eeJakub Pawlowski#if (BLE_PRIVACY_SPT == TRUE) 1951c8e29efe4cf0c12cc301e91bfc89b3429c875849Jakub Pawlowski peer_addr_type = bda_type; 1952c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski match = btm_identity_addr_to_random_pseudo(&bda, &bda_type, true); 1953c8e29efe4cf0c12cc301e91bfc89b3429c875849Jakub Pawlowski 1954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* possiblly receive connection complete with resolvable random while 1955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson the device has been paired */ 1956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) { 19579462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski tBTM_SEC_DEV_REC* match_rec = btm_ble_resolve_random_addr(bda); 19589462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (match_rec) { 19599462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski LOG_INFO(LOG_TAG, "%s matched and resolved random address", __func__); 19609462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski match = true; 19619462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA; 1962c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski match_rec->ble.cur_rand_addr = bda; 19639462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (!btm_ble_init_pseudo_addr(match_rec, bda)) { 19649462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski /* assign the original address to be the current report address */ 1965c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bda = match_rec->ble.pseudo_addr; 19669462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } else { 1967c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bda = match_rec->bd_addr; 19689462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } 19699462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } else { 19709462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski LOG_INFO(LOG_TAG, "%s unable to match and resolve random address", 19719462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski __func__); 19729462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } 19739462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski } 19748b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 1975ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 19769462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski btm_ble_connected(bda, handle, HCI_ENCRYPT_MODE_DISABLED, role, bda_type, 19779462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski match); 1978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 19799462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski l2cble_conn_comp(handle, role, bda, bda_type, conn_interval, conn_latency, 19809462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski conn_timeout); 1981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 19839462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (enhanced) { 19849462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski btm_ble_refresh_local_resolvable_private_addr(bda, local_rpa); 1985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 19869462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski if (peer_addr_type & BLE_ADDR_TYPE_ID_BIT) 19879462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski btm_ble_refresh_peer_resolvable_private_addr(bda, peer_rpa, 19889462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski BLE_ADDR_RANDOM); 1989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 19909462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski#endif 1991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson role = HCI_ROLE_UNKNOWN; 1993bbac1da9f6af4ed2695b0fbf2825868de933128fJakub Pawlowski if (status != HCI_ERR_ADVERTISING_TIMEOUT) { 1994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_set_conn_st(BLE_CONN_IDLE); 1995d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 1996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, true); 1997a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#endif 1998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1999d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 2000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE; 2001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, true); 2002a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#endif 200370b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji } 2004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2006c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_ble_update_mode_operation(role, &bda, status); 2007d88da92ae1e9dc81cd97cb30e920d588156cac11Jakub Pawlowski 2008874ef327d4624bf9c189b1ac37e831cfab75774bJakub Pawlowski if (role == HCI_ROLE_SLAVE) 2009874ef327d4624bf9c189b1ac37e831cfab75774bJakub Pawlowski btm_ble_advertiser_notify_terminated_legacy(status, handle); 2010ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 2011ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2013ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_create_ll_conn_complete 2014ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2015ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description LE connection complete. 2016ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2017ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/ 2018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_create_ll_conn_complete(uint8_t status) { 2019bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski if (status == HCI_SUCCESS) return; 2020bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski 2021bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski btm_ble_set_conn_st(BLE_CONN_IDLE); 2022bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, NULL, status); 2023bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski 2024bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski LOG(WARNING) << "LE Create Connection attempt failed, status=" 2025bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski << loghex(status); 2026bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski 2027bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski if (status == HCI_ERR_COMMAND_DISALLOWED) { 2028bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski /* There is already either direct connect, or whitelist connection 2029bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski * pending, but we don't know which one, or to which state should we 2030bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski * transition now. This can be triggered only in case of rare race 2031bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski * condition. Crash to recover. */ 2032bd58b0bb9c4ae21331bc2fd9fbc443efe880ee53Jakub Pawlowski LOG(FATAL) << "LE Create Connection - command disallowed"; 2033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 203424adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera} 203524adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera/***************************************************************************** 2036ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_proc_smp_cback 2037ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is the SMP callback handler. 2039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/ 2041a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskiuint8_t btm_proc_smp_cback(tSMP_EVT event, const RawAddress& bd_addr, 2042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_EVT_DATA* p_data) { 2043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 2044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t res = 0; 2045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_proc_smp_cback event = %d", event); 2047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec != NULL) { 2049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (event) { 2050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_IO_CAP_REQ_EVT: 2051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_io_capabilities_req(p_dev_rec, 2052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_IO_REQ*)&p_data->io_req); 2053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_BR_KEYS_REQ_EVT: 2056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_br_keys_req(p_dev_rec, (tBTM_LE_IO_REQ*)&p_data->io_req); 2057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_PASSKEY_REQ_EVT: 2060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_PASSKEY_NOTIF_EVT: 2061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_OOB_REQ_EVT: 2062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_NC_REQ_EVT: 2063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_SC_OOB_REQ_EVT: 2064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* fall through */ 2065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; 2066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_SEC_REQUEST_EVT: 2068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (event == SMP_SEC_REQUEST_EVT && 2069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) { 2070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: Ignoring SMP Security request", __func__); 2071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2073c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btm_cb.pairing_bda = bd_addr; 2074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 2075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 2076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* fall through */ 2077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SMP_COMPLT_EVT: 2079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback) { 2080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the callback function implementation may change the IO 2081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * capability... */ 2082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_cb.api.p_le_callback=0x%x", 2083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_le_callback); 2084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_le_callback)(event, bd_addr, 2085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_LE_EVT_DATA*)p_data); 2086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (event == SMP_COMPLT_EVT) { 2089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", 2091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->cmplt.sec_level, p_dev_rec->sec_flags); 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS 2094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_ERR_PROCESSING; 2095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "after update result=%d sec_level=0x%x sec_flags=0x%x", res, 2098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->cmplt.sec_level, p_dev_rec->sec_flags); 2099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data->cmplt.is_pair_cancel && 2101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.api.p_bond_cancel_cmpl_callback) { 2102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing Cancel completed"); 2103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS); 2104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2105d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_BLE_CONFORMANCE_TESTING == TRUE) 2106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_SUCCESS) { 2107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.devcb.no_disc_if_pair_fail && 2108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->cmplt.reason != SMP_CONN_TOUT) { 2109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL"); 2110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle); 2111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing failed - Not Removing ACL"); 2113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 2114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT) { 2118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL"); 2119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle); 2120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x", 2125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state, btm_cb.pairing_flags, btm_cb.pin_code_len); 2126c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski VLOG(1) << "btm_cb.pairing_bda: " << btm_cb.pairing_bda; 2127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reset btm state only if the callback address matches pairing 2129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * address*/ 2130c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (bd_addr == btm_cb.pairing_bda) { 2131b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski btm_cb.pairing_bda = RawAddress::kAny; 2132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; 2133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.pairing_flags = 0; 2134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (res == BTM_SUCCESS) { 2137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 2138d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 2139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add all bonded device into resolving list if IRK is available*/ 2140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_resolving_list_load_dev(p_dev_rec); 2141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_rec_cback_event(p_dev_rec, res, true); 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 2149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("unknown event = %d", event); 2150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_proc_smp_cback received for unknown device"); 2154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleDataSignature 2162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to sign the data using AES128 CMAC 2164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * algorith. 2165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter bd_addr: target device the data to be signed for. 2167ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_text: singing data 2168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * len: length of the data to be signed. 2169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * signature: output parameter where data signature is going to 2170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * be stored. 2171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if signing sucessul, otherwise false. 2173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2175a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_BleDataSignature(const RawAddress& bd_addr, uint8_t* p_text, 2176c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint16_t len, BLE_SIGNATURE signature) { 2177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr); 2178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 2180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool ret = false; 2181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL) { 2182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s-data signing can not be done from unknown device", 2183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 2184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_mac = (uint8_t*)signature; 2186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* pp; 2187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_buf = (uint8_t*)osi_malloc(len + 4); 2188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s-Start to generate Local CSRK", __func__); 2190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pp = p_buf; 2191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* prepare plain text */ 2192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_text) { 2193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_buf, p_text, len); 2194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pp = (p_buf + len); 2195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter); 2198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter); 2199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ret = aes_cipher_msg_auth_code(p_rec->ble.keys.lcsrk, p_buf, 2201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint16_t)(len + 4), BTM_CMAC_TLEN_SIZE, 2202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_mac); 22035d5fcf26d941315bf91056a7d634846820b7c02fMyles Watson if (ret) { 2204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_increment_sign_ctr(bd_addr, true); 2205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s p_mac = %d", __func__, p_mac); 2208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = " 2210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%02x", 2211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3)); 2212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = " 2214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%02x", 2215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7)); 2216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 2217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ret; 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleVerifySignature 2224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to verify the data signature 2226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2227ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter bd_addr: target device the data to be signed for. 2228ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_orig: original data before signature. 2229ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * len: length of the signing data 2230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * counter: counter used when doing data signing 2231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_comp: signature to be compared against. 2232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson 2233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if signature verified correctly; otherwise false. 2234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2236a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_BleVerifySignature(const RawAddress& bd_addr, uint8_t* p_orig, 2237c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint16_t len, uint32_t counter, uint8_t* p_comp) { 2238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool verified = false; 2239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr); 2240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t p_mac[BTM_CMAC_TLEN_SIZE]; 22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK))) { 2243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("can not verify signature for unknown device"); 2244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (counter < p_rec->ble.keys.counter) { 2245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("signature received with out dated sign counter"); 2246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_orig == NULL) { 2247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("No signature to verify"); 2248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s rcv_cnt=%d >= expected_cnt=%d", __func__, counter, 2250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec->ble.keys.counter); 2251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (aes_cipher_msg_auth_code(p_rec->ble.keys.pcsrk, p_orig, len, 2253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMAC_TLEN_SIZE, p_mac)) { 2254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0) { 2255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_increment_sign_ctr(bd_addr, false); 2256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson verified = true; 2257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return verified; 22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetLeSecurityState 2266ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2267ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to get security mode 1 flags and 2268ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * encryption key size for LE peer. 2269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool true if LE device is found, false otherwise. 2271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2273a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_GetLeSecurityState(const RawAddress& bd_addr, 2274c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski uint8_t* p_le_dev_sec_flags, 2275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_le_key_size) { 2276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec; 2277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t dev_rec_sec_flags; 2278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags = 0; 2280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_key_size = 0; 2281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec = btm_find_dev(bd_addr); 2283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 2284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s fails", __func__); 2285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 2286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) { 2289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s-this is not LE device", __func__); 2290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 2291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dev_rec_sec_flags = p_dev_rec->sec_flags; 2294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (dev_rec_sec_flags & BTM_SEC_LE_ENCRYPTED) { 2296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* link is encrypted with LTK or STK */ 2297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_key_size = p_dev_rec->enc_key_size; 2298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags |= BTM_SEC_LE_LINK_ENCRYPTED; 2299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags |= 2301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (dev_rec_sec_flags & BTM_SEC_LE_AUTHENTICATED) 2302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ 2303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ 2304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) { 2305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* link is unencrypted, still LTK is available */ 2306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_key_size = p_dev_rec->ble.keys.key_size; 2307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags |= 2309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (dev_rec_sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) 2310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ 2311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ 2312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s - le_dev_sec_flags: 0x%02x, le_key_size: %d", __func__, 2315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_le_dev_sec_flags, *p_le_key_size); 2316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 2318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleSecurityProcedureIsRunning 2323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function indicates if LE security procedure is 2325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * currently running with the peer. 2326ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 23279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns bool true if security procedure is running, false 23289ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * otherwise. 2329ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2330ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2331a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_BleSecurityProcedureIsRunning(const RawAddress& bd_addr) { 2332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 2333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_dev_rec == NULL) { 2335c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(ERROR) << __func__ << " device with BDA: " << bd_addr 2336c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " is not found"; 2337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 2338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING || 2341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING); 2342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_BleGetSupportedKeySize 2347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function gets the maximum encryption key size in bytes 2349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device can suport. 2350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * record. 2351ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns the key size or 0 if the size can't be retrieved. 2353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2355a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskiextern uint8_t BTM_BleGetSupportedKeySize(const RawAddress& bd_addr) { 235684baa7f16e830394408278dbb8c508dd9fa02887Myles Watson#if (L2CAP_LE_COC_INCLUDED == TRUE) 2357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); 235813d04d9813c740dd2e8c621cc64c589088268155Myles Watson tBTM_LE_EVT_DATA btm_le_evt_data; 2359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t callback_rc; 2360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_dev_rec) { 2362c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski LOG(ERROR) << __func__ << " device with BDA: " << bd_addr 2363c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski << " is not found"; 2364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_callback == NULL) { 2368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s can't access supported key size", __func__); 2369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_rc = (*btm_cb.api.p_le_callback)( 237313d04d9813c740dd2e8c621cc64c589088268155Myles Watson BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, &btm_le_evt_data); 2374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (callback_rc != BTM_SUCCESS) { 2376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s can't access supported key size", __func__); 2377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s device supports key size = %d", __func__, 238113d04d9813c740dd2e8c621cc64c589088268155Myles Watson btm_le_evt_data.io_req.max_key_size); 238213d04d9813c740dd2e8c621cc64c589088268155Myles Watson return (btm_le_evt_data.io_req.max_key_size); 2383444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else 2384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0; 2385444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Utility functions for LE device IR/ER generation 2390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_notify_new_key 2394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is to notify application new keys have been 2396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * generated. 2397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_notify_new_key(uint8_t key_type) { 240213d04d9813c740dd2e8c621cc64c589088268155Myles Watson tBTM_BLE_LOCAL_KEYS* p_local_keys = NULL; 24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_notify_new_key key_type=%d", key_type); 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.api.p_le_key_callback) { 2407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (key_type) { 2408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ID: 2409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ID"); 241013d04d9813c740dd2e8c621cc64c589088268155Myles Watson p_local_keys = (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.id_keys; 2411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_BLE_KEY_TYPE_ER: 2414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ER"); 241513d04d9813c740dd2e8c621cc64c589088268155Myles Watson p_local_keys = 2416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.ble_encryption_key_value; 2417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 2420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("unknown key type: %d", key_type); 2421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 242313d04d9813c740dd2e8c621cc64c589088268155Myles Watson if (p_local_keys != NULL) 242413d04d9813c740dd2e8c621cc64c589088268155Myles Watson (*btm_cb.api.p_le_key_callback)(key_type, p_local_keys); 2425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_process_irk 2431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when IRK is generated, store it in 2433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * local control block. 2434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_ble_process_irk(tSMP_ENC* p) { 2439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_process_irk"); 2440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p && p->opcode == HCI_BLE_ENCRYPT) { 2441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN); 2442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_notify_new_key(BTM_BLE_KEY_TYPE_ID); 24432808a249c7fc1230eb8955481f94ea0e083165e4Satya Calloji 2444d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 2445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if privacy is enabled, new RPA should be calculated */ 2446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) { 24470c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btm_gen_resolvable_private_addr(base::Bind(&btm_gen_resolve_paddr_low)); 24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif 2450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Generating IRK exception."); 2452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* proceed generate ER */ 24550c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand1) { 24560c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(&btm_cb.devcb.ble_encryption_key_value[0], rand1, BT_OCTET8_LEN); 24570c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski 24580c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand2) { 24590c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(&btm_cb.devcb.ble_encryption_key_value[8], rand2, BT_OCTET8_LEN); 24600c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btm_notify_new_key(BTM_BLE_KEY_TYPE_ER); 24610c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 24620c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski 24630c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_process_dhk 2469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when DHK is calculated, store it in 2471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * local control block, and proceed to generate ER, a 128-bits 2472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * random number. 2473ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_ble_process_dhk(tSMP_ENC* p) { 2478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t btm_ble_irk_pt = 0x01; 2479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSMP_ENC output; 24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_process_dhk"); 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p && p->opcode == HCI_BLE_ENCRYPT) { 2484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN); 2485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BLE DHK generated."); 2486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* IRK = D1(IR, 1) */ 2488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt, 2489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1, &output)) { 2490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* reset all identity root related key */ 2491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 2492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_process_irk(&output); 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* reset all identity root related key */ 2497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); 2498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2502ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 25030c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski * Function btm_ble_reset_id 2504ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 25050c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski * Description This function is called to reset LE device identity. 2506ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2507ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 25100c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowskivoid btm_ble_reset_id(void) { 25110c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("btm_ble_reset_id"); 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25130c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski /* Regenerate Identity Root*/ 25140c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) { 25150c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("btm_ble_process_ir1"); 25160c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(btm_cb.devcb.id_keys.ir, rand, BT_OCTET8_LEN); 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25180c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) { 25190c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski uint8_t btm_ble_dhk_pt = 0x03; 25200c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski tSMP_ENC output; 25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25220c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("btm_ble_process_ir2"); 25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25240c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski /* remembering in control block */ 25250c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski memcpy(&btm_cb.devcb.id_keys.ir[8], rand, BT_OCTET8_LEN); 25260c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski /* generate DHK= Eir({0x03, 0x00, 0x00 ...}) */ 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25280c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_dhk_pt, 1, 25290c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski &output); 25300c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski btm_ble_process_dhk(&output); 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25320c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski BTM_TRACE_DEBUG("BLE IR generated."); 25330c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 25340c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski })); 25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25376bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski/* This function set a random address to local controller. It also temporarily 25386bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski * disable scans and adv before sending the command to the controller. */ 2539a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_set_random_address(const RawAddress& random_bda) { 25406bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski tBTM_LE_RANDOM_CB* p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; 25416bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb; 25426bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski bool adv_mode = btm_cb.ble_ctr_cb.inq_var.adv_mode; 25436bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 25446bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski BTM_TRACE_DEBUG("%s", __func__); 25456bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (btm_ble_get_conn_st() == BLE_DIR_CONN) { 25466bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski BTM_TRACE_ERROR("%s: Cannot set random address. Direct conn ongoing", 25476bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski __func__); 25486bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski return; 25496bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski } 25506bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 25516bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (adv_mode == BTM_BLE_ADV_ENABLE) 25526bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_DISABLE); 25536bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_stop_scan(); 25546bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btm_ble_suspend_bg_conn(); 25556bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 2556c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski p_cb->private_addr = random_bda; 25576bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btsnd_hcic_ble_set_random_addr(p_cb->private_addr); 25586bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 25596bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (adv_mode == BTM_BLE_ADV_ENABLE) 25606bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_ENABLE); 25616bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_start_scan(); 25626bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski btm_ble_resume_bg_conn(); 25636bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski} 25646bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski 2565bdd2f5001ffc7c53f0e38c2a98e393b1855f9ce6Myles Watson#if BTM_BLE_CONFORMANCE_TESTING == TRUE 25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2567ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2568ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_no_disc_if_pair_fail 2569ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 25709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function indicates whether no disconnect of the ACL 2571ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * should be used if pairing failed 2572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_no_disc_if_pair_fail(bool disable_disc) { 2577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", 2578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson disable_disc); 2579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.no_disc_if_pair_fail = disable_disc; 25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_test_mac_value 2585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function set test MAC value 2587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_test_mac_value(bool enable, uint8_t* p_test_mac_val) { 2592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_test_mac_value enable=%d", enable); 2593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.enable_test_mac_val = enable; 2594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN); 25955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_test_local_sign_cntr_value 2600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function set test local sign counter value 2602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2605ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_test_local_sign_cntr_value(bool enable, 2607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t test_local_sign_cntr) { 2608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 2609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d", 2610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson enable, test_local_sign_cntr); 2611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.enable_test_local_sign_cntr = enable; 2612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.test_local_sign_cntr = test_local_sign_cntr; 26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 2616ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2617ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_set_keep_rfu_in_auth_req 2618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function indicates if RFU bits have to be kept as is 2620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (by default they have to be set to 0 by the sender). 2621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_keep_rfu_in_auth_req(bool keep_rfu) { 2626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_ble_set_keep_rfu_in_auth_req keep_rfus=%d", keep_rfu); 2627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.keep_rfu_in_auth_req = keep_rfu; 2628a6ce7751d84218c193eb90d390aef23217b1737eWei Wang} 2629a6ce7751d84218c193eb90d390aef23217b1737eWei Wang 26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_BLE_CONFORMANCE_TESTING */ 2631