btm_ble.cc revision 874ef327d4624bf9c189b1ac37e831cfab75774b
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains functions for BLE device control utilities, and LE
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  security functions.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
2549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
2649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btm_ble"
2749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
28bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#include "bt_target.h"
29bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen
300c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski#include <base/bind.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
3549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_ble_api.h"
3649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_int.h"
3749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h"
38444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "device/include/controller.h"
3949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "gap_api.h"
40b2a292b5d8df2f359c38b0787bc01181225a9bc9Pavlin Radoslavov#include "gatt_api.h"
4149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "hcimsgs.h"
4249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "l2c_int.h"
43f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#include "osi/include/log.h"
44d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
4549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "smp_api.h"
46ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang
47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern bool aes_cipher_msg_auth_code(BT_OCTET16 key, uint8_t* input,
48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     uint16_t length, uint16_t tlen,
49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     uint8_t* p_signature);
50d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowskiextern void gatt_notify_phy_updated(uint8_t status, uint16_t handle,
51d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski                                    uint8_t tx_phy, uint8_t rx_phy);
52d88da92ae1e9dc81cd97cb30e920d588156cac11Jakub Pawlowskiextern void btm_ble_advertiser_notify_terminated_legacy(
53d88da92ae1e9dc81cd97cb30e920d588156cac11Jakub Pawlowski    uint8_t status, uint16_t connection_handle);
54426da5ad3cc43336e48620605e37e9432b3cd126Andre Eisenbach
55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/
569ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* External Function to be called by other modules                            */
57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************
59ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
60ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_SecAddBleDevice
61ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Add/modify device.  This function will be normally called
63ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  during host startup to restore all required information
64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  for a LE device stored in the NVRAM.
65ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
66ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters:      bd_addr          - BD address of the peer
679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  bd_name          - Name of the peer device. NULL if unknown.
68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  dev_type         - Remote device's device type.
69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  addr_type        - LE device address type.
70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if added OK, else false
72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
74a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_SecAddBleDevice(const RawAddress& bd_addr, BD_NAME bd_name,
75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                         tBT_DEVICE_TYPE dev_type, tBLE_ADDR_TYPE addr_type) {
76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s: dev_type=0x%x", __func__, dev_type);
77c9f86da73bfb637426c83b86497c50fede4e0f63Jakub Pawlowski
78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec) {
80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec = btm_sec_allocate_dev_rec();
81cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
82c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    p_dev_rec->bd_addr = bd_addr;
83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_BR_EDR);
84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_LE);
85cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* update conn params, use default value for background connection params */
87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->conn_params.min_conn_int = BTM_BLE_CONN_PARAM_UNDEF;
88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->conn_params.max_conn_int = BTM_BLE_CONN_PARAM_UNDEF;
89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_PARAM_UNDEF;
90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF;
91cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("%s: Device added, handle=0x%x ", __func__,
93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_dev_rec->ble_hci_handle);
94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME));
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (bd_name && bd_name[0]) {
99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    strlcpy((char*)p_dev_rec->sec_bd_name, (char*)bd_name,
101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            BTM_MAX_REM_BD_NAME_LEN);
102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->device_type |= dev_type;
104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->ble.ble_addr_type = addr_type;
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
106c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_dev_rec->ble.pseudo_addr = bd_addr;
107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* sync up with the Inq Data base*/
108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_INQ_INFO* p_info = BTM_InqDbRead(bd_addr);
109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_info) {
110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type;
111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_info->results.device_type = p_dev_rec->device_type;
112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("InqDb  device_type =0x%x  addr_type=0x%x",
113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_info->results.device_type, p_info->results.ble_addr_type);
114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return true;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
120ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_SecAddBleKey
122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Add/modify LE device information.  This function will be
124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  normally called during host startup to restore all required
125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  information stored in the NVRAM.
126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters:      bd_addr          - BD address of the peer
128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_le_key         - LE key values.
129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  key_type         - LE SMP key type.
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*
131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if added OK, else false
132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
134a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_SecAddBleKey(const RawAddress& bd_addr, tBTM_LE_KEY_VALUE* p_le_key,
135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      tBTM_LE_KEY_TYPE key_type) {
136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec;
137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("BTM_SecAddBleKey");
138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec = btm_find_dev(bd_addr);
139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec || !p_le_key ||
140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID &&
141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC &&
142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       key_type != BTM_LE_KEY_LCSRK && key_type != BTM_LE_KEY_LID)) {
143c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    LOG(WARNING) << __func__
144c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                 << " Wrong Type, or No Device record for bdaddr: " << bd_addr
145c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                 << ", Type: " << key_type;
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return (false);
147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
149c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  VLOG(1) << __func__ << " BDA: " << bd_addr << ", Type: " << key_type;
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_save_le_key(bd_addr, key_type, p_le_key, false);
152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE)
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (key_type == BTM_LE_KEY_PID || key_type == BTM_LE_KEY_LID)
155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_resolving_list_load_dev(p_dev_rec);
156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return (true);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleLoadLocalKeys
164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Local local identity key, encryption root or sign counter.
166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters:      key_type: type of key, can be BTM_BLE_KEY_TYPE_ID,
1689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                                                BTM_BLE_KEY_TYPE_ER
1699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                                             or BTM_BLE_KEY_TYPE_COUNTER.
170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_key: pointer to the key.
1719ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *
172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          non2.
173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleLoadLocalKeys(uint8_t key_type, tBTM_BLE_LOCAL_KEYS* p_key) {
176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_DEVCB* p_devcb = &btm_cb.devcb;
177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s", __func__);
178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_key != NULL) {
179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    switch (key_type) {
180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_BLE_KEY_TYPE_ID:
181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memcpy(&p_devcb->id_keys, &p_key->id_keys,
182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson               sizeof(tBTM_BLE_LOCAL_ID_KEYS));
183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_BLE_KEY_TYPE_ER:
186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memcpy(p_devcb->ble_encryption_key_value, p_key->er,
187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson               sizeof(BT_OCTET16));
188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      default:
191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_ERROR("unknow local key type: %d", key_type);
192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_GetDeviceEncRoot
200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to read the local device encryption
202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  root.
203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the local device ER is copied into ble_encr_key_value
206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceEncRoot(BT_OCTET16 ble_encr_key_value) {
209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s", __func__);
210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(ble_encr_key_value, btm_cb.devcb.ble_encryption_key_value,
211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson         BT_OCTET16_LEN);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_GetDeviceIDRoot
217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to read the local device identity
219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  root.
220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the local device IR is copied into irk
223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceIDRoot(BT_OCTET16 irk) {
226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("BTM_GetDeviceIDRoot ");
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN);
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_GetDeviceDHK
234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to read the local device DHK.
236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the local device DHK is copied into dhk
239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_GetDeviceDHK(BT_OCTET16 dhk) {
242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("BTM_GetDeviceDHK");
243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN);
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_ReadConnectionAddr
249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to get the local device address
2519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  information.
252ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
256a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_ReadConnectionAddr(const RawAddress& remote_bda,
257a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                            RawAddress& local_conn_addr,
258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            tBLE_ADDR_TYPE* p_addr_type) {
259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_LE);
260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_acl == NULL) {
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("No connection exist!");
263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
265c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  local_conn_addr = p_acl->conn_addr;
266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *p_addr_type = p_acl->conn_addr_type;
267ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("BTM_ReadConnectionAddr address type: %d addr: 0x%02x",
269c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                  p_acl->conn_addr_type, p_acl->conn_addr.address[0]);
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
271bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen
2726975b4d711142b885af479721cada448952c6b41Andre Eisenbach/*******************************************************************************
273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_IsBleConnection
275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to check if the connection handle
277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  for an LE link
278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if connection is LE link, otherwise false.
280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_IsBleConnection(uint16_t conn_handle) {
283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t xx;
284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* p;
2856975b4d711142b885af479721cada448952c6b41Andre Eisenbach
286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_API("BTM_IsBleConnection: conn_handle: %d", conn_handle);
2876975b4d711142b885af479721cada448952c6b41Andre Eisenbach
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  xx = btm_handle_to_acl_index(conn_handle);
289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (xx >= MAX_L2CAP_LINKS) return false;
2906975b4d711142b885af479721cada448952c6b41Andre Eisenbach
291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = &btm_cb.acl_db[xx];
2926975b4d711142b885af479721cada448952c6b41Andre Eisenbach
293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return (p->transport == BT_TRANSPORT_LE);
2946975b4d711142b885af479721cada448952c6b41Andre Eisenbach}
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Function       BTM_ReadRemoteConnectionAddr
299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
3009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description    This function is read the remote device address currently used
301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters     pseudo_addr: pseudo random address available
303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                conn_addr:connection address used
3049ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                p_addr_type : BD Address type, Public or Random of the address
3059ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                              used
306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
3079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns        bool, true if connection to remote device exists, else false
308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
310a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_ReadRemoteConnectionAddr(const RawAddress& pseudo_addr,
311a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                  RawAddress& conn_addr,
312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                  tBLE_ADDR_TYPE* p_addr_type) {
313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool st = true;
3147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_PRIVACY_SPT == TRUE)
315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* p = btm_bda_to_acl(pseudo_addr, BT_TRANSPORT_LE);
316ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p == NULL) {
318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR(
319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "BTM_ReadRemoteConnectionAddr can not find connection"
320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        " with matching address");
321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
3238b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
324c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  conn_addr = p->active_remote_addr;
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *p_addr_type = p->active_remote_addr_type;
3268b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#else
327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(pseudo_addr);
3287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
329c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  conn_addr = pseudo_addr;
330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec != NULL) {
331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_addr_type = p_dev_rec->ble.ble_addr_type;
332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
3338b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return st;
335ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
336ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_SecurityGrant
339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to grant security process.
341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       bd_addr - peer device bd address.
343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  res     - result of the operation BTM_SUCCESS if success.
3449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                            Otherwise, BTM_REPEATED_ATTEMPTS if too many
3459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                            attempts.
346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          None
348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
350a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_SecurityGrant(const RawAddress& bd_addr, uint8_t res) {
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS res_smp =
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS;
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("BTM_SecurityGrant");
354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_SecurityGrant(bd_addr, res_smp);
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
358ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BlePasskeyReply
360ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
361ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called after Security Manager submitted
362ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  passkey request to the application.
363ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
3649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameters:      bd_addr - Address of the device for which passkey was
3659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                            requested
3669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  res     - result of the operation BTM_SUCCESS if success
3679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  key_len - length in bytes of the Passkey
3689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  p_passkey    - pointer to array with the passkey
3699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  trusted_mask - bitwise OR of trusted services (array of
3709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                                 uint32_t)
371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
372ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
373a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BlePasskeyReply(const RawAddress& bd_addr, uint8_t res,
374c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                         uint32_t passkey) {
375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS res_smp =
377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) {
380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("Passkey reply to Unknown device");
381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
383ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("BTM_BlePasskeyReply");
386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_PasskeyReply(bd_addr, res_smp, passkey);
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleConfirmReply
392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called after Security Manager submitted
394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  numeric comparison request to the application.
395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters:      bd_addr      - Address of the device with which numeric
397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                                 comparison was requested
398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  res          - comparison result BTM_SUCCESS if success
399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
401a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleConfirmReply(const RawAddress& bd_addr, uint8_t res) {
402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS res_smp =
404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;
405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) {
407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("Passkey reply to Unknown device");
408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s", __func__);
413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_ConfirmReply(bd_addr, res_smp);
414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleOobDataReply
419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to provide the OOB data for
421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  SMP in response to BTM_LE_OOB_REQ_EVT
422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters:      bd_addr     - Address of the peer device
424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  res         - result of the operation SMP_SUCCESS if success
4259ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  p_data      - oob data, depending on transport and
4269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                                capabilities.
427ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                                Might be "Simple Pairing Randomizer", or
428ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                                "Security Manager TK Value".
429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
431a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleOobDataReply(const RawAddress& bd_addr, uint8_t res, uint8_t len,
432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                         uint8_t* p_data) {
433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL;
434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s:", __func__);
437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) {
439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s: Unknown device", __func__);
440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
442ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_OobDataReply(bd_addr, res_smp, len, p_data);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
447bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski/*******************************************************************************
448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleSecureConnectionOobDataReply
450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to provide the OOB data for
452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  SMP in response to BTM_LE_OOB_REQ_EVT when secure connection
453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  data is available
454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters:      bd_addr     - Address of the peer device
456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_c         - pointer to Confirmation.
457ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_r         - pointer to Randomizer
458ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
460a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleSecureConnectionOobDataReply(const RawAddress& bd_addr,
461c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                         uint8_t* p_c, uint8_t* p_r) {
462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
463bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski
464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s:", __func__);
465bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski
466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) {
467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s: Unknown device", __func__);
468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
470bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski
471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
472bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski
473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_SC_OOB_DATA oob;
474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(&oob, 0, sizeof(tSMP_SC_OOB_DATA));
475bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski
476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  oob.peer_oob_data.present = true;
477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(&oob.peer_oob_data.randomizer, p_r, BT_OCTET16_LEN);
478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(&oob.peer_oob_data.commitment, p_c, BT_OCTET16_LEN);
479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  oob.peer_oob_data.addr_rcvd_from.type = p_dev_rec->ble.ble_addr_type;
48078b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski  oob.peer_oob_data.addr_rcvd_from.bda = bd_addr;
481bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski
482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  SMP_SecureConnectionOobDataReply((uint8_t*)&oob);
483bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski}
484bd60854e49f88196bb3bcb38346214f8c6c3f3c9Jakub Pawlowski
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleSetConnScanParams
488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Set scan parameter used in BLE connection request
490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters:      scan_interval: scan interval
492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  scan_window: scan window
493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleSetConnScanParams(uint32_t scan_interval, uint32_t scan_window) {
498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb;
499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool new_param = false;
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN,
502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            BTM_BLE_SCAN_INT_MAX) &&
503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN,
504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            BTM_BLE_SCAN_WIN_MAX)) {
505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_ble_cb->scan_int != scan_interval) {
506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_ble_cb->scan_int = scan_interval;
507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      new_param = true;
508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_ble_cb->scan_win != scan_window) {
511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_ble_cb->scan_win = scan_window;
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      new_param = true;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (new_param && p_ble_cb->conn_state == BLE_BG_CONN) {
516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_suspend_bg_conn();
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("Illegal Connection Scan Parameters");
520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************
524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleSetPrefConnParams
526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Set a peripheral's preferred connection parameters
528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters:      bd_addr          - BD address of the peripheral
530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  scan_interval: scan interval
531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  scan_window: scan window
532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  min_conn_int     - minimum preferred connection interval
533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  max_conn_int     - maximum preferred connection interval
534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  slave_latency    - preferred slave latency
535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  supervision_tout - preferred supervision timeout
536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
540a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleSetPrefConnParams(const RawAddress& bd_addr, uint16_t min_conn_int,
541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint16_t max_conn_int, uint16_t slave_latency,
542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint16_t supervision_tout) {
543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_API(
546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      "BTM_BleSetPrefConnParams min: %u  max: %u  latency: %u  \
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    tout: %u",
548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      min_conn_int, max_conn_int, slave_latency, supervision_tout);
549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (BTM_BLE_ISVALID_PARAM(min_conn_int, BTM_BLE_CONN_INT_MIN,
551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            BTM_BLE_CONN_INT_MAX) &&
552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_BLE_ISVALID_PARAM(max_conn_int, BTM_BLE_CONN_INT_MIN,
553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            BTM_BLE_CONN_INT_MAX) &&
554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_BLE_ISVALID_PARAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN,
555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            BTM_BLE_CONN_SUP_TOUT_MAX) &&
556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (slave_latency <= BTM_BLE_CONN_LATENCY_MAX ||
557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       slave_latency == BTM_BLE_CONN_PARAM_UNDEF)) {
558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_dev_rec) {
559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* expect conn int and stout and slave latency to be updated all together
560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       */
561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF ||
562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) {
563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.min_conn_int = min_conn_int;
565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        else
566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.min_conn_int = max_conn_int;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.max_conn_int = max_conn_int;
570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        else
571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.max_conn_int = min_conn_int;
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF)
574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.slave_latency = slave_latency;
575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        else
576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF;
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF)
579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.supervision_tout = supervision_tout;
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF;
582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_ERROR("Unknown Device, setting rejected");
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("Illegal Connection Parameters");
589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
593ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_ReadDevInfo
595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to read the device/address type
597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  of BD address.
598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter        remote_bda: remote device address
600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_dev_type: output parameter to read the device type.
601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_addr_type: output parameter to read the address type.
602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
604a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_ReadDevInfo(const RawAddress& remote_bda, tBT_DEVICE_TYPE* p_dev_type,
605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                     tBLE_ADDR_TYPE* p_addr_type) {
606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(remote_bda);
607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_INQ_INFO* p_inq_info = BTM_InqDbRead(remote_bda);
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *p_addr_type = BLE_ADDR_PUBLIC;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec) {
612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_dev_type = BT_DEVICE_TYPE_BREDR;
613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* Check with the BT manager if details about remote device are known */
614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_inq_info != NULL) {
615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_dev_type = p_inq_info->results.device_type;
616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_addr_type = p_inq_info->results.ble_addr_type;
617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* unknown device, assume BR/EDR */
619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("btm_find_dev_type - unknown device, BR/EDR assumed");
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* there is a security device record exisitng */
622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* new inquiry result, overwrite device type in security device record */
624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_inq_info) {
625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_dev_rec->device_type = p_inq_info->results.device_type;
626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type;
627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
628c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    if (p_dev_rec->bd_addr == remote_bda &&
629c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        p_dev_rec->ble.pseudo_addr == remote_bda) {
630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_dev_type = p_dev_rec->device_type;
631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_addr_type = p_dev_rec->ble.ble_addr_type;
632c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    } else if (p_dev_rec->ble.pseudo_addr == remote_bda) {
633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_dev_type = BT_DEVICE_TYPE_BLE;
634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_addr_type = p_dev_rec->ble.ble_addr_type;
635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else /* matching static adddress only */
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_dev_type = BT_DEVICE_TYPE_BREDR;
638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_addr_type = BLE_ADDR_PUBLIC;
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_find_dev_type - device_type = %d addr_type = %d",
643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  *p_dev_type, *p_addr_type);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6461f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji/*******************************************************************************
647ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
648ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_ReadConnectedTransportAddress
649ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
6509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to read the paired device/address
6519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  type of other device paired corresponding to the BD_address
652ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
6539ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Parameter        remote_bda: remote device address, carry out the transport
6549ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                              address
655ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  transport: active transport
656ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
657ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Return           true if an active link is identified; false otherwise
658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
660a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_ReadConnectedTransportAddress(RawAddress* remote_bda,
661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       tBT_TRANSPORT transport) {
662c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(*remote_bda);
6631f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji
664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if no device can be located, return */
665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) return false;
6661f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji
667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (transport == BT_TRANSPORT_BR_EDR) {
668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (btm_bda_to_acl(p_dev_rec->bd_addr, transport) != NULL) {
669c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski      *remote_bda = p_dev_rec->bd_addr;
670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return true;
671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else if (p_dev_rec->device_type & BT_DEVICE_TYPE_BREDR) {
672c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski      *remote_bda = p_dev_rec->bd_addr;
673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else
674b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski      *remote_bda = RawAddress::kEmpty;
675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6771f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji
678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (transport == BT_TRANSPORT_LE) {
679c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    *remote_bda = p_dev_rec->ble.pseudo_addr;
680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (btm_bda_to_acl(p_dev_rec->ble.pseudo_addr, transport) != NULL)
681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return true;
682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else
683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return false;
684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6851f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji
686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
6871f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji}
6881f38e92c7045e92b6b9d7f31bf85ceb585733885Satya Calloji
689ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleReceiverTest
692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to start the LE Receiver test
694ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter       rx_freq - Frequency Range
696ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *               p_cmd_cmpl_cback - Command Complete callback
697ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleReceiverTest(uint8_t rx_freq, tBTM_CMPL_CB* p_cmd_cmpl_cback) {
700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btsnd_hcic_ble_receiver_test(rx_freq);
703ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleTransmitterTest
708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to start the LE Transmitter test
710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter       tx_freq - Frequency Range
7129ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                       test_data_len - Length in bytes of payload data in each
7139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                                       packet
714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                       packet_payload - Pattern to use in the payload
715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                       p_cmd_cmpl_cback - Command Complete callback
716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
718d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenvoid BTM_BleTransmitterTest(uint8_t tx_freq, uint8_t test_data_len,
719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            uint8_t packet_payload,
720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            tBTM_CMPL_CB* p_cmd_cmpl_cback) {
721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload);
723ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
726ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
727ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleTestEnd
728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
7299ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to stop the in-progress TX or RX
7309ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  test
731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter       p_cmd_cmpl_cback - Command complete callback
733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_BleTestEnd(tBTM_CMPL_CB* p_cmd_cmpl_cback) {
736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btsnd_hcic_ble_test_end();
739ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
742ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Internal Functions
743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_test_command_complete(uint8_t* p) {
745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_le_test_cmd_cmpl_cb;
746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.p_le_test_cmd_cmpl_cb = NULL;
748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_cb) {
750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    (*p_cb)(p);
751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
755ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
756ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_UseLeLink
757ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
7589ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is to select the underlying physical link to
7599ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  use.
760ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
761ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true to use LE, false use BR/EDR.
762ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
763ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
764a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_UseLeLink(const RawAddress& bd_addr) {
765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* p;
766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBT_DEVICE_TYPE dev_type;
767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBLE_ADDR_TYPE addr_type;
768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool use_le = false;
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR);
771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p != NULL) {
772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return use_le;
773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
775f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen    if (p != NULL) {
776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      use_le = true;
777f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen    } else {
778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      use_le = (dev_type == BT_DEVICE_TYPE_BLE);
7806975b4d711142b885af479721cada448952c6b41Andre Eisenbach    }
781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return use_le;
7836975b4d711142b885af479721cada448952c6b41Andre Eisenbach}
784636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
785636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera/*******************************************************************************
786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_SetBleDataLength
788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is to set maximum BLE transmission packet size
790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          BTM_SUCCESS if success; otherwise failed.
792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
793ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
794a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitBTM_STATUS BTM_SetBleDataLength(const RawAddress& bd_addr,
795c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                 uint16_t tx_pdu_length) {
796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
7977d1faf334e83332d733d8886069ffb2585cf1b8dliuchao
798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_acl == NULL) {
799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported",
800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    __func__);
801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_WRONG_MODE;
802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
8037d1faf334e83332d733d8886069ffb2585cf1b8dliuchao
804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s: tx_pdu_length =%d", __func__, tx_pdu_length);
805636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!controller_get_interface()->supports_ble_packet_extension()) {
807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s failed, request not supported", __func__);
808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_ILLEGAL_VALUE;
809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
810636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) {
812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s failed, peer does not support request", __func__);
813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_ILLEGAL_VALUE;
814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
815636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (tx_pdu_length > BTM_BLE_DATA_SIZE_MAX)
817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    tx_pdu_length = BTM_BLE_DATA_SIZE_MAX;
818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else if (tx_pdu_length < BTM_BLE_DATA_SIZE_MIN)
819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    tx_pdu_length = BTM_BLE_DATA_SIZE_MIN;
820636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* always set the TxTime to be max, as controller does not care for now */
822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btsnd_hcic_ble_set_data_length(p_acl->hci_handle, tx_pdu_length,
823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                 BTM_BLE_DATA_TX_TIME_MAX);
824636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return BTM_SUCCESS;
826636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera}
827636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
8285a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid read_phy_cb(
8295a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb,
8305a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    uint8_t* data, uint16_t len) {
8315a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t status, tx_phy, rx_phy;
8325a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint16_t handle;
8335a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8345a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  LOG_ASSERT(len == 5) << "Received bad response length: " << len;
8355a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = data;
8365a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  STREAM_TO_UINT8(status, pp);
8375a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  STREAM_TO_UINT16(handle, pp);
8385a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  handle = handle & 0x0FFF;
8395a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  STREAM_TO_UINT8(tx_phy, pp);
8405a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  STREAM_TO_UINT8(rx_phy, pp);
8415a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8425a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  DVLOG(1) << __func__ << " Received read_phy_cb";
8435a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  cb.Run(tx_phy, rx_phy, status);
8445a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
8455a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8465a475e71a01322367a2ba591aecd62781902cfc2Avish Shah/*******************************************************************************
8475a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
8485a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Function         BTM_BleReadPhy
8495a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
8505a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Description      To read the current PHYs for specified LE connection
8515a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
8525a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
8535a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Returns          BTM_SUCCESS if command successfully sent to controller,
8545a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  BTM_MODE_UNSUPPORTED if local controller doesn't support LE
8555a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  2M or LE Coded PHY,
8565a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  BTM_WRONG_MODE if Device in wrong mode for request.
8575a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
8585a475e71a01322367a2ba591aecd62781902cfc2Avish Shah ******************************************************************************/
8595a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid BTM_BleReadPhy(
860a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski    const RawAddress& bd_addr,
8615a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb) {
8625a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  BTM_TRACE_DEBUG("%s", __func__);
8635a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8645a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
8655a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8665a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (p_acl == NULL) {
8675a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported",
8685a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                    __func__);
8695a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    cb.Run(0, 0, HCI_ERR_NO_CONNECTION);
8705a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    return;
8715a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  }
8725a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8735a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  // checking if local controller supports it!
8745a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (!controller_get_interface()->supports_ble_2m_phy() &&
8755a475e71a01322367a2ba591aecd62781902cfc2Avish Shah      !controller_get_interface()->supports_ble_coded_phy()) {
8765a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    BTM_TRACE_ERROR("%s failed, request not supported in local controller!",
8775a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                    __func__);
878d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski    cb.Run(0, 0, GATT_REQ_NOT_SUPPORTED);
8795a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    return;
8805a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  }
8815a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8825a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint16_t handle = p_acl->hci_handle;
8835a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8845a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  const uint8_t len = HCIC_PARAM_SIZE_BLE_READ_PHY;
8855a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t data[len];
8865a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = data;
8875a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT16_TO_STREAM(pp, handle);
8885a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_READ_PHY, data, len,
8895a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                            base::Bind(&read_phy_cb, std::move(cb)));
8905a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  return;
8915a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
8925a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8935a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid doNothing(uint8_t* data, uint16_t len) {}
8945a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
8955a475e71a01322367a2ba591aecd62781902cfc2Avish Shah/*******************************************************************************
8965a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
8975a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Function         BTM_BleSetDefaultPhy
8985a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
8995a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Description      To set preferred PHY for ensuing LE connections
9005a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9015a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9025a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Returns          BTM_SUCCESS if command successfully sent to controller,
9035a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  BTM_MODE_UNSUPPORTED if local controller doesn't support LE
9045a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  2M or LE Coded PHY
9055a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9065a475e71a01322367a2ba591aecd62781902cfc2Avish Shah ******************************************************************************/
9075a475e71a01322367a2ba591aecd62781902cfc2Avish ShahtBTM_STATUS BTM_BleSetDefaultPhy(uint8_t all_phys, uint8_t tx_phys,
9085a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                                 uint8_t rx_phys) {
9095a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  BTM_TRACE_DEBUG("%s: all_phys = 0x%02x, tx_phys = 0x%02x, rx_phys = 0x%02x",
9105a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                  __func__, all_phys, tx_phys, rx_phys);
9115a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9125a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  // checking if local controller supports it!
9135a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (!controller_get_interface()->supports_ble_2m_phy() &&
9145a475e71a01322367a2ba591aecd62781902cfc2Avish Shah      !controller_get_interface()->supports_ble_coded_phy()) {
9155a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    BTM_TRACE_ERROR("%s failed, request not supported in local controller!",
9165a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                    __func__);
9175a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    return BTM_MODE_UNSUPPORTED;
9185a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  }
9195a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9205a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  const uint8_t len = HCIC_PARAM_SIZE_BLE_SET_DEFAULT_PHY;
9215a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t data[len];
9225a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = data;
9235a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, all_phys);
9245a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, tx_phys);
9255a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, rx_phys);
9265a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_SET_DEFAULT_PHY, data, len,
9275a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                            base::Bind(doNothing));
9285a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  return BTM_SUCCESS;
9295a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
9305a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9315a475e71a01322367a2ba591aecd62781902cfc2Avish Shah/*******************************************************************************
9325a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9335a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Function         BTM_BleSetPhy
9345a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9355a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Description      To set PHY preferences for specified LE connection
9365a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9375a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9385a475e71a01322367a2ba591aecd62781902cfc2Avish Shah * Returns          BTM_SUCCESS if command successfully sent to controller,
9395a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  BTM_MODE_UNSUPPORTED if local controller doesn't support LE
9405a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  2M or LE Coded PHY,
9415a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  BTM_ILLEGAL_VALUE if specified remote doesn't support LE 2M
9425a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  or LE Coded PHY,
9435a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *                  BTM_WRONG_MODE if Device in wrong mode for request.
9445a475e71a01322367a2ba591aecd62781902cfc2Avish Shah *
9455a475e71a01322367a2ba591aecd62781902cfc2Avish Shah ******************************************************************************/
946a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTM_BleSetPhy(const RawAddress& bd_addr, uint8_t tx_phys, uint8_t rx_phys,
9475a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                   uint16_t phy_options) {
9485a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
9495a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9505a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (p_acl == NULL) {
9515a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported",
9525a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                    __func__);
9535a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    return;
9545a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  }
9555a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9565a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t all_phys = 0;
9575a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (tx_phys == 0) all_phys &= 0x01;
9585a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (rx_phys == 0) all_phys &= 0x02;
9595a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9605a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  BTM_TRACE_DEBUG(
9615a475e71a01322367a2ba591aecd62781902cfc2Avish Shah      "%s: all_phys = 0x%02x, tx_phys = 0x%02x, rx_phys = 0x%02x, phy_options "
9625a475e71a01322367a2ba591aecd62781902cfc2Avish Shah      "= 0x%04x",
9635a475e71a01322367a2ba591aecd62781902cfc2Avish Shah      __func__, all_phys, tx_phys, rx_phys, phy_options);
9645a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
965d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski  uint16_t handle = p_acl->hci_handle;
966d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski
9675a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  // checking if local controller supports it!
9685a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (!controller_get_interface()->supports_ble_2m_phy() &&
9695a475e71a01322367a2ba591aecd62781902cfc2Avish Shah      !controller_get_interface()->supports_ble_coded_phy()) {
9705a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    BTM_TRACE_ERROR("%s failed, request not supported in local controller!",
9715a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                    __func__);
972d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski    gatt_notify_phy_updated(GATT_REQ_NOT_SUPPORTED, handle, tx_phys, rx_phys);
9735a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    return;
9745a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  }
9755a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9765a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  if (!HCI_LE_2M_PHY_SUPPORTED(p_acl->peer_le_features) &&
9775a475e71a01322367a2ba591aecd62781902cfc2Avish Shah      !HCI_LE_CODED_PHY_SUPPORTED(p_acl->peer_le_features)) {
9785a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    BTM_TRACE_ERROR("%s failed, peer does not support request", __func__);
979d08d44e09b680195c253cb24971428e3fb2c77bbJakub Pawlowski    gatt_notify_phy_updated(GATT_REQ_NOT_SUPPORTED, handle, tx_phys, rx_phys);
9805a475e71a01322367a2ba591aecd62781902cfc2Avish Shah    return;
9815a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  }
9825a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9835a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  const uint8_t len = HCIC_PARAM_SIZE_BLE_SET_PHY;
9845a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t data[len];
9855a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = data;
9865a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT16_TO_STREAM(pp, handle);
9875a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, all_phys);
9885a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, tx_phys);
9895a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, rx_phys);
9905a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT16_TO_STREAM(pp, phy_options);
9915a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_SET_PHY, data, len,
9925a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                            base::Bind(doNothing));
9935a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
9945a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
996ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
997ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_determine_security_act
998ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
999ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function checks the security of current LE link
1000ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  and returns the appropriate action that needs to be
1001ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  taken to achieve the required security.
1002ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1003ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter        is_originator - True if outgoing connection
1004ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  bdaddr: remote device address
1005ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  security_required: Security required for the service.
1006ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1007ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          The appropriate security action required.
1008ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1009ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1010911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SEC_ACTION btm_ble_determine_security_act(bool is_originator,
1011a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                               const RawAddress& bdaddr,
1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                               uint16_t security_required) {
1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_AUTH_REQ auth_req = 0x00;
10146721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (is_originator) {
1016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((security_required & BTM_SEC_OUT_FLAGS) == 0 &&
1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (security_required & BTM_SEC_OUT_MITM) == 0) {
1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("%s No security required for outgoing connection",
1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      __func__);
1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return BTM_SEC_OK;
10216721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar    }
10226721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (security_required & BTM_SEC_OUT_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM;
1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((security_required & BTM_SEC_IN_FLAGS) == 0 &&
1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (security_required & BTM_SEC_IN_MITM) == 0) {
1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("%s No security required for incoming connection",
1028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      __func__);
1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return BTM_SEC_OK;
10306721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar    }
10316721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (security_required & BTM_SEC_IN_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM;
1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
10346721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_SEC_REQ_ACT ble_sec_act;
1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_link_sec_check(bdaddr, auth_req, &ble_sec_act);
10376721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s ble_sec_act %d", __func__, ble_sec_act);
10396721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_DISCARD) return BTM_SEC_ENC_PENDING;
10416721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_NONE) return BTM_SEC_OK;
10436721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t sec_flag = 0;
1045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_GetSecurityFlagsByTransport(bdaddr, &sec_flag, BT_TRANSPORT_LE);
10466721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool is_link_encrypted = false;
1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool is_key_mitm = false;
1049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED | BTM_SEC_FLAG_LKEY_KNOWN)) {
1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) is_link_encrypted = true;
10516721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) is_key_mitm = true;
1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (auth_req & BTM_LE_AUTH_REQ_MITM) {
1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!is_key_mitm) {
1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return BTM_SEC_ENCRYPT_MITM;
10586721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar    } else {
1059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (is_link_encrypted)
1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        return BTM_SEC_OK;
1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      else
1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        return BTM_SEC_ENCRYPT;
10636721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar    }
1064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (is_link_encrypted)
1066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return BTM_SEC_OK;
1067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else
1068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return BTM_SEC_ENCRYPT_NO_MITM;
1069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
10706721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return BTM_SEC_OK;
10726721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar}
10736721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
10746721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar/*******************************************************************************
1075ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1076ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_start_sec_check
1077ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1078ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is to check and set the security required for
1079ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  LE link for LE COC.
1080ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1081ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter        bdaddr: remote device address.
1082ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  psm : PSM of the LE COC sevice.
1083ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  is_originator: true if outgoing connection.
1084ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_callback : Pointer to the callback function.
1085ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_ref_data : Pointer to be returned along with the callback.
1086ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
10879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns          true if link already meets the required security; otherwise
10889ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  false.
1089ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1090ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1091a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool btm_ble_start_sec_check(const RawAddress& bd_addr, uint16_t psm,
1092c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                             bool is_originator, tBTM_SEC_CALLBACK* p_callback,
1093c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                             void* p_ref_data) {
1094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Find the service record for the PSM */
1095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_SERV_REC* p_serv_rec = btm_sec_find_first_serv(is_originator, psm);
10966721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* If there is no application registered with this PSM do not allow connection
1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   */
1099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_serv_rec) {
1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_WARNING("%s PSM: %d no application registerd", __func__, psm);
1101c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    (*p_callback)(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_MODE_UNSUPPORTED);
1102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
1103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
11046721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_ACTION sec_act = btm_ble_determine_security_act(
1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      is_originator, bd_addr, p_serv_rec->security_flags);
11076721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_SEC_ACT ble_sec_act = BTM_BLE_SEC_NONE;
1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool status = false;
11106721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (sec_act) {
1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_SEC_OK:
1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("%s Security met", __func__);
1114c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski      p_callback(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_SUCCESS);
1115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      status = true;
1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
11176721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_SEC_ENCRYPT:
1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("%s Encryption needs to be done", __func__);
1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ble_sec_act = BTM_BLE_SEC_ENCRYPT;
1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
11226721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_SEC_ENCRYPT_MITM:
1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("%s Pairing with MITM needs to be done", __func__);
1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ble_sec_act = BTM_BLE_SEC_ENCRYPT_MITM;
1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
11276721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_SEC_ENCRYPT_NO_MITM:
1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("%s Pairing with No MITM needs to be done", __func__);
1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ble_sec_act = BTM_BLE_SEC_ENCRYPT_NO_MITM;
1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_SEC_ENC_PENDING:
1134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("%s Ecryption pending", __func__);
1135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (ble_sec_act == BTM_BLE_SEC_NONE) return status;
1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_lcb->sec_act = sec_act;
1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_SetEncryption(bd_addr, BT_TRANSPORT_LE, p_callback, p_ref_data,
1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    ble_sec_act);
1144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
11466721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar}
11476721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar
11486721232129f137ab024d9b95fc1094a714bc4c01Navin Kochar/*******************************************************************************
1149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_rand_enc_complete
1151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is the callback functions for HCI_Rand command
1153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  and HCI_Encrypt command is completed.
1154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  This message is received from the HCI.
1155ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1156ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1157ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_rand_enc_complete(uint8_t* p, uint16_t op_code,
1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                               tBTM_RAND_ENC_CB* p_enc_cplt_cback) {
1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_RAND_ENC params;
1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p_dest = params.param_buf;
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_rand_enc_complete");
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(&params, 0, sizeof(tBTM_RAND_ENC));
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* If there was a callback address for vcs complete, call it */
1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_enc_cplt_cback && p) {
1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* Pass paramters to the callback function */
1171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_UINT8(params.status, p); /* command status */
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (params.status == HCI_SUCCESS) {
1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      params.opcode = op_code;
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (op_code == HCI_BLE_RAND)
1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        params.param_len = BT_OCTET8_LEN;
1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      else
1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        params.param_len = BT_OCTET16_LEN;
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* Fetch return info from HCI event message */
1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memcpy(p_dest, p, params.param_len);
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_enc_cplt_cback) /* Call the Encryption complete callback function */
1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (*p_enc_cplt_cback)(&params);
1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1190ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_get_enc_key_type
1192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is to increment local sign counter
1194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns         None
1195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1197a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_increment_sign_ctr(const RawAddress& bd_addr, bool is_local) {
1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec;
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_increment_sign_ctr is_local=%d", is_local);
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec = btm_find_dev(bd_addr);
1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec != NULL) {
1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (is_local)
1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_dev_rec->ble.keys.local_counter++;
1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else
1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_dev_rec->ble.keys.counter++;
1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("is_local=%d local sign counter=%d peer sign counter=%d",
1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    is_local, p_dev_rec->ble.keys.local_counter,
1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_dev_rec->ble.keys.counter);
1211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_get_enc_key_type
1217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
12189ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is to get the BLE key type that has been
12199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  exchanged betweem the local device and the peer device.
1220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          p_key_type: output parameter to carry the key type value.
1222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1224a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool btm_ble_get_enc_key_type(const RawAddress& bd_addr, uint8_t* p_key_types) {
1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_get_enc_key_type");
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec = btm_find_dev(bd_addr);
1230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec != NULL) {
1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_key_types = p_dev_rec->ble.key_type;
1232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return true;
1233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_get_local_div
1240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to read the local DIV
1242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          TURE - if a valid DIV is availavle
1244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1245a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool btm_get_local_div(const RawAddress& bd_addr, uint16_t* p_div) {
1246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec;
1247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool status = false;
1248c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  VLOG(1) << __func__ << " bd_addr: " << bd_addr;
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *p_div = 0;
1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec = btm_find_dev(bd_addr);
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec && p_dev_rec->ble.keys.div) {
1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    status = true;
1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_div = p_dev_rec->ble.keys.div;
1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_get_local_div status=%d (1-OK) DIV=0x%x", status,
1258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  *p_div);
1259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return status;
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1263ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_sec_save_le_key
1265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1266ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called by the SMP to update
1267ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  an  BLE key.  SMP is internal, whereas all the keys shall
1268ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  be sent to the application.  The function is also called
12699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  when application passes ble key stored in NVRAM to the
12709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  btm_sec.
1271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  pass_to_application parameter is false in this case.
1272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1276a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_sec_save_le_key(const RawAddress& bd_addr, tBTM_LE_KEY_TYPE key_type,
1277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                         tBTM_LE_KEY_VALUE* p_keys, bool pass_to_application) {
1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec;
1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_EVT_DATA cb_data;
1280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t i;
1281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",
1283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  key_type, pass_to_application);
1284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Store the updated key in the device database */
1285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1286c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  VLOG(1) << "bd_addr:" << bd_addr;
1287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_rec = btm_find_dev(bd_addr)) != NULL &&
1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_keys || key_type == BTM_LE_KEY_LID)) {
1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_init_pseudo_addr(p_rec, bd_addr);
1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    switch (key_type) {
1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_LE_KEY_PENC:
1294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memcpy(p_rec->ble.keys.pltk, p_keys->penc_key.ltk, BT_OCTET16_LEN);
1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN);
1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level;
1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.ediv = p_keys->penc_key.ediv;
1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.key_size = p_keys->penc_key.key_size;
1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.key_type |= BTM_LE_KEY_PENC;
1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN;
1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED)
1302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
1303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        else
1304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
1305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG(
1306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x",
1307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.key_type, p_rec->sec_flags, p_rec->ble.keys.sec_level);
1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_LE_KEY_PID:
1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        for (i = 0; i < BT_OCTET16_LEN; i++) {
1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_rec->ble.keys.irk[i] = p_keys->pid_key.irk[i];
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        // memcpy( p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN); todo
1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        // will crash the system
1317c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        p_rec->ble.static_addr = p_keys->pid_key.static_addr;
1318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.static_addr_type = p_keys->pid_key.addr_type;
1319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.key_type |= BTM_LE_KEY_PID;
1320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG("BTM_LE_KEY_PID key_type=0x%x save peer IRK",
1321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        p_rec->ble.key_type);
1322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* update device record address as static address */
1323c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        p_rec->bd_addr = p_keys->pid_key.static_addr;
1324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* combine DUMO device security record if needed */
1325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_consolidate_dev(p_rec);
1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_LE_KEY_PCSRK:
1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memcpy(p_rec->ble.keys.pcsrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN);
1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level;
1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.counter = p_keys->pcsrk_key.counter;
1332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.key_type |= BTM_LE_KEY_PCSRK;
1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN;
1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_keys->pcsrk_key.sec_level == SMP_SEC_AUTHENTICATED)
1335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
1336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        else
1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
1338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG(
1340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x "
1341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "peer_counter=%d",
1342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.key_type, p_rec->sec_flags,
1343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.keys.srk_sec_level, p_rec->ble.keys.counter);
1344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_LE_KEY_LENC:
1347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memcpy(p_rec->ble.keys.lltk, p_keys->lenc_key.ltk, BT_OCTET16_LEN);
1348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */
1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level;
1350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.key_size = p_keys->lenc_key.key_size;
1351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.key_type |= BTM_LE_KEY_LENC;
1352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG(
1354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x "
1355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "sec_level=0x%x",
1356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.key_type, p_rec->ble.keys.div, p_rec->ble.keys.key_size,
1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.keys.sec_level);
1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_LE_KEY_LCSRK: /* local CSRK has been delivered */
1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        memcpy(p_rec->ble.keys.lcsrk, p_keys->lcsrk_key.csrk, BT_OCTET16_LEN);
1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */
1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level;
1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter;
1365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.key_type |= BTM_LE_KEY_LCSRK;
1366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG(
1367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x "
1368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            "local_counter=%d",
1369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.key_type, p_rec->ble.keys.div,
1370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.keys.local_csrk_sec_level,
1371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_rec->ble.keys.local_counter);
1372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_LE_KEY_LID:
1375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->ble.key_type |= BTM_LE_KEY_LID;
1376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      default:
1378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)",
1379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                          key_type);
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1383c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    VLOG(1) << "BLE key type 0x" << std::hex << key_type
1384c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski            << " updated for BDA: " << bd_addr << " (btm_sec_save_le_key)";
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* Notify the application that one of the BLE keys has been updated
1387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       If link key is in progress, it will get sent later.*/
1388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (pass_to_application && btm_cb.api.p_le_callback) {
1389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      cb_data.key.p_key_value = p_keys;
1390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      cb_data.key.key_type = key_type;
1391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (*btm_cb.api.p_le_callback)(BTM_LE_KEY_EVT, bd_addr, &cb_data);
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1397c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  LOG(WARNING) << "BLE key type 0x" << std::hex << key_type
1398c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski               << " called for Unknown BDA or type: " << bd_addr
1399c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski               << "(btm_sec_save_le_key)";
1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec) {
1402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("sec_flags=0x%x", p_rec->sec_flags);
1403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_update_sec_key_size
1409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      update the current lin kencryption key size
1411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1415a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_update_sec_key_size(const RawAddress& bd_addr,
1416c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                 uint8_t enc_key_size) {
1417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec;
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_update_sec_key_size enc_key_size = %d",
1420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  enc_key_size);
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_rec = btm_find_dev(bd_addr);
1423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec != NULL) {
1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_rec->enc_key_size = enc_key_size;
1425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_read_sec_key_size
1431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      update the current lin kencryption key size
1433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1437a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskiuint8_t btm_ble_read_sec_key_size(const RawAddress& bd_addr) {
1438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec;
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_rec = btm_find_dev(bd_addr);
1441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec != NULL) {
1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return p_rec->enc_key_size;
1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else
1444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return 0;
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_link_sec_check
1450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Check BLE link security level match.
1452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true: check is OK and the *p_sec_req_act contain the action
1454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1456a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_link_sec_check(const RawAddress& bd_addr,
1457c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                            tBTM_LE_AUTH_REQ auth_req,
1458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            tBTM_BLE_SEC_REQ_ACT* p_sec_req_act) {
1459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
1460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t req_sec_level = BTM_LE_SEC_NONE, cur_sec_level = BTM_LE_SEC_NONE;
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_link_sec_check auth_req =0x%x", auth_req);
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) {
1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("btm_ble_link_sec_check received for unknown device");
1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING ||
1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) {
1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* race condition: discard the security request while master is encrypting
1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson     * the link */
1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD;
1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    req_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (auth_req & BTM_LE_AUTH_REQ_MITM) {
1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      req_sec_level = BTM_LE_SEC_AUTHENTICATED;
1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags);
1481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* currently encrpted  */
1483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED) {
1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)
1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cur_sec_level = BTM_LE_SEC_AUTHENTICATED;
1486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      else
1487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else /* unencrypted link */
1489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    {
1490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* if bonded, get the key security level */
1491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC)
1492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cur_sec_level = p_dev_rec->ble.keys.sec_level;
1493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      else
1494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cur_sec_level = BTM_LE_SEC_NONE;
1495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (cur_sec_level >= req_sec_level) {
1498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* To avoid re-encryption on an encrypted link for an equal condition
1499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       * encryption */
1500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_ENCRYPT;
1501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
1502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* start the pariring process to upgrade the keys*/
1503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_PAIR;
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("cur_sec_level=%d req_sec_level=%d sec_req_act=%d",
1508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  cur_sec_level, req_sec_level, *p_sec_req_act);
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1512ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1513ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_set_encryption
1514ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1515ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to ensure that LE connection is
1516ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  encrypted.  Should be called only on an open connection.
1517ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  Typically only needed for connections that first want to
1518ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  bring up unencrypted links, then later encrypt them.
1519ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1520ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the local device ER is copied into er
1522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1524a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitBTM_STATUS btm_ble_set_encryption(const RawAddress& bd_addr,
1525c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                   tBTM_BLE_SEC_ACT sec_act,
1526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                   uint8_t link_role) {
1527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_STATUS cmd = BTM_NO_RESOURCES;
1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr);
1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_SEC_REQ_ACT sec_req_act;
1530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_LE_AUTH_REQ auth_req;
1531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec == NULL) {
1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_WARNING(
1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act);
1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return (BTM_WRONG_MODE);
1536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act,
1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  p_rec->role_master);
1540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM) {
1542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_rec->security_required |= BTM_SEC_IN_MITM;
1543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (sec_act) {
1546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_ENCRYPT:
1547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (link_role == BTM_ROLE_MASTER) {
1548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* start link layer encryption using the security info stored */
1549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cmd = btm_ble_start_encrypt(bd_addr, false, NULL);
1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if salve role then fall through to call SMP_Pair below which will send a
1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       sec_request to request the master to encrypt the link */
1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_ENCRYPT_NO_MITM:
1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case BTM_BLE_SEC_ENCRYPT_MITM:
1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      auth_req = (sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM)
1557b66829ab8b3bcfb83ec859f050fb5b3038fd658eMyles Watson                     ? SMP_AUTH_BOND
1558b66829ab8b3bcfb83ec859f050fb5b3038fd658eMyles Watson                     : (SMP_AUTH_BOND | SMP_AUTH_YN_BIT);
1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_link_sec_check(bd_addr, auth_req, &sec_req_act);
1560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (sec_req_act == BTM_BLE_SEC_REQ_ACT_NONE ||
1561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          sec_req_act == BTM_BLE_SEC_REQ_ACT_DISCARD) {
1562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG("%s, no action needed. Ignore", __func__);
1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cmd = BTM_SUCCESS;
1564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (link_role == BTM_ROLE_MASTER) {
1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (sec_req_act == BTM_BLE_SEC_REQ_ACT_ENCRYPT) {
1568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          cmd = btm_ble_start_encrypt(bd_addr, false, NULL);
1569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (SMP_Pair(bd_addr) == SMP_STARTED) {
1574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        cmd = BTM_CMD_STARTED;
1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
1576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      cmd = BTM_WRONG_MODE;
1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return cmd;
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_ltk_request
1589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when encryption request is received
1591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  on a slave device.
1592ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1593ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_ltk_request(uint16_t handle, uint8_t rand[8], uint16_t ediv) {
1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_CB* p_cb = &btm_cb;
1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
1600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_OCTET8 dummy_stk = {0};
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_ltk_request");
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->ediv = ediv;
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN);
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec != NULL) {
1609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!smp_proc_ltk_request(p_dev_rec->bd_addr))
1610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_ltk_request_reply(p_dev_rec->bd_addr, false, dummy_stk);
1611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1615ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1616ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_start_encrypt
1617ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to start LE encryption.
1619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          BTM_SUCCESS if encryption was started successfully
1622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1624a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitBTM_STATUS btm_ble_start_encrypt(const RawAddress& bda, bool use_stk,
1625c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                  BT_OCTET16 stk) {
1626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_CB* p_cb = &btm_cb;
1627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda);
1628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_OCTET8 dummy_rand = {0};
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_start_encrypt");
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_rec) {
1633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("Link is not active, can not encrypt!");
1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_WRONG_MODE;
1635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) {
1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_WARNING("Link Encryption is active, Busy!");
1639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_BUSY;
1640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->enc_handle = p_rec->ble_hci_handle;
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (use_stk) {
1645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk);
1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (p_rec->ble.key_type & BTM_LE_KEY_PENC) {
1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand,
1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                             p_rec->ble.keys.ediv, p_rec->ble.keys.pltk);
1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("No key available to encrypt the link");
1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_NO_RESOURCES;
1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1653ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec->sec_state == BTM_SEC_STATE_IDLE)
1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
1656b6ab9b3af6b8793ff781e0359a78611726ab2300Jakub Pawlowski
1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return BTM_CMD_STARTED;
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_link_encrypted
1663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
16649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called when LE link encrption status is
16659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  changed.
1666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1669ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1670a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_link_encrypted(const RawAddress& bd_addr, uint8_t encr_enable) {
1671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
1672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool enc_cback;
1673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec) {
1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_WARNING(
1676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "btm_ble_link_encrypted (No Device Found!) encr_enable=%d",
1677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        encr_enable);
1678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_link_encrypted encr_enable=%d", encr_enable);
1682ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  enc_cback = (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING);
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  smp_link_encrypted(bd_addr, encr_enable);
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
1688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (encr_enable && p_dev_rec->enc_key_size == 0)
1690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size;
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
1693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec->p_callback && enc_cback) {
1694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (encr_enable)
1695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS, true);
1696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else if (p_dev_rec->role_master)
1697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, true);
1698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* to notify GATT to send data if any request is pending */
1700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  gatt_notify_enc_cmpl(p_dev_rec->ble.pseudo_addr);
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1704ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1705ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_ltk_request_reply
1706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
17079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send a LTK request reply on a
17089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  slave
1709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  device.
1710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1714a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_ltk_request_reply(const RawAddress& bda, bool use_stk,
1715c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                               BT_OCTET16 stk) {
1716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda);
1717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_CB* p_cb = &btm_cb;
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec == NULL) {
1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("btm_ble_ltk_request_reply received for unknown device");
1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_ltk_request_reply");
1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->enc_handle = p_rec->ble_hci_handle;
1726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->key_size = p_rec->ble.keys.key_size;
1727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_ERROR("key size = %d", p_rec->ble.keys.key_size);
1729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (use_stk) {
1730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk);
1731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* calculate LTK using peer device  */
1732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
1733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_rec->ble.key_type & BTM_LE_KEY_LENC)
1734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p_rec->ble.keys.lltk);
1735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    else
1736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btsnd_hcic_ble_ltk_req_neg_reply(btm_cb.enc_handle);
1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1742ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_io_capabilities_req
1743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
17449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to handle SMP get IO capability
17459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  request.
1746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC* p_dev_rec,
1751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    tBTM_LE_IO_REQ* p_data) {
1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t callback_rc = BTM_SUCCESS;
1753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_io_capabilities_req");
1754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (btm_cb.api.p_le_callback) {
1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* the callback function implementation may change the IO capability... */
1756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    callback_rc = (*btm_cb.api.p_le_callback)(
1757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data);
1758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != p_data->oob_data)) {
1760d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_BLE_CONFORMANCE_TESTING == TRUE)
1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (btm_cb.devcb.keep_rfu_in_auth_req) {
1762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("btm_ble_io_capabilities_req keep_rfu_in_auth_req = %u",
1763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      btm_cb.devcb.keep_rfu_in_auth_req);
1764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->auth_req &= BTM_LE_AUTH_REQ_MASK_KEEP_RFU;
1765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.devcb.keep_rfu_in_auth_req = false;
1766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else { /* default */
1767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
1768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1769a6ce7751d84218c193eb90d390aef23217b1737eWei Wang#else
1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
1771a6ce7751d84218c193eb90d390aef23217b1737eWei Wang#endif
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG(
1774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d "
1775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "auth_req:%d",
1776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_dev_rec->security_required, p_data->auth_req);
1777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG(
1778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK "
1779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "1-IRK 2-CSRK)",
1780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_data->init_keys, p_data->resp_keys);
1781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if authentication requires MITM protection, put on the mask */
1783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_dev_rec->security_required & BTM_SEC_IN_MITM)
1784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->auth_req |= BTM_LE_AUTH_REQ_MITM;
1785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!(p_data->auth_req & SMP_AUTH_BOND)) {
1787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG("Non bonding: No keys should be exchanged");
1788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->init_keys = 0;
1789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->resp_keys = 0;
1790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 3: auth_req:%d",
1793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_data->auth_req);
1794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x",
1795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_data->init_keys, p_data->resp_keys);
1796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG(
1798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d",
1799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_data->io_cap, p_data->auth_req);
1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* remove MITM protection requirement if IO cap does not allow it */
1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE)
1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM;
1804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!(p_data->auth_req & SMP_SC_SUPPORT_BIT)) {
1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* if Secure Connections are not supported then remove LK derivation,
1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ** and keypress notifications.
1808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      */
1809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_DEBUG(
1810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          "%s-SC not supported -> No LK derivation, no keypress notifications",
1811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          __func__);
1812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->auth_req &= ~SMP_KP_SUPPORT_BIT;
1813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->init_keys &= ~SMP_SEC_KEY_TYPE_LK;
1814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_data->resp_keys &= ~SMP_SEC_KEY_TYPE_LK;
1815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
1816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG(
1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:0x%02x",
1819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_data->io_cap, p_data->oob_data, p_data->auth_req);
1820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return callback_rc;
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1824444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1825ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_br_keys_req
1827ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1828ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to handle SMP request for keys sent
1829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  over BR/EDR.
1830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1833ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_ble_br_keys_req(tBTM_SEC_DEV_REC* p_dev_rec,
1835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            tBTM_LE_IO_REQ* p_data) {
1836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t callback_rc = BTM_SUCCESS;
1837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s", __func__);
1838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (btm_cb.api.p_le_callback) {
1839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* the callback function implementation may change the IO capability... */
1840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    callback_rc = (*btm_cb.api.p_le_callback)(
1841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data);
1842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return callback_rc;
1845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1847ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_connected
1850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is when a LE connection to the peer device is
1852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  establsihed
1853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1854ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1857a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_connected(const RawAddress& bda, uint16_t handle, uint8_t enc_mode,
1858a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                       uint8_t role, tBLE_ADDR_TYPE addr_type,
1859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                       UNUSED_ATTR bool addr_matched) {
1860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
1861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_CB* p_cb = &btm_cb.ble_ctr_cb;
1862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_EVENT("btm_ble_connected");
1864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Commenting out trace due to obf/compilation problems.
1866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  */
1867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec) {
1868c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    VLOG(1) << __func__ << " Security Manager: handle:" << handle
1869c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski            << " enc_mode:" << enc_mode << "  bda: " << bda
1870c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski            << " RName: " << p_dev_rec->sec_bd_name;
1871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("btm_ble_connected sec_flags=0x%x", p_dev_rec->sec_flags);
1873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1874c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    VLOG(1) << __func__ << " Security Manager: handle:" << handle
1875c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski            << " enc_mode:" << enc_mode << "  bda: " << bda;
1876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec) {
1879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* There is no device record for new connection.  Allocate one */
1880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec = btm_sec_alloc_dev(bda);
1881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_dev_rec == NULL) return;
1882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else /* Update the timestamp for this device */
1883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
1884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->timestamp = btm_cb.dev_rec_count++;
1885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* update device information */
1888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE;
1889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->ble_hci_handle = handle;
1890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->ble.ble_addr_type = addr_type;
1891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* update pseudo address */
1892c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_dev_rec->ble.pseudo_addr = bda;
1893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->role_master = false;
1895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (role == HCI_ROLE_MASTER) p_dev_rec->role_master = true;
1896ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1897d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
1898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!addr_matched) p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_PSEUDO;
18998b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
1900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched)
1901c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    p_dev_rec->ble.cur_rand_addr = bda;
19028b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
19038b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
1904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_cb->inq_var.directed_conn = BTM_BLE_CONNECT_EVT;
1905ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return;
1907ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1908ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1909ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*****************************************************************************
1910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *  Function        btm_ble_conn_complete
1911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *  Description     LE connection complete.
1913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/
1915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_conn_complete(uint8_t* p, UNUSED_ATTR uint16_t evt_len,
1916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                           bool enhanced) {
1917d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
19189462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski  uint8_t peer_addr_type;
19198b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
1920a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress local_rpa, peer_rpa;
1921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t role, status, bda_type;
1922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
1923a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
1924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t conn_interval, conn_latency, conn_timeout;
1925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool match = false;
1926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
1928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
1929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(role, p);
1930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(bda_type, p);
1931b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
1932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status == 0) {
1934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (enhanced) {
1935b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski      STREAM_TO_BDADDR(local_rpa, p);
1936b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski      STREAM_TO_BDADDR(peer_rpa, p);
1937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
193816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
19399462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    STREAM_TO_UINT16(conn_interval, p);
19409462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    STREAM_TO_UINT16(conn_latency, p);
19419462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    STREAM_TO_UINT16(conn_timeout, p);
19429462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    handle = HCID_GET_HANDLE(handle);
19439462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski
19445d790e4732c68fc6a159138dd0bbde6086e063eeJakub Pawlowski#if (BLE_PRIVACY_SPT == TRUE)
1945c8e29efe4cf0c12cc301e91bfc89b3429c875849Jakub Pawlowski    peer_addr_type = bda_type;
1946c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    match = btm_identity_addr_to_random_pseudo(&bda, &bda_type, true);
1947c8e29efe4cf0c12cc301e91bfc89b3429c875849Jakub Pawlowski
1948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* possiblly receive connection complete with resolvable random while
1949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       the device has been paired */
1950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) {
19519462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski      tBTM_SEC_DEV_REC* match_rec = btm_ble_resolve_random_addr(bda);
19529462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski      if (match_rec) {
19539462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        LOG_INFO(LOG_TAG, "%s matched and resolved random address", __func__);
19549462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        match = true;
19559462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
1956c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        match_rec->ble.cur_rand_addr = bda;
19579462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        if (!btm_ble_init_pseudo_addr(match_rec, bda)) {
19589462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski          /* assign the original address to be the current report address */
1959c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          bda = match_rec->ble.pseudo_addr;
19609462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        } else {
1961c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          bda = match_rec->bd_addr;
19629462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        }
19639462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski      } else {
19649462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        LOG_INFO(LOG_TAG, "%s unable to match and resolve random address",
19659462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski                 __func__);
19669462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski      }
19679462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    }
19688b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
1969ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
19709462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    btm_ble_connected(bda, handle, HCI_ENCRYPT_MODE_DISABLED, role, bda_type,
19719462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski                      match);
1972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
19739462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    l2cble_conn_comp(handle, role, bda, bda_type, conn_interval, conn_latency,
19749462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski                     conn_timeout);
1975444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE)
19779462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski    if (enhanced) {
19789462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski      btm_ble_refresh_local_resolvable_private_addr(bda, local_rpa);
1979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
19809462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski      if (peer_addr_type & BLE_ADDR_TYPE_ID_BIT)
19819462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski        btm_ble_refresh_peer_resolvable_private_addr(bda, peer_rpa,
19829462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski                                                     BLE_ADDR_RANDOM);
1983ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
19849462c5dbd610e7b894008cec99f57e082de1abc5Jakub Pawlowski#endif
1985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
1986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    role = HCI_ROLE_UNKNOWN;
1987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (status != HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) {
1988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_set_conn_st(BLE_CONN_IDLE);
1989d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
1990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, true);
1991a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#endif
1992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
1993d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
1994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
1995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, true);
1996a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#endif
199770b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji    }
1998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2000c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  btm_ble_update_mode_operation(role, &bda, status);
2001d88da92ae1e9dc81cd97cb30e920d588156cac11Jakub Pawlowski
2002874ef327d4624bf9c189b1ac37e831cfab75774bJakub Pawlowski  if (role == HCI_ROLE_SLAVE)
2003874ef327d4624bf9c189b1ac37e831cfab75774bJakub Pawlowski    btm_ble_advertiser_notify_terminated_legacy(status, handle);
2004ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
2005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2007ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_ble_create_ll_conn_complete
2008ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2009ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description LE connection complete.
2010ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2011ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/
2012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_create_ll_conn_complete(uint8_t status) {
2013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status != HCI_SUCCESS) {
2014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_set_conn_st(BLE_CONN_IDLE);
2015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, NULL, status);
2016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
201724adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera}
201824adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera/*****************************************************************************
2019ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *  Function        btm_proc_smp_cback
2020ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2021ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *  Description     This function is the SMP callback handler.
2022ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2023ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/
2024a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskiuint8_t btm_proc_smp_cback(tSMP_EVT event, const RawAddress& bd_addr,
2025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                           tSMP_EVT_DATA* p_data) {
2026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
2027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t res = 0;
2028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_proc_smp_cback event = %d", event);
2030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec != NULL) {
2032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    switch (event) {
2033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_IO_CAP_REQ_EVT:
2034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_ble_io_capabilities_req(p_dev_rec,
2035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    (tBTM_LE_IO_REQ*)&p_data->io_req);
2036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
2037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_BR_KEYS_REQ_EVT:
2039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_ble_br_keys_req(p_dev_rec, (tBTM_LE_IO_REQ*)&p_data->io_req);
2040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
2041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_PASSKEY_REQ_EVT:
2043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_PASSKEY_NOTIF_EVT:
2044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_OOB_REQ_EVT:
2045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_NC_REQ_EVT:
2046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SC_OOB_REQ_EVT:
2047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* fall through */
2048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
2049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_SEC_REQUEST_EVT:
2051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (event == SMP_SEC_REQUEST_EVT &&
2052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) {
2053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BTM_TRACE_DEBUG("%s: Ignoring SMP Security request", __func__);
2054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
2055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
2056c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski        btm_cb.pairing_bda = bd_addr;
2057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
2058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
2059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* fall through */
2060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case SMP_COMPLT_EVT:
2062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (btm_cb.api.p_le_callback) {
2063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* the callback function implementation may change the IO
2064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           * capability... */
2065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BTM_TRACE_DEBUG("btm_cb.api.p_le_callback=0x%x",
2066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                          btm_cb.api.p_le_callback);
2067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          (*btm_cb.api.p_le_callback)(event, bd_addr,
2068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                      (tBTM_LE_EVT_DATA*)p_data);
2069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (event == SMP_COMPLT_EVT) {
2072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BTM_TRACE_DEBUG(
2073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x",
2074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_data->cmplt.sec_level, p_dev_rec->sec_flags);
20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS
2077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                                      : BTM_ERR_PROCESSING;
2078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BTM_TRACE_DEBUG(
2080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "after update result=%d sec_level=0x%x sec_flags=0x%x", res,
2081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_data->cmplt.sec_level, p_dev_rec->sec_flags);
2082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (p_data->cmplt.is_pair_cancel &&
2084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              btm_cb.api.p_bond_cancel_cmpl_callback) {
2085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            BTM_TRACE_DEBUG("Pairing Cancel completed");
2086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS);
2087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
2088d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_BLE_CONFORMANCE_TESTING == TRUE)
2089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (res != BTM_SUCCESS) {
2090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            if (!btm_cb.devcb.no_disc_if_pair_fail &&
2091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                p_data->cmplt.reason != SMP_CONN_TOUT) {
2092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL");
2093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle);
2094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            } else {
2095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              BTM_TRACE_DEBUG("Pairing failed - Not Removing ACL");
2096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
2097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            }
2098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT) {
2101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL");
2102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle);
2103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BTM_TRACE_DEBUG(
2107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              "btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x",
2108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              btm_cb.pairing_state, btm_cb.pairing_flags, btm_cb.pin_code_len);
2109c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          VLOG(1) << "btm_cb.pairing_bda: " << btm_cb.pairing_bda;
2110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* Reset btm state only if the callback address matches pairing
2112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson           * address*/
2113c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski          if (bd_addr == btm_cb.pairing_bda) {
2114b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski            btm_cb.pairing_bda = RawAddress::kAny;
2115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_cb.pairing_state = BTM_PAIR_STATE_IDLE;
2116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_cb.pairing_flags = 0;
2117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
2118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (res == BTM_SUCCESS) {
2120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
2121d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
2122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* add all bonded device into resolving list if IRK is available*/
2123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_ble_resolving_list_load_dev(p_dev_rec);
2124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
2125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btm_sec_dev_rec_cback_event(p_dev_rec, res, true);
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
2130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      default:
2132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG("unknown event = %d", event);
2133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
2136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("btm_proc_smp_cback received for unknown device");
2137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return 0;
21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2144ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleDataSignature
2145ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2146ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to sign the data using AES128 CMAC
2147ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  algorith.
2148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter        bd_addr: target device the data to be signed for.
2150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_text: singing data
2151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  len: length of the data to be signed.
2152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  signature: output parameter where data signature is going to
2153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                             be stored.
2154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2155ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if signing sucessul, otherwise false.
2156ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2157ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2158a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_BleDataSignature(const RawAddress& bd_addr, uint8_t* p_text,
2159c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                          uint16_t len, BLE_SIGNATURE signature) {
2160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr);
2161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s", __func__);
2163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool ret = false;
2164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec == NULL) {
2165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s-data signing can not be done from unknown device",
2166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    __func__);
2167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
2168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t* p_mac = (uint8_t*)signature;
2169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t* pp;
2170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t* p_buf = (uint8_t*)osi_malloc(len + 4);
2171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("%s-Start to generate Local CSRK", __func__);
2173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    pp = p_buf;
2174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* prepare plain text */
2175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (p_text) {
2176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memcpy(p_buf, p_text, len);
2177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      pp = (p_buf + len);
2178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
2179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter);
2181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter);
2182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ret = aes_cipher_msg_auth_code(p_rec->ble.keys.lcsrk, p_buf,
2184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                   (uint16_t)(len + 4), BTM_CMAC_TLEN_SIZE,
2185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                   p_mac);
21865d5fcf26d941315bf91056a7d634846820b7c02fMyles Watson    if (ret) {
2187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_increment_sign_ctr(bd_addr, true);
2188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
2189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("%s p_mac = %d", __func__, p_mac);
2191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG(
2192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = "
2193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "0x%02x",
2194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3));
2195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG(
2196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = "
2197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        "0x%02x",
2198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7));
2199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    osi_free(p_buf);
2200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return ret;
22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleVerifySignature
2207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to verify the data signature
2209ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2210ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter        bd_addr: target device the data to be signed for.
2211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_orig:  original data before signature.
2212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  len: length of the signing data
2213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  counter: counter used when doing data signing
2214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_comp: signature to be compared against.
2215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson
2216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if signature verified correctly; otherwise false.
2217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2219a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_BleVerifySignature(const RawAddress& bd_addr, uint8_t* p_orig,
2220c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                            uint16_t len, uint32_t counter, uint8_t* p_comp) {
2221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool verified = false;
2222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr);
2223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t p_mac[BTM_CMAC_TLEN_SIZE];
22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK))) {
2226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("can not verify signature for unknown device");
2227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (counter < p_rec->ble.keys.counter) {
2228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("signature received with out dated sign counter");
2229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (p_orig == NULL) {
2230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("No signature to verify");
2231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
2232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("%s rcv_cnt=%d >= expected_cnt=%d", __func__, counter,
2233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    p_rec->ble.keys.counter);
2234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (aes_cipher_msg_auth_code(p_rec->ble.keys.pcsrk, p_orig, len,
2236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                 BTM_CMAC_TLEN_SIZE, p_mac)) {
2237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0) {
2238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_ble_increment_sign_ctr(bd_addr, false);
2239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        verified = true;
2240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return verified;
22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_GetLeSecurityState
2249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2250ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to get security mode 1 flags and
2251ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  encryption key size for LE peer.
2252ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          bool    true if LE device is found, false otherwise.
2254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2256a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_GetLeSecurityState(const RawAddress& bd_addr,
2257c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                            uint8_t* p_le_dev_sec_flags,
2258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            uint8_t* p_le_key_size) {
2259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec;
2260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t dev_rec_sec_flags;
2261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *p_le_dev_sec_flags = 0;
2263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *p_le_key_size = 0;
2264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec = btm_find_dev(bd_addr);
2266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) {
2267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s fails", __func__);
2268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return (false);
2269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) {
2272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s-this is not LE device", __func__);
2273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return (false);
2274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  dev_rec_sec_flags = p_dev_rec->sec_flags;
2277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (dev_rec_sec_flags & BTM_SEC_LE_ENCRYPTED) {
2279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* link is encrypted with LTK or STK */
2280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_le_key_size = p_dev_rec->enc_key_size;
2281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_le_dev_sec_flags |= BTM_SEC_LE_LINK_ENCRYPTED;
2282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_le_dev_sec_flags |=
2284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (dev_rec_sec_flags & BTM_SEC_LE_AUTHENTICATED)
2285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM     /* set auth LTK flag */
2286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */
2287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) {
2288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* link is unencrypted, still LTK is available */
2289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_le_key_size = p_dev_rec->ble.keys.key_size;
2290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *p_le_dev_sec_flags |=
2292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        (dev_rec_sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
2293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM     /* set auth LTK flag */
2294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */
2295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s - le_dev_sec_flags: 0x%02x, le_key_size: %d", __func__,
2298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  *p_le_dev_sec_flags, *p_le_key_size);
2299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return true;
2301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
2304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleSecurityProcedureIsRunning
2306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function indicates if LE security procedure is
2308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  currently running with the peer.
2309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
23109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns          bool    true if security procedure is running, false
23119ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  otherwise.
2312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2314a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskibool BTM_BleSecurityProcedureIsRunning(const RawAddress& bd_addr) {
2315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
2316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) {
2318c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    LOG(ERROR) << __func__ << " device with BDA: " << bd_addr
2319c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski               << " is not found";
2320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
2321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING ||
2324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING);
2325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
2328ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2329ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         BTM_BleGetSupportedKeySize
2330ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2331ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function gets the maximum encryption key size in bytes
2332ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the local device can suport.
2333ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  record.
2334ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2335ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          the key size or 0 if the size can't be retrieved.
2336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2338a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskiextern uint8_t BTM_BleGetSupportedKeySize(const RawAddress& bd_addr) {
233984baa7f16e830394408278dbb8c508dd9fa02887Myles Watson#if (L2CAP_LE_COC_INCLUDED == TRUE)
2340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
234113d04d9813c740dd2e8c621cc64c589088268155Myles Watson  tBTM_LE_EVT_DATA btm_le_evt_data;
2342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t callback_rc;
2343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_dev_rec) {
2345c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    LOG(ERROR) << __func__ << " device with BDA: " << bd_addr
2346c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski               << " is not found";
2347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return 0;
2348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (btm_cb.api.p_le_callback == NULL) {
2351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s can't access supported key size", __func__);
2352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return 0;
2353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  callback_rc = (*btm_cb.api.p_le_callback)(
235613d04d9813c740dd2e8c621cc64c589088268155Myles Watson      BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, &btm_le_evt_data);
2357444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (callback_rc != BTM_SUCCESS) {
2359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s can't access supported key size", __func__);
2360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return 0;
2361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
2362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s device supports key size = %d", __func__,
236413d04d9813c740dd2e8c621cc64c589088268155Myles Watson                  btm_le_evt_data.io_req.max_key_size);
236513d04d9813c740dd2e8c621cc64c589088268155Myles Watson  return (btm_le_evt_data.io_req.max_key_size);
2366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else
2367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return 0;
2368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
2369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
2370444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
2372ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *  Utility functions for LE device IR/ER generation
2373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_notify_new_key
2377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is to notify application new keys have been
2379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  generated.
2380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2382ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_notify_new_key(uint8_t key_type) {
238513d04d9813c740dd2e8c621cc64c589088268155Myles Watson  tBTM_BLE_LOCAL_KEYS* p_local_keys = NULL;
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_notify_new_key key_type=%d", key_type);
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (btm_cb.api.p_le_key_callback) {
2390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    switch (key_type) {
2391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_BLE_KEY_TYPE_ID:
2392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ID");
239313d04d9813c740dd2e8c621cc64c589088268155Myles Watson        p_local_keys = (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.id_keys;
2394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
2395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      case BTM_BLE_KEY_TYPE_ER:
2397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ER");
239813d04d9813c740dd2e8c621cc64c589088268155Myles Watson        p_local_keys =
2399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.ble_encryption_key_value;
2400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
2401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      default:
2403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        BTM_TRACE_ERROR("unknown key type: %d", key_type);
2404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        break;
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
240613d04d9813c740dd2e8c621cc64c589088268155Myles Watson    if (p_local_keys != NULL)
240713d04d9813c740dd2e8c621cc64c589088268155Myles Watson      (*btm_cb.api.p_le_key_callback)(key_type, p_local_keys);
2408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_process_irk
2414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when IRK is generated, store it in
2416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  local control block.
2417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_ble_process_irk(tSMP_ENC* p) {
2422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_process_irk");
2423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p && p->opcode == HCI_BLE_ENCRYPT) {
2424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN);
2425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_notify_new_key(BTM_BLE_KEY_TYPE_ID);
24262808a249c7fc1230eb8955481f94ea0e083165e4Satya Calloji
2427d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
2428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* if privacy is enabled, new RPA should be calculated */
2429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) {
24300c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      btm_gen_resolvable_private_addr(base::Bind(&btm_gen_resolve_paddr_low));
24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif
2433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
2434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("Generating IRK exception.");
2435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* proceed generate ER */
24380c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand1) {
24390c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski    memcpy(&btm_cb.devcb.ble_encryption_key_value[0], rand1, BT_OCTET8_LEN);
24400c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski
24410c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski    btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand2) {
24420c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      memcpy(&btm_cb.devcb.ble_encryption_key_value[8], rand2, BT_OCTET8_LEN);
24430c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      btm_notify_new_key(BTM_BLE_KEY_TYPE_ER);
24440c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski    }));
24450c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski
24460c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  }));
24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_process_dhk
2452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when DHK is calculated, store it in
2454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  local control block, and proceed to generate ER, a 128-bits
2455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  random number.
2456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2457ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2458ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_ble_process_dhk(tSMP_ENC* p) {
2461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t btm_ble_irk_pt = 0x01;
2462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tSMP_ENC output;
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_process_dhk");
24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p && p->opcode == HCI_BLE_ENCRYPT) {
2467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN);
2468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("BLE DHK generated.");
2469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* IRK = D1(IR, 1) */
2471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt,
2472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                     1, &output)) {
2473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* reset all identity root related key */
2474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
2475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
2476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_process_irk(&output);
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
2479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* reset all identity root related key */
2480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
2481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
24860c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski * Function         btm_ble_reset_id
2487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
24880c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski * Description      This function is called to reset LE device identity.
2489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
24930c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowskivoid btm_ble_reset_id(void) {
24940c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  BTM_TRACE_DEBUG("btm_ble_reset_id");
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24960c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  /* Regenerate Identity Root*/
24970c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) {
24980c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski    BTM_TRACE_DEBUG("btm_ble_process_ir1");
24990c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski    memcpy(btm_cb.devcb.id_keys.ir, rand, BT_OCTET8_LEN);
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25010c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski    btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) {
25020c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      uint8_t btm_ble_dhk_pt = 0x03;
25030c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      tSMP_ENC output;
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25050c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      BTM_TRACE_DEBUG("btm_ble_process_ir2");
25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25070c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      /* remembering in control block */
25080c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      memcpy(&btm_cb.devcb.id_keys.ir[8], rand, BT_OCTET8_LEN);
25090c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      /* generate DHK= Eir({0x03, 0x00, 0x00 ...}) */
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25110c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_dhk_pt, 1,
25120c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                  &output);
25130c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      btm_ble_process_dhk(&output);
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25150c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski      BTM_TRACE_DEBUG("BLE IR generated.");
25160c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski    }));
25170c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  }));
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25206bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski/* This function set a random address to local controller. It also temporarily
25216bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski * disable scans and adv before sending the command to the controller. */
2522a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btm_ble_set_random_address(const RawAddress& random_bda) {
25236bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  tBTM_LE_RANDOM_CB* p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
25246bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb;
25256bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  bool adv_mode = btm_cb.ble_ctr_cb.inq_var.adv_mode;
25266bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski
25276bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  BTM_TRACE_DEBUG("%s", __func__);
25286bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  if (btm_ble_get_conn_st() == BLE_DIR_CONN) {
25296bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski    BTM_TRACE_ERROR("%s: Cannot set random address. Direct conn ongoing",
25306bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski                    __func__);
25316bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski    return;
25326bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  }
25336bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski
25346bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  if (adv_mode == BTM_BLE_ADV_ENABLE)
25356bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski    btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_DISABLE);
25366bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_stop_scan();
25376bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  btm_ble_suspend_bg_conn();
25386bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski
2539c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_cb->private_addr = random_bda;
25406bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  btsnd_hcic_ble_set_random_addr(p_cb->private_addr);
25416bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski
25426bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  if (adv_mode == BTM_BLE_ADV_ENABLE)
25436bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski    btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_ENABLE);
25446bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_start_scan();
25456bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski  btm_ble_resume_bg_conn();
25466bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski}
25476bd467a004f4416aafc7fbd4da19b1e54578fd18Jakub Pawlowski
2548bdd2f5001ffc7c53f0e38c2a98e393b1855f9ce6Myles Watson#if BTM_BLE_CONFORMANCE_TESTING == TRUE
25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_set_no_disc_if_pair_fail
2552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
25539ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function indicates whether no disconnect of the ACL
2554ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  should be used if pairing failed
2555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_no_disc_if_pair_fail(bool disable_disc) {
2560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d",
2561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  disable_disc);
2562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.no_disc_if_pair_fail = disable_disc;
25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2566ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2567ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_set_test_mac_value
2568ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2569ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function set test MAC value
2570ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2571ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_test_mac_value(bool enable, uint8_t* p_test_mac_val) {
2575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_set_test_mac_value enable=%d", enable);
2576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.enable_test_mac_val = enable;
2577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN);
25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2581ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2582ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_set_test_local_sign_cntr_value
2583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function set test local sign counter value
2585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_test_local_sign_cntr_value(bool enable,
2590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            uint32_t test_local_sign_cntr) {
2591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG(
2592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      "btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d",
2593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      enable, test_local_sign_cntr);
2594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.enable_test_local_sign_cntr = enable;
2595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.test_local_sign_cntr = test_local_sign_cntr;
25965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_set_keep_rfu_in_auth_req
2601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function indicates if RFU bits have to be kept as is
2603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  (by default they have to be set to 0 by the sender).
2604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2605ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
2606ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
2607ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_set_keep_rfu_in_auth_req(bool keep_rfu) {
2609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("btm_ble_set_keep_rfu_in_auth_req keep_rfus=%d", keep_rfu);
2610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.devcb.keep_rfu_in_auth_req = keep_rfu;
2611a6ce7751d84218c193eb90d390aef23217b1737eWei Wang}
2612a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_BLE_CONFORMANCE_TESTING */
2614