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