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