Home | History | Annotate | Download | only in btm
      1 /******************************************************************************
      2  *
      3  *  Copyright 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains functions for BLE device control utilities, and LE
     22  *  security functions.
     23  *
     24  ******************************************************************************/
     25 
     26 #define LOG_TAG "bt_btm_ble"
     27 
     28 #include "bt_target.h"
     29 
     30 #include <base/bind.h>
     31 #include <string.h>
     32 
     33 #include "bt_types.h"
     34 #include "bt_utils.h"
     35 #include "btm_ble_api.h"
     36 #include "btm_int.h"
     37 #include "btu.h"
     38 #include "device/include/controller.h"
     39 #include "gap_api.h"
     40 #include "gatt_api.h"
     41 #include "hcimsgs.h"
     42 #include "l2c_int.h"
     43 #include "osi/include/log.h"
     44 #include "osi/include/osi.h"
     45 #include "smp_api.h"
     46 
     47 extern bool aes_cipher_msg_auth_code(BT_OCTET16 key, uint8_t* input,
     48                                      uint16_t length, uint16_t tlen,
     49                                      uint8_t* p_signature);
     50 extern void gatt_notify_phy_updated(uint8_t status, uint16_t handle,
     51                                     uint8_t tx_phy, uint8_t rx_phy);
     52 extern void btm_ble_advertiser_notify_terminated_legacy(
     53     uint8_t status, uint16_t connection_handle);
     54 
     55 /******************************************************************************/
     56 /* External Function to be called by other modules                            */
     57 /******************************************************************************/
     58 /********************************************************
     59  *
     60  * Function         BTM_SecAddBleDevice
     61  *
     62  * Description      Add/modify device.  This function will be normally called
     63  *                  during host startup to restore all required information
     64  *                  for a LE device stored in the NVRAM.
     65  *
     66  * Parameters:      bd_addr          - BD address of the peer
     67  *                  bd_name          - Name of the peer device. NULL if unknown.
     68  *                  dev_type         - Remote device's device type.
     69  *                  addr_type        - LE device address type.
     70  *
     71  * Returns          true if added OK, else false
     72  *
     73  ******************************************************************************/
     74 bool BTM_SecAddBleDevice(const RawAddress& bd_addr, BD_NAME bd_name,
     75                          tBT_DEVICE_TYPE dev_type, tBLE_ADDR_TYPE addr_type) {
     76   BTM_TRACE_DEBUG("%s: dev_type=0x%x", __func__, dev_type);
     77 
     78   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
     79   if (!p_dev_rec) {
     80     p_dev_rec = btm_sec_allocate_dev_rec();
     81 
     82     p_dev_rec->bd_addr = bd_addr;
     83     p_dev_rec->hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_BR_EDR);
     84     p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle(bd_addr, BT_TRANSPORT_LE);
     85 
     86     /* update conn params, use default value for background connection params */
     87     p_dev_rec->conn_params.min_conn_int = BTM_BLE_CONN_PARAM_UNDEF;
     88     p_dev_rec->conn_params.max_conn_int = BTM_BLE_CONN_PARAM_UNDEF;
     89     p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_PARAM_UNDEF;
     90     p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF;
     91 
     92     BTM_TRACE_DEBUG("%s: Device added, handle=0x%x, p_dev_rec=%p, bd_addr=%s",
     93                     __func__, p_dev_rec->ble_hci_handle, p_dev_rec,
     94                     bd_addr.ToString().c_str());
     95   }
     96 
     97   memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME));
     98 
     99   if (bd_name && bd_name[0]) {
    100     p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
    101     strlcpy((char*)p_dev_rec->sec_bd_name, (char*)bd_name,
    102             BTM_MAX_REM_BD_NAME_LEN);
    103   }
    104   p_dev_rec->device_type |= dev_type;
    105   p_dev_rec->ble.ble_addr_type = addr_type;
    106 
    107   p_dev_rec->ble.pseudo_addr = bd_addr;
    108   /* sync up with the Inq Data base*/
    109   tBTM_INQ_INFO* p_info = BTM_InqDbRead(bd_addr);
    110   if (p_info) {
    111     p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type;
    112     p_info->results.device_type = p_dev_rec->device_type;
    113     BTM_TRACE_DEBUG("InqDb  device_type =0x%x  addr_type=0x%x",
    114                     p_info->results.device_type, p_info->results.ble_addr_type);
    115   }
    116 
    117   return true;
    118 }
    119 
    120 /*******************************************************************************
    121  *
    122  * Function         BTM_SecAddBleKey
    123  *
    124  * Description      Add/modify LE device information.  This function will be
    125  *                  normally called during host startup to restore all required
    126  *                  information stored in the NVRAM.
    127  *
    128  * Parameters:      bd_addr          - BD address of the peer
    129  *                  p_le_key         - LE key values.
    130  *                  key_type         - LE SMP key type.
    131 *
    132  * Returns          true if added OK, else false
    133  *
    134  ******************************************************************************/
    135 bool BTM_SecAddBleKey(const RawAddress& bd_addr, tBTM_LE_KEY_VALUE* p_le_key,
    136                       tBTM_LE_KEY_TYPE key_type) {
    137   tBTM_SEC_DEV_REC* p_dev_rec;
    138   BTM_TRACE_DEBUG("BTM_SecAddBleKey");
    139   p_dev_rec = btm_find_dev(bd_addr);
    140   if (!p_dev_rec || !p_le_key ||
    141       (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID &&
    142        key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC &&
    143        key_type != BTM_LE_KEY_LCSRK && key_type != BTM_LE_KEY_LID)) {
    144     LOG(WARNING) << __func__
    145                  << " Wrong Type, or No Device record for bdaddr: " << bd_addr
    146                  << ", Type: " << key_type;
    147     return (false);
    148   }
    149 
    150   VLOG(1) << __func__ << " BDA: " << bd_addr << ", Type: " << key_type;
    151 
    152   btm_sec_save_le_key(bd_addr, key_type, p_le_key, false);
    153 
    154 #if (BLE_PRIVACY_SPT == TRUE)
    155   if (key_type == BTM_LE_KEY_PID || key_type == BTM_LE_KEY_LID)
    156     btm_ble_resolving_list_load_dev(p_dev_rec);
    157 #endif
    158 
    159   return (true);
    160 }
    161 
    162 /*******************************************************************************
    163  *
    164  * Function         BTM_BleLoadLocalKeys
    165  *
    166  * Description      Local local identity key, encryption root or sign counter.
    167  *
    168  * Parameters:      key_type: type of key, can be BTM_BLE_KEY_TYPE_ID,
    169  *                                                BTM_BLE_KEY_TYPE_ER
    170  *                                             or BTM_BLE_KEY_TYPE_COUNTER.
    171  *                  p_key: pointer to the key.
    172  *
    173  * Returns          non2.
    174  *
    175  ******************************************************************************/
    176 void BTM_BleLoadLocalKeys(uint8_t key_type, tBTM_BLE_LOCAL_KEYS* p_key) {
    177   tBTM_DEVCB* p_devcb = &btm_cb.devcb;
    178   BTM_TRACE_DEBUG("%s", __func__);
    179   if (p_key != NULL) {
    180     switch (key_type) {
    181       case BTM_BLE_KEY_TYPE_ID:
    182         memcpy(&p_devcb->id_keys, &p_key->id_keys,
    183                sizeof(tBTM_BLE_LOCAL_ID_KEYS));
    184         break;
    185 
    186       case BTM_BLE_KEY_TYPE_ER:
    187         memcpy(p_devcb->ble_encryption_key_value, p_key->er,
    188                sizeof(BT_OCTET16));
    189         break;
    190 
    191       default:
    192         BTM_TRACE_ERROR("unknow local key type: %d", key_type);
    193         break;
    194     }
    195   }
    196 }
    197 
    198 /*******************************************************************************
    199  *
    200  * Function         BTM_GetDeviceEncRoot
    201  *
    202  * Description      This function is called to read the local device encryption
    203  *                  root.
    204  *
    205  * Returns          void
    206  *                  the local device ER is copied into ble_encr_key_value
    207  *
    208  ******************************************************************************/
    209 void BTM_GetDeviceEncRoot(BT_OCTET16 ble_encr_key_value) {
    210   BTM_TRACE_DEBUG("%s", __func__);
    211   memcpy(ble_encr_key_value, btm_cb.devcb.ble_encryption_key_value,
    212          BT_OCTET16_LEN);
    213 }
    214 
    215 /*******************************************************************************
    216  *
    217  * Function         BTM_GetDeviceIDRoot
    218  *
    219  * Description      This function is called to read the local device identity
    220  *                  root.
    221  *
    222  * Returns          void
    223  *                  the local device IR is copied into irk
    224  *
    225  ******************************************************************************/
    226 void BTM_GetDeviceIDRoot(BT_OCTET16 irk) {
    227   BTM_TRACE_DEBUG("BTM_GetDeviceIDRoot ");
    228 
    229   memcpy(irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN);
    230 }
    231 
    232 /*******************************************************************************
    233  *
    234  * Function         BTM_GetDeviceDHK
    235  *
    236  * Description      This function is called to read the local device DHK.
    237  *
    238  * Returns          void
    239  *                  the local device DHK is copied into dhk
    240  *
    241  ******************************************************************************/
    242 void BTM_GetDeviceDHK(BT_OCTET16 dhk) {
    243   BTM_TRACE_DEBUG("BTM_GetDeviceDHK");
    244   memcpy(dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN);
    245 }
    246 
    247 /*******************************************************************************
    248  *
    249  * Function         BTM_ReadConnectionAddr
    250  *
    251  * Description      This function is called to get the local device address
    252  *                  information.
    253  *
    254  * Returns          void
    255  *
    256  ******************************************************************************/
    257 void BTM_ReadConnectionAddr(const RawAddress& remote_bda,
    258                             RawAddress& local_conn_addr,
    259                             tBLE_ADDR_TYPE* p_addr_type) {
    260   tACL_CONN* p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_LE);
    261 
    262   if (p_acl == NULL) {
    263     BTM_TRACE_ERROR("No connection exist!");
    264     return;
    265   }
    266   local_conn_addr = p_acl->conn_addr;
    267   *p_addr_type = p_acl->conn_addr_type;
    268 
    269   BTM_TRACE_DEBUG("BTM_ReadConnectionAddr address type: %d addr: 0x%02x",
    270                   p_acl->conn_addr_type, p_acl->conn_addr.address[0]);
    271 }
    272 
    273 /*******************************************************************************
    274  *
    275  * Function         BTM_IsBleConnection
    276  *
    277  * Description      This function is called to check if the connection handle
    278  *                  for an LE link
    279  *
    280  * Returns          true if connection is LE link, otherwise false.
    281  *
    282  ******************************************************************************/
    283 bool BTM_IsBleConnection(uint16_t conn_handle) {
    284   uint8_t xx;
    285   tACL_CONN* p;
    286 
    287   BTM_TRACE_API("BTM_IsBleConnection: conn_handle: %d", conn_handle);
    288 
    289   xx = btm_handle_to_acl_index(conn_handle);
    290   if (xx >= MAX_L2CAP_LINKS) return false;
    291 
    292   p = &btm_cb.acl_db[xx];
    293 
    294   return (p->transport == BT_TRANSPORT_LE);
    295 }
    296 
    297 /*******************************************************************************
    298  *
    299  * Function       BTM_ReadRemoteConnectionAddr
    300  *
    301  * Description    This function is read the remote device address currently used
    302  *
    303  * Parameters     pseudo_addr: pseudo random address available
    304  *                conn_addr:connection address used
    305  *                p_addr_type : BD Address type, Public or Random of the address
    306  *                              used
    307  *
    308  * Returns        bool, true if connection to remote device exists, else false
    309  *
    310  ******************************************************************************/
    311 bool BTM_ReadRemoteConnectionAddr(const RawAddress& pseudo_addr,
    312                                   RawAddress& conn_addr,
    313                                   tBLE_ADDR_TYPE* p_addr_type) {
    314   bool st = true;
    315 #if (BLE_PRIVACY_SPT == TRUE)
    316   tACL_CONN* p = btm_bda_to_acl(pseudo_addr, BT_TRANSPORT_LE);
    317 
    318   if (p == NULL) {
    319     BTM_TRACE_ERROR(
    320         "BTM_ReadRemoteConnectionAddr can not find connection"
    321         " with matching address");
    322     return false;
    323   }
    324 
    325   conn_addr = p->active_remote_addr;
    326   *p_addr_type = p->active_remote_addr_type;
    327 #else
    328   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(pseudo_addr);
    329 
    330   conn_addr = pseudo_addr;
    331   if (p_dev_rec != NULL) {
    332     *p_addr_type = p_dev_rec->ble.ble_addr_type;
    333   }
    334 #endif
    335   return st;
    336 }
    337 /*******************************************************************************
    338  *
    339  * Function         BTM_SecurityGrant
    340  *
    341  * Description      This function is called to grant security process.
    342  *
    343  * Parameters       bd_addr - peer device bd address.
    344  *                  res     - result of the operation BTM_SUCCESS if success.
    345  *                            Otherwise, BTM_REPEATED_ATTEMPTS if too many
    346  *                            attempts.
    347  *
    348  * Returns          None
    349  *
    350  ******************************************************************************/
    351 void BTM_SecurityGrant(const RawAddress& bd_addr, uint8_t res) {
    352   tSMP_STATUS res_smp =
    353       (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS;
    354   BTM_TRACE_DEBUG("BTM_SecurityGrant");
    355   SMP_SecurityGrant(bd_addr, res_smp);
    356 }
    357 
    358 /*******************************************************************************
    359  *
    360  * Function         BTM_BlePasskeyReply
    361  *
    362  * Description      This function is called after Security Manager submitted
    363  *                  passkey request to the application.
    364  *
    365  * Parameters:      bd_addr - Address of the device for which passkey was
    366  *                            requested
    367  *                  res     - result of the operation BTM_SUCCESS if success
    368  *                  key_len - length in bytes of the Passkey
    369  *                  p_passkey    - pointer to array with the passkey
    370  *                  trusted_mask - bitwise OR of trusted services (array of
    371  *                                 uint32_t)
    372  *
    373  ******************************************************************************/
    374 void BTM_BlePasskeyReply(const RawAddress& bd_addr, uint8_t res,
    375                          uint32_t passkey) {
    376   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
    377   tSMP_STATUS res_smp =
    378       (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;
    379 
    380   if (p_dev_rec == NULL) {
    381     BTM_TRACE_ERROR("Passkey reply to Unknown device");
    382     return;
    383   }
    384 
    385   p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
    386   BTM_TRACE_DEBUG("BTM_BlePasskeyReply");
    387   SMP_PasskeyReply(bd_addr, res_smp, passkey);
    388 }
    389 
    390 /*******************************************************************************
    391  *
    392  * Function         BTM_BleConfirmReply
    393  *
    394  * Description      This function is called after Security Manager submitted
    395  *                  numeric comparison request to the application.
    396  *
    397  * Parameters:      bd_addr      - Address of the device with which numeric
    398  *                                 comparison was requested
    399  *                  res          - comparison result BTM_SUCCESS if success
    400  *
    401  ******************************************************************************/
    402 void BTM_BleConfirmReply(const RawAddress& bd_addr, uint8_t res) {
    403   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
    404   tSMP_STATUS res_smp =
    405       (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;
    406 
    407   if (p_dev_rec == NULL) {
    408     BTM_TRACE_ERROR("Passkey reply to Unknown device");
    409     return;
    410   }
    411 
    412   p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
    413   BTM_TRACE_DEBUG("%s", __func__);
    414   SMP_ConfirmReply(bd_addr, res_smp);
    415 }
    416 
    417 /*******************************************************************************
    418  *
    419  * Function         BTM_BleOobDataReply
    420  *
    421  * Description      This function is called to provide the OOB data for
    422  *                  SMP in response to BTM_LE_OOB_REQ_EVT
    423  *
    424  * Parameters:      bd_addr     - Address of the peer device
    425  *                  res         - result of the operation SMP_SUCCESS if success
    426  *                  p_data      - oob data, depending on transport and
    427  *                                capabilities.
    428  *                                Might be "Simple Pairing Randomizer", or
    429  *                                "Security Manager TK Value".
    430  *
    431  ******************************************************************************/
    432 void BTM_BleOobDataReply(const RawAddress& bd_addr, uint8_t res, uint8_t len,
    433                          uint8_t* p_data) {
    434   tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL;
    435   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
    436 
    437   BTM_TRACE_DEBUG("%s:", __func__);
    438 
    439   if (p_dev_rec == NULL) {
    440     BTM_TRACE_ERROR("%s: Unknown device", __func__);
    441     return;
    442   }
    443 
    444   p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
    445   SMP_OobDataReply(bd_addr, res_smp, len, p_data);
    446 }
    447 
    448 /*******************************************************************************
    449  *
    450  * Function         BTM_BleSecureConnectionOobDataReply
    451  *
    452  * Description      This function is called to provide the OOB data for
    453  *                  SMP in response to BTM_LE_OOB_REQ_EVT when secure connection
    454  *                  data is available
    455  *
    456  * Parameters:      bd_addr     - Address of the peer device
    457  *                  p_c         - pointer to Confirmation.
    458  *                  p_r         - pointer to Randomizer
    459  *
    460  ******************************************************************************/
    461 void BTM_BleSecureConnectionOobDataReply(const RawAddress& bd_addr,
    462                                          uint8_t* p_c, uint8_t* p_r) {
    463   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
    464 
    465   BTM_TRACE_DEBUG("%s:", __func__);
    466 
    467   if (p_dev_rec == NULL) {
    468     BTM_TRACE_ERROR("%s: Unknown device", __func__);
    469     return;
    470   }
    471 
    472   p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
    473 
    474   tSMP_SC_OOB_DATA oob;
    475   memset(&oob, 0, sizeof(tSMP_SC_OOB_DATA));
    476 
    477   oob.peer_oob_data.present = true;
    478   memcpy(&oob.peer_oob_data.randomizer, p_r, BT_OCTET16_LEN);
    479   memcpy(&oob.peer_oob_data.commitment, p_c, BT_OCTET16_LEN);
    480   oob.peer_oob_data.addr_rcvd_from.type = p_dev_rec->ble.ble_addr_type;
    481   oob.peer_oob_data.addr_rcvd_from.bda = bd_addr;
    482 
    483   SMP_SecureConnectionOobDataReply((uint8_t*)&oob);
    484 }
    485 
    486 /******************************************************************************
    487  *
    488  * Function         BTM_BleSetConnScanParams
    489  *
    490  * Description      Set scan parameter used in BLE connection request
    491  *
    492  * Parameters:      scan_interval: scan interval
    493  *                  scan_window: scan window
    494  *
    495  * Returns          void
    496  *
    497  ******************************************************************************/
    498 void BTM_BleSetConnScanParams(uint32_t scan_interval, uint32_t scan_window) {
    499   tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb;
    500   bool new_param = false;
    501 
    502   if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN,
    503                             BTM_BLE_SCAN_INT_MAX) &&
    504       BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN,
    505                             BTM_BLE_SCAN_WIN_MAX)) {
    506     if (p_ble_cb->scan_int != scan_interval) {
    507       p_ble_cb->scan_int = scan_interval;
    508       new_param = true;
    509     }
    510 
    511     if (p_ble_cb->scan_win != scan_window) {
    512       p_ble_cb->scan_win = scan_window;
    513       new_param = true;
    514     }
    515 
    516     if (new_param && p_ble_cb->conn_state == BLE_BG_CONN) {
    517       btm_ble_suspend_bg_conn();
    518     }
    519   } else {
    520     BTM_TRACE_ERROR("Illegal Connection Scan Parameters");
    521   }
    522 }
    523 
    524 /********************************************************
    525  *
    526  * Function         BTM_BleSetPrefConnParams
    527  *
    528  * Description      Set a peripheral's preferred connection parameters
    529  *
    530  * Parameters:      bd_addr          - BD address of the peripheral
    531  *                  scan_interval: scan interval
    532  *                  scan_window: scan window
    533  *                  min_conn_int     - minimum preferred connection interval
    534  *                  max_conn_int     - maximum preferred connection interval
    535  *                  slave_latency    - preferred slave latency
    536  *                  supervision_tout - preferred supervision timeout
    537  *
    538  * Returns          void
    539  *
    540  ******************************************************************************/
    541 void BTM_BleSetPrefConnParams(const RawAddress& bd_addr, uint16_t min_conn_int,
    542                               uint16_t max_conn_int, uint16_t slave_latency,
    543                               uint16_t supervision_tout) {
    544   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
    545 
    546   BTM_TRACE_API(
    547       "BTM_BleSetPrefConnParams min: %u  max: %u  latency: %u  \
    548                     tout: %u",
    549       min_conn_int, max_conn_int, slave_latency, supervision_tout);
    550 
    551   if (BTM_BLE_ISVALID_PARAM(min_conn_int, BTM_BLE_CONN_INT_MIN,
    552                             BTM_BLE_CONN_INT_MAX) &&
    553       BTM_BLE_ISVALID_PARAM(max_conn_int, BTM_BLE_CONN_INT_MIN,
    554                             BTM_BLE_CONN_INT_MAX) &&
    555       BTM_BLE_ISVALID_PARAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN,
    556                             BTM_BLE_CONN_SUP_TOUT_MAX) &&
    557       (slave_latency <= BTM_BLE_CONN_LATENCY_MAX ||
    558        slave_latency == BTM_BLE_CONN_PARAM_UNDEF)) {
    559     if (p_dev_rec) {
    560       /* expect conn int and stout and slave latency to be updated all together
    561        */
    562       if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF ||
    563           max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) {
    564         if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
    565           p_dev_rec->conn_params.min_conn_int = min_conn_int;
    566         else
    567           p_dev_rec->conn_params.min_conn_int = max_conn_int;
    568 
    569         if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
    570           p_dev_rec->conn_params.max_conn_int = max_conn_int;
    571         else
    572           p_dev_rec->conn_params.max_conn_int = min_conn_int;
    573 
    574         if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF)
    575           p_dev_rec->conn_params.slave_latency = slave_latency;
    576         else
    577           p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF;
    578 
    579         if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF)
    580           p_dev_rec->conn_params.supervision_tout = supervision_tout;
    581         else
    582           p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF;
    583       }
    584 
    585     } else {
    586       BTM_TRACE_ERROR("Unknown Device, setting rejected");
    587     }
    588   } else {
    589     BTM_TRACE_ERROR("Illegal Connection Parameters");
    590   }
    591 }
    592 
    593 /*******************************************************************************
    594  *
    595  * Function         BTM_ReadDevInfo
    596  *
    597  * Description      This function is called to read the device/address type
    598  *                  of BD address.
    599  *
    600  * Parameter        remote_bda: remote device address
    601  *                  p_dev_type: output parameter to read the device type.
    602  *                  p_addr_type: output parameter to read the address type.
    603  *
    604  ******************************************************************************/
    605 void BTM_ReadDevInfo(const RawAddress& remote_bda, tBT_DEVICE_TYPE* p_dev_type,
    606                      tBLE_ADDR_TYPE* p_addr_type) {
    607   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(remote_bda);
    608   tBTM_INQ_INFO* p_inq_info = BTM_InqDbRead(remote_bda);
    609 
    610   *p_addr_type = BLE_ADDR_PUBLIC;
    611 
    612   if (!p_dev_rec) {
    613     *p_dev_type = BT_DEVICE_TYPE_BREDR;
    614     /* Check with the BT manager if details about remote device are known */
    615     if (p_inq_info != NULL) {
    616       *p_dev_type = p_inq_info->results.device_type;
    617       *p_addr_type = p_inq_info->results.ble_addr_type;
    618     } else {
    619       /* unknown device, assume BR/EDR */
    620       BTM_TRACE_DEBUG("btm_find_dev_type - unknown device, BR/EDR assumed");
    621     }
    622   } else /* there is a security device record exisitng */
    623   {
    624     /* new inquiry result, overwrite device type in security device record */
    625     if (p_inq_info) {
    626       p_dev_rec->device_type = p_inq_info->results.device_type;
    627       p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type;
    628     }
    629     if (p_dev_rec->bd_addr == remote_bda &&
    630         p_dev_rec->ble.pseudo_addr == remote_bda) {
    631       *p_dev_type = p_dev_rec->device_type;
    632       *p_addr_type = p_dev_rec->ble.ble_addr_type;
    633     } else if (p_dev_rec->ble.pseudo_addr == remote_bda) {
    634       *p_dev_type = BT_DEVICE_TYPE_BLE;
    635       *p_addr_type = p_dev_rec->ble.ble_addr_type;
    636     } else /* matching static adddress only */
    637     {
    638       *p_dev_type = BT_DEVICE_TYPE_BREDR;
    639       *p_addr_type = BLE_ADDR_PUBLIC;
    640     }
    641   }
    642 
    643   BTM_TRACE_DEBUG("btm_find_dev_type - device_type = %d addr_type = %d",
    644                   *p_dev_type, *p_addr_type);
    645 }
    646 
    647 /*******************************************************************************
    648  *
    649  * Function         BTM_ReadConnectedTransportAddress
    650  *
    651  * Description      This function is called to read the paired device/address
    652  *                  type of other device paired corresponding to the BD_address
    653  *
    654  * Parameter        remote_bda: remote device address, carry out the transport
    655  *                              address
    656  *                  transport: active transport
    657  *
    658  * Return           true if an active link is identified; false otherwise
    659  *
    660  ******************************************************************************/
    661 bool BTM_ReadConnectedTransportAddress(RawAddress* remote_bda,
    662                                        tBT_TRANSPORT transport) {
    663   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(*remote_bda);
    664 
    665   /* if no device can be located, return */
    666   if (p_dev_rec == NULL) return false;
    667 
    668   if (transport == BT_TRANSPORT_BR_EDR) {
    669     if (btm_bda_to_acl(p_dev_rec->bd_addr, transport) != NULL) {
    670       *remote_bda = p_dev_rec->bd_addr;
    671       return true;
    672     } else if (p_dev_rec->device_type & BT_DEVICE_TYPE_BREDR) {
    673       *remote_bda = p_dev_rec->bd_addr;
    674     } else
    675       *remote_bda = RawAddress::kEmpty;
    676     return false;
    677   }
    678 
    679   if (transport == BT_TRANSPORT_LE) {
    680     *remote_bda = p_dev_rec->ble.pseudo_addr;
    681     if (btm_bda_to_acl(p_dev_rec->ble.pseudo_addr, transport) != NULL)
    682       return true;
    683     else
    684       return false;
    685   }
    686 
    687   return false;
    688 }
    689 
    690 /*******************************************************************************
    691  *
    692  * Function         BTM_BleReceiverTest
    693  *
    694  * Description      This function is called to start the LE Receiver test
    695  *
    696  * Parameter       rx_freq - Frequency Range
    697  *               p_cmd_cmpl_cback - Command Complete callback
    698  *
    699  ******************************************************************************/
    700 void BTM_BleReceiverTest(uint8_t rx_freq, tBTM_CMPL_CB* p_cmd_cmpl_cback) {
    701   btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
    702 
    703   btsnd_hcic_ble_receiver_test(rx_freq);
    704 }
    705 
    706 /*******************************************************************************
    707  *
    708  * Function         BTM_BleTransmitterTest
    709  *
    710  * Description      This function is called to start the LE Transmitter test
    711  *
    712  * Parameter       tx_freq - Frequency Range
    713  *                       test_data_len - Length in bytes of payload data in each
    714  *                                       packet
    715  *                       packet_payload - Pattern to use in the payload
    716  *                       p_cmd_cmpl_cback - Command Complete callback
    717  *
    718  ******************************************************************************/
    719 void BTM_BleTransmitterTest(uint8_t tx_freq, uint8_t test_data_len,
    720                             uint8_t packet_payload,
    721                             tBTM_CMPL_CB* p_cmd_cmpl_cback) {
    722   btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
    723   btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload);
    724 }
    725 
    726 /*******************************************************************************
    727  *
    728  * Function         BTM_BleTestEnd
    729  *
    730  * Description      This function is called to stop the in-progress TX or RX
    731  *                  test
    732  *
    733  * Parameter       p_cmd_cmpl_cback - Command complete callback
    734  *
    735  ******************************************************************************/
    736 void BTM_BleTestEnd(tBTM_CMPL_CB* p_cmd_cmpl_cback) {
    737   btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
    738 
    739   btsnd_hcic_ble_test_end();
    740 }
    741 
    742 /*******************************************************************************
    743  * Internal Functions
    744  ******************************************************************************/
    745 void btm_ble_test_command_complete(uint8_t* p) {
    746   tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_le_test_cmd_cmpl_cb;
    747 
    748   btm_cb.devcb.p_le_test_cmd_cmpl_cb = NULL;
    749 
    750   if (p_cb) {
    751     (*p_cb)(p);
    752   }
    753 }
    754 
    755 /*******************************************************************************
    756  *
    757  * Function         BTM_UseLeLink
    758  *
    759  * Description      This function is to select the underlying physical link to
    760  *                  use.
    761  *
    762  * Returns          true to use LE, false use BR/EDR.
    763  *
    764  ******************************************************************************/
    765 bool BTM_UseLeLink(const RawAddress& bd_addr) {
    766   tACL_CONN* p;
    767   tBT_DEVICE_TYPE dev_type;
    768   tBLE_ADDR_TYPE addr_type;
    769   bool use_le = false;
    770 
    771   p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR);
    772   if (p != NULL) {
    773     return use_le;
    774   } else {
    775     p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
    776     if (p != NULL) {
    777       use_le = true;
    778     } else {
    779       BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
    780       use_le = (dev_type == BT_DEVICE_TYPE_BLE);
    781     }
    782   }
    783   return use_le;
    784 }
    785 
    786 /*******************************************************************************
    787  *
    788  * Function         BTM_SetBleDataLength
    789  *
    790  * Description      This function is to set maximum BLE transmission packet size
    791  *
    792  * Returns          BTM_SUCCESS if success; otherwise failed.
    793  *
    794  ******************************************************************************/
    795 tBTM_STATUS BTM_SetBleDataLength(const RawAddress& bd_addr,
    796                                  uint16_t tx_pdu_length) {
    797   tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
    798 
    799   if (p_acl == NULL) {
    800     BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported",
    801                     __func__);
    802     return BTM_WRONG_MODE;
    803   }
    804 
    805   BTM_TRACE_DEBUG("%s: tx_pdu_length =%d", __func__, tx_pdu_length);
    806 
    807   if (!controller_get_interface()->supports_ble_packet_extension()) {
    808     BTM_TRACE_ERROR("%s failed, request not supported", __func__);
    809     return BTM_ILLEGAL_VALUE;
    810   }
    811 
    812   if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) {
    813     BTM_TRACE_ERROR("%s failed, peer does not support request", __func__);
    814     return BTM_ILLEGAL_VALUE;
    815   }
    816 
    817   if (tx_pdu_length > BTM_BLE_DATA_SIZE_MAX)
    818     tx_pdu_length = BTM_BLE_DATA_SIZE_MAX;
    819   else if (tx_pdu_length < BTM_BLE_DATA_SIZE_MIN)
    820     tx_pdu_length = BTM_BLE_DATA_SIZE_MIN;
    821 
    822   /* always set the TxTime to be max, as controller does not care for now */
    823   btsnd_hcic_ble_set_data_length(p_acl->hci_handle, tx_pdu_length,
    824                                  BTM_BLE_DATA_TX_TIME_MAX);
    825 
    826   return BTM_SUCCESS;
    827 }
    828 
    829 void read_phy_cb(
    830     base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb,
    831     uint8_t* data, uint16_t len) {
    832   uint8_t status, tx_phy, rx_phy;
    833   uint16_t handle;
    834 
    835   LOG_ASSERT(len == 5) << "Received bad response length: " << len;
    836   uint8_t* pp = data;
    837   STREAM_TO_UINT8(status, pp);
    838   STREAM_TO_UINT16(handle, pp);
    839   handle = handle & 0x0FFF;
    840   STREAM_TO_UINT8(tx_phy, pp);
    841   STREAM_TO_UINT8(rx_phy, pp);
    842 
    843   DVLOG(1) << __func__ << " Received read_phy_cb";
    844   cb.Run(tx_phy, rx_phy, status);
    845 }
    846 
    847 /*******************************************************************************
    848  *
    849  * Function         BTM_BleReadPhy
    850  *
    851  * Description      To read the current PHYs for specified LE connection
    852  *
    853  *
    854  * Returns          BTM_SUCCESS if command successfully sent to controller,
    855  *                  BTM_MODE_UNSUPPORTED if local controller doesn't support LE
    856  *                  2M or LE Coded PHY,
    857  *                  BTM_WRONG_MODE if Device in wrong mode for request.
    858  *
    859  ******************************************************************************/
    860 void BTM_BleReadPhy(
    861     const RawAddress& bd_addr,
    862     base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb) {
    863   BTM_TRACE_DEBUG("%s", __func__);
    864 
    865   tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
    866 
    867   if (p_acl == NULL) {
    868     BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported",
    869                     __func__);
    870     cb.Run(0, 0, HCI_ERR_NO_CONNECTION);
    871     return;
    872   }
    873 
    874   // checking if local controller supports it!
    875   if (!controller_get_interface()->supports_ble_2m_phy() &&
    876       !controller_get_interface()->supports_ble_coded_phy()) {
    877     BTM_TRACE_ERROR("%s failed, request not supported in local controller!",
    878                     __func__);
    879     cb.Run(0, 0, GATT_REQ_NOT_SUPPORTED);
    880     return;
    881   }
    882 
    883   uint16_t handle = p_acl->hci_handle;
    884 
    885   const uint8_t len = HCIC_PARAM_SIZE_BLE_READ_PHY;
    886   uint8_t data[len];
    887   uint8_t* pp = data;
    888   UINT16_TO_STREAM(pp, handle);
    889   btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_READ_PHY, data, len,
    890                             base::Bind(&read_phy_cb, std::move(cb)));
    891   return;
    892 }
    893 
    894 void doNothing(uint8_t* data, uint16_t len) {}
    895 
    896 /*******************************************************************************
    897  *
    898  * Function         BTM_BleSetDefaultPhy
    899  *
    900  * Description      To set preferred PHY for ensuing LE connections
    901  *
    902  *
    903  * Returns          BTM_SUCCESS if command successfully sent to controller,
    904  *                  BTM_MODE_UNSUPPORTED if local controller doesn't support LE
    905  *                  2M or LE Coded PHY
    906  *
    907  ******************************************************************************/
    908 tBTM_STATUS BTM_BleSetDefaultPhy(uint8_t all_phys, uint8_t tx_phys,
    909                                  uint8_t rx_phys) {
    910   BTM_TRACE_DEBUG("%s: all_phys = 0x%02x, tx_phys = 0x%02x, rx_phys = 0x%02x",
    911                   __func__, all_phys, tx_phys, rx_phys);
    912 
    913   // checking if local controller supports it!
    914   if (!controller_get_interface()->supports_ble_2m_phy() &&
    915       !controller_get_interface()->supports_ble_coded_phy()) {
    916     BTM_TRACE_ERROR("%s failed, request not supported in local controller!",
    917                     __func__);
    918     return BTM_MODE_UNSUPPORTED;
    919   }
    920 
    921   const uint8_t len = HCIC_PARAM_SIZE_BLE_SET_DEFAULT_PHY;
    922   uint8_t data[len];
    923   uint8_t* pp = data;
    924   UINT8_TO_STREAM(pp, all_phys);
    925   UINT8_TO_STREAM(pp, tx_phys);
    926   UINT8_TO_STREAM(pp, rx_phys);
    927   btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_SET_DEFAULT_PHY, data, len,
    928                             base::Bind(doNothing));
    929   return BTM_SUCCESS;
    930 }
    931 
    932 /*******************************************************************************
    933  *
    934  * Function         BTM_BleSetPhy
    935  *
    936  * Description      To set PHY preferences for specified LE connection
    937  *
    938  *
    939  * Returns          BTM_SUCCESS if command successfully sent to controller,
    940  *                  BTM_MODE_UNSUPPORTED if local controller doesn't support LE
    941  *                  2M or LE Coded PHY,
    942  *                  BTM_ILLEGAL_VALUE if specified remote doesn't support LE 2M
    943  *                  or LE Coded PHY,
    944  *                  BTM_WRONG_MODE if Device in wrong mode for request.
    945  *
    946  ******************************************************************************/
    947 void BTM_BleSetPhy(const RawAddress& bd_addr, uint8_t tx_phys, uint8_t rx_phys,
    948                    uint16_t phy_options) {
    949   tACL_CONN* p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE);
    950 
    951   if (p_acl == NULL) {
    952     BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported",
    953                     __func__);
    954     return;
    955   }
    956 
    957   uint8_t all_phys = 0;
    958   if (tx_phys == 0) all_phys &= 0x01;
    959   if (rx_phys == 0) all_phys &= 0x02;
    960 
    961   BTM_TRACE_DEBUG(
    962       "%s: all_phys = 0x%02x, tx_phys = 0x%02x, rx_phys = 0x%02x, phy_options "
    963       "= 0x%04x",
    964       __func__, all_phys, tx_phys, rx_phys, phy_options);
    965 
    966   uint16_t handle = p_acl->hci_handle;
    967 
    968   // checking if local controller supports it!
    969   if (!controller_get_interface()->supports_ble_2m_phy() &&
    970       !controller_get_interface()->supports_ble_coded_phy()) {
    971     BTM_TRACE_ERROR("%s failed, request not supported in local controller!",
    972                     __func__);
    973     gatt_notify_phy_updated(GATT_REQ_NOT_SUPPORTED, handle, tx_phys, rx_phys);
    974     return;
    975   }
    976 
    977   if (!HCI_LE_2M_PHY_SUPPORTED(p_acl->peer_le_features) &&
    978       !HCI_LE_CODED_PHY_SUPPORTED(p_acl->peer_le_features)) {
    979     BTM_TRACE_ERROR("%s failed, peer does not support request", __func__);
    980     gatt_notify_phy_updated(GATT_REQ_NOT_SUPPORTED, handle, tx_phys, rx_phys);
    981     return;
    982   }
    983 
    984   const uint8_t len = HCIC_PARAM_SIZE_BLE_SET_PHY;
    985   uint8_t data[len];
    986   uint8_t* pp = data;
    987   UINT16_TO_STREAM(pp, handle);
    988   UINT8_TO_STREAM(pp, all_phys);
    989   UINT8_TO_STREAM(pp, tx_phys);
    990   UINT8_TO_STREAM(pp, rx_phys);
    991   UINT16_TO_STREAM(pp, phy_options);
    992   btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_SET_PHY, data, len,
    993                             base::Bind(doNothing));
    994 }
    995 
    996 /*******************************************************************************
    997  *
    998  * Function         btm_ble_determine_security_act
    999  *
   1000  * Description      This function checks the security of current LE link
   1001  *                  and returns the appropriate action that needs to be
   1002  *                  taken to achieve the required security.
   1003  *
   1004  * Parameter        is_originator - True if outgoing connection
   1005  *                  bdaddr: remote device address
   1006  *                  security_required: Security required for the service.
   1007  *
   1008  * Returns          The appropriate security action required.
   1009  *
   1010  ******************************************************************************/
   1011 tBTM_SEC_ACTION btm_ble_determine_security_act(bool is_originator,
   1012                                                const RawAddress& bdaddr,
   1013                                                uint16_t security_required) {
   1014   tBTM_LE_AUTH_REQ auth_req = 0x00;
   1015 
   1016   if (is_originator) {
   1017     if ((security_required & BTM_SEC_OUT_FLAGS) == 0 &&
   1018         (security_required & BTM_SEC_OUT_MITM) == 0) {
   1019       BTM_TRACE_DEBUG("%s No security required for outgoing connection",
   1020                       __func__);
   1021       return BTM_SEC_OK;
   1022     }
   1023 
   1024     if (security_required & BTM_SEC_OUT_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM;
   1025   } else {
   1026     if ((security_required & BTM_SEC_IN_FLAGS) == 0 &&
   1027         (security_required & BTM_SEC_IN_MITM) == 0) {
   1028       BTM_TRACE_DEBUG("%s No security required for incoming connection",
   1029                       __func__);
   1030       return BTM_SEC_OK;
   1031     }
   1032 
   1033     if (security_required & BTM_SEC_IN_MITM) auth_req |= BTM_LE_AUTH_REQ_MITM;
   1034   }
   1035 
   1036   tBTM_BLE_SEC_REQ_ACT ble_sec_act;
   1037   btm_ble_link_sec_check(bdaddr, auth_req, &ble_sec_act);
   1038 
   1039   BTM_TRACE_DEBUG("%s ble_sec_act %d", __func__, ble_sec_act);
   1040 
   1041   if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_DISCARD) return BTM_SEC_ENC_PENDING;
   1042 
   1043   if (ble_sec_act == BTM_BLE_SEC_REQ_ACT_NONE) return BTM_SEC_OK;
   1044 
   1045   uint8_t sec_flag = 0;
   1046   BTM_GetSecurityFlagsByTransport(bdaddr, &sec_flag, BT_TRANSPORT_LE);
   1047 
   1048   bool is_link_encrypted = false;
   1049   bool is_key_mitm = false;
   1050   if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED | BTM_SEC_FLAG_LKEY_KNOWN)) {
   1051     if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) is_link_encrypted = true;
   1052 
   1053     if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) is_key_mitm = true;
   1054   }
   1055 
   1056   if (auth_req & BTM_LE_AUTH_REQ_MITM) {
   1057     if (!is_key_mitm) {
   1058       return BTM_SEC_ENCRYPT_MITM;
   1059     } else {
   1060       if (is_link_encrypted)
   1061         return BTM_SEC_OK;
   1062       else
   1063         return BTM_SEC_ENCRYPT;
   1064     }
   1065   } else {
   1066     if (is_link_encrypted)
   1067       return BTM_SEC_OK;
   1068     else
   1069       return BTM_SEC_ENCRYPT_NO_MITM;
   1070   }
   1071 
   1072   return BTM_SEC_OK;
   1073 }
   1074 
   1075 /*******************************************************************************
   1076  *
   1077  * Function         btm_ble_start_sec_check
   1078  *
   1079  * Description      This function is to check and set the security required for
   1080  *                  LE link for LE COC.
   1081  *
   1082  * Parameter        bdaddr: remote device address.
   1083  *                  psm : PSM of the LE COC sevice.
   1084  *                  is_originator: true if outgoing connection.
   1085  *                  p_callback : Pointer to the callback function.
   1086  *                  p_ref_data : Pointer to be returned along with the callback.
   1087  *
   1088  * Returns          true if link already meets the required security; otherwise
   1089  *                  false.
   1090  *
   1091  ******************************************************************************/
   1092 bool btm_ble_start_sec_check(const RawAddress& bd_addr, uint16_t psm,
   1093                              bool is_originator, tBTM_SEC_CALLBACK* p_callback,
   1094                              void* p_ref_data) {
   1095   /* Find the service record for the PSM */
   1096   tBTM_SEC_SERV_REC* p_serv_rec = btm_sec_find_first_serv(is_originator, psm);
   1097 
   1098   /* If there is no application registered with this PSM do not allow connection
   1099    */
   1100   if (!p_serv_rec) {
   1101     BTM_TRACE_WARNING("%s PSM: %d no application registerd", __func__, psm);
   1102     (*p_callback)(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_MODE_UNSUPPORTED);
   1103     return false;
   1104   }
   1105 
   1106   tBTM_SEC_ACTION sec_act = btm_ble_determine_security_act(
   1107       is_originator, bd_addr, p_serv_rec->security_flags);
   1108 
   1109   tBTM_BLE_SEC_ACT ble_sec_act = BTM_BLE_SEC_NONE;
   1110   bool status = false;
   1111 
   1112   switch (sec_act) {
   1113     case BTM_SEC_OK:
   1114       BTM_TRACE_DEBUG("%s Security met", __func__);
   1115       p_callback(&bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_SUCCESS);
   1116       status = true;
   1117       break;
   1118 
   1119     case BTM_SEC_ENCRYPT:
   1120       BTM_TRACE_DEBUG("%s Encryption needs to be done", __func__);
   1121       ble_sec_act = BTM_BLE_SEC_ENCRYPT;
   1122       break;
   1123 
   1124     case BTM_SEC_ENCRYPT_MITM:
   1125       BTM_TRACE_DEBUG("%s Pairing with MITM needs to be done", __func__);
   1126       ble_sec_act = BTM_BLE_SEC_ENCRYPT_MITM;
   1127       break;
   1128 
   1129     case BTM_SEC_ENCRYPT_NO_MITM:
   1130       BTM_TRACE_DEBUG("%s Pairing with No MITM needs to be done", __func__);
   1131       ble_sec_act = BTM_BLE_SEC_ENCRYPT_NO_MITM;
   1132       break;
   1133 
   1134     case BTM_SEC_ENC_PENDING:
   1135       BTM_TRACE_DEBUG("%s Ecryption pending", __func__);
   1136       break;
   1137   }
   1138 
   1139   if (ble_sec_act == BTM_BLE_SEC_NONE) return status;
   1140 
   1141   tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
   1142   p_lcb->sec_act = sec_act;
   1143   BTM_SetEncryption(bd_addr, BT_TRANSPORT_LE, p_callback, p_ref_data,
   1144                     ble_sec_act);
   1145 
   1146   return false;
   1147 }
   1148 
   1149 /*******************************************************************************
   1150  *
   1151  * Function         btm_ble_rand_enc_complete
   1152  *
   1153  * Description      This function is the callback functions for HCI_Rand command
   1154  *                  and HCI_Encrypt command is completed.
   1155  *                  This message is received from the HCI.
   1156  *
   1157  * Returns          void
   1158  *
   1159  ******************************************************************************/
   1160 void btm_ble_rand_enc_complete(uint8_t* p, uint16_t op_code,
   1161                                tBTM_RAND_ENC_CB* p_enc_cplt_cback) {
   1162   tBTM_RAND_ENC params;
   1163   uint8_t* p_dest = params.param_buf;
   1164 
   1165   BTM_TRACE_DEBUG("btm_ble_rand_enc_complete");
   1166 
   1167   memset(&params, 0, sizeof(tBTM_RAND_ENC));
   1168 
   1169   /* If there was a callback address for vcs complete, call it */
   1170   if (p_enc_cplt_cback && p) {
   1171     /* Pass paramters to the callback function */
   1172     STREAM_TO_UINT8(params.status, p); /* command status */
   1173 
   1174     if (params.status == HCI_SUCCESS) {
   1175       params.opcode = op_code;
   1176 
   1177       if (op_code == HCI_BLE_RAND)
   1178         params.param_len = BT_OCTET8_LEN;
   1179       else
   1180         params.param_len = BT_OCTET16_LEN;
   1181 
   1182       /* Fetch return info from HCI event message */
   1183       memcpy(p_dest, p, params.param_len);
   1184     }
   1185     if (p_enc_cplt_cback) /* Call the Encryption complete callback function */
   1186       (*p_enc_cplt_cback)(&params);
   1187   }
   1188 }
   1189 
   1190 /*******************************************************************************
   1191  *
   1192  * Function         btm_ble_get_enc_key_type
   1193  *
   1194  * Description      This function is to increment local sign counter
   1195  * Returns         None
   1196  *
   1197  ******************************************************************************/
   1198 void btm_ble_increment_sign_ctr(const RawAddress& bd_addr, bool is_local) {
   1199   tBTM_SEC_DEV_REC* p_dev_rec;
   1200 
   1201   BTM_TRACE_DEBUG("btm_ble_increment_sign_ctr is_local=%d", is_local);
   1202 
   1203   p_dev_rec = btm_find_dev(bd_addr);
   1204   if (p_dev_rec != NULL) {
   1205     if (is_local)
   1206       p_dev_rec->ble.keys.local_counter++;
   1207     else
   1208       p_dev_rec->ble.keys.counter++;
   1209     BTM_TRACE_DEBUG("is_local=%d local sign counter=%d peer sign counter=%d",
   1210                     is_local, p_dev_rec->ble.keys.local_counter,
   1211                     p_dev_rec->ble.keys.counter);
   1212   }
   1213 }
   1214 
   1215 /*******************************************************************************
   1216  *
   1217  * Function         btm_ble_get_enc_key_type
   1218  *
   1219  * Description      This function is to get the BLE key type that has been
   1220  *                  exchanged betweem the local device and the peer device.
   1221  *
   1222  * Returns          p_key_type: output parameter to carry the key type value.
   1223  *
   1224  ******************************************************************************/
   1225 bool btm_ble_get_enc_key_type(const RawAddress& bd_addr, uint8_t* p_key_types) {
   1226   tBTM_SEC_DEV_REC* p_dev_rec;
   1227 
   1228   BTM_TRACE_DEBUG("btm_ble_get_enc_key_type");
   1229 
   1230   p_dev_rec = btm_find_dev(bd_addr);
   1231   if (p_dev_rec != NULL) {
   1232     *p_key_types = p_dev_rec->ble.key_type;
   1233     return true;
   1234   }
   1235   return false;
   1236 }
   1237 
   1238 /*******************************************************************************
   1239  *
   1240  * Function         btm_get_local_div
   1241  *
   1242  * Description      This function is called to read the local DIV
   1243  *
   1244  * Returns          TURE - if a valid DIV is availavle
   1245  ******************************************************************************/
   1246 bool btm_get_local_div(const RawAddress& bd_addr, uint16_t* p_div) {
   1247   tBTM_SEC_DEV_REC* p_dev_rec;
   1248   bool status = false;
   1249   VLOG(1) << __func__ << " bd_addr: " << bd_addr;
   1250 
   1251   *p_div = 0;
   1252   p_dev_rec = btm_find_dev(bd_addr);
   1253 
   1254   if (p_dev_rec && p_dev_rec->ble.keys.div) {
   1255     status = true;
   1256     *p_div = p_dev_rec->ble.keys.div;
   1257   }
   1258   BTM_TRACE_DEBUG("btm_get_local_div status=%d (1-OK) DIV=0x%x", status,
   1259                   *p_div);
   1260   return status;
   1261 }
   1262 
   1263 /*******************************************************************************
   1264  *
   1265  * Function         btm_sec_save_le_key
   1266  *
   1267  * Description      This function is called by the SMP to update
   1268  *                  an  BLE key.  SMP is internal, whereas all the keys shall
   1269  *                  be sent to the application.  The function is also called
   1270  *                  when application passes ble key stored in NVRAM to the
   1271  *                  btm_sec.
   1272  *                  pass_to_application parameter is false in this case.
   1273  *
   1274  * Returns          void
   1275  *
   1276  ******************************************************************************/
   1277 void btm_sec_save_le_key(const RawAddress& bd_addr, tBTM_LE_KEY_TYPE key_type,
   1278                          tBTM_LE_KEY_VALUE* p_keys, bool pass_to_application) {
   1279   tBTM_SEC_DEV_REC* p_rec;
   1280   tBTM_LE_EVT_DATA cb_data;
   1281   uint8_t i;
   1282 
   1283   BTM_TRACE_DEBUG("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",
   1284                   key_type, pass_to_application);
   1285   /* Store the updated key in the device database */
   1286 
   1287   VLOG(1) << "bd_addr:" << bd_addr;
   1288 
   1289   if ((p_rec = btm_find_dev(bd_addr)) != NULL &&
   1290       (p_keys || key_type == BTM_LE_KEY_LID)) {
   1291     btm_ble_init_pseudo_addr(p_rec, bd_addr);
   1292 
   1293     switch (key_type) {
   1294       case BTM_LE_KEY_PENC:
   1295         memcpy(p_rec->ble.keys.pltk, p_keys->penc_key.ltk, BT_OCTET16_LEN);
   1296         memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN);
   1297         p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level;
   1298         p_rec->ble.keys.ediv = p_keys->penc_key.ediv;
   1299         p_rec->ble.keys.key_size = p_keys->penc_key.key_size;
   1300         p_rec->ble.key_type |= BTM_LE_KEY_PENC;
   1301         p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN;
   1302         if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED)
   1303           p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
   1304         else
   1305           p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
   1306         BTM_TRACE_DEBUG(
   1307             "BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x",
   1308             p_rec->ble.key_type, p_rec->sec_flags, p_rec->ble.keys.sec_level);
   1309         break;
   1310 
   1311       case BTM_LE_KEY_PID:
   1312         for (i = 0; i < BT_OCTET16_LEN; i++) {
   1313           p_rec->ble.keys.irk[i] = p_keys->pid_key.irk[i];
   1314         }
   1315 
   1316         // memcpy( p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN); todo
   1317         // will crash the system
   1318         p_rec->ble.static_addr = p_keys->pid_key.static_addr;
   1319         p_rec->ble.static_addr_type = p_keys->pid_key.addr_type;
   1320         p_rec->ble.key_type |= BTM_LE_KEY_PID;
   1321         BTM_TRACE_DEBUG(
   1322             "%s: BTM_LE_KEY_PID key_type=0x%x save peer IRK, change bd_addr=%s "
   1323             "to static_addr=%s",
   1324             __func__, p_rec->ble.key_type, p_rec->bd_addr.ToString().c_str(),
   1325             p_keys->pid_key.static_addr.ToString().c_str());
   1326         /* update device record address as static address */
   1327         p_rec->bd_addr = p_keys->pid_key.static_addr;
   1328         /* combine DUMO device security record if needed */
   1329         btm_consolidate_dev(p_rec);
   1330         break;
   1331 
   1332       case BTM_LE_KEY_PCSRK:
   1333         memcpy(p_rec->ble.keys.pcsrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN);
   1334         p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level;
   1335         p_rec->ble.keys.counter = p_keys->pcsrk_key.counter;
   1336         p_rec->ble.key_type |= BTM_LE_KEY_PCSRK;
   1337         p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN;
   1338         if (p_keys->pcsrk_key.sec_level == SMP_SEC_AUTHENTICATED)
   1339           p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
   1340         else
   1341           p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
   1342 
   1343         BTM_TRACE_DEBUG(
   1344             "BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x "
   1345             "peer_counter=%d",
   1346             p_rec->ble.key_type, p_rec->sec_flags,
   1347             p_rec->ble.keys.srk_sec_level, p_rec->ble.keys.counter);
   1348         break;
   1349 
   1350       case BTM_LE_KEY_LENC:
   1351         memcpy(p_rec->ble.keys.lltk, p_keys->lenc_key.ltk, BT_OCTET16_LEN);
   1352         p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */
   1353         p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level;
   1354         p_rec->ble.keys.key_size = p_keys->lenc_key.key_size;
   1355         p_rec->ble.key_type |= BTM_LE_KEY_LENC;
   1356 
   1357         BTM_TRACE_DEBUG(
   1358             "BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x "
   1359             "sec_level=0x%x",
   1360             p_rec->ble.key_type, p_rec->ble.keys.div, p_rec->ble.keys.key_size,
   1361             p_rec->ble.keys.sec_level);
   1362         break;
   1363 
   1364       case BTM_LE_KEY_LCSRK: /* local CSRK has been delivered */
   1365         memcpy(p_rec->ble.keys.lcsrk, p_keys->lcsrk_key.csrk, BT_OCTET16_LEN);
   1366         p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */
   1367         p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level;
   1368         p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter;
   1369         p_rec->ble.key_type |= BTM_LE_KEY_LCSRK;
   1370         BTM_TRACE_DEBUG(
   1371             "BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x "
   1372             "local_counter=%d",
   1373             p_rec->ble.key_type, p_rec->ble.keys.div,
   1374             p_rec->ble.keys.local_csrk_sec_level,
   1375             p_rec->ble.keys.local_counter);
   1376         break;
   1377 
   1378       case BTM_LE_KEY_LID:
   1379         p_rec->ble.key_type |= BTM_LE_KEY_LID;
   1380         break;
   1381       default:
   1382         BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)",
   1383                           key_type);
   1384         return;
   1385     }
   1386 
   1387     VLOG(1) << "BLE key type 0x" << loghex(key_type)
   1388             << " updated for BDA: " << bd_addr << " (btm_sec_save_le_key)";
   1389 
   1390     /* Notify the application that one of the BLE keys has been updated
   1391        If link key is in progress, it will get sent later.*/
   1392     if (pass_to_application && btm_cb.api.p_le_callback) {
   1393       cb_data.key.p_key_value = p_keys;
   1394       cb_data.key.key_type = key_type;
   1395 
   1396       (*btm_cb.api.p_le_callback)(BTM_LE_KEY_EVT, bd_addr, &cb_data);
   1397     }
   1398     return;
   1399   }
   1400 
   1401   LOG(WARNING) << "BLE key type 0x" << loghex(key_type)
   1402                << " called for Unknown BDA or type: " << bd_addr
   1403                << "(btm_sec_save_le_key)";
   1404 
   1405   if (p_rec) {
   1406     BTM_TRACE_DEBUG("sec_flags=0x%x", p_rec->sec_flags);
   1407   }
   1408 }
   1409 
   1410 /*******************************************************************************
   1411  *
   1412  * Function         btm_ble_update_sec_key_size
   1413  *
   1414  * Description      update the current lin kencryption key size
   1415  *
   1416  * Returns          void
   1417  *
   1418  ******************************************************************************/
   1419 void btm_ble_update_sec_key_size(const RawAddress& bd_addr,
   1420                                  uint8_t enc_key_size) {
   1421   tBTM_SEC_DEV_REC* p_rec;
   1422 
   1423   BTM_TRACE_DEBUG("btm_ble_update_sec_key_size enc_key_size = %d",
   1424                   enc_key_size);
   1425 
   1426   p_rec = btm_find_dev(bd_addr);
   1427   if (p_rec != NULL) {
   1428     p_rec->enc_key_size = enc_key_size;
   1429   }
   1430 }
   1431 
   1432 /*******************************************************************************
   1433  *
   1434  * Function         btm_ble_read_sec_key_size
   1435  *
   1436  * Description      update the current lin kencryption key size
   1437  *
   1438  * Returns          void
   1439  *
   1440  ******************************************************************************/
   1441 uint8_t btm_ble_read_sec_key_size(const RawAddress& bd_addr) {
   1442   tBTM_SEC_DEV_REC* p_rec;
   1443 
   1444   p_rec = btm_find_dev(bd_addr);
   1445   if (p_rec != NULL) {
   1446     return p_rec->enc_key_size;
   1447   } else
   1448     return 0;
   1449 }
   1450 
   1451 /*******************************************************************************
   1452  *
   1453  * Function         btm_ble_link_sec_check
   1454  *
   1455  * Description      Check BLE link security level match.
   1456  *
   1457  * Returns          true: check is OK and the *p_sec_req_act contain the action
   1458  *
   1459  ******************************************************************************/
   1460 void btm_ble_link_sec_check(const RawAddress& bd_addr,
   1461                             tBTM_LE_AUTH_REQ auth_req,
   1462                             tBTM_BLE_SEC_REQ_ACT* p_sec_req_act) {
   1463   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   1464   uint8_t req_sec_level = BTM_LE_SEC_NONE, cur_sec_level = BTM_LE_SEC_NONE;
   1465 
   1466   BTM_TRACE_DEBUG("btm_ble_link_sec_check auth_req =0x%x", auth_req);
   1467 
   1468   if (p_dev_rec == NULL) {
   1469     BTM_TRACE_ERROR("btm_ble_link_sec_check received for unknown device");
   1470     return;
   1471   }
   1472 
   1473   if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING ||
   1474       p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) {
   1475     /* race condition: discard the security request while master is encrypting
   1476      * the link */
   1477     *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD;
   1478   } else {
   1479     req_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
   1480     if (auth_req & BTM_LE_AUTH_REQ_MITM) {
   1481       req_sec_level = BTM_LE_SEC_AUTHENTICATED;
   1482     }
   1483 
   1484     BTM_TRACE_DEBUG("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags);
   1485 
   1486     /* currently encrpted  */
   1487     if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED) {
   1488       if (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)
   1489         cur_sec_level = BTM_LE_SEC_AUTHENTICATED;
   1490       else
   1491         cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
   1492     } else /* unencrypted link */
   1493     {
   1494       /* if bonded, get the key security level */
   1495       if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC)
   1496         cur_sec_level = p_dev_rec->ble.keys.sec_level;
   1497       else
   1498         cur_sec_level = BTM_LE_SEC_NONE;
   1499     }
   1500 
   1501     if (cur_sec_level >= req_sec_level) {
   1502       /* To avoid re-encryption on an encrypted link for an equal condition
   1503        * encryption */
   1504       *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_ENCRYPT;
   1505     } else {
   1506       /* start the pariring process to upgrade the keys*/
   1507       *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_PAIR;
   1508     }
   1509   }
   1510 
   1511   BTM_TRACE_DEBUG("cur_sec_level=%d req_sec_level=%d sec_req_act=%d",
   1512                   cur_sec_level, req_sec_level, *p_sec_req_act);
   1513 }
   1514 
   1515 /*******************************************************************************
   1516  *
   1517  * Function         btm_ble_set_encryption
   1518  *
   1519  * Description      This function is called to ensure that LE connection is
   1520  *                  encrypted.  Should be called only on an open connection.
   1521  *                  Typically only needed for connections that first want to
   1522  *                  bring up unencrypted links, then later encrypt them.
   1523  *
   1524  * Returns          void
   1525  *                  the local device ER is copied into er
   1526  *
   1527  ******************************************************************************/
   1528 tBTM_STATUS btm_ble_set_encryption(const RawAddress& bd_addr,
   1529                                    tBTM_BLE_SEC_ACT sec_act,
   1530                                    uint8_t link_role) {
   1531   tBTM_STATUS cmd = BTM_NO_RESOURCES;
   1532   tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr);
   1533   tBTM_BLE_SEC_REQ_ACT sec_req_act;
   1534   tBTM_LE_AUTH_REQ auth_req;
   1535 
   1536   if (p_rec == NULL) {
   1537     BTM_TRACE_WARNING(
   1538         "btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act);
   1539     return (BTM_WRONG_MODE);
   1540   }
   1541 
   1542   BTM_TRACE_DEBUG("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act,
   1543                   p_rec->role_master);
   1544 
   1545   if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM) {
   1546     p_rec->security_required |= BTM_SEC_IN_MITM;
   1547   }
   1548 
   1549   switch (sec_act) {
   1550     case BTM_BLE_SEC_ENCRYPT:
   1551       if (link_role == BTM_ROLE_MASTER) {
   1552         /* start link layer encryption using the security info stored */
   1553         cmd = btm_ble_start_encrypt(bd_addr, false, NULL);
   1554         break;
   1555       }
   1556     /* if salve role then fall through to call SMP_Pair below which will send a
   1557        sec_request to request the master to encrypt the link */
   1558     case BTM_BLE_SEC_ENCRYPT_NO_MITM:
   1559     case BTM_BLE_SEC_ENCRYPT_MITM:
   1560       auth_req = (sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM)
   1561                      ? SMP_AUTH_BOND
   1562                      : (SMP_AUTH_BOND | SMP_AUTH_YN_BIT);
   1563       btm_ble_link_sec_check(bd_addr, auth_req, &sec_req_act);
   1564       if (sec_req_act == BTM_BLE_SEC_REQ_ACT_NONE ||
   1565           sec_req_act == BTM_BLE_SEC_REQ_ACT_DISCARD) {
   1566         BTM_TRACE_DEBUG("%s, no action needed. Ignore", __func__);
   1567         cmd = BTM_SUCCESS;
   1568         break;
   1569       }
   1570       if (link_role == BTM_ROLE_MASTER) {
   1571         if (sec_req_act == BTM_BLE_SEC_REQ_ACT_ENCRYPT) {
   1572           cmd = btm_ble_start_encrypt(bd_addr, false, NULL);
   1573           break;
   1574         }
   1575       }
   1576 
   1577       if (SMP_Pair(bd_addr) == SMP_STARTED) {
   1578         cmd = BTM_CMD_STARTED;
   1579         p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
   1580       }
   1581       break;
   1582 
   1583     default:
   1584       cmd = BTM_WRONG_MODE;
   1585       break;
   1586   }
   1587   return cmd;
   1588 }
   1589 
   1590 /*******************************************************************************
   1591  *
   1592  * Function         btm_ble_ltk_request
   1593  *
   1594  * Description      This function is called when encryption request is received
   1595  *                  on a slave device.
   1596  *
   1597  *
   1598  * Returns          void
   1599  *
   1600  ******************************************************************************/
   1601 void btm_ble_ltk_request(uint16_t handle, uint8_t rand[8], uint16_t ediv) {
   1602   tBTM_CB* p_cb = &btm_cb;
   1603   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
   1604   BT_OCTET8 dummy_stk = {0};
   1605 
   1606   BTM_TRACE_DEBUG("btm_ble_ltk_request");
   1607 
   1608   p_cb->ediv = ediv;
   1609 
   1610   memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN);
   1611 
   1612   if (p_dev_rec != NULL) {
   1613     if (!smp_proc_ltk_request(p_dev_rec->bd_addr))
   1614       btm_ble_ltk_request_reply(p_dev_rec->bd_addr, false, dummy_stk);
   1615   }
   1616 }
   1617 
   1618 /*******************************************************************************
   1619  *
   1620  * Function         btm_ble_start_encrypt
   1621  *
   1622  * Description      This function is called to start LE encryption.
   1623  *
   1624  *
   1625  * Returns          BTM_SUCCESS if encryption was started successfully
   1626  *
   1627  ******************************************************************************/
   1628 tBTM_STATUS btm_ble_start_encrypt(const RawAddress& bda, bool use_stk,
   1629                                   BT_OCTET16 stk) {
   1630   tBTM_CB* p_cb = &btm_cb;
   1631   tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda);
   1632   BT_OCTET8 dummy_rand = {0};
   1633 
   1634   BTM_TRACE_DEBUG("btm_ble_start_encrypt");
   1635 
   1636   if (!p_rec) {
   1637     BTM_TRACE_ERROR("Link is not active, can not encrypt!");
   1638     return BTM_WRONG_MODE;
   1639   }
   1640 
   1641   if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) {
   1642     BTM_TRACE_WARNING("Link Encryption is active, Busy!");
   1643     return BTM_BUSY;
   1644   }
   1645 
   1646   p_cb->enc_handle = p_rec->ble_hci_handle;
   1647 
   1648   if (use_stk) {
   1649     btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk);
   1650   } else if (p_rec->ble.key_type & BTM_LE_KEY_PENC) {
   1651     btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand,
   1652                              p_rec->ble.keys.ediv, p_rec->ble.keys.pltk);
   1653   } else {
   1654     BTM_TRACE_ERROR("No key available to encrypt the link");
   1655     return BTM_NO_RESOURCES;
   1656   }
   1657 
   1658   if (p_rec->sec_state == BTM_SEC_STATE_IDLE)
   1659     p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
   1660 
   1661   return BTM_CMD_STARTED;
   1662 }
   1663 
   1664 /*******************************************************************************
   1665  *
   1666  * Function         btm_ble_link_encrypted
   1667  *
   1668  * Description      This function is called when LE link encrption status is
   1669  *                  changed.
   1670  *
   1671  * Returns          void
   1672  *
   1673  ******************************************************************************/
   1674 void btm_ble_link_encrypted(const RawAddress& bd_addr, uint8_t encr_enable) {
   1675   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   1676   bool enc_cback;
   1677 
   1678   if (!p_dev_rec) {
   1679     BTM_TRACE_WARNING(
   1680         "btm_ble_link_encrypted (No Device Found!) encr_enable=%d",
   1681         encr_enable);
   1682     return;
   1683   }
   1684 
   1685   BTM_TRACE_DEBUG("btm_ble_link_encrypted encr_enable=%d", encr_enable);
   1686 
   1687   enc_cback = (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING);
   1688 
   1689   smp_link_encrypted(bd_addr, encr_enable);
   1690 
   1691   BTM_TRACE_DEBUG(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
   1692 
   1693   if (encr_enable && p_dev_rec->enc_key_size == 0)
   1694     p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size;
   1695 
   1696   p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   1697   if (p_dev_rec->p_callback && enc_cback) {
   1698     if (encr_enable)
   1699       btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS, true);
   1700     else if (p_dev_rec->role_master)
   1701       btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, true);
   1702   }
   1703   /* to notify GATT to send data if any request is pending */
   1704   gatt_notify_enc_cmpl(p_dev_rec->ble.pseudo_addr);
   1705 }
   1706 
   1707 /*******************************************************************************
   1708  *
   1709  * Function         btm_ble_ltk_request_reply
   1710  *
   1711  * Description      This function is called to send a LTK request reply on a
   1712  *                  slave
   1713  *                  device.
   1714  *
   1715  * Returns          void
   1716  *
   1717  ******************************************************************************/
   1718 void btm_ble_ltk_request_reply(const RawAddress& bda, bool use_stk,
   1719                                BT_OCTET16 stk) {
   1720   tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bda);
   1721   tBTM_CB* p_cb = &btm_cb;
   1722 
   1723   if (p_rec == NULL) {
   1724     BTM_TRACE_ERROR("btm_ble_ltk_request_reply received for unknown device");
   1725     return;
   1726   }
   1727 
   1728   BTM_TRACE_DEBUG("btm_ble_ltk_request_reply");
   1729   p_cb->enc_handle = p_rec->ble_hci_handle;
   1730   p_cb->key_size = p_rec->ble.keys.key_size;
   1731 
   1732   BTM_TRACE_ERROR("key size = %d", p_rec->ble.keys.key_size);
   1733   if (use_stk) {
   1734     btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk);
   1735   } else /* calculate LTK using peer device  */
   1736   {
   1737     if (p_rec->ble.key_type & BTM_LE_KEY_LENC)
   1738       btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p_rec->ble.keys.lltk);
   1739     else
   1740       btsnd_hcic_ble_ltk_req_neg_reply(btm_cb.enc_handle);
   1741   }
   1742 }
   1743 
   1744 /*******************************************************************************
   1745  *
   1746  * Function         btm_ble_io_capabilities_req
   1747  *
   1748  * Description      This function is called to handle SMP get IO capability
   1749  *                  request.
   1750  *
   1751  * Returns          void
   1752  *
   1753  ******************************************************************************/
   1754 uint8_t btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC* p_dev_rec,
   1755                                     tBTM_LE_IO_REQ* p_data) {
   1756   uint8_t callback_rc = BTM_SUCCESS;
   1757   BTM_TRACE_DEBUG("btm_ble_io_capabilities_req");
   1758   if (btm_cb.api.p_le_callback) {
   1759     /* the callback function implementation may change the IO capability... */
   1760     callback_rc = (*btm_cb.api.p_le_callback)(
   1761         BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data);
   1762   }
   1763   if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != p_data->oob_data)) {
   1764 #if (BTM_BLE_CONFORMANCE_TESTING == TRUE)
   1765     if (btm_cb.devcb.keep_rfu_in_auth_req) {
   1766       BTM_TRACE_DEBUG("btm_ble_io_capabilities_req keep_rfu_in_auth_req = %u",
   1767                       btm_cb.devcb.keep_rfu_in_auth_req);
   1768       p_data->auth_req &= BTM_LE_AUTH_REQ_MASK_KEEP_RFU;
   1769       btm_cb.devcb.keep_rfu_in_auth_req = false;
   1770     } else { /* default */
   1771       p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
   1772     }
   1773 #else
   1774     p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
   1775 #endif
   1776 
   1777     BTM_TRACE_DEBUG(
   1778         "btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d "
   1779         "auth_req:%d",
   1780         p_dev_rec->security_required, p_data->auth_req);
   1781     BTM_TRACE_DEBUG(
   1782         "btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK "
   1783         "1-IRK 2-CSRK)",
   1784         p_data->init_keys, p_data->resp_keys);
   1785 
   1786     /* if authentication requires MITM protection, put on the mask */
   1787     if (p_dev_rec->security_required & BTM_SEC_IN_MITM)
   1788       p_data->auth_req |= BTM_LE_AUTH_REQ_MITM;
   1789 
   1790     if (!(p_data->auth_req & SMP_AUTH_BOND)) {
   1791       BTM_TRACE_DEBUG("Non bonding: No keys should be exchanged");
   1792       p_data->init_keys = 0;
   1793       p_data->resp_keys = 0;
   1794     }
   1795 
   1796     BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 3: auth_req:%d",
   1797                     p_data->auth_req);
   1798     BTM_TRACE_DEBUG("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x",
   1799                     p_data->init_keys, p_data->resp_keys);
   1800 
   1801     BTM_TRACE_DEBUG(
   1802         "btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d",
   1803         p_data->io_cap, p_data->auth_req);
   1804 
   1805     /* remove MITM protection requirement if IO cap does not allow it */
   1806     if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE)
   1807       p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM;
   1808 
   1809     if (!(p_data->auth_req & SMP_SC_SUPPORT_BIT)) {
   1810       /* if Secure Connections are not supported then remove LK derivation,
   1811       ** and keypress notifications.
   1812       */
   1813       BTM_TRACE_DEBUG(
   1814           "%s-SC not supported -> No LK derivation, no keypress notifications",
   1815           __func__);
   1816       p_data->auth_req &= ~SMP_KP_SUPPORT_BIT;
   1817       p_data->init_keys &= ~SMP_SEC_KEY_TYPE_LK;
   1818       p_data->resp_keys &= ~SMP_SEC_KEY_TYPE_LK;
   1819     }
   1820 
   1821     BTM_TRACE_DEBUG(
   1822         "btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:0x%02x",
   1823         p_data->io_cap, p_data->oob_data, p_data->auth_req);
   1824   }
   1825   return callback_rc;
   1826 }
   1827 
   1828 /*******************************************************************************
   1829  *
   1830  * Function         btm_ble_br_keys_req
   1831  *
   1832  * Description      This function is called to handle SMP request for keys sent
   1833  *                  over BR/EDR.
   1834  *
   1835  * Returns          void
   1836  *
   1837  ******************************************************************************/
   1838 uint8_t btm_ble_br_keys_req(tBTM_SEC_DEV_REC* p_dev_rec,
   1839                             tBTM_LE_IO_REQ* p_data) {
   1840   uint8_t callback_rc = BTM_SUCCESS;
   1841   BTM_TRACE_DEBUG("%s", __func__);
   1842   if (btm_cb.api.p_le_callback) {
   1843     /* the callback function implementation may change the IO capability... */
   1844     callback_rc = (*btm_cb.api.p_le_callback)(
   1845         BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA*)p_data);
   1846   }
   1847 
   1848   return callback_rc;
   1849 }
   1850 
   1851 /*******************************************************************************
   1852  *
   1853  * Function         btm_ble_connected
   1854  *
   1855  * Description      This function is when a LE connection to the peer device is
   1856  *                  establsihed
   1857  *
   1858  * Returns          void
   1859  *
   1860  ******************************************************************************/
   1861 void btm_ble_connected(const RawAddress& bda, uint16_t handle, uint8_t enc_mode,
   1862                        uint8_t role, tBLE_ADDR_TYPE addr_type,
   1863                        UNUSED_ATTR bool addr_matched) {
   1864   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
   1865   tBTM_BLE_CB* p_cb = &btm_cb.ble_ctr_cb;
   1866 
   1867   BTM_TRACE_EVENT("btm_ble_connected");
   1868 
   1869   /* Commenting out trace due to obf/compilation problems.
   1870   */
   1871   if (p_dev_rec) {
   1872     VLOG(1) << __func__ << " Security Manager: handle:" << handle
   1873             << " enc_mode:" << loghex(enc_mode) << "  bda: " << bda
   1874             << " RName: " << p_dev_rec->sec_bd_name
   1875             << " p_dev_rec:" << p_dev_rec;
   1876 
   1877     BTM_TRACE_DEBUG("btm_ble_connected sec_flags=0x%x", p_dev_rec->sec_flags);
   1878   } else {
   1879     VLOG(1) << __func__ << " Security Manager: handle:" << handle
   1880             << " enc_mode:" << loghex(enc_mode) << "  bda: " << bda
   1881             << " p_dev_rec:" << p_dev_rec;
   1882   }
   1883 
   1884   if (!p_dev_rec) {
   1885     /* There is no device record for new connection.  Allocate one */
   1886     p_dev_rec = btm_sec_alloc_dev(bda);
   1887     if (p_dev_rec == NULL) return;
   1888   } else /* Update the timestamp for this device */
   1889   {
   1890     p_dev_rec->timestamp = btm_cb.dev_rec_count++;
   1891   }
   1892 
   1893   /* update device information */
   1894   p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE;
   1895   p_dev_rec->ble_hci_handle = handle;
   1896   p_dev_rec->ble.ble_addr_type = addr_type;
   1897   /* update pseudo address */
   1898   p_dev_rec->ble.pseudo_addr = bda;
   1899 
   1900   p_dev_rec->role_master = false;
   1901   if (role == HCI_ROLE_MASTER) p_dev_rec->role_master = true;
   1902 
   1903 #if (BLE_PRIVACY_SPT == TRUE)
   1904   if (!addr_matched) p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_PSEUDO;
   1905 
   1906   if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched)
   1907     p_dev_rec->ble.cur_rand_addr = bda;
   1908 #endif
   1909 
   1910   p_cb->inq_var.directed_conn = BTM_BLE_CONNECT_EVT;
   1911 
   1912   return;
   1913 }
   1914 
   1915 /*****************************************************************************
   1916  *  Function        btm_ble_conn_complete
   1917  *
   1918  *  Description     LE connection complete.
   1919  *
   1920  *****************************************************************************/
   1921 void btm_ble_conn_complete(uint8_t* p, UNUSED_ATTR uint16_t evt_len,
   1922                            bool enhanced) {
   1923 #if (BLE_PRIVACY_SPT == TRUE)
   1924   uint8_t peer_addr_type;
   1925 #endif
   1926   RawAddress local_rpa, peer_rpa;
   1927   uint8_t role, status, bda_type;
   1928   uint16_t handle;
   1929   RawAddress bda;
   1930   uint16_t conn_interval, conn_latency, conn_timeout;
   1931   bool match = false;
   1932 
   1933   STREAM_TO_UINT8(status, p);
   1934   STREAM_TO_UINT16(handle, p);
   1935   STREAM_TO_UINT8(role, p);
   1936   STREAM_TO_UINT8(bda_type, p);
   1937   STREAM_TO_BDADDR(bda, p);
   1938 
   1939   if (status == 0) {
   1940     if (enhanced) {
   1941       STREAM_TO_BDADDR(local_rpa, p);
   1942       STREAM_TO_BDADDR(peer_rpa, p);
   1943     }
   1944 
   1945     STREAM_TO_UINT16(conn_interval, p);
   1946     STREAM_TO_UINT16(conn_latency, p);
   1947     STREAM_TO_UINT16(conn_timeout, p);
   1948     handle = HCID_GET_HANDLE(handle);
   1949 
   1950 #if (BLE_PRIVACY_SPT == TRUE)
   1951     peer_addr_type = bda_type;
   1952     match = btm_identity_addr_to_random_pseudo(&bda, &bda_type, true);
   1953 
   1954     /* possiblly receive connection complete with resolvable random while
   1955        the device has been paired */
   1956     if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) {
   1957       tBTM_SEC_DEV_REC* match_rec = btm_ble_resolve_random_addr(bda);
   1958       if (match_rec) {
   1959         LOG_INFO(LOG_TAG, "%s matched and resolved random address", __func__);
   1960         match = true;
   1961         match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
   1962         match_rec->ble.cur_rand_addr = bda;
   1963         if (!btm_ble_init_pseudo_addr(match_rec, bda)) {
   1964           /* assign the original address to be the current report address */
   1965           bda = match_rec->ble.pseudo_addr;
   1966         } else {
   1967           bda = match_rec->bd_addr;
   1968         }
   1969       } else {
   1970         LOG_INFO(LOG_TAG, "%s unable to match and resolve random address",
   1971                  __func__);
   1972       }
   1973     }
   1974 #endif
   1975 
   1976     btm_ble_connected(bda, handle, HCI_ENCRYPT_MODE_DISABLED, role, bda_type,
   1977                       match);
   1978 
   1979     l2cble_conn_comp(handle, role, bda, bda_type, conn_interval, conn_latency,
   1980                      conn_timeout);
   1981 
   1982 #if (BLE_PRIVACY_SPT == TRUE)
   1983     if (enhanced) {
   1984       btm_ble_refresh_local_resolvable_private_addr(bda, local_rpa);
   1985 
   1986       if (peer_addr_type & BLE_ADDR_TYPE_ID_BIT)
   1987         btm_ble_refresh_peer_resolvable_private_addr(bda, peer_rpa,
   1988                                                      BLE_ADDR_RANDOM);
   1989     }
   1990 #endif
   1991   } else {
   1992     role = HCI_ROLE_UNKNOWN;
   1993     if (status != HCI_ERR_ADVERTISING_TIMEOUT) {
   1994       btm_ble_set_conn_st(BLE_CONN_IDLE);
   1995 #if (BLE_PRIVACY_SPT == TRUE)
   1996       btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, true);
   1997 #endif
   1998     } else {
   1999 #if (BLE_PRIVACY_SPT == TRUE)
   2000       btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
   2001       btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, true);
   2002 #endif
   2003     }
   2004   }
   2005 
   2006   btm_ble_update_mode_operation(role, &bda, status);
   2007 
   2008   if (role == HCI_ROLE_SLAVE)
   2009     btm_ble_advertiser_notify_terminated_legacy(status, handle);
   2010 }
   2011 
   2012 /*****************************************************************************
   2013  * Function btm_ble_create_ll_conn_complete
   2014  *
   2015  * Description LE connection complete.
   2016  *
   2017  *****************************************************************************/
   2018 void btm_ble_create_ll_conn_complete(uint8_t status) {
   2019   if (status == HCI_SUCCESS) return;
   2020 
   2021   btm_ble_set_conn_st(BLE_CONN_IDLE);
   2022   btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, NULL, status);
   2023 
   2024   LOG(WARNING) << "LE Create Connection attempt failed, status="
   2025                << loghex(status);
   2026 
   2027   if (status == HCI_ERR_COMMAND_DISALLOWED) {
   2028     /* There is already either direct connect, or whitelist connection
   2029      * pending, but we don't know which one, or to which state should we
   2030      * transition now. This can be triggered only in case of rare race
   2031      * condition. Crash to recover. */
   2032     LOG(FATAL) << "LE Create Connection - command disallowed";
   2033   }
   2034 }
   2035 /*****************************************************************************
   2036  *  Function        btm_proc_smp_cback
   2037  *
   2038  *  Description     This function is the SMP callback handler.
   2039  *
   2040  *****************************************************************************/
   2041 uint8_t btm_proc_smp_cback(tSMP_EVT event, const RawAddress& bd_addr,
   2042                            tSMP_EVT_DATA* p_data) {
   2043   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   2044   uint8_t res = 0;
   2045 
   2046   BTM_TRACE_DEBUG("btm_proc_smp_cback event = %d", event);
   2047 
   2048   if (p_dev_rec != NULL) {
   2049     switch (event) {
   2050       case SMP_IO_CAP_REQ_EVT:
   2051         btm_ble_io_capabilities_req(p_dev_rec,
   2052                                     (tBTM_LE_IO_REQ*)&p_data->io_req);
   2053         break;
   2054 
   2055       case SMP_BR_KEYS_REQ_EVT:
   2056         btm_ble_br_keys_req(p_dev_rec, (tBTM_LE_IO_REQ*)&p_data->io_req);
   2057         break;
   2058 
   2059       case SMP_PASSKEY_REQ_EVT:
   2060       case SMP_PASSKEY_NOTIF_EVT:
   2061       case SMP_OOB_REQ_EVT:
   2062       case SMP_NC_REQ_EVT:
   2063       case SMP_SC_OOB_REQ_EVT:
   2064         /* fall through */
   2065         p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
   2066 
   2067       case SMP_SEC_REQUEST_EVT:
   2068         if (event == SMP_SEC_REQUEST_EVT &&
   2069             btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) {
   2070           BTM_TRACE_DEBUG("%s: Ignoring SMP Security request", __func__);
   2071           break;
   2072         }
   2073         btm_cb.pairing_bda = bd_addr;
   2074         p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
   2075         btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
   2076       /* fall through */
   2077 
   2078       case SMP_COMPLT_EVT:
   2079         if (btm_cb.api.p_le_callback) {
   2080           /* the callback function implementation may change the IO
   2081            * capability... */
   2082           BTM_TRACE_DEBUG("btm_cb.api.p_le_callback=0x%x",
   2083                           btm_cb.api.p_le_callback);
   2084           (*btm_cb.api.p_le_callback)(event, bd_addr,
   2085                                       (tBTM_LE_EVT_DATA*)p_data);
   2086         }
   2087 
   2088         if (event == SMP_COMPLT_EVT) {
   2089           BTM_TRACE_DEBUG(
   2090               "evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x",
   2091               p_data->cmplt.sec_level, p_dev_rec->sec_flags);
   2092 
   2093           res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS
   2094                                                       : BTM_ERR_PROCESSING;
   2095 
   2096           BTM_TRACE_DEBUG(
   2097               "after update result=%d sec_level=0x%x sec_flags=0x%x", res,
   2098               p_data->cmplt.sec_level, p_dev_rec->sec_flags);
   2099 
   2100           if (p_data->cmplt.is_pair_cancel &&
   2101               btm_cb.api.p_bond_cancel_cmpl_callback) {
   2102             BTM_TRACE_DEBUG("Pairing Cancel completed");
   2103             (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS);
   2104           }
   2105 #if (BTM_BLE_CONFORMANCE_TESTING == TRUE)
   2106           if (res != BTM_SUCCESS) {
   2107             if (!btm_cb.devcb.no_disc_if_pair_fail &&
   2108                 p_data->cmplt.reason != SMP_CONN_TOUT) {
   2109               BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL");
   2110               l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle);
   2111             } else {
   2112               BTM_TRACE_DEBUG("Pairing failed - Not Removing ACL");
   2113               p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   2114             }
   2115           }
   2116 #else
   2117           if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT) {
   2118             BTM_TRACE_DEBUG("Pairing failed - prepare to remove ACL");
   2119             l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle);
   2120           }
   2121 #endif
   2122 
   2123           BTM_TRACE_DEBUG(
   2124               "btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x",
   2125               btm_cb.pairing_state, btm_cb.pairing_flags, btm_cb.pin_code_len);
   2126           VLOG(1) << "btm_cb.pairing_bda: " << btm_cb.pairing_bda;
   2127 
   2128           /* Reset btm state only if the callback address matches pairing
   2129            * address*/
   2130           if (bd_addr == btm_cb.pairing_bda) {
   2131             btm_cb.pairing_bda = RawAddress::kAny;
   2132             btm_cb.pairing_state = BTM_PAIR_STATE_IDLE;
   2133             btm_cb.pairing_flags = 0;
   2134           }
   2135 
   2136           if (res == BTM_SUCCESS) {
   2137             p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   2138 #if (BLE_PRIVACY_SPT == TRUE)
   2139             /* add all bonded device into resolving list if IRK is available*/
   2140             btm_ble_resolving_list_load_dev(p_dev_rec);
   2141 #endif
   2142           }
   2143 
   2144           btm_sec_dev_rec_cback_event(p_dev_rec, res, true);
   2145         }
   2146         break;
   2147 
   2148       default:
   2149         BTM_TRACE_DEBUG("unknown event = %d", event);
   2150         break;
   2151     }
   2152   } else {
   2153     BTM_TRACE_ERROR("btm_proc_smp_cback received for unknown device");
   2154   }
   2155 
   2156   return 0;
   2157 }
   2158 
   2159 /*******************************************************************************
   2160  *
   2161  * Function         BTM_BleDataSignature
   2162  *
   2163  * Description      This function is called to sign the data using AES128 CMAC
   2164  *                  algorith.
   2165  *
   2166  * Parameter        bd_addr: target device the data to be signed for.
   2167  *                  p_text: singing data
   2168  *                  len: length of the data to be signed.
   2169  *                  signature: output parameter where data signature is going to
   2170  *                             be stored.
   2171  *
   2172  * Returns          true if signing sucessul, otherwise false.
   2173  *
   2174  ******************************************************************************/
   2175 bool BTM_BleDataSignature(const RawAddress& bd_addr, uint8_t* p_text,
   2176                           uint16_t len, BLE_SIGNATURE signature) {
   2177   tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr);
   2178 
   2179   BTM_TRACE_DEBUG("%s", __func__);
   2180   bool ret = false;
   2181   if (p_rec == NULL) {
   2182     BTM_TRACE_ERROR("%s-data signing can not be done from unknown device",
   2183                     __func__);
   2184   } else {
   2185     uint8_t* p_mac = (uint8_t*)signature;
   2186     uint8_t* pp;
   2187     uint8_t* p_buf = (uint8_t*)osi_malloc(len + 4);
   2188 
   2189     BTM_TRACE_DEBUG("%s-Start to generate Local CSRK", __func__);
   2190     pp = p_buf;
   2191     /* prepare plain text */
   2192     if (p_text) {
   2193       memcpy(p_buf, p_text, len);
   2194       pp = (p_buf + len);
   2195     }
   2196 
   2197     UINT32_TO_STREAM(pp, p_rec->ble.keys.local_counter);
   2198     UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter);
   2199 
   2200     ret = aes_cipher_msg_auth_code(p_rec->ble.keys.lcsrk, p_buf,
   2201                                    (uint16_t)(len + 4), BTM_CMAC_TLEN_SIZE,
   2202                                    p_mac);
   2203     if (ret) {
   2204       btm_ble_increment_sign_ctr(bd_addr, true);
   2205     }
   2206 
   2207     BTM_TRACE_DEBUG("%s p_mac = %d", __func__, p_mac);
   2208     BTM_TRACE_DEBUG(
   2209         "p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = "
   2210         "0x%02x",
   2211         *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3));
   2212     BTM_TRACE_DEBUG(
   2213         "p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = "
   2214         "0x%02x",
   2215         *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7));
   2216     osi_free(p_buf);
   2217   }
   2218   return ret;
   2219 }
   2220 
   2221 /*******************************************************************************
   2222  *
   2223  * Function         BTM_BleVerifySignature
   2224  *
   2225  * Description      This function is called to verify the data signature
   2226  *
   2227  * Parameter        bd_addr: target device the data to be signed for.
   2228  *                  p_orig:  original data before signature.
   2229  *                  len: length of the signing data
   2230  *                  counter: counter used when doing data signing
   2231  *                  p_comp: signature to be compared against.
   2232 
   2233  * Returns          true if signature verified correctly; otherwise false.
   2234  *
   2235  ******************************************************************************/
   2236 bool BTM_BleVerifySignature(const RawAddress& bd_addr, uint8_t* p_orig,
   2237                             uint16_t len, uint32_t counter, uint8_t* p_comp) {
   2238   bool verified = false;
   2239   tBTM_SEC_DEV_REC* p_rec = btm_find_dev(bd_addr);
   2240   uint8_t p_mac[BTM_CMAC_TLEN_SIZE];
   2241 
   2242   if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK))) {
   2243     BTM_TRACE_ERROR("can not verify signature for unknown device");
   2244   } else if (counter < p_rec->ble.keys.counter) {
   2245     BTM_TRACE_ERROR("signature received with out dated sign counter");
   2246   } else if (p_orig == NULL) {
   2247     BTM_TRACE_ERROR("No signature to verify");
   2248   } else {
   2249     BTM_TRACE_DEBUG("%s rcv_cnt=%d >= expected_cnt=%d", __func__, counter,
   2250                     p_rec->ble.keys.counter);
   2251 
   2252     if (aes_cipher_msg_auth_code(p_rec->ble.keys.pcsrk, p_orig, len,
   2253                                  BTM_CMAC_TLEN_SIZE, p_mac)) {
   2254       if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0) {
   2255         btm_ble_increment_sign_ctr(bd_addr, false);
   2256         verified = true;
   2257       }
   2258     }
   2259   }
   2260   return verified;
   2261 }
   2262 
   2263 /*******************************************************************************
   2264  *
   2265  * Function         BTM_GetLeSecurityState
   2266  *
   2267  * Description      This function is called to get security mode 1 flags and
   2268  *                  encryption key size for LE peer.
   2269  *
   2270  * Returns          bool    true if LE device is found, false otherwise.
   2271  *
   2272  ******************************************************************************/
   2273 bool BTM_GetLeSecurityState(const RawAddress& bd_addr,
   2274                             uint8_t* p_le_dev_sec_flags,
   2275                             uint8_t* p_le_key_size) {
   2276   tBTM_SEC_DEV_REC* p_dev_rec;
   2277   uint16_t dev_rec_sec_flags;
   2278 
   2279   *p_le_dev_sec_flags = 0;
   2280   *p_le_key_size = 0;
   2281 
   2282   p_dev_rec = btm_find_dev(bd_addr);
   2283   if (p_dev_rec == NULL) {
   2284     BTM_TRACE_ERROR("%s fails", __func__);
   2285     return (false);
   2286   }
   2287 
   2288   if (p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) {
   2289     BTM_TRACE_ERROR("%s-this is not LE device", __func__);
   2290     return (false);
   2291   }
   2292 
   2293   dev_rec_sec_flags = p_dev_rec->sec_flags;
   2294 
   2295   if (dev_rec_sec_flags & BTM_SEC_LE_ENCRYPTED) {
   2296     /* link is encrypted with LTK or STK */
   2297     *p_le_key_size = p_dev_rec->enc_key_size;
   2298     *p_le_dev_sec_flags |= BTM_SEC_LE_LINK_ENCRYPTED;
   2299 
   2300     *p_le_dev_sec_flags |=
   2301         (dev_rec_sec_flags & BTM_SEC_LE_AUTHENTICATED)
   2302             ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM     /* set auth LTK flag */
   2303             : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */
   2304   } else if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) {
   2305     /* link is unencrypted, still LTK is available */
   2306     *p_le_key_size = p_dev_rec->ble.keys.key_size;
   2307 
   2308     *p_le_dev_sec_flags |=
   2309         (dev_rec_sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
   2310             ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM     /* set auth LTK flag */
   2311             : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */
   2312   }
   2313 
   2314   BTM_TRACE_DEBUG("%s - le_dev_sec_flags: 0x%02x, le_key_size: %d", __func__,
   2315                   *p_le_dev_sec_flags, *p_le_key_size);
   2316 
   2317   return true;
   2318 }
   2319 
   2320 /*******************************************************************************
   2321  *
   2322  * Function         BTM_BleSecurityProcedureIsRunning
   2323  *
   2324  * Description      This function indicates if LE security procedure is
   2325  *                  currently running with the peer.
   2326  *
   2327  * Returns          bool    true if security procedure is running, false
   2328  *                  otherwise.
   2329  *
   2330  ******************************************************************************/
   2331 bool BTM_BleSecurityProcedureIsRunning(const RawAddress& bd_addr) {
   2332   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   2333 
   2334   if (p_dev_rec == NULL) {
   2335     LOG(ERROR) << __func__ << " device with BDA: " << bd_addr
   2336                << " is not found";
   2337     return false;
   2338   }
   2339 
   2340   return (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING ||
   2341           p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING);
   2342 }
   2343 
   2344 /*******************************************************************************
   2345  *
   2346  * Function         BTM_BleGetSupportedKeySize
   2347  *
   2348  * Description      This function gets the maximum encryption key size in bytes
   2349  *                  the local device can suport.
   2350  *                  record.
   2351  *
   2352  * Returns          the key size or 0 if the size can't be retrieved.
   2353  *
   2354  ******************************************************************************/
   2355 extern uint8_t BTM_BleGetSupportedKeySize(const RawAddress& bd_addr) {
   2356 #if (L2CAP_LE_COC_INCLUDED == TRUE)
   2357   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   2358   tBTM_LE_EVT_DATA btm_le_evt_data;
   2359   uint8_t callback_rc;
   2360 
   2361   if (!p_dev_rec) {
   2362     LOG(ERROR) << __func__ << " device with BDA: " << bd_addr
   2363                << " is not found";
   2364     return 0;
   2365   }
   2366 
   2367   if (btm_cb.api.p_le_callback == NULL) {
   2368     BTM_TRACE_ERROR("%s can't access supported key size", __func__);
   2369     return 0;
   2370   }
   2371 
   2372   callback_rc = (*btm_cb.api.p_le_callback)(
   2373       BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, &btm_le_evt_data);
   2374 
   2375   if (callback_rc != BTM_SUCCESS) {
   2376     BTM_TRACE_ERROR("%s can't access supported key size", __func__);
   2377     return 0;
   2378   }
   2379 
   2380   BTM_TRACE_DEBUG("%s device supports key size = %d", __func__,
   2381                   btm_le_evt_data.io_req.max_key_size);
   2382   return (btm_le_evt_data.io_req.max_key_size);
   2383 #else
   2384   return 0;
   2385 #endif
   2386 }
   2387 
   2388 /*******************************************************************************
   2389  *  Utility functions for LE device IR/ER generation
   2390  ******************************************************************************/
   2391 /*******************************************************************************
   2392  *
   2393  * Function         btm_notify_new_key
   2394  *
   2395  * Description      This function is to notify application new keys have been
   2396  *                  generated.
   2397  *
   2398  * Returns          void
   2399  *
   2400  ******************************************************************************/
   2401 static void btm_notify_new_key(uint8_t key_type) {
   2402   tBTM_BLE_LOCAL_KEYS* p_local_keys = NULL;
   2403 
   2404   BTM_TRACE_DEBUG("btm_notify_new_key key_type=%d", key_type);
   2405 
   2406   if (btm_cb.api.p_le_key_callback) {
   2407     switch (key_type) {
   2408       case BTM_BLE_KEY_TYPE_ID:
   2409         BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ID");
   2410         p_local_keys = (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.id_keys;
   2411         break;
   2412 
   2413       case BTM_BLE_KEY_TYPE_ER:
   2414         BTM_TRACE_DEBUG("BTM_BLE_KEY_TYPE_ER");
   2415         p_local_keys =
   2416             (tBTM_BLE_LOCAL_KEYS*)&btm_cb.devcb.ble_encryption_key_value;
   2417         break;
   2418 
   2419       default:
   2420         BTM_TRACE_ERROR("unknown key type: %d", key_type);
   2421         break;
   2422     }
   2423     if (p_local_keys != NULL)
   2424       (*btm_cb.api.p_le_key_callback)(key_type, p_local_keys);
   2425   }
   2426 }
   2427 
   2428 /*******************************************************************************
   2429  *
   2430  * Function         btm_ble_process_irk
   2431  *
   2432  * Description      This function is called when IRK is generated, store it in
   2433  *                  local control block.
   2434  *
   2435  * Returns          void
   2436  *
   2437  ******************************************************************************/
   2438 static void btm_ble_process_irk(tSMP_ENC* p) {
   2439   BTM_TRACE_DEBUG("btm_ble_process_irk");
   2440   if (p && p->opcode == HCI_BLE_ENCRYPT) {
   2441     memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN);
   2442     btm_notify_new_key(BTM_BLE_KEY_TYPE_ID);
   2443 
   2444 #if (BLE_PRIVACY_SPT == TRUE)
   2445     /* if privacy is enabled, new RPA should be calculated */
   2446     if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) {
   2447       btm_gen_resolvable_private_addr(base::Bind(&btm_gen_resolve_paddr_low));
   2448     }
   2449 #endif
   2450   } else {
   2451     BTM_TRACE_ERROR("Generating IRK exception.");
   2452   }
   2453 
   2454   /* proceed generate ER */
   2455   btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand1) {
   2456     memcpy(&btm_cb.devcb.ble_encryption_key_value[0], rand1, BT_OCTET8_LEN);
   2457 
   2458     btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand2) {
   2459       memcpy(&btm_cb.devcb.ble_encryption_key_value[8], rand2, BT_OCTET8_LEN);
   2460       btm_notify_new_key(BTM_BLE_KEY_TYPE_ER);
   2461     }));
   2462 
   2463   }));
   2464 }
   2465 
   2466 /*******************************************************************************
   2467  *
   2468  * Function         btm_ble_process_dhk
   2469  *
   2470  * Description      This function is called when DHK is calculated, store it in
   2471  *                  local control block, and proceed to generate ER, a 128-bits
   2472  *                  random number.
   2473  *
   2474  * Returns          void
   2475  *
   2476  ******************************************************************************/
   2477 static void btm_ble_process_dhk(tSMP_ENC* p) {
   2478   uint8_t btm_ble_irk_pt = 0x01;
   2479   tSMP_ENC output;
   2480 
   2481   BTM_TRACE_DEBUG("btm_ble_process_dhk");
   2482 
   2483   if (p && p->opcode == HCI_BLE_ENCRYPT) {
   2484     memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN);
   2485     BTM_TRACE_DEBUG("BLE DHK generated.");
   2486 
   2487     /* IRK = D1(IR, 1) */
   2488     if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt,
   2489                      1, &output)) {
   2490       /* reset all identity root related key */
   2491       memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
   2492     } else {
   2493       btm_ble_process_irk(&output);
   2494     }
   2495   } else {
   2496     /* reset all identity root related key */
   2497     memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
   2498   }
   2499 }
   2500 
   2501 /*******************************************************************************
   2502  *
   2503  * Function         btm_ble_reset_id
   2504  *
   2505  * Description      This function is called to reset LE device identity.
   2506  *
   2507  * Returns          void
   2508  *
   2509  ******************************************************************************/
   2510 void btm_ble_reset_id(void) {
   2511   BTM_TRACE_DEBUG("btm_ble_reset_id");
   2512 
   2513   /* Regenerate Identity Root*/
   2514   btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) {
   2515     BTM_TRACE_DEBUG("btm_ble_process_ir1");
   2516     memcpy(btm_cb.devcb.id_keys.ir, rand, BT_OCTET8_LEN);
   2517 
   2518     btsnd_hcic_ble_rand(base::Bind([](BT_OCTET8 rand) {
   2519       uint8_t btm_ble_dhk_pt = 0x03;
   2520       tSMP_ENC output;
   2521 
   2522       BTM_TRACE_DEBUG("btm_ble_process_ir2");
   2523 
   2524       /* remembering in control block */
   2525       memcpy(&btm_cb.devcb.id_keys.ir[8], rand, BT_OCTET8_LEN);
   2526       /* generate DHK= Eir({0x03, 0x00, 0x00 ...}) */
   2527 
   2528       SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_dhk_pt, 1,
   2529                   &output);
   2530       btm_ble_process_dhk(&output);
   2531 
   2532       BTM_TRACE_DEBUG("BLE IR generated.");
   2533     }));
   2534   }));
   2535 }
   2536 
   2537 /* This function set a random address to local controller. It also temporarily
   2538  * disable scans and adv before sending the command to the controller. */
   2539 void btm_ble_set_random_address(const RawAddress& random_bda) {
   2540   tBTM_LE_RANDOM_CB* p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
   2541   tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb;
   2542   bool adv_mode = btm_cb.ble_ctr_cb.inq_var.adv_mode;
   2543 
   2544   BTM_TRACE_DEBUG("%s", __func__);
   2545   if (btm_ble_get_conn_st() == BLE_DIR_CONN) {
   2546     BTM_TRACE_ERROR("%s: Cannot set random address. Direct conn ongoing",
   2547                     __func__);
   2548     return;
   2549   }
   2550 
   2551   if (adv_mode == BTM_BLE_ADV_ENABLE)
   2552     btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_DISABLE);
   2553   if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_stop_scan();
   2554   btm_ble_suspend_bg_conn();
   2555 
   2556   p_cb->private_addr = random_bda;
   2557   btsnd_hcic_ble_set_random_addr(p_cb->private_addr);
   2558 
   2559   if (adv_mode == BTM_BLE_ADV_ENABLE)
   2560     btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_ENABLE);
   2561   if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) btm_ble_start_scan();
   2562   btm_ble_resume_bg_conn();
   2563 }
   2564 
   2565 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
   2566 /*******************************************************************************
   2567  *
   2568  * Function         btm_ble_set_no_disc_if_pair_fail
   2569  *
   2570  * Description      This function indicates whether no disconnect of the ACL
   2571  *                  should be used if pairing failed
   2572  *
   2573  * Returns          void
   2574  *
   2575  ******************************************************************************/
   2576 void btm_ble_set_no_disc_if_pair_fail(bool disable_disc) {
   2577   BTM_TRACE_DEBUG("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d",
   2578                   disable_disc);
   2579   btm_cb.devcb.no_disc_if_pair_fail = disable_disc;
   2580 }
   2581 
   2582 /*******************************************************************************
   2583  *
   2584  * Function         btm_ble_set_test_mac_value
   2585  *
   2586  * Description      This function set test MAC value
   2587  *
   2588  * Returns          void
   2589  *
   2590  ******************************************************************************/
   2591 void btm_ble_set_test_mac_value(bool enable, uint8_t* p_test_mac_val) {
   2592   BTM_TRACE_DEBUG("btm_ble_set_test_mac_value enable=%d", enable);
   2593   btm_cb.devcb.enable_test_mac_val = enable;
   2594   memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN);
   2595 }
   2596 
   2597 /*******************************************************************************
   2598  *
   2599  * Function         btm_ble_set_test_local_sign_cntr_value
   2600  *
   2601  * Description      This function set test local sign counter value
   2602  *
   2603  * Returns          void
   2604  *
   2605  ******************************************************************************/
   2606 void btm_ble_set_test_local_sign_cntr_value(bool enable,
   2607                                             uint32_t test_local_sign_cntr) {
   2608   BTM_TRACE_DEBUG(
   2609       "btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d",
   2610       enable, test_local_sign_cntr);
   2611   btm_cb.devcb.enable_test_local_sign_cntr = enable;
   2612   btm_cb.devcb.test_local_sign_cntr = test_local_sign_cntr;
   2613 }
   2614 
   2615 /*******************************************************************************
   2616  *
   2617  * Function         btm_ble_set_keep_rfu_in_auth_req
   2618  *
   2619  * Description      This function indicates if RFU bits have to be kept as is
   2620  *                  (by default they have to be set to 0 by the sender).
   2621  *
   2622  * Returns          void
   2623  *
   2624  ******************************************************************************/
   2625 void btm_ble_set_keep_rfu_in_auth_req(bool keep_rfu) {
   2626   BTM_TRACE_DEBUG("btm_ble_set_keep_rfu_in_auth_req keep_rfus=%d", keep_rfu);
   2627   btm_cb.devcb.keep_rfu_in_auth_req = keep_rfu;
   2628 }
   2629 
   2630 #endif /* BTM_BLE_CONFORMANCE_TESTING */
   2631