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 the Bluetooth Security Manager
     22  *
     23  ******************************************************************************/
     24 
     25 #define LOG_TAG "bt_btm_sec"
     26 
     27 #include <stdarg.h>
     28 #include <stdio.h>
     29 #include <string.h>
     30 
     31 #include "device/include/controller.h"
     32 #include "osi/include/log.h"
     33 #include "osi/include/osi.h"
     34 #include "osi/include/time.h"
     35 
     36 #include "bt_types.h"
     37 #include "bt_utils.h"
     38 #include "btm_int.h"
     39 #include "btu.h"
     40 #include "hcimsgs.h"
     41 #include "l2c_int.h"
     42 
     43 #include "gatt_int.h"
     44 
     45 #define BTM_SEC_MAX_COLLISION_DELAY (5000)
     46 
     47 #ifdef APPL_AUTH_WRITE_EXCEPTION
     48 bool(APPL_AUTH_WRITE_EXCEPTION)(const RawAddress& bd_addr);
     49 #endif
     50 
     51 /*******************************************************************************
     52  *             L O C A L    F U N C T I O N     P R O T O T Y P E S            *
     53  ******************************************************************************/
     54 tBTM_SEC_SERV_REC* btm_sec_find_first_serv(bool is_originator, uint16_t psm);
     55 static tBTM_SEC_SERV_REC* btm_sec_find_next_serv(tBTM_SEC_SERV_REC* p_cur);
     56 static tBTM_SEC_SERV_REC* btm_sec_find_mx_serv(uint8_t is_originator,
     57                                                uint16_t psm,
     58                                                uint32_t mx_proto_id,
     59                                                uint32_t mx_chan_id);
     60 
     61 static bool btm_sec_start_get_name(tBTM_SEC_DEV_REC* p_dev_rec);
     62 static void btm_sec_start_authentication(tBTM_SEC_DEV_REC* p_dev_rec);
     63 static void btm_sec_start_encryption(tBTM_SEC_DEV_REC* p_dev_rec);
     64 static void btm_sec_collision_timeout(void* data);
     65 static void btm_restore_mode(void);
     66 static void btm_sec_pairing_timeout(void* data);
     67 static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec);
     68 static void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state);
     69 
     70 static const char* btm_pair_state_descr(tBTM_PAIRING_STATE state);
     71 
     72 static void btm_sec_check_pending_reqs(void);
     73 static bool btm_sec_queue_mx_request(const RawAddress& bd_addr, uint16_t psm,
     74                                      bool is_orig, uint32_t mx_proto_id,
     75                                      uint32_t mx_chan_id,
     76                                      tBTM_SEC_CALLBACK* p_callback,
     77                                      void* p_ref_data);
     78 static void btm_sec_bond_cancel_complete(void);
     79 static void btm_send_link_key_notif(tBTM_SEC_DEV_REC* p_dev_rec);
     80 static bool btm_sec_check_prefetch_pin(tBTM_SEC_DEV_REC* p_dev_rec);
     81 
     82 static uint8_t btm_sec_start_authorization(tBTM_SEC_DEV_REC* p_dev_rec);
     83 bool btm_sec_are_all_trusted(uint32_t p_mask[]);
     84 
     85 static tBTM_STATUS btm_sec_send_hci_disconnect(tBTM_SEC_DEV_REC* p_dev_rec,
     86                                                uint8_t reason,
     87                                                uint16_t conn_handle);
     88 uint8_t btm_sec_start_role_switch(tBTM_SEC_DEV_REC* p_dev_rec);
     89 tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state);
     90 
     91 static bool btm_sec_set_security_level(CONNECTION_TYPE conn_type,
     92                                        const char* p_name, uint8_t service_id,
     93                                        uint16_t sec_level, uint16_t psm,
     94                                        uint32_t mx_proto_id,
     95                                        uint32_t mx_chan_id);
     96 
     97 static bool btm_dev_authenticated(tBTM_SEC_DEV_REC* p_dev_rec);
     98 static bool btm_dev_encrypted(tBTM_SEC_DEV_REC* p_dev_rec);
     99 static bool btm_dev_authorized(tBTM_SEC_DEV_REC* p_dev_rec);
    100 static bool btm_serv_trusted(tBTM_SEC_DEV_REC* p_dev_rec,
    101                              tBTM_SEC_SERV_REC* p_serv_rec);
    102 static bool btm_sec_is_serv_level0(uint16_t psm);
    103 static uint16_t btm_sec_set_serv_level4_flags(uint16_t cur_security,
    104                                               bool is_originator);
    105 
    106 static bool btm_sec_queue_encrypt_request(const RawAddress& bd_addr,
    107                                           tBT_TRANSPORT transport,
    108                                           tBTM_SEC_CALLBACK* p_callback,
    109                                           void* p_ref_data,
    110                                           tBTM_BLE_SEC_ACT sec_act);
    111 static void btm_sec_check_pending_enc_req(tBTM_SEC_DEV_REC* p_dev_rec,
    112                                           tBT_TRANSPORT transport,
    113                                           uint8_t encr_enable);
    114 
    115 static bool btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC* p_dev_rec);
    116 static bool btm_sec_is_master(tBTM_SEC_DEV_REC* p_dev_rec);
    117 
    118 /* true - authenticated link key is possible */
    119 static const bool btm_sec_io_map[BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = {
    120     /*   OUT,    IO,     IN,     NONE */
    121     /* OUT  */ {false, false, true, false},
    122     /* IO   */ {false, true, true, false},
    123     /* IN   */ {true, true, true, false},
    124     /* NONE */ {false, false, false, false}};
    125 /*  BTM_IO_CAP_OUT      0   DisplayOnly */
    126 /*  BTM_IO_CAP_IO       1   DisplayYesNo */
    127 /*  BTM_IO_CAP_IN       2   KeyboardOnly */
    128 /*  BTM_IO_CAP_NONE     3   NoInputNoOutput */
    129 
    130 /*******************************************************************************
    131  *
    132  * Function         btm_dev_authenticated
    133  *
    134  * Description      check device is authenticated
    135  *
    136  * Returns          bool    true or false
    137  *
    138  ******************************************************************************/
    139 static bool btm_dev_authenticated(tBTM_SEC_DEV_REC* p_dev_rec) {
    140   if (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) {
    141     return (true);
    142   }
    143   return (false);
    144 }
    145 
    146 /*******************************************************************************
    147  *
    148  * Function         btm_dev_encrypted
    149  *
    150  * Description      check device is encrypted
    151  *
    152  * Returns          bool    true or false
    153  *
    154  ******************************************************************************/
    155 static bool btm_dev_encrypted(tBTM_SEC_DEV_REC* p_dev_rec) {
    156   if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) {
    157     return (true);
    158   }
    159   return (false);
    160 }
    161 
    162 /*******************************************************************************
    163  *
    164  * Function         btm_dev_authorized
    165  *
    166  * Description      check device is authorized
    167  *
    168  * Returns          bool    true or false
    169  *
    170  ******************************************************************************/
    171 static bool btm_dev_authorized(tBTM_SEC_DEV_REC* p_dev_rec) {
    172   if (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) {
    173     return (true);
    174   }
    175   return (false);
    176 }
    177 
    178 /*******************************************************************************
    179  *
    180  * Function         btm_dev_16_digit_authenticated
    181  *
    182  * Description      check device is authenticated by using 16 digit pin or MITM
    183  *
    184  * Returns          bool    true or false
    185  *
    186  ******************************************************************************/
    187 static bool btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC* p_dev_rec) {
    188   // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used
    189   if (p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) {
    190     return (true);
    191   }
    192   return (false);
    193 }
    194 
    195 /*******************************************************************************
    196  *
    197  * Function         btm_serv_trusted
    198  *
    199  * Description      check service is trusted
    200  *
    201  * Returns          bool    true or false
    202  *
    203  ******************************************************************************/
    204 static bool btm_serv_trusted(tBTM_SEC_DEV_REC* p_dev_rec,
    205                              tBTM_SEC_SERV_REC* p_serv_rec) {
    206   if (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
    207                                  p_serv_rec->service_id)) {
    208     return (true);
    209   }
    210   return (false);
    211 }
    212 
    213 /*******************************************************************************
    214  *
    215  * Function         BTM_SecRegister
    216  *
    217  * Description      Application manager calls this function to register for
    218  *                  security services.  There can be one and only one
    219  *                  application saving link keys.  BTM allows only first
    220  *                  registration.
    221  *
    222  * Returns          true if registered OK, else false
    223  *
    224  ******************************************************************************/
    225 bool BTM_SecRegister(const tBTM_APPL_INFO* p_cb_info) {
    226   BT_OCTET16 temp_value = {0};
    227 
    228   BTM_TRACE_EVENT("%s application registered", __func__);
    229 
    230   LOG_INFO(LOG_TAG, "%s p_cb_info->p_le_callback == 0x%p", __func__,
    231            p_cb_info->p_le_callback);
    232   if (p_cb_info->p_le_callback) {
    233     BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__);
    234     SMP_Register(btm_proc_smp_cback);
    235     /* if no IR is loaded, need to regenerate all the keys */
    236     if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) {
    237       btm_ble_reset_id();
    238     }
    239   } else {
    240     LOG_WARN(LOG_TAG, "%s p_cb_info->p_le_callback == NULL", __func__);
    241   }
    242 
    243   btm_cb.api = *p_cb_info;
    244   LOG_INFO(LOG_TAG, "%s btm_cb.api.p_le_callback = 0x%p ", __func__,
    245            btm_cb.api.p_le_callback);
    246   BTM_TRACE_EVENT("%s application registered", __func__);
    247   return (true);
    248 }
    249 
    250 /*******************************************************************************
    251  *
    252  * Function         BTM_SecRegisterLinkKeyNotificationCallback
    253  *
    254  * Description      Application manager calls this function to register for
    255  *                  link key notification.  When there is nobody registered
    256  *                  we should avoid changing link key
    257  *
    258  * Returns          true if registered OK, else false
    259  *
    260  ******************************************************************************/
    261 bool BTM_SecRegisterLinkKeyNotificationCallback(
    262     tBTM_LINK_KEY_CALLBACK* p_callback) {
    263   btm_cb.api.p_link_key_callback = p_callback;
    264   return true;
    265 }
    266 
    267 /*******************************************************************************
    268  *
    269  * Function         BTM_SecAddRmtNameNotifyCallback
    270  *
    271  * Description      Any profile can register to be notified when name of the
    272  *                  remote device is resolved.
    273  *
    274  * Returns          true if registered OK, else false
    275  *
    276  ******************************************************************************/
    277 bool BTM_SecAddRmtNameNotifyCallback(tBTM_RMT_NAME_CALLBACK* p_callback) {
    278   int i;
    279 
    280   for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) {
    281     if (btm_cb.p_rmt_name_callback[i] == NULL) {
    282       btm_cb.p_rmt_name_callback[i] = p_callback;
    283       return (true);
    284     }
    285   }
    286 
    287   return (false);
    288 }
    289 
    290 /*******************************************************************************
    291  *
    292  * Function         BTM_SecDeleteRmtNameNotifyCallback
    293  *
    294  * Description      Any profile can deregister notification when a new Link Key
    295  *                  is generated per connection.
    296  *
    297  * Returns          true if OK, else false
    298  *
    299  ******************************************************************************/
    300 bool BTM_SecDeleteRmtNameNotifyCallback(tBTM_RMT_NAME_CALLBACK* p_callback) {
    301   int i;
    302 
    303   for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) {
    304     if (btm_cb.p_rmt_name_callback[i] == p_callback) {
    305       btm_cb.p_rmt_name_callback[i] = NULL;
    306       return (true);
    307     }
    308   }
    309 
    310   return (false);
    311 }
    312 
    313 /*******************************************************************************
    314  *
    315  * Function         BTM_GetSecurityFlags
    316  *
    317  * Description      Get security flags for the device
    318  *
    319  * Returns          bool    true or false is device found
    320  *
    321  ******************************************************************************/
    322 bool BTM_GetSecurityFlags(const RawAddress& bd_addr, uint8_t* p_sec_flags) {
    323   tBTM_SEC_DEV_REC* p_dev_rec;
    324 
    325   p_dev_rec = btm_find_dev(bd_addr);
    326   if (p_dev_rec != NULL) {
    327     *p_sec_flags = (uint8_t)p_dev_rec->sec_flags;
    328     return (true);
    329   }
    330   BTM_TRACE_ERROR("BTM_GetSecurityFlags false");
    331   return (false);
    332 }
    333 
    334 /*******************************************************************************
    335  *
    336  * Function         BTM_GetSecurityFlagsByTransport
    337  *
    338  * Description      Get security flags for the device on a particular transport
    339  *
    340  * Returns          bool    true or false is device found
    341  *
    342  ******************************************************************************/
    343 bool BTM_GetSecurityFlagsByTransport(const RawAddress& bd_addr,
    344                                      uint8_t* p_sec_flags,
    345                                      tBT_TRANSPORT transport) {
    346   tBTM_SEC_DEV_REC* p_dev_rec;
    347 
    348   p_dev_rec = btm_find_dev(bd_addr);
    349   if (p_dev_rec != NULL) {
    350     if (transport == BT_TRANSPORT_BR_EDR)
    351       *p_sec_flags = (uint8_t)p_dev_rec->sec_flags;
    352     else
    353       *p_sec_flags = (uint8_t)(p_dev_rec->sec_flags >> 8);
    354 
    355     return (true);
    356   }
    357   BTM_TRACE_ERROR("BTM_GetSecurityFlags false");
    358   return (false);
    359 }
    360 
    361 /*******************************************************************************
    362  *
    363  * Function         BTM_SetPinType
    364  *
    365  * Description      Set PIN type for the device.
    366  *
    367  * Returns          void
    368  *
    369  ******************************************************************************/
    370 void BTM_SetPinType(uint8_t pin_type, PIN_CODE pin_code, uint8_t pin_code_len) {
    371   BTM_TRACE_API(
    372       "BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
    373       pin_type, (char*)pin_code, pin_code_len);
    374 
    375   /* If device is not up security mode will be set as a part of startup */
    376   if ((btm_cb.cfg.pin_type != pin_type) &&
    377       controller_get_interface()->get_is_ready()) {
    378     btsnd_hcic_write_pin_type(pin_type);
    379   }
    380 
    381   btm_cb.cfg.pin_type = pin_type;
    382   btm_cb.cfg.pin_code_len = pin_code_len;
    383   memcpy(btm_cb.cfg.pin_code, pin_code, pin_code_len);
    384 }
    385 
    386 /*******************************************************************************
    387  *
    388  * Function         BTM_SetPairableMode
    389  *
    390  * Description      Enable or disable pairing
    391  *
    392  * Parameters       allow_pairing - (true or false) whether or not the device
    393  *                      allows pairing.
    394  *                  connect_only_paired - (true or false) whether or not to
    395  *                      only allow paired devices to connect.
    396  *
    397  * Returns          void
    398  *
    399  ******************************************************************************/
    400 void BTM_SetPairableMode(bool allow_pairing, bool connect_only_paired) {
    401   BTM_TRACE_API(
    402       "BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u",
    403       allow_pairing, connect_only_paired);
    404 
    405   btm_cb.pairing_disabled = !allow_pairing;
    406   btm_cb.connect_only_paired = connect_only_paired;
    407 }
    408 
    409 /*******************************************************************************
    410  *
    411  * Function         BTM_SetSecureConnectionsOnly
    412  *
    413  * Description      Enable or disable default treatment for Mode 4 Level 0
    414  *                  services
    415  *
    416  * Parameter        secure_connections_only_mode -
    417  *                  true means that the device should treat Mode 4 Level 0
    418  *                       services as services of other levels.
    419  *                  false means that the device should provide default
    420  *                        treatment for Mode 4 Level 0 services.
    421  *
    422  * Returns          void
    423  *
    424  ******************************************************************************/
    425 void BTM_SetSecureConnectionsOnly(bool secure_connections_only_mode) {
    426   BTM_TRACE_API("%s: Mode : %u", __func__, secure_connections_only_mode);
    427 
    428   btm_cb.devcb.secure_connections_only = secure_connections_only_mode;
    429   btm_cb.security_mode = BTM_SEC_MODE_SC;
    430 }
    431 #define BTM_NO_AVAIL_SEC_SERVICES ((uint16_t)0xffff)
    432 
    433 /*******************************************************************************
    434  *
    435  * Function         BTM_SetSecurityLevel
    436  *
    437  * Description      Register service security level with Security Manager
    438  *
    439  * Parameters:      is_originator - true if originating the connection
    440  *                  p_name      - Name of the service relevant only if
    441  *                                authorization will show this name to user.
    442  *                                Ignored if BTM_SEC_SERVICE_NAME_LEN is 0.
    443  *                  service_id  - service ID for the service passed to
    444  *                                authorization callback
    445  *                  sec_level   - bit mask of the security features
    446  *                  psm         - L2CAP PSM
    447  *                  mx_proto_id - protocol ID of multiplexing proto below
    448  *                  mx_chan_id  - channel ID of multiplexing proto below
    449  *
    450  * Returns          true if registered OK, else false
    451  *
    452  ******************************************************************************/
    453 bool BTM_SetSecurityLevel(bool is_originator, const char* p_name,
    454                           uint8_t service_id, uint16_t sec_level, uint16_t psm,
    455                           uint32_t mx_proto_id, uint32_t mx_chan_id) {
    456   return (btm_sec_set_security_level(is_originator, p_name, service_id,
    457                                      sec_level, psm, mx_proto_id, mx_chan_id));
    458 }
    459 
    460 /*******************************************************************************
    461  *
    462  * Function         btm_sec_set_security_level
    463  *
    464  * Description      Register service security level with Security Manager
    465  *
    466  * Parameters:      conn_type   - true if originating the connection
    467  *                  p_name      - Name of the service relevant only if
    468  *                                authorization will show this name to user.
    469  *                                Ignored if BTM_SEC_SERVICE_NAME_LEN is 0.
    470  *                  service_id  - service ID for the service passed to
    471  *                                authorization callback
    472  *                  sec_level   - bit mask of the security features
    473  *                  psm         - L2CAP PSM
    474  *                  mx_proto_id - protocol ID of multiplexing proto below
    475  *                  mx_chan_id  - channel ID of multiplexing proto below
    476  *
    477  * Returns          true if registered OK, else false
    478  *
    479  ******************************************************************************/
    480 static bool btm_sec_set_security_level(CONNECTION_TYPE conn_type,
    481                                        const char* p_name, uint8_t service_id,
    482                                        uint16_t sec_level, uint16_t psm,
    483                                        uint32_t mx_proto_id,
    484                                        uint32_t mx_chan_id) {
    485   tBTM_SEC_SERV_REC* p_srec;
    486   uint16_t index;
    487   uint16_t first_unused_record = BTM_NO_AVAIL_SEC_SERVICES;
    488   bool record_allocated = false;
    489   bool is_originator;
    490   is_originator = conn_type;
    491 
    492   BTM_TRACE_API("%s : sec: 0x%x", __func__, sec_level);
    493 
    494   /* See if the record can be reused (same service name, psm, mx_proto_id,
    495      service_id, and mx_chan_id), or obtain the next unused record */
    496 
    497   p_srec = &btm_cb.sec_serv_rec[0];
    498 
    499   for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) {
    500     /* Check if there is already a record for this service */
    501     if (p_srec->security_flags & BTM_SEC_IN_USE) {
    502 #if BTM_SEC_SERVICE_NAME_LEN > 0
    503       if (p_srec->psm == psm && p_srec->mx_proto_id == mx_proto_id &&
    504           service_id == p_srec->service_id && p_name &&
    505           (!strncmp(p_name, (char*)p_srec->orig_service_name,
    506                     /* strlcpy replaces end char with termination char*/
    507                     BTM_SEC_SERVICE_NAME_LEN - 1) ||
    508            !strncmp(p_name, (char*)p_srec->term_service_name,
    509                     /* strlcpy replaces end char with termination char*/
    510                     BTM_SEC_SERVICE_NAME_LEN - 1)))
    511 #else
    512       if (p_srec->psm == psm && p_srec->mx_proto_id == mx_proto_id &&
    513           service_id == p_srec->service_id)
    514 #endif
    515       {
    516         record_allocated = true;
    517         break;
    518       }
    519     }
    520     /* Mark the first available service record */
    521     else if (!record_allocated) {
    522       memset(p_srec, 0, sizeof(tBTM_SEC_SERV_REC));
    523       record_allocated = true;
    524       first_unused_record = index;
    525     }
    526   }
    527 
    528   if (!record_allocated) {
    529     BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)",
    530                       BTM_SEC_MAX_SERVICE_RECORDS);
    531     return (record_allocated);
    532   }
    533 
    534   /* Process the request if service record is valid */
    535   /* If a duplicate service wasn't found, use the first available */
    536   if (index >= BTM_SEC_MAX_SERVICE_RECORDS) {
    537     index = first_unused_record;
    538     p_srec = &btm_cb.sec_serv_rec[index];
    539   }
    540 
    541   p_srec->psm = psm;
    542   p_srec->service_id = service_id;
    543   p_srec->mx_proto_id = mx_proto_id;
    544 
    545   if (is_originator) {
    546     p_srec->orig_mx_chan_id = mx_chan_id;
    547 #if BTM_SEC_SERVICE_NAME_LEN > 0
    548     strlcpy((char*)p_srec->orig_service_name, p_name,
    549             BTM_SEC_SERVICE_NAME_LEN + 1);
    550 #endif
    551 /* clear out the old setting, just in case it exists */
    552     {
    553       p_srec->security_flags &= ~(
    554           BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT |
    555           BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | BTM_SEC_FORCE_MASTER |
    556           BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
    557     }
    558 
    559     /* Parameter validation.  Originator should not set requirements for
    560      * incoming connections */
    561     sec_level &=
    562         ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE |
    563           BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN);
    564 
    565     if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
    566         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
    567         btm_cb.security_mode == BTM_SEC_MODE_SC) {
    568       if (sec_level & BTM_SEC_OUT_AUTHENTICATE) sec_level |= BTM_SEC_OUT_MITM;
    569     }
    570 
    571     /* Make sure the authenticate bit is set, when encrypt bit is set */
    572     if (sec_level & BTM_SEC_OUT_ENCRYPT) sec_level |= BTM_SEC_OUT_AUTHENTICATE;
    573 
    574 /* outgoing connections usually set the security level right before
    575  * the connection is initiated.
    576  * set it to be the outgoing service */
    577       btm_cb.p_out_serv = p_srec;
    578   } else {
    579     p_srec->term_mx_chan_id = mx_chan_id;
    580 #if BTM_SEC_SERVICE_NAME_LEN > 0
    581     strlcpy((char*)p_srec->term_service_name, p_name,
    582             BTM_SEC_SERVICE_NAME_LEN + 1);
    583 #endif
    584 /* clear out the old setting, just in case it exists */
    585     {
    586       p_srec->security_flags &=
    587           ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT |
    588             BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | BTM_SEC_FORCE_MASTER |
    589             BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE |
    590             BTM_SEC_ATTEMPT_SLAVE | BTM_SEC_IN_MIN_16_DIGIT_PIN);
    591     }
    592 
    593     /* Parameter validation.  Acceptor should not set requirements for outgoing
    594      * connections */
    595     sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT |
    596                    BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM);
    597 
    598     if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
    599         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
    600         btm_cb.security_mode == BTM_SEC_MODE_SC) {
    601       if (sec_level & BTM_SEC_IN_AUTHENTICATE) sec_level |= BTM_SEC_IN_MITM;
    602     }
    603 
    604     /* Make sure the authenticate bit is set, when encrypt bit is set */
    605     if (sec_level & BTM_SEC_IN_ENCRYPT) sec_level |= BTM_SEC_IN_AUTHENTICATE;
    606   }
    607 
    608   p_srec->security_flags |= (uint16_t)(sec_level | BTM_SEC_IN_USE);
    609 
    610   BTM_TRACE_API(
    611       "BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
    612       index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
    613 
    614 #if BTM_SEC_SERVICE_NAME_LEN > 0
    615   BTM_TRACE_API(
    616       "               : sec: 0x%x, service name [%s] (up to %d chars saved)",
    617       p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
    618 #endif
    619 
    620   return (record_allocated);
    621 }
    622 
    623 /*******************************************************************************
    624  *
    625  * Function         BTM_SecClrService
    626  *
    627  * Description      Removes specified service record(s) from the security
    628  *                  database. All service records with the specified name are
    629  *                  removed. Typically used only by devices with limited RAM so
    630  *                  that it can reuse an old security service record.
    631  *
    632  *                  Note: Unpredictable results may occur if a service is
    633  *                      cleared that is still in use by an application/profile.
    634  *
    635  * Parameters       Service ID - Id of the service to remove. '0' removes all
    636  *                          service records (except SDP).
    637  *
    638  * Returns          Number of records that were freed.
    639  *
    640  ******************************************************************************/
    641 uint8_t BTM_SecClrService(uint8_t service_id) {
    642   tBTM_SEC_SERV_REC* p_srec = &btm_cb.sec_serv_rec[0];
    643   uint8_t num_freed = 0;
    644   int i;
    645 
    646   for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) {
    647     /* Delete services with specified name (if in use and not SDP) */
    648     if ((p_srec->security_flags & BTM_SEC_IN_USE) &&
    649         (p_srec->psm != BT_PSM_SDP) &&
    650         (!service_id || (service_id == p_srec->service_id))) {
    651       BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
    652       p_srec->security_flags = 0;
    653       num_freed++;
    654     }
    655   }
    656 
    657   return (num_freed);
    658 }
    659 
    660 /*******************************************************************************
    661  *
    662  * Function         btm_sec_clr_service_by_psm
    663  *
    664  * Description      Removes specified service record from the security database.
    665  *                  All service records with the specified psm are removed.
    666  *                  Typically used by L2CAP to free up the service record used
    667  *                  by dynamic PSM clients when the channel is closed.
    668  *                  The given psm must be a virtual psm.
    669  *
    670  * Parameters       Service ID - Id of the service to remove. '0' removes all
    671  *                          service records (except SDP).
    672  *
    673  * Returns          Number of records that were freed.
    674  *
    675  ******************************************************************************/
    676 uint8_t btm_sec_clr_service_by_psm(uint16_t psm) {
    677   tBTM_SEC_SERV_REC* p_srec = &btm_cb.sec_serv_rec[0];
    678   uint8_t num_freed = 0;
    679   int i;
    680 
    681   for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) {
    682     /* Delete services with specified name (if in use and not SDP) */
    683     if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm)) {
    684       BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
    685       p_srec->security_flags = 0;
    686       num_freed++;
    687     }
    688   }
    689   BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm,
    690                 num_freed);
    691 
    692   return (num_freed);
    693 }
    694 
    695 /*******************************************************************************
    696  *
    697  * Function         btm_sec_clr_temp_auth_service
    698  *
    699  * Description      Removes specified device record's temporary authorization
    700  *                  flag from the security database.
    701  *
    702  * Parameters       Device address to be cleared
    703  *
    704  * Returns          void.
    705  *
    706  ******************************************************************************/
    707 void btm_sec_clr_temp_auth_service(const RawAddress& bda) {
    708   tBTM_SEC_DEV_REC* p_dev_rec;
    709 
    710   p_dev_rec = btm_find_dev(bda);
    711   if (p_dev_rec == NULL) {
    712     BTM_TRACE_WARNING("btm_sec_clr_temp_auth_service() - no dev CB");
    713     return;
    714   }
    715 
    716   /* Reset the temporary authorized flag so that next time (untrusted) service
    717    * is accessed autorization will take place */
    718   if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID &&
    719       p_dev_rec->p_cur_service) {
    720     VLOG(1) << __func__ << " clearing device: " << bda;
    721 
    722     p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
    723   }
    724 }
    725 
    726 /*******************************************************************************
    727  *
    728  * Function         BTM_PINCodeReply
    729  *
    730  * Description      This function is called after Security Manager submitted
    731  *                  PIN code request to the UI.
    732  *
    733  * Parameters:      bd_addr      - Address of the device for which PIN was
    734  *                                 requested
    735  *                  res          - result of the operation BTM_SUCCESS
    736  *                                 if success
    737  *                  pin_len      - length in bytes of the PIN Code
    738  *                  p_pin        - pointer to array with the PIN Code
    739  *                  trusted_mask - bitwise OR of trusted services
    740  *                                 (array of uint32_t)
    741  *
    742  ******************************************************************************/
    743 void BTM_PINCodeReply(const RawAddress& bd_addr, uint8_t res, uint8_t pin_len,
    744                       uint8_t* p_pin, uint32_t trusted_mask[]) {
    745   tBTM_SEC_DEV_REC* p_dev_rec;
    746 
    747   BTM_TRACE_API(
    748       "BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  "
    749       "Result:%d",
    750       btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len,
    751       res);
    752 
    753   /* If timeout already expired or has been canceled, ignore the reply */
    754   if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) {
    755     BTM_TRACE_WARNING("BTM_PINCodeReply() - Wrong State: %d",
    756                       btm_cb.pairing_state);
    757     return;
    758   }
    759 
    760   if (bd_addr != btm_cb.pairing_bda) {
    761     BTM_TRACE_ERROR("BTM_PINCodeReply() - Wrong BD Addr");
    762     return;
    763   }
    764 
    765   p_dev_rec = btm_find_dev(bd_addr);
    766   if (p_dev_rec == NULL) {
    767     BTM_TRACE_ERROR("BTM_PINCodeReply() - no dev CB");
    768     return;
    769   }
    770 
    771   if ((pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL))
    772     res = BTM_ILLEGAL_VALUE;
    773 
    774   if (res != BTM_SUCCESS) {
    775     /* if peer started dd OR we started dd and pre-fetch pin was not used send
    776      * negative reply */
    777     if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) ||
    778         ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
    779          (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))) {
    780       /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed
    781        * event */
    782       btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
    783       btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
    784 
    785       btsnd_hcic_pin_code_neg_reply(bd_addr);
    786     } else {
    787       p_dev_rec->security_required = BTM_SEC_NONE;
    788       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
    789     }
    790     return;
    791   }
    792   if (trusted_mask)
    793     BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
    794   p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
    795   p_dev_rec->pin_code_length = pin_len;
    796   if (pin_len >= 16) {
    797     p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
    798   }
    799 
    800   if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
    801       (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) &&
    802       (!btm_cb.security_mode_changed)) {
    803     /* This is start of the dedicated bonding if local device is 2.0 */
    804     btm_cb.pin_code_len = pin_len;
    805     memcpy(btm_cb.pin_code, p_pin, pin_len);
    806 
    807     btm_cb.security_mode_changed = true;
    808 #ifdef APPL_AUTH_WRITE_EXCEPTION
    809     if (!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
    810 #endif
    811       btsnd_hcic_write_auth_enable(true);
    812 
    813     btm_cb.acl_disc_reason = 0xff;
    814 
    815     /* if we rejected incoming connection request, we have to wait
    816      * HCI_Connection_Complete event */
    817     /*  before originating  */
    818     if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) {
    819       BTM_TRACE_WARNING(
    820           "BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected "
    821           "incoming connection");
    822       /* we change state little bit early so btm_sec_connected() will originate
    823        * connection */
    824       /*   when existing ACL link is down completely */
    825       btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ);
    826     }
    827     /* if we already accepted incoming connection from pairing device */
    828     else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) {
    829       BTM_TRACE_WARNING(
    830           "BTM_PINCodeReply(): link is connecting so wait pin code request "
    831           "from peer");
    832       btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ);
    833     } else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) {
    834       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
    835       p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
    836 
    837       if (btm_cb.api.p_auth_complete_callback)
    838         (*btm_cb.api.p_auth_complete_callback)(
    839             p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
    840             HCI_ERR_AUTH_FAILURE);
    841     }
    842     return;
    843   }
    844 
    845   btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
    846   btm_cb.acl_disc_reason = HCI_SUCCESS;
    847 
    848   btsnd_hcic_pin_code_req_reply(bd_addr, pin_len, p_pin);
    849 }
    850 
    851 /*******************************************************************************
    852  *
    853  * Function         btm_sec_bond_by_transport
    854  *
    855  * Description      this is the bond function that will start either SSP or SMP.
    856  *
    857  * Parameters:      bd_addr      - Address of the device to bond
    858  *                  pin_len      - length in bytes of the PIN Code
    859  *                  p_pin        - pointer to array with the PIN Code
    860  *                  trusted_mask - bitwise OR of trusted services
    861  *                                 (array of uint32_t)
    862  *
    863  *  Note: After 2.1 parameters are not used and preserved here not to change API
    864  ******************************************************************************/
    865 tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr,
    866                                       tBT_TRANSPORT transport, uint8_t pin_len,
    867                                       uint8_t* p_pin, uint32_t trusted_mask[]) {
    868   tBTM_SEC_DEV_REC* p_dev_rec;
    869   tBTM_STATUS status;
    870   uint8_t* p_features;
    871   uint8_t ii;
    872   tACL_CONN* p = btm_bda_to_acl(bd_addr, transport);
    873   VLOG(1) << __func__ << " BDA: " << bd_addr;
    874 
    875   BTM_TRACE_DEBUG("%s: Transport used %d, bd_addr=%s", __func__, transport,
    876                   bd_addr.ToString().c_str());
    877 
    878   /* Other security process is in progress */
    879   if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) {
    880     BTM_TRACE_ERROR("BTM_SecBond: already busy in state: %s",
    881                     btm_pair_state_descr(btm_cb.pairing_state));
    882     return (BTM_WRONG_MODE);
    883   }
    884 
    885   p_dev_rec = btm_find_or_alloc_dev(bd_addr);
    886   if (p_dev_rec == NULL) {
    887     return (BTM_NO_RESOURCES);
    888   }
    889 
    890   if (!controller_get_interface()->get_is_ready()) {
    891     BTM_TRACE_ERROR("%s controller module is not ready", __func__);
    892     return (BTM_NO_RESOURCES);
    893   }
    894 
    895   BTM_TRACE_DEBUG("before update sec_flags=0x%x", p_dev_rec->sec_flags);
    896 
    897   /* Finished if connection is active and already paired */
    898   if (((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) &&
    899        transport == BT_TRANSPORT_BR_EDR &&
    900        (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) ||
    901       ((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) &&
    902        transport == BT_TRANSPORT_LE &&
    903        (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))) {
    904     BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
    905     return (BTM_SUCCESS);
    906   }
    907 
    908   /* Tell controller to get rid of the link key if it has one stored */
    909   if ((BTM_DeleteStoredLinkKey(&bd_addr, NULL)) != BTM_SUCCESS)
    910     return (BTM_NO_RESOURCES);
    911 
    912   /* Save the PIN code if we got a valid one */
    913   if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) {
    914     btm_cb.pin_code_len = pin_len;
    915     p_dev_rec->pin_code_length = pin_len;
    916     memcpy(btm_cb.pin_code, p_pin, PIN_CODE_LEN);
    917   }
    918 
    919   btm_cb.pairing_bda = bd_addr;
    920 
    921   btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD;
    922 
    923   p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE;
    924   p_dev_rec->is_originator = true;
    925   if (trusted_mask)
    926     BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
    927 
    928   if (transport == BT_TRANSPORT_LE) {
    929     btm_ble_init_pseudo_addr(p_dev_rec, bd_addr);
    930     p_dev_rec->sec_flags &= ~BTM_SEC_LE_MASK;
    931 
    932     if (SMP_Pair(bd_addr) == SMP_STARTED) {
    933       btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
    934       p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
    935       btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
    936       return BTM_CMD_STARTED;
    937     }
    938 
    939     btm_cb.pairing_flags = 0;
    940     return (BTM_NO_RESOURCES);
    941   }
    942 
    943   p_dev_rec->sec_flags &=
    944       ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED |
    945         BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED);
    946 
    947   BTM_TRACE_DEBUG("after update sec_flags=0x%x", p_dev_rec->sec_flags);
    948   if (!controller_get_interface()->supports_simple_pairing()) {
    949     /* The special case when we authenticate keyboard.  Set pin type to fixed */
    950     /* It would be probably better to do it from the application, but it is */
    951     /* complicated */
    952     if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) ==
    953          BTM_COD_MAJOR_PERIPHERAL) &&
    954         (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) &&
    955         (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) {
    956       btm_cb.pin_type_changed = true;
    957       btsnd_hcic_write_pin_type(HCI_PIN_TYPE_FIXED);
    958     }
    959   }
    960 
    961   for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) {
    962     p_features = p_dev_rec->feature_pages[ii];
    963     BTM_TRACE_EVENT("  remote_features page[%1d] = %02x-%02x-%02x-%02x", ii,
    964                     p_features[0], p_features[1], p_features[2], p_features[3]);
    965     BTM_TRACE_EVENT("                              %02x-%02x-%02x-%02x",
    966                     p_features[4], p_features[5], p_features[6], p_features[7]);
    967   }
    968 
    969   BTM_TRACE_EVENT("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x",
    970                   p_dev_rec->sm4, p_dev_rec->hci_handle);
    971 
    972 #if (BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE)
    973   p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
    974 #endif
    975 
    976   /* If connection already exists... */
    977   if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) {
    978     btm_sec_start_authentication(p_dev_rec);
    979 
    980     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ);
    981 
    982     /* Mark lcb as bonding */
    983     l2cu_update_lcb_4_bonding(bd_addr, true);
    984     return (BTM_CMD_STARTED);
    985   }
    986 
    987   BTM_TRACE_DEBUG("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
    988   if (!controller_get_interface()->supports_simple_pairing() ||
    989       (p_dev_rec->sm4 == BTM_SM4_KNOWN)) {
    990     if (btm_sec_check_prefetch_pin(p_dev_rec)) return (BTM_CMD_STARTED);
    991   }
    992   if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
    993        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
    994        btm_cb.security_mode == BTM_SEC_MODE_SC) &&
    995       BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) {
    996     /* local is 2.1 and peer is unknown */
    997     if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) {
    998       /* we are not accepting connection request from peer
    999        * -> RNR (to learn if peer is 2.1)
   1000        * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
   1001       btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME);
   1002       status = BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
   1003     } else {
   1004       /* We are accepting connection request from peer */
   1005       btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ);
   1006       status = BTM_CMD_STARTED;
   1007     }
   1008     BTM_TRACE_DEBUG("State:%s sm4: 0x%x sec_state:%d",
   1009                     btm_pair_state_descr(btm_cb.pairing_state), p_dev_rec->sm4,
   1010                     p_dev_rec->sec_state);
   1011   } else {
   1012     /* both local and peer are 2.1  */
   1013     status = btm_sec_dd_create_conn(p_dev_rec);
   1014   }
   1015 
   1016   if (status != BTM_CMD_STARTED) {
   1017     BTM_TRACE_ERROR(
   1018         "%s BTM_ReadRemoteDeviceName or btm_sec_dd_create_conn error: 0x%x",
   1019         __func__, (int)status);
   1020     btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   1021   }
   1022 
   1023   return status;
   1024 }
   1025 
   1026 /*******************************************************************************
   1027  *
   1028  * Function         BTM_SecBondByTransport
   1029  *
   1030  * Description      This function is called to perform bonding with peer device.
   1031  *                  If the connection is already up, but not secure, pairing
   1032  *                  is attempted.  If already paired BTM_SUCCESS is returned.
   1033  *
   1034  * Parameters:      bd_addr      - Address of the device to bond
   1035  *                  transport    - doing SSP over BR/EDR or SMP over LE
   1036  *                  pin_len      - length in bytes of the PIN Code
   1037  *                  p_pin        - pointer to array with the PIN Code
   1038  *                  trusted_mask - bitwise OR of trusted services
   1039  *                                 (array of uint32_t)
   1040  *
   1041  *  Note: After 2.1 parameters are not used and preserved here not to change API
   1042  ******************************************************************************/
   1043 tBTM_STATUS BTM_SecBondByTransport(const RawAddress& bd_addr,
   1044                                    tBT_TRANSPORT transport, uint8_t pin_len,
   1045                                    uint8_t* p_pin, uint32_t trusted_mask[]) {
   1046   tBT_DEVICE_TYPE dev_type;
   1047   tBLE_ADDR_TYPE addr_type;
   1048 
   1049   BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
   1050   /* LE device, do SMP pairing */
   1051   if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
   1052       (transport == BT_TRANSPORT_BR_EDR &&
   1053        (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) {
   1054     return BTM_ILLEGAL_ACTION;
   1055   }
   1056   return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin,
   1057                                    trusted_mask);
   1058 }
   1059 
   1060 /*******************************************************************************
   1061  *
   1062  * Function         BTM_SecBond
   1063  *
   1064  * Description      This function is called to perform bonding with peer device.
   1065  *                  If the connection is already up, but not secure, pairing
   1066  *                  is attempted.  If already paired BTM_SUCCESS is returned.
   1067  *
   1068  * Parameters:      bd_addr      - Address of the device to bond
   1069  *                  pin_len      - length in bytes of the PIN Code
   1070  *                  p_pin        - pointer to array with the PIN Code
   1071  *                  trusted_mask - bitwise OR of trusted services
   1072  *                                 (array of uint32_t)
   1073  *
   1074  *  Note: After 2.1 parameters are not used and preserved here not to change API
   1075  ******************************************************************************/
   1076 tBTM_STATUS BTM_SecBond(const RawAddress& bd_addr, uint8_t pin_len,
   1077                         uint8_t* p_pin, uint32_t trusted_mask[]) {
   1078   tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
   1079   if (BTM_UseLeLink(bd_addr)) transport = BT_TRANSPORT_LE;
   1080   return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin,
   1081                                    trusted_mask);
   1082 }
   1083 /*******************************************************************************
   1084  *
   1085  * Function         BTM_SecBondCancel
   1086  *
   1087  * Description      This function is called to cancel ongoing bonding process
   1088  *                  with peer device.
   1089  *
   1090  * Parameters:      bd_addr      - Address of the peer device
   1091  *                  transport    - false for BR/EDR link; true for LE link
   1092  *
   1093  ******************************************************************************/
   1094 tBTM_STATUS BTM_SecBondCancel(const RawAddress& bd_addr) {
   1095   tBTM_SEC_DEV_REC* p_dev_rec;
   1096 
   1097   BTM_TRACE_API("BTM_SecBondCancel()  State: %s flags:0x%x",
   1098                 btm_pair_state_descr(btm_cb.pairing_state),
   1099                 btm_cb.pairing_flags);
   1100   p_dev_rec = btm_find_dev(bd_addr);
   1101   if (!p_dev_rec || btm_cb.pairing_bda != bd_addr) {
   1102     return BTM_UNKNOWN_ADDR;
   1103   }
   1104 
   1105   if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) {
   1106     if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) {
   1107       BTM_TRACE_DEBUG("Cancel LE pairing");
   1108       if (SMP_PairCancel(bd_addr)) {
   1109         return BTM_CMD_STARTED;
   1110       }
   1111     }
   1112     return BTM_WRONG_MODE;
   1113   }
   1114 
   1115   BTM_TRACE_DEBUG("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle,
   1116                   p_dev_rec->sec_state);
   1117   if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
   1118       BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) {
   1119     /* pre-fetching pin for dedicated bonding */
   1120     btm_sec_bond_cancel_complete();
   1121     return BTM_SUCCESS;
   1122   }
   1123 
   1124   /* If this BDA is in a bonding procedure */
   1125   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   1126       (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) {
   1127     /* If the HCI link is up */
   1128     if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) {
   1129       /* If some other thread disconnecting, we do not send second command */
   1130       if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) ||
   1131           (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH))
   1132         return (BTM_CMD_STARTED);
   1133 
   1134       /* If the HCI link was set up by Bonding process */
   1135       if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
   1136         return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER,
   1137                                            p_dev_rec->hci_handle);
   1138       else
   1139         l2cu_update_lcb_4_bonding(bd_addr, false);
   1140 
   1141       return BTM_NOT_AUTHORIZED;
   1142     } else /*HCI link is not up */
   1143     {
   1144       /* If the HCI link creation was started by Bonding process */
   1145       if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) {
   1146         btsnd_hcic_create_conn_cancel(bd_addr);
   1147         return BTM_CMD_STARTED;
   1148       }
   1149       if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) {
   1150         BTM_CancelRemoteDeviceName();
   1151         btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD;
   1152         return BTM_CMD_STARTED;
   1153       }
   1154       return BTM_NOT_AUTHORIZED;
   1155     }
   1156   }
   1157 
   1158   return BTM_WRONG_MODE;
   1159 }
   1160 
   1161 /*******************************************************************************
   1162  *
   1163  * Function         BTM_SecGetDeviceLinkKey
   1164  *
   1165  * Description      This function is called to obtain link key for the device
   1166  *                  it returns BTM_SUCCESS if link key is available, or
   1167  *                  BTM_UNKNOWN_ADDR if Security Manager does not know about
   1168  *                  the device or device record does not contain link key info
   1169  *
   1170  * Parameters:      bd_addr      - Address of the device
   1171  *                  link_key     - Link Key is copied into this array
   1172  *
   1173  ******************************************************************************/
   1174 tBTM_STATUS BTM_SecGetDeviceLinkKey(const RawAddress& bd_addr,
   1175                                     LINK_KEY link_key) {
   1176   tBTM_SEC_DEV_REC* p_dev_rec;
   1177   p_dev_rec = btm_find_dev(bd_addr);
   1178   if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) {
   1179     memcpy(link_key, p_dev_rec->link_key, LINK_KEY_LEN);
   1180     return (BTM_SUCCESS);
   1181   }
   1182   return (BTM_UNKNOWN_ADDR);
   1183 }
   1184 
   1185 /*******************************************************************************
   1186  *
   1187  * Function         BTM_SecGetDeviceLinkKeyType
   1188  *
   1189  * Description      This function is called to obtain link key type for the
   1190  *                  device.
   1191  *                  it returns BTM_SUCCESS if link key is available, or
   1192  *                  BTM_UNKNOWN_ADDR if Security Manager does not know about
   1193  *                  the device or device record does not contain link key info
   1194  *
   1195  * Returns          BTM_LKEY_TYPE_IGNORE if link key is unknown, link type
   1196  *                  otherwise.
   1197  *
   1198  ******************************************************************************/
   1199 tBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType(const RawAddress& bd_addr) {
   1200   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   1201 
   1202   if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) {
   1203     return p_dev_rec->link_key_type;
   1204   }
   1205   return BTM_LKEY_TYPE_IGNORE;
   1206 }
   1207 
   1208 /*******************************************************************************
   1209  *
   1210  * Function         BTM_SetEncryption
   1211  *
   1212  * Description      This function is called to ensure that connection is
   1213  *                  encrypted.  Should be called only on an open connection.
   1214  *                  Typically only needed for connections that first want to
   1215  *                  bring up unencrypted links, then later encrypt them.
   1216  *
   1217  * Parameters:      bd_addr       - Address of the peer device
   1218  *                  transport     - Link transport
   1219  *                  p_callback    - Pointer to callback function called if
   1220  *                                  this function returns PENDING after required
   1221  *                                  procedures are completed.  Can be set to
   1222  *                                  NULL if status is not desired.
   1223  *                  p_ref_data    - pointer to any data the caller wishes to
   1224  *                                  receive in the callback function upon
   1225  *                                  completion. can be set to NULL if not used.
   1226  *                  sec_act       - LE security action, unused for BR/EDR
   1227  *
   1228  * Returns          BTM_SUCCESS   - already encrypted
   1229  *                  BTM_PENDING   - command will be returned in the callback
   1230  *                  BTM_WRONG_MODE- connection not up.
   1231  *                  BTM_BUSY      - security procedures are currently active
   1232  *                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
   1233  *
   1234  ******************************************************************************/
   1235 tBTM_STATUS BTM_SetEncryption(const RawAddress& bd_addr,
   1236                               tBT_TRANSPORT transport,
   1237                               tBTM_SEC_CBACK* p_callback, void* p_ref_data,
   1238                               tBTM_BLE_SEC_ACT sec_act) {
   1239   tBTM_STATUS rc = 0;
   1240 
   1241   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   1242   if (!p_dev_rec ||
   1243       (transport == BT_TRANSPORT_BR_EDR &&
   1244        p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) ||
   1245       (transport == BT_TRANSPORT_LE &&
   1246        p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)) {
   1247     /* Connection should be up and runnning */
   1248     BTM_TRACE_WARNING("Security Manager: BTM_SetEncryption not connected");
   1249 
   1250     if (p_callback)
   1251       (*p_callback)(&bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
   1252 
   1253     return (BTM_WRONG_MODE);
   1254   }
   1255 
   1256   if (transport == BT_TRANSPORT_BR_EDR &&
   1257       (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) {
   1258     BTM_TRACE_EVENT("Security Manager: BTM_SetEncryption already encrypted");
   1259 
   1260     if (*p_callback)
   1261       (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS);
   1262 
   1263     return (BTM_SUCCESS);
   1264   }
   1265 
   1266   /* enqueue security request if security is active */
   1267   if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)) {
   1268     BTM_TRACE_WARNING(
   1269         "Security Manager: BTM_SetEncryption busy, enqueue request");
   1270 
   1271     if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback,
   1272                                       p_ref_data, sec_act)) {
   1273       return BTM_CMD_STARTED;
   1274     } else {
   1275       if (p_callback)
   1276         (*p_callback)(&bd_addr, transport, p_ref_data, BTM_NO_RESOURCES);
   1277       return BTM_NO_RESOURCES;
   1278     }
   1279   }
   1280 
   1281   p_dev_rec->p_callback = p_callback;
   1282   p_dev_rec->p_ref_data = p_ref_data;
   1283   p_dev_rec->security_required |=
   1284       (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
   1285   p_dev_rec->is_originator = false;
   1286 
   1287   BTM_TRACE_API(
   1288       "Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x "
   1289       "Required:0x%x, p_dev_rec=%p, p_callback=%p",
   1290       p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
   1291       p_dev_rec->security_required, p_dev_rec, p_callback);
   1292 
   1293   if (transport == BT_TRANSPORT_LE) {
   1294     tACL_CONN* p = btm_bda_to_acl(bd_addr, transport);
   1295     if (p) {
   1296       rc = btm_ble_set_encryption(bd_addr, sec_act, p->link_role);
   1297     } else {
   1298       rc = BTM_WRONG_MODE;
   1299       BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL",
   1300                         __func__);
   1301     }
   1302   } else {
   1303     rc = btm_sec_execute_procedure(p_dev_rec);
   1304   }
   1305 
   1306   if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) {
   1307     if (p_callback) {
   1308       BTM_TRACE_DEBUG(
   1309           "%s: clearing p_callback=%p, p_dev_rec=%p, transport=%d, "
   1310           "bd_addr=%s",
   1311           __func__, p_callback, p_dev_rec, transport,
   1312           bd_addr.ToString().c_str());
   1313       p_dev_rec->p_callback = NULL;
   1314       (*p_callback)(&bd_addr, transport, p_dev_rec->p_ref_data, rc);
   1315     }
   1316   }
   1317 
   1318   return (rc);
   1319 }
   1320 
   1321 /*******************************************************************************
   1322  * disconnect the ACL link, if it's not done yet.
   1323  ******************************************************************************/
   1324 static tBTM_STATUS btm_sec_send_hci_disconnect(tBTM_SEC_DEV_REC* p_dev_rec,
   1325                                                uint8_t reason,
   1326                                                uint16_t conn_handle) {
   1327   uint8_t old_state = p_dev_rec->sec_state;
   1328   tBTM_STATUS status = BTM_CMD_STARTED;
   1329 
   1330   BTM_TRACE_EVENT("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
   1331                   conn_handle, reason);
   1332 
   1333   /* send HCI_Disconnect on a transport only once */
   1334   switch (old_state) {
   1335     case BTM_SEC_STATE_DISCONNECTING:
   1336       if (conn_handle == p_dev_rec->hci_handle) return status;
   1337 
   1338       p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
   1339       break;
   1340 
   1341     case BTM_SEC_STATE_DISCONNECTING_BLE:
   1342       if (conn_handle == p_dev_rec->ble_hci_handle) return status;
   1343 
   1344       p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
   1345       break;
   1346 
   1347     case BTM_SEC_STATE_DISCONNECTING_BOTH:
   1348       return status;
   1349 
   1350     default:
   1351       p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle)
   1352                                  ? BTM_SEC_STATE_DISCONNECTING
   1353                                  : BTM_SEC_STATE_DISCONNECTING_BLE;
   1354 
   1355       break;
   1356   }
   1357 
   1358   /* If a role switch is in progress, delay the HCI Disconnect to avoid
   1359    * controller problem */
   1360   if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING &&
   1361       p_dev_rec->hci_handle == conn_handle) {
   1362     BTM_TRACE_DEBUG(
   1363         "RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect "
   1364         "to delay disconnect");
   1365     p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
   1366     status = BTM_SUCCESS;
   1367   }
   1368   /* Tear down the HCI link */
   1369   else {
   1370     btsnd_hcic_disconnect(conn_handle, reason);
   1371   }
   1372 
   1373   return status;
   1374 }
   1375 
   1376 /*******************************************************************************
   1377  *
   1378  * Function         BTM_ConfirmReqReply
   1379  *
   1380  * Description      This function is called to confirm the numeric value for
   1381  *                  Simple Pairing in response to BTM_SP_CFM_REQ_EVT
   1382  *
   1383  * Parameters:      res           - result of the operation BTM_SUCCESS if
   1384  *                                  success
   1385  *                  bd_addr       - Address of the peer device
   1386  *
   1387  ******************************************************************************/
   1388 void BTM_ConfirmReqReply(tBTM_STATUS res, const RawAddress& bd_addr) {
   1389   tBTM_SEC_DEV_REC* p_dev_rec;
   1390 
   1391   BTM_TRACE_EVENT("BTM_ConfirmReqReply() State: %s  Res: %u",
   1392                   btm_pair_state_descr(btm_cb.pairing_state), res);
   1393 
   1394   /* If timeout already expired or has been canceled, ignore the reply */
   1395   if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) ||
   1396       (btm_cb.pairing_bda != bd_addr))
   1397     return;
   1398 
   1399   btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
   1400 
   1401   if ((res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY)) {
   1402     btm_cb.acl_disc_reason = HCI_SUCCESS;
   1403 
   1404     if (res == BTM_SUCCESS) {
   1405       p_dev_rec = btm_find_dev(bd_addr);
   1406       if (p_dev_rec != NULL) {
   1407         p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
   1408         p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
   1409       }
   1410     }
   1411 
   1412     btsnd_hcic_user_conf_reply(bd_addr, true);
   1413   } else {
   1414     /* Report authentication failed event from state
   1415      * BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */
   1416     btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
   1417     btsnd_hcic_user_conf_reply(bd_addr, false);
   1418   }
   1419 }
   1420 
   1421 /*******************************************************************************
   1422  *
   1423  * Function         BTM_PasskeyReqReply
   1424  *
   1425  * Description      This function is called to provide the passkey for
   1426  *                  Simple Pairing in response to BTM_SP_KEY_REQ_EVT
   1427  *
   1428  * Parameters:      res     - result of the operation BTM_SUCCESS if success
   1429  *                  bd_addr - Address of the peer device
   1430  *                  passkey - numeric value in the range of
   1431  *                  BTM_MIN_PASSKEY_VAL(0) -
   1432  *                  BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
   1433  *
   1434  ******************************************************************************/
   1435 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   1436 void BTM_PasskeyReqReply(tBTM_STATUS res, const RawAddress& bd_addr,
   1437                          uint32_t passkey) {
   1438   BTM_TRACE_API("BTM_PasskeyReqReply: State: %s  res:%d",
   1439                 btm_pair_state_descr(btm_cb.pairing_state), res);
   1440 
   1441   if ((btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) ||
   1442       (btm_cb.pairing_bda != bd_addr)) {
   1443     return;
   1444   }
   1445 
   1446   /* If timeout already expired or has been canceled, ignore the reply */
   1447   if ((btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) &&
   1448       (res != BTM_SUCCESS)) {
   1449     tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   1450     if (p_dev_rec != NULL) {
   1451       btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
   1452 
   1453       if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
   1454         btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE,
   1455                                     p_dev_rec->hci_handle);
   1456       else
   1457         BTM_SecBondCancel(bd_addr);
   1458 
   1459       p_dev_rec->sec_flags &=
   1460           ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN);
   1461 
   1462       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   1463       return;
   1464     }
   1465   } else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY)
   1466     return;
   1467 
   1468   if (passkey > BTM_MAX_PASSKEY_VAL) res = BTM_ILLEGAL_VALUE;
   1469 
   1470   btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
   1471 
   1472   if (res != BTM_SUCCESS) {
   1473     /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed
   1474      * event */
   1475     btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
   1476     btsnd_hcic_user_passkey_neg_reply(bd_addr);
   1477   } else {
   1478     btm_cb.acl_disc_reason = HCI_SUCCESS;
   1479     btsnd_hcic_user_passkey_reply(bd_addr, passkey);
   1480   }
   1481 }
   1482 #endif
   1483 
   1484 /*******************************************************************************
   1485  *
   1486  * Function         BTM_SendKeypressNotif
   1487  *
   1488  * Description      This function is used during the passkey entry model
   1489  *                  by a device with KeyboardOnly IO capabilities
   1490  *                  (very likely to be a HID Device).
   1491  *                  It is called by a HID Device to inform the remote device
   1492  *                  when a key has been entered or erased.
   1493  *
   1494  * Parameters:      bd_addr - Address of the peer device
   1495  *                  type - notification type
   1496  *
   1497  ******************************************************************************/
   1498 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   1499 void BTM_SendKeypressNotif(const RawAddress& bd_addr, tBTM_SP_KEY_TYPE type) {
   1500   /* This API only make sense between PASSKEY_REQ and SP complete */
   1501   if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY)
   1502     btsnd_hcic_send_keypress_notif(bd_addr, type);
   1503 }
   1504 #endif
   1505 
   1506 /*******************************************************************************
   1507  *
   1508  * Function         BTM_IoCapRsp
   1509  *
   1510  * Description      This function is called in response to BTM_SP_IO_REQ_EVT
   1511  *                  When the event data io_req.oob_data is set to
   1512  *                  BTM_OOB_UNKNOWN by the tBTM_SP_CALLBACK implementation,
   1513  *                  this function is called to provide the actual response
   1514  *
   1515  * Parameters:      bd_addr - Address of the peer device
   1516  *                  io_cap  - The IO capability of local device.
   1517  *                  oob     - BTM_OOB_NONE or BTM_OOB_PRESENT.
   1518  *                  auth_req- MITM protection required or not.
   1519  *
   1520  ******************************************************************************/
   1521 void BTM_IoCapRsp(const RawAddress& bd_addr, tBTM_IO_CAP io_cap,
   1522                   tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req) {
   1523   BTM_TRACE_EVENT("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
   1524                   btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
   1525 
   1526   if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS) ||
   1527       (btm_cb.pairing_bda != bd_addr))
   1528     return;
   1529 
   1530   if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) {
   1531     btm_cb.devcb.loc_auth_req = auth_req;
   1532     btm_cb.devcb.loc_io_caps = io_cap;
   1533 
   1534     if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
   1535       auth_req = (BTM_AUTH_DD_BOND | (auth_req & BTM_AUTH_YN_BIT));
   1536 
   1537     btsnd_hcic_io_cap_req_reply(bd_addr, io_cap, oob, auth_req);
   1538   }
   1539 }
   1540 
   1541 /*******************************************************************************
   1542  *
   1543  * Function         BTM_ReadLocalOobData
   1544  *
   1545  * Description      This function is called to read the local OOB data from
   1546  *                  LM
   1547  *
   1548  ******************************************************************************/
   1549 void BTM_ReadLocalOobData(void) { btsnd_hcic_read_local_oob_data(); }
   1550 
   1551 /*******************************************************************************
   1552  *
   1553  * Function         BTM_RemoteOobDataReply
   1554  *
   1555  * Description      This function is called to provide the remote OOB data for
   1556  *                  Simple Pairing in response to BTM_SP_RMT_OOB_EVT
   1557  *
   1558  * Parameters:      bd_addr     - Address of the peer device
   1559  *                  c           - simple pairing Hash C.
   1560  *                  r           - simple pairing Randomizer  C.
   1561  *
   1562  ******************************************************************************/
   1563 void BTM_RemoteOobDataReply(tBTM_STATUS res, const RawAddress& bd_addr,
   1564                             BT_OCTET16 c, BT_OCTET16 r) {
   1565   BTM_TRACE_EVENT("%s() - State: %s res: %d", __func__,
   1566                   btm_pair_state_descr(btm_cb.pairing_state), res);
   1567 
   1568   /* If timeout already expired or has been canceled, ignore the reply */
   1569   if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) return;
   1570 
   1571   btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
   1572 
   1573   if (res != BTM_SUCCESS) {
   1574     /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed
   1575      * event */
   1576     btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
   1577     btsnd_hcic_rem_oob_neg_reply(bd_addr);
   1578   } else {
   1579     btm_cb.acl_disc_reason = HCI_SUCCESS;
   1580     btsnd_hcic_rem_oob_reply(bd_addr, c, r);
   1581   }
   1582 }
   1583 
   1584 /*******************************************************************************
   1585  *
   1586  * Function         BTM_BuildOobData
   1587  *
   1588  * Description      This function is called to build the OOB data payload to
   1589  *                  be sent over OOB (non-Bluetooth) link
   1590  *
   1591  * Parameters:      p_data  - the location for OOB data
   1592  *                  max_len - p_data size.
   1593  *                  c       - simple pairing Hash C.
   1594  *                  r       - simple pairing Randomizer  C.
   1595  *                  name_len- 0, local device name would not be included.
   1596  *                            otherwise, the local device name is included for
   1597  *                            up to this specified length
   1598  *
   1599  * Returns          Number of bytes in p_data.
   1600  *
   1601  ******************************************************************************/
   1602 uint16_t BTM_BuildOobData(uint8_t* p_data, uint16_t max_len, BT_OCTET16 c,
   1603                           BT_OCTET16 r, uint8_t name_len) {
   1604   uint8_t* p = p_data;
   1605   uint16_t len = 0;
   1606   uint16_t name_size;
   1607   uint8_t name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
   1608 
   1609   if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) {
   1610     /* add mandatory part */
   1611     UINT16_TO_STREAM(p, len);
   1612     BDADDR_TO_STREAM(p, *controller_get_interface()->get_address());
   1613 
   1614     len = BTM_OOB_MANDATORY_SIZE;
   1615     max_len -= len;
   1616 
   1617     /* now optional part */
   1618 
   1619     /* add Hash C */
   1620     uint16_t delta = BTM_OOB_HASH_C_SIZE + 2;
   1621     if (max_len >= delta) {
   1622       *p++ = BTM_OOB_HASH_C_SIZE + 1;
   1623       *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE;
   1624       ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE);
   1625       len += delta;
   1626       max_len -= delta;
   1627     }
   1628 
   1629     /* add Rand R */
   1630     delta = BTM_OOB_RAND_R_SIZE + 2;
   1631     if (max_len >= delta) {
   1632       *p++ = BTM_OOB_RAND_R_SIZE + 1;
   1633       *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE;
   1634       ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE);
   1635       len += delta;
   1636       max_len -= delta;
   1637     }
   1638 
   1639     /* add class of device */
   1640     delta = BTM_OOB_COD_SIZE + 2;
   1641     if (max_len >= delta) {
   1642       *p++ = BTM_OOB_COD_SIZE + 1;
   1643       *p++ = BTM_EIR_OOB_COD_TYPE;
   1644       DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class);
   1645       len += delta;
   1646       max_len -= delta;
   1647     }
   1648     name_size = name_len;
   1649     if (name_size > strlen(btm_cb.cfg.bd_name)) {
   1650       name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
   1651       name_size = (uint16_t)strlen(btm_cb.cfg.bd_name);
   1652     }
   1653     delta = name_size + 2;
   1654     if (max_len >= delta) {
   1655       *p++ = name_size + 1;
   1656       *p++ = name_type;
   1657       ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, name_size);
   1658       len += delta;
   1659       max_len -= delta;
   1660     }
   1661     /* update len */
   1662     p = p_data;
   1663     UINT16_TO_STREAM(p, len);
   1664   }
   1665   return len;
   1666 }
   1667 
   1668 /*******************************************************************************
   1669  *
   1670  * Function         BTM_BothEndsSupportSecureConnections
   1671  *
   1672  * Description      This function is called to check if both the local device
   1673  *                  and the peer device specified by bd_addr support BR/EDR
   1674  *                  Secure Connections.
   1675  *
   1676  * Parameters:      bd_addr - address of the peer
   1677  *
   1678  * Returns          true if BR/EDR Secure Connections are supported by both
   1679  *                  local and the remote device, else false.
   1680  *
   1681  ******************************************************************************/
   1682 bool BTM_BothEndsSupportSecureConnections(const RawAddress& bd_addr) {
   1683   return ((controller_get_interface()->supports_secure_connections()) &&
   1684           (BTM_PeerSupportsSecureConnections(bd_addr)));
   1685 }
   1686 
   1687 /*******************************************************************************
   1688  *
   1689  * Function         BTM_PeerSupportsSecureConnections
   1690  *
   1691  * Description      This function is called to check if the peer supports
   1692  *                  BR/EDR Secure Connections.
   1693  *
   1694  * Parameters:      bd_addr - address of the peer
   1695  *
   1696  * Returns          true if BR/EDR Secure Connections are supported by the peer,
   1697  *                  else false.
   1698  *
   1699  ******************************************************************************/
   1700 bool BTM_PeerSupportsSecureConnections(const RawAddress& bd_addr) {
   1701   tBTM_SEC_DEV_REC* p_dev_rec;
   1702 
   1703   p_dev_rec = btm_find_dev(bd_addr);
   1704   if (p_dev_rec == NULL) {
   1705     LOG(WARNING) << __func__ << ": unknown BDA: " << bd_addr;
   1706     return false;
   1707   }
   1708 
   1709   return (p_dev_rec->remote_supports_secure_connections);
   1710 }
   1711 
   1712 /*******************************************************************************
   1713  *
   1714  * Function         BTM_ReadOobData
   1715  *
   1716  * Description      This function is called to parse the OOB data payload
   1717  *                  received over OOB (non-Bluetooth) link
   1718  *
   1719  * Parameters:      p_data  - the location for OOB data
   1720  *                  eir_tag - The associated EIR tag to read the data.
   1721  *                  *p_len(output) - the length of the data with the given tag.
   1722  *
   1723  * Returns          the beginning of the data with the given tag.
   1724  *                  NULL, if the tag is not found.
   1725  *
   1726  ******************************************************************************/
   1727 uint8_t* BTM_ReadOobData(uint8_t* p_data, uint8_t eir_tag, uint8_t* p_len) {
   1728   uint8_t* p = p_data;
   1729   uint16_t max_len;
   1730   uint8_t len, type;
   1731   uint8_t* p_ret = NULL;
   1732   uint8_t ret_len = 0;
   1733 
   1734   if (p_data) {
   1735     STREAM_TO_UINT16(max_len, p);
   1736     if (max_len >= BTM_OOB_MANDATORY_SIZE) {
   1737       if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) {
   1738         p_ret = p; /* the location for bd_addr */
   1739         ret_len = BTM_OOB_BD_ADDR_SIZE;
   1740       } else {
   1741         p += BD_ADDR_LEN;
   1742         max_len -= BTM_OOB_MANDATORY_SIZE;
   1743         /* now the optional data in EIR format */
   1744         while (max_len > 0) {
   1745           len = *p++; /* tag data len + 1 */
   1746           type = *p++;
   1747           if (eir_tag == type) {
   1748             p_ret = p;
   1749             ret_len = len - 1;
   1750             break;
   1751           }
   1752           /* the data size of this tag is len + 1 (tag data len + 2) */
   1753           if (max_len > len) {
   1754             max_len -= len;
   1755             max_len--;
   1756             len--;
   1757             p += len;
   1758           } else
   1759             max_len = 0;
   1760         }
   1761       }
   1762     }
   1763   }
   1764 
   1765   if (p_len) *p_len = ret_len;
   1766 
   1767   return p_ret;
   1768 }
   1769 
   1770 /*******************************************************************************
   1771  *
   1772  * Function         BTM_SetOutService
   1773  *
   1774  * Description      This function is called to set the service for
   1775  *                  outgoing connections.
   1776  *
   1777  *                  If the profile/application calls BTM_SetSecurityLevel
   1778  *                  before initiating a connection, this function does not
   1779  *                  need to be called.
   1780  *
   1781  * Returns          void
   1782  *
   1783  ******************************************************************************/
   1784 void BTM_SetOutService(const RawAddress& bd_addr, uint8_t service_id,
   1785                        uint32_t mx_chan_id) {
   1786   tBTM_SEC_DEV_REC* p_dev_rec;
   1787   tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0];
   1788 
   1789   btm_cb.p_out_serv = p_serv_rec;
   1790   p_dev_rec = btm_find_dev(bd_addr);
   1791 
   1792   for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) {
   1793     if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) &&
   1794         (p_serv_rec->service_id == service_id) &&
   1795         (p_serv_rec->orig_mx_chan_id == mx_chan_id)) {
   1796       BTM_TRACE_API(
   1797           "BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, "
   1798           "chan_id %d",
   1799           p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id,
   1800           p_serv_rec->orig_mx_chan_id);
   1801       btm_cb.p_out_serv = p_serv_rec;
   1802       if (p_dev_rec) p_dev_rec->p_cur_service = p_serv_rec;
   1803       break;
   1804     }
   1805   }
   1806 }
   1807 
   1808 /************************************************************************
   1809  *              I N T E R N A L     F U N C T I O N S
   1810  ************************************************************************/
   1811 /*******************************************************************************
   1812  *
   1813  * Function         btm_sec_is_upgrade_possible
   1814  *
   1815  * Description      This function returns true if the existing link key
   1816  *                  can be upgraded or if the link key does not exist.
   1817  *
   1818  * Returns          bool
   1819  *
   1820  ******************************************************************************/
   1821 static bool btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC* p_dev_rec,
   1822                                         bool is_originator) {
   1823   uint16_t mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM;
   1824   bool is_possible = true;
   1825 
   1826   if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) {
   1827     is_possible = false;
   1828     if (p_dev_rec->p_cur_service) {
   1829       BTM_TRACE_DEBUG(
   1830           "%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, "
   1831           "flags: 0x%x",
   1832           __func__, p_dev_rec->p_cur_service->service_id,
   1833           p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check,
   1834           p_dev_rec->p_cur_service->security_flags);
   1835     } else {
   1836       BTM_TRACE_DEBUG(
   1837           "%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x", __func__,
   1838           p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
   1839     }
   1840     /* Already have a link key to the connected peer. Is the link key secure
   1841      *enough?
   1842      ** Is a link key upgrade even possible?
   1843      */
   1844     if ((p_dev_rec->security_required & mtm_check) /* needs MITM */
   1845         && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) ||
   1846             (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256))
   1847         /* has unauthenticated
   1848         link key */
   1849         && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */
   1850         && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps]))
   1851     /* authenticated
   1852     link key is possible */
   1853     {
   1854       /* upgrade is possible: check if the application wants the upgrade.
   1855        * If the application is configured to use a global MITM flag,
   1856        * it probably would not want to upgrade the link key based on the
   1857        * security level database */
   1858       is_possible = true;
   1859     }
   1860   }
   1861   BTM_TRACE_DEBUG("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible,
   1862                   p_dev_rec->sec_flags);
   1863   return is_possible;
   1864 }
   1865 
   1866 /*******************************************************************************
   1867  *
   1868  * Function         btm_sec_check_upgrade
   1869  *
   1870  * Description      This function is called to check if the existing link key
   1871  *                  needs to be upgraded.
   1872  *
   1873  * Returns          void
   1874  *
   1875  ******************************************************************************/
   1876 static void btm_sec_check_upgrade(tBTM_SEC_DEV_REC* p_dev_rec,
   1877                                   bool is_originator) {
   1878   BTM_TRACE_DEBUG("%s()", __func__);
   1879 
   1880   /* Only check if link key already exists */
   1881   if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) return;
   1882 
   1883   if (btm_sec_is_upgrade_possible(p_dev_rec, is_originator)) {
   1884     BTM_TRACE_DEBUG("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
   1885     /* upgrade is possible: check if the application wants the upgrade.
   1886      * If the application is configured to use a global MITM flag,
   1887      * it probably would not want to upgrade the link key based on the security
   1888      * level database */
   1889     tBTM_SP_UPGRADE evt_data;
   1890     evt_data.bd_addr = p_dev_rec->bd_addr;
   1891     evt_data.upgrade = true;
   1892     if (btm_cb.api.p_sp_callback)
   1893       (*btm_cb.api.p_sp_callback)(BTM_SP_UPGRADE_EVT,
   1894                                   (tBTM_SP_EVT_DATA*)&evt_data);
   1895 
   1896     BTM_TRACE_DEBUG("evt_data.upgrade:0x%x", evt_data.upgrade);
   1897     if (evt_data.upgrade) {
   1898       /* if the application confirms the upgrade, set the upgrade bit */
   1899       p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
   1900 
   1901       /* Clear the link key known to go through authentication/pairing again */
   1902       p_dev_rec->sec_flags &=
   1903           ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
   1904       p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
   1905       BTM_TRACE_DEBUG("sec_flags:0x%x", p_dev_rec->sec_flags);
   1906     }
   1907   }
   1908 }
   1909 
   1910 /*******************************************************************************
   1911  *
   1912  * Function         btm_sec_l2cap_access_req
   1913  *
   1914  * Description      This function is called by the L2CAP to grant permission to
   1915  *                  establish L2CAP connection to or from the peer device.
   1916  *
   1917  * Parameters:      bd_addr       - Address of the peer device
   1918  *                  psm           - L2CAP PSM
   1919  *                  is_originator - true if protocol above L2CAP originates
   1920  *                                  connection
   1921  *                  p_callback    - Pointer to callback function called if
   1922  *                                  this function returns PENDING after required
   1923  *                                  procedures are complete. MUST NOT BE NULL.
   1924  *
   1925  * Returns          tBTM_STATUS
   1926  *
   1927  ******************************************************************************/
   1928 tBTM_STATUS btm_sec_l2cap_access_req(const RawAddress& bd_addr, uint16_t psm,
   1929                                      uint16_t handle, CONNECTION_TYPE conn_type,
   1930                                      tBTM_SEC_CALLBACK* p_callback,
   1931                                      void* p_ref_data) {
   1932   tBTM_SEC_DEV_REC* p_dev_rec;
   1933   tBTM_SEC_SERV_REC* p_serv_rec;
   1934   uint16_t security_required;
   1935   uint16_t old_security_required;
   1936   bool old_is_originator;
   1937   tBTM_STATUS rc = BTM_SUCCESS;
   1938   bool chk_acp_auth_done = false;
   1939   bool is_originator;
   1940   tBT_TRANSPORT transport =
   1941       BT_TRANSPORT_BR_EDR; /* should check PSM range in LE connection oriented
   1942                               L2CAP connection */
   1943 
   1944   is_originator = conn_type;
   1945 
   1946   BTM_TRACE_DEBUG("%s() is_originator:%d, 0x%x, psm=0x%04x", __func__,
   1947                   is_originator, p_ref_data, psm);
   1948 
   1949   /* Find or get oldest record */
   1950   p_dev_rec = btm_find_or_alloc_dev(bd_addr);
   1951 
   1952   p_dev_rec->hci_handle = handle;
   1953 
   1954   /* Find the service record for the PSM */
   1955   p_serv_rec = btm_sec_find_first_serv(conn_type, psm);
   1956 
   1957   /* If there is no application registered with this PSM do not allow connection
   1958    */
   1959   if (!p_serv_rec) {
   1960     BTM_TRACE_WARNING("%s() PSM: %d no application registerd", __func__, psm);
   1961     (*p_callback)(&bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
   1962     return (BTM_MODE_UNSUPPORTED);
   1963   }
   1964 
   1965   /* Services level0 by default have no security */
   1966   if ((btm_sec_is_serv_level0(psm)) &&
   1967       (!btm_cb.devcb.secure_connections_only)) {
   1968     (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
   1969     return (BTM_SUCCESS);
   1970   }
   1971   if (btm_cb.security_mode == BTM_SEC_MODE_SC) {
   1972     security_required = btm_sec_set_serv_level4_flags(
   1973         p_serv_rec->security_flags, is_originator);
   1974   } else {
   1975     security_required = p_serv_rec->security_flags;
   1976   }
   1977 
   1978   BTM_TRACE_DEBUG(
   1979       "%s: security_required 0x%04x, is_originator 0x%02x, psm  0x%04x",
   1980       __func__, security_required, is_originator, psm);
   1981 
   1982   if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4)) {
   1983     bool local_supports_sc =
   1984         controller_get_interface()->supports_secure_connections();
   1985     /* acceptor receives L2CAP Channel Connect Request for Secure Connections
   1986      * Only service */
   1987     if (!(local_supports_sc) ||
   1988         !(p_dev_rec->remote_supports_secure_connections)) {
   1989       BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d",
   1990                       "rmt_support_for_sc : %d -> fail pairing", __func__,
   1991                       local_supports_sc,
   1992                       p_dev_rec->remote_supports_secure_connections);
   1993       if (p_callback)
   1994         (*p_callback)(&bd_addr, transport, (void*)p_ref_data,
   1995                       BTM_MODE4_LEVEL4_NOT_SUPPORTED);
   1996 
   1997       return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
   1998     }
   1999   }
   2000 
   2001   /* there are some devices (moto KRZR) which connects to several services at
   2002    * the same time */
   2003   /* we will process one after another */
   2004   if ((p_dev_rec->p_callback) ||
   2005       (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)) {
   2006     BTM_TRACE_EVENT("%s() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x",
   2007                     __func__, psm, btm_pair_state_descr(btm_cb.pairing_state),
   2008                     btm_cb.security_mode, p_dev_rec->sm4);
   2009     BTM_TRACE_EVENT("security_flags:x%x, sec_flags:x%x", security_required,
   2010                     p_dev_rec->sec_flags);
   2011     rc = BTM_CMD_STARTED;
   2012     if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
   2013          btm_cb.security_mode == BTM_SEC_MODE_NONE ||
   2014          btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
   2015          btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
   2016         (BTM_SM4_KNOWN == p_dev_rec->sm4) ||
   2017         (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
   2018          (!btm_sec_is_upgrade_possible(p_dev_rec, is_originator)))) {
   2019       /* legacy mode - local is legacy or local is lisbon/peer is legacy
   2020        * or SM4 with no possibility of link key upgrade */
   2021       if (is_originator) {
   2022         if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
   2023             ((((security_required & BTM_SEC_OUT_FLAGS) ==
   2024                BTM_SEC_OUT_AUTHENTICATE) &&
   2025               btm_dev_authenticated(p_dev_rec))) ||
   2026             ((((security_required & BTM_SEC_OUT_FLAGS) ==
   2027                (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) &&
   2028               btm_dev_encrypted(p_dev_rec))) ||
   2029             ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) &&
   2030               btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec)))) {
   2031           rc = BTM_SUCCESS;
   2032         }
   2033       } else {
   2034         if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
   2035             (((security_required & BTM_SEC_IN_FLAGS) ==
   2036               BTM_SEC_IN_AUTHENTICATE) &&
   2037              btm_dev_authenticated(p_dev_rec)) ||
   2038             (((security_required & BTM_SEC_IN_FLAGS) ==
   2039               (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) &&
   2040              btm_dev_encrypted(p_dev_rec)) ||
   2041             (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) &&
   2042              (btm_dev_authorized(p_dev_rec) ||
   2043               btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
   2044             (((security_required & BTM_SEC_IN_FLAGS) ==
   2045               (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) &&
   2046              ((btm_dev_authorized(p_dev_rec) ||
   2047                btm_serv_trusted(p_dev_rec, p_serv_rec)) &&
   2048               btm_dev_authenticated(p_dev_rec))) ||
   2049             (((security_required & BTM_SEC_IN_FLAGS) ==
   2050               (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) &&
   2051              ((btm_dev_authorized(p_dev_rec) ||
   2052                btm_serv_trusted(p_dev_rec, p_serv_rec)) &&
   2053               btm_dev_encrypted(p_dev_rec))) ||
   2054             (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) &&
   2055              btm_dev_encrypted(p_dev_rec) &&
   2056              (btm_dev_authorized(p_dev_rec) ||
   2057               btm_serv_trusted(p_dev_rec, p_serv_rec)))) {
   2058           // Check for 16 digits (or MITM)
   2059           if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
   2060               (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) ==
   2061                 BTM_SEC_IN_MIN_16_DIGIT_PIN) &&
   2062                btm_dev_16_digit_authenticated(p_dev_rec))) {
   2063             rc = BTM_SUCCESS;
   2064           }
   2065         }
   2066       }
   2067 
   2068       if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
   2069           (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   2070         rc = BTM_CMD_STARTED;
   2071       }
   2072 
   2073       if (rc == BTM_SUCCESS) {
   2074         if (p_callback)
   2075           (*p_callback)(&bd_addr, transport, (void*)p_ref_data, BTM_SUCCESS);
   2076         return (BTM_SUCCESS);
   2077       }
   2078     }
   2079 
   2080     btm_cb.sec_req_pending = true;
   2081     return (BTM_CMD_STARTED);
   2082   }
   2083 
   2084   /* Save pointer to service record */
   2085   p_dev_rec->p_cur_service = p_serv_rec;
   2086 
   2087   /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */
   2088   if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
   2089       btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
   2090       btm_cb.security_mode == BTM_SEC_MODE_SC) {
   2091     if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) {
   2092       if (is_originator) {
   2093         /* SM4 to SM4 -> always authenticate & encrypt */
   2094         security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT);
   2095       } else /* acceptor */
   2096       {
   2097         /* SM4 to SM4: the acceptor needs to make sure the authentication is
   2098          * already done */
   2099         chk_acp_auth_done = true;
   2100         /* SM4 to SM4 -> always authenticate & encrypt */
   2101         security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
   2102       }
   2103     } else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4)) {
   2104       /* the remote features are not known yet */
   2105       BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x",
   2106                       __func__, (is_originator) ? "initiator" : "acceptor",
   2107                       p_dev_rec->sec_flags);
   2108 
   2109       p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
   2110       return (BTM_CMD_STARTED);
   2111     }
   2112   }
   2113 
   2114   BTM_TRACE_DEBUG(
   2115       "%s()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__,
   2116       p_dev_rec->sm4, p_dev_rec->sec_flags, security_required,
   2117       chk_acp_auth_done);
   2118 
   2119   old_security_required = p_dev_rec->security_required;
   2120   old_is_originator = p_dev_rec->is_originator;
   2121   p_dev_rec->security_required = security_required;
   2122   p_dev_rec->p_ref_data = p_ref_data;
   2123   p_dev_rec->is_originator = is_originator;
   2124 
   2125 /* If there are multiple service records used through the same PSM */
   2126 /* leave security decision for the multiplexor on the top */
   2127   if ((btm_sec_find_next_serv(p_serv_rec)) != NULL) {
   2128     BTM_TRACE_DEBUG("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4,
   2129                     chk_acp_auth_done);
   2130     if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) {
   2131       BTM_TRACE_EVENT(
   2132           "Security Manager: l2cap_access_req PSM:%d postponed for multiplexer",
   2133           psm);
   2134       /* pre-Lisbon: restore the old settings */
   2135       p_dev_rec->security_required = old_security_required;
   2136       p_dev_rec->is_originator = old_is_originator;
   2137 
   2138       (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS);
   2139 
   2140       return (BTM_SUCCESS);
   2141     }
   2142   }
   2143 
   2144   /* if the originator is using dynamic PSM in legacy mode, do not start any
   2145    * security process now
   2146    * The layer above L2CAP needs to carry out the security requirement after
   2147    * L2CAP connect
   2148    * response is received */
   2149   if (is_originator &&
   2150       ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
   2151         btm_cb.security_mode == BTM_SEC_MODE_NONE ||
   2152         btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
   2153         btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
   2154        !BTM_SEC_IS_SM4(p_dev_rec->sm4)) &&
   2155       (psm >= 0x1001)) {
   2156     BTM_TRACE_EVENT(
   2157         "dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
   2158     /* restore the old settings */
   2159     p_dev_rec->security_required = old_security_required;
   2160     p_dev_rec->is_originator = old_is_originator;
   2161 
   2162     (*p_callback)(&bd_addr, transport, p_ref_data, BTM_SUCCESS);
   2163 
   2164     return (BTM_SUCCESS);
   2165   }
   2166 
   2167   if (chk_acp_auth_done) {
   2168     BTM_TRACE_DEBUG(
   2169         "(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: "
   2170         "x%x",
   2171         (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED),
   2172         (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
   2173     /* SM4, but we do not know for sure which level of security we need.
   2174      * as long as we have a link key, it's OK */
   2175     if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) ||
   2176         (0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) {
   2177       rc = BTM_DELAY_CHECK;
   2178       /*
   2179       2046 may report HCI_Encryption_Change and L2C Connection Request out of
   2180       sequence
   2181       because of data path issues. Delay this disconnect a little bit
   2182       */
   2183       LOG_INFO(
   2184           LOG_TAG,
   2185           "%s peer should have initiated security process by now (SM4 to SM4)",
   2186           __func__);
   2187       p_dev_rec->p_callback = p_callback;
   2188       p_dev_rec->sec_state = BTM_SEC_STATE_DELAY_FOR_ENC;
   2189       (*p_callback)(&bd_addr, transport, p_ref_data, rc);
   2190 
   2191       return BTM_SUCCESS;
   2192     }
   2193   }
   2194 
   2195   p_dev_rec->p_callback = p_callback;
   2196 
   2197   if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID ||
   2198       p_dev_rec->last_author_service_id !=
   2199           p_dev_rec->p_cur_service->service_id) {
   2200     /* Although authentication and encryption are per connection
   2201     ** authorization is per access request.  For example when serial connection
   2202     ** is up and authorized and client requests to read file (access to other
   2203     ** scn), we need to request user's permission again.
   2204     */
   2205     p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED;
   2206   }
   2207 
   2208   if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) {
   2209     if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
   2210         (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   2211       /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case
   2212        */
   2213       if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) {
   2214         p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
   2215       }
   2216       p_dev_rec->sec_flags &=
   2217           ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
   2218             BTM_SEC_AUTHENTICATED);
   2219       BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __func__, p_dev_rec->sec_flags);
   2220     } else {
   2221       /* If we already have a link key to the connected peer, is it secure
   2222        * enough? */
   2223       btm_sec_check_upgrade(p_dev_rec, is_originator);
   2224     }
   2225   }
   2226 
   2227   BTM_TRACE_EVENT(
   2228       "%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d",
   2229       __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
   2230       p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
   2231 
   2232   rc = btm_sec_execute_procedure(p_dev_rec);
   2233   if (rc != BTM_CMD_STARTED) {
   2234     BTM_TRACE_DEBUG("%s: p_dev_rec=%p, clearing callback. old p_callback=%p",
   2235                     __func__, p_dev_rec, p_dev_rec->p_callback);
   2236     p_dev_rec->p_callback = NULL;
   2237     (*p_callback)(&bd_addr, transport, p_dev_rec->p_ref_data, (uint8_t)rc);
   2238   }
   2239 
   2240   return (rc);
   2241 }
   2242 
   2243 /*******************************************************************************
   2244  *
   2245  * Function         btm_sec_mx_access_request
   2246  *
   2247  * Description      This function is called by all Multiplexing Protocols during
   2248  *                  establishing connection to or from peer device to grant
   2249  *                  permission to establish application connection.
   2250  *
   2251  * Parameters:      bd_addr       - Address of the peer device
   2252  *                  psm           - L2CAP PSM
   2253  *                  is_originator - true if protocol above L2CAP originates
   2254  *                                  connection
   2255  *                  mx_proto_id   - protocol ID of the multiplexer
   2256  *                  mx_chan_id    - multiplexer channel to reach application
   2257  *                  p_callback    - Pointer to callback function called if
   2258  *                                  this function returns PENDING after required
   2259  *                                  procedures are completed
   2260  *                  p_ref_data    - Pointer to any reference data needed by the
   2261  *                                  the callback function.
   2262  *
   2263  * Returns          BTM_CMD_STARTED
   2264  *
   2265  ******************************************************************************/
   2266 tBTM_STATUS btm_sec_mx_access_request(const RawAddress& bd_addr, uint16_t psm,
   2267                                       bool is_originator, uint32_t mx_proto_id,
   2268                                       uint32_t mx_chan_id,
   2269                                       tBTM_SEC_CALLBACK* p_callback,
   2270                                       void* p_ref_data) {
   2271   tBTM_SEC_DEV_REC* p_dev_rec;
   2272   tBTM_SEC_SERV_REC* p_serv_rec;
   2273   tBTM_STATUS rc;
   2274   uint16_t security_required;
   2275   bool transport = false; /* should check PSM range in LE connection oriented
   2276                              L2CAP connection */
   2277 
   2278   BTM_TRACE_DEBUG("%s() is_originator: %d", __func__, is_originator);
   2279   /* Find or get oldest record */
   2280   p_dev_rec = btm_find_or_alloc_dev(bd_addr);
   2281 
   2282   /* Find the service record for the PSM */
   2283   p_serv_rec =
   2284       btm_sec_find_mx_serv(is_originator, psm, mx_proto_id, mx_chan_id);
   2285 
   2286   /* If there is no application registered with this PSM do not allow connection
   2287    */
   2288   if (!p_serv_rec) {
   2289     if (p_callback)
   2290       (*p_callback)(&bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
   2291 
   2292     BTM_TRACE_ERROR(
   2293         "Security Manager: MX service not found PSM:%d Proto:%d SCN:%d", psm,
   2294         mx_proto_id, mx_chan_id);
   2295     return BTM_NO_RESOURCES;
   2296   }
   2297 
   2298   if ((btm_cb.security_mode == BTM_SEC_MODE_SC) &&
   2299       (!btm_sec_is_serv_level0(psm))) {
   2300     security_required = btm_sec_set_serv_level4_flags(
   2301         p_serv_rec->security_flags, is_originator);
   2302   } else {
   2303     security_required = p_serv_rec->security_flags;
   2304   }
   2305 
   2306   /* there are some devices (moto phone) which connects to several services at
   2307    * the same time */
   2308   /* we will process one after another */
   2309   if ((p_dev_rec->p_callback) ||
   2310       (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)) {
   2311     BTM_TRACE_EVENT("%s() service PSM:%d Proto:%d SCN:%d delayed  state: %s",
   2312                     __func__, psm, mx_proto_id, mx_chan_id,
   2313                     btm_pair_state_descr(btm_cb.pairing_state));
   2314 
   2315     rc = BTM_CMD_STARTED;
   2316 
   2317     if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
   2318          btm_cb.security_mode == BTM_SEC_MODE_NONE ||
   2319          btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
   2320          btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
   2321         (BTM_SM4_KNOWN == p_dev_rec->sm4) ||
   2322         (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
   2323          (!btm_sec_is_upgrade_possible(p_dev_rec, is_originator)))) {
   2324       /* legacy mode - local is legacy or local is lisbon/peer is legacy
   2325        * or SM4 with no possibility of link key upgrade */
   2326       if (is_originator) {
   2327         if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
   2328             ((((security_required & BTM_SEC_OUT_FLAGS) ==
   2329                BTM_SEC_OUT_AUTHENTICATE) &&
   2330               btm_dev_authenticated(p_dev_rec))) ||
   2331             ((((security_required & BTM_SEC_OUT_FLAGS) ==
   2332                (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) &&
   2333               btm_dev_encrypted(p_dev_rec)))) {
   2334           rc = BTM_SUCCESS;
   2335         }
   2336       } else {
   2337         if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
   2338             ((((security_required & BTM_SEC_IN_FLAGS) ==
   2339                BTM_SEC_IN_AUTHENTICATE) &&
   2340               btm_dev_authenticated(p_dev_rec))) ||
   2341             (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) &&
   2342              (btm_dev_authorized(p_dev_rec) ||
   2343               btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
   2344             (((security_required & BTM_SEC_IN_FLAGS) ==
   2345               (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) &&
   2346              ((btm_dev_authorized(p_dev_rec) ||
   2347                btm_serv_trusted(p_dev_rec, p_serv_rec)) &&
   2348               btm_dev_authenticated(p_dev_rec))) ||
   2349             (((security_required & BTM_SEC_IN_FLAGS) ==
   2350               (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) &&
   2351              ((btm_dev_authorized(p_dev_rec) ||
   2352                btm_serv_trusted(p_dev_rec, p_serv_rec)) &&
   2353               btm_dev_encrypted(p_dev_rec))) ||
   2354             ((((security_required & BTM_SEC_IN_FLAGS) ==
   2355                (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) &&
   2356               btm_dev_encrypted(p_dev_rec)))) {
   2357           // Check for 16 digits (or MITM)
   2358           if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
   2359               (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) ==
   2360                 BTM_SEC_IN_MIN_16_DIGIT_PIN) &&
   2361                btm_dev_16_digit_authenticated(p_dev_rec))) {
   2362             rc = BTM_SUCCESS;
   2363           }
   2364         }
   2365       }
   2366       if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
   2367           (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   2368         rc = BTM_CMD_STARTED;
   2369       }
   2370     }
   2371 
   2372     if (rc == BTM_SUCCESS) {
   2373       BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __func__);
   2374       /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the
   2375        * requirements in */
   2376       /* btm_sec_execute_procedure */
   2377       if ((is_originator &&
   2378            (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) ||
   2379           (!is_originator &&
   2380            (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE))) {
   2381         BTM_TRACE_EVENT("%s: still need authorization", __func__);
   2382         rc = BTM_CMD_STARTED;
   2383       }
   2384     }
   2385 
   2386     /* Check whether there is a pending security procedure, if so we should
   2387      * always queue */
   2388     /* the new security request */
   2389     if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE) {
   2390       BTM_TRACE_EVENT("%s: There is a pending security procedure", __func__);
   2391       rc = BTM_CMD_STARTED;
   2392     }
   2393     if (rc == BTM_CMD_STARTED) {
   2394       BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __func__);
   2395       btm_sec_queue_mx_request(bd_addr, psm, is_originator, mx_proto_id,
   2396                                mx_chan_id, p_callback, p_ref_data);
   2397     } else /* rc == BTM_SUCCESS */
   2398     {
   2399       /* access granted */
   2400       if (p_callback) {
   2401         (*p_callback)(&bd_addr, transport, p_ref_data, (uint8_t)rc);
   2402       }
   2403     }
   2404 
   2405     BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __func__,
   2406                     rc, btm_pair_state_descr(btm_cb.pairing_state));
   2407     return rc;
   2408   }
   2409 
   2410   if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) ||
   2411                            (btm_cb.security_mode == BTM_SEC_MODE_SC))) {
   2412     bool local_supports_sc =
   2413         controller_get_interface()->supports_secure_connections();
   2414     /* acceptor receives service connection establishment Request for */
   2415     /* Secure Connections Only service */
   2416     if (!(local_supports_sc) ||
   2417         !(p_dev_rec->remote_supports_secure_connections)) {
   2418       BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,",
   2419                       "remote_support_for_sc %d: fail pairing", __func__,
   2420                       local_supports_sc,
   2421                       p_dev_rec->remote_supports_secure_connections);
   2422 
   2423       if (p_callback)
   2424         (*p_callback)(&bd_addr, transport, (void*)p_ref_data,
   2425                       BTM_MODE4_LEVEL4_NOT_SUPPORTED);
   2426 
   2427       return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
   2428     }
   2429   }
   2430 
   2431   p_dev_rec->p_cur_service = p_serv_rec;
   2432   p_dev_rec->security_required = security_required;
   2433 
   2434   if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
   2435       btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
   2436       btm_cb.security_mode == BTM_SEC_MODE_SC) {
   2437     if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) {
   2438       if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
   2439           (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   2440         /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case
   2441          */
   2442         if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) {
   2443           p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
   2444         }
   2445 
   2446         p_dev_rec->sec_flags &=
   2447             ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
   2448               BTM_SEC_AUTHENTICATED);
   2449         BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __func__, p_dev_rec->sec_flags);
   2450       } else {
   2451         /* If we already have a link key, check if that link key is good enough
   2452          */
   2453         btm_sec_check_upgrade(p_dev_rec, is_originator);
   2454       }
   2455     }
   2456   }
   2457 
   2458   p_dev_rec->is_originator = is_originator;
   2459   p_dev_rec->p_callback = p_callback;
   2460   p_dev_rec->p_ref_data = p_ref_data;
   2461 
   2462   /* Although authentication and encryption are per connection */
   2463   /* authorization is per access request.  For example when serial connection */
   2464   /* is up and authorized and client requests to read file (access to other */
   2465   /* scn, we need to request user's permission again. */
   2466   p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
   2467 
   2468   BTM_TRACE_EVENT(
   2469       "%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service "
   2470       "ID:%d",
   2471       __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state,
   2472       p_dev_rec->sec_flags, p_dev_rec->security_required,
   2473       p_dev_rec->p_cur_service->service_id);
   2474 
   2475   rc = btm_sec_execute_procedure(p_dev_rec);
   2476   if (rc != BTM_CMD_STARTED) {
   2477     if (p_callback) {
   2478       p_dev_rec->p_callback = NULL;
   2479       (*p_callback)(&bd_addr, transport, p_ref_data, (uint8_t)rc);
   2480     }
   2481   }
   2482 
   2483   return rc;
   2484 }
   2485 
   2486 /*******************************************************************************
   2487  *
   2488  * Function         btm_sec_conn_req
   2489  *
   2490  * Description      This function is when the peer device is requesting
   2491  *                  connection
   2492  *
   2493  * Returns          void
   2494  *
   2495  ******************************************************************************/
   2496 void btm_sec_conn_req(const RawAddress& bda, uint8_t* dc) {
   2497   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
   2498 
   2499   /* Some device may request a connection before we are done with the HCI_Reset
   2500    * sequence */
   2501   if (!controller_get_interface()->get_is_ready()) {
   2502     BTM_TRACE_EVENT("Security Manager: connect request when device not ready");
   2503     btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE);
   2504     return;
   2505   }
   2506 
   2507   /* Security guys wants us not to allow connection from not paired devices */
   2508 
   2509   /* Check if connection is allowed for only paired devices */
   2510   if (btm_cb.connect_only_paired) {
   2511     if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) {
   2512       BTM_TRACE_EVENT(
   2513           "Security Manager: connect request from non-paired device");
   2514       btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE);
   2515       return;
   2516     }
   2517   }
   2518 
   2519 #if (BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE)
   2520   /* If non-discoverable, only allow known devices to connect */
   2521   if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) {
   2522     if (!p_dev_rec) {
   2523       BTM_TRACE_EVENT(
   2524           "Security Manager: connect request from not paired device");
   2525       btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE);
   2526       return;
   2527     }
   2528   }
   2529 #endif
   2530 
   2531   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   2532       (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
   2533       (btm_cb.pairing_bda == bda)) {
   2534     BTM_TRACE_EVENT(
   2535         "Security Manager: reject connect request from bonding device");
   2536 
   2537     /* incoming connection from bonding device is rejected */
   2538     btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
   2539     btsnd_hcic_reject_conn(bda, HCI_ERR_HOST_REJECT_DEVICE);
   2540     return;
   2541   }
   2542 
   2543   /* Host is not interested or approved connection.  Save BDA and DC and */
   2544   /* pass request to L2CAP */
   2545   btm_cb.connecting_bda = bda;
   2546   memcpy(btm_cb.connecting_dc, dc, DEV_CLASS_LEN);
   2547 
   2548   if (l2c_link_hci_conn_req(bda)) {
   2549     if (!p_dev_rec) {
   2550       /* accept the connection -> allocate a device record */
   2551       p_dev_rec = btm_sec_alloc_dev(bda);
   2552     }
   2553     if (p_dev_rec) {
   2554       p_dev_rec->sm4 |= BTM_SM4_CONN_PEND;
   2555     }
   2556   }
   2557 }
   2558 
   2559 /*******************************************************************************
   2560  *
   2561  * Function         btm_sec_bond_cancel_complete
   2562  *
   2563  * Description      This function is called to report bond cancel complete
   2564  *                  event.
   2565  *
   2566  * Returns          void
   2567  *
   2568  ******************************************************************************/
   2569 static void btm_sec_bond_cancel_complete(void) {
   2570   tBTM_SEC_DEV_REC* p_dev_rec;
   2571 
   2572   if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) ||
   2573       (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
   2574        BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) ||
   2575       (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME &&
   2576        BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) {
   2577     /* for dedicated bonding in legacy mode, authentication happens at "link
   2578      * level"
   2579      * btm_sec_connected is called with failed status.
   2580      * In theory, the code that handles is_pairing_device/true should clean out
   2581      * security related code.
   2582      * However, this function may clean out the security related flags and
   2583      * btm_sec_connected would not know
   2584      * this function also needs to do proper clean up.
   2585      */
   2586     p_dev_rec = btm_find_dev(btm_cb.pairing_bda);
   2587     if (p_dev_rec != NULL) p_dev_rec->security_required = BTM_SEC_NONE;
   2588     btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   2589 
   2590     /* Notify application that the cancel succeeded */
   2591     if (btm_cb.api.p_bond_cancel_cmpl_callback)
   2592       btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS);
   2593   }
   2594 }
   2595 
   2596 /*******************************************************************************
   2597  *
   2598  * Function         btm_create_conn_cancel_complete
   2599  *
   2600  * Description      This function is called when the command complete message
   2601  *                  is received from the HCI for the create connection cancel
   2602  *                  command.
   2603  *
   2604  * Returns          void
   2605  *
   2606  ******************************************************************************/
   2607 void btm_create_conn_cancel_complete(uint8_t* p) {
   2608   uint8_t status;
   2609 
   2610   STREAM_TO_UINT8(status, p);
   2611   BTM_TRACE_EVENT("btm_create_conn_cancel_complete(): in State: %s  status:%d",
   2612                   btm_pair_state_descr(btm_cb.pairing_state), status);
   2613 
   2614   /* if the create conn cancel cmd was issued by the bond cancel,
   2615   ** the application needs to be notified that bond cancel succeeded
   2616   */
   2617   switch (status) {
   2618     case HCI_SUCCESS:
   2619       btm_sec_bond_cancel_complete();
   2620       break;
   2621     case HCI_ERR_CONNECTION_EXISTS:
   2622     case HCI_ERR_NO_CONNECTION:
   2623     default:
   2624       /* Notify application of the error */
   2625       if (btm_cb.api.p_bond_cancel_cmpl_callback)
   2626         btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING);
   2627       break;
   2628   }
   2629 }
   2630 
   2631 /*******************************************************************************
   2632  *
   2633  * Function         btm_sec_check_pending_reqs
   2634  *
   2635  * Description      This function is called at the end of the security procedure
   2636  *                  to let L2CAP and RFCOMM know to re-submit any pending
   2637  *                  requests
   2638  *
   2639  * Returns          void
   2640  *
   2641  ******************************************************************************/
   2642 void btm_sec_check_pending_reqs(void) {
   2643   if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) {
   2644     /* First, resubmit L2CAP requests */
   2645     if (btm_cb.sec_req_pending) {
   2646       btm_cb.sec_req_pending = false;
   2647       l2cu_resubmit_pending_sec_req(nullptr);
   2648     }
   2649 
   2650     /* Now, re-submit anything in the mux queue */
   2651     fixed_queue_t* bq = btm_cb.sec_pending_q;
   2652 
   2653     btm_cb.sec_pending_q = fixed_queue_new(SIZE_MAX);
   2654 
   2655     tBTM_SEC_QUEUE_ENTRY* p_e;
   2656     while ((p_e = (tBTM_SEC_QUEUE_ENTRY*)fixed_queue_try_dequeue(bq)) != NULL) {
   2657       /* Check that the ACL is still up before starting security procedures */
   2658       if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL) {
   2659         if (p_e->psm != 0) {
   2660           BTM_TRACE_EVENT(
   2661               "%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u", __func__,
   2662               p_e->psm, p_e->is_orig, p_e->mx_proto_id, p_e->mx_chan_id);
   2663 
   2664           btm_sec_mx_access_request(p_e->bd_addr, p_e->psm, p_e->is_orig,
   2665                                     p_e->mx_proto_id, p_e->mx_chan_id,
   2666                                     p_e->p_callback, p_e->p_ref_data);
   2667         } else {
   2668           BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback,
   2669                             p_e->p_ref_data, p_e->sec_act);
   2670         }
   2671       }
   2672 
   2673       osi_free(p_e);
   2674     }
   2675     fixed_queue_free(bq, NULL);
   2676   }
   2677 }
   2678 
   2679 /*******************************************************************************
   2680  *
   2681  * Function         btm_sec_init
   2682  *
   2683  * Description      This function is on the SEC startup
   2684  *
   2685  * Returns          void
   2686  *
   2687  ******************************************************************************/
   2688 void btm_sec_init(uint8_t sec_mode) {
   2689   btm_cb.security_mode = sec_mode;
   2690   btm_cb.pairing_bda = RawAddress::kAny;
   2691   btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY;
   2692 }
   2693 
   2694 /*******************************************************************************
   2695  *
   2696  * Function         btm_sec_device_down
   2697  *
   2698  * Description      This function should be called when device is disabled or
   2699  *                  turned off
   2700  *
   2701  * Returns          void
   2702  *
   2703  ******************************************************************************/
   2704 void btm_sec_device_down(void) {
   2705   BTM_TRACE_EVENT("%s() State: %s", __func__,
   2706                   btm_pair_state_descr(btm_cb.pairing_state));
   2707   btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   2708 }
   2709 
   2710 /*******************************************************************************
   2711  *
   2712  * Function         btm_sec_dev_reset
   2713  *
   2714  * Description      This function should be called after device reset
   2715  *
   2716  * Returns          void
   2717  *
   2718  ******************************************************************************/
   2719 void btm_sec_dev_reset(void) {
   2720   if (controller_get_interface()->supports_simple_pairing()) {
   2721     /* set the default IO capabilities */
   2722     btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS;
   2723     /* add mx service to use no security */
   2724     BTM_SetSecurityLevel(false, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX,
   2725                          BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0);
   2726   } else {
   2727     btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
   2728   }
   2729 
   2730   BTM_TRACE_DEBUG("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
   2731 }
   2732 
   2733 /*******************************************************************************
   2734  *
   2735  * Function         btm_sec_abort_access_req
   2736  *
   2737  * Description      This function is called by the L2CAP or RFCOMM to abort
   2738  *                  the pending operation.
   2739  *
   2740  * Parameters:      bd_addr       - Address of the peer device
   2741  *
   2742  * Returns          void
   2743  *
   2744  ******************************************************************************/
   2745 void btm_sec_abort_access_req(const RawAddress& bd_addr) {
   2746   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   2747 
   2748   if (!p_dev_rec) return;
   2749 
   2750   if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) &&
   2751       (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING))
   2752     return;
   2753 
   2754   p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   2755 
   2756   BTM_TRACE_DEBUG("%s: clearing callback. p_dev_rec=%p, p_callback=%p",
   2757                   __func__, p_dev_rec, p_dev_rec->p_callback);
   2758   p_dev_rec->p_callback = NULL;
   2759 }
   2760 
   2761 /*******************************************************************************
   2762  *
   2763  * Function         btm_sec_dd_create_conn
   2764  *
   2765  * Description      This function is called to create the ACL connection for
   2766  *                  the dedicated boding process
   2767  *
   2768  * Returns          void
   2769  *
   2770  ******************************************************************************/
   2771 static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec) {
   2772   tL2C_LCB* p_lcb =
   2773       l2cu_find_lcb_by_bd_addr(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
   2774   if (p_lcb && (p_lcb->link_state == LST_CONNECTED ||
   2775                 p_lcb->link_state == LST_CONNECTING)) {
   2776     BTM_TRACE_WARNING("%s Connection already exists", __func__);
   2777     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ);
   2778     return BTM_CMD_STARTED;
   2779   }
   2780 
   2781   /* Make sure an L2cap link control block is available */
   2782   if (!p_lcb && (p_lcb = l2cu_allocate_lcb(p_dev_rec->bd_addr, true,
   2783                                            BT_TRANSPORT_BR_EDR)) == NULL) {
   2784     LOG(WARNING) << "Security Manager: failed allocate LCB "
   2785                  << p_dev_rec->bd_addr;
   2786 
   2787     return (BTM_NO_RESOURCES);
   2788   }
   2789 
   2790   /* set up the control block to indicated dedicated bonding */
   2791   btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
   2792 
   2793   if (!l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR)) {
   2794     LOG(WARNING) << "Security Manager: failed create allocate LCB "
   2795                  << p_dev_rec->bd_addr;
   2796 
   2797     l2cu_release_lcb(p_lcb);
   2798     return (BTM_NO_RESOURCES);
   2799   }
   2800 
   2801   btm_acl_update_busy_level(BTM_BLI_PAGE_EVT);
   2802 
   2803   VLOG(1) << "Security Manager: " << p_dev_rec->bd_addr;
   2804 
   2805   btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ);
   2806 
   2807   return (BTM_CMD_STARTED);
   2808 }
   2809 
   2810 bool is_state_getting_name(void* data, void* context) {
   2811   tBTM_SEC_DEV_REC* p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(data);
   2812 
   2813   if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) {
   2814     return false;
   2815   }
   2816   return true;
   2817 }
   2818 
   2819 /*******************************************************************************
   2820  *
   2821  * Function         btm_sec_rmt_name_request_complete
   2822  *
   2823  * Description      This function is called when remote name was obtained from
   2824  *                  the peer device
   2825  *
   2826  * Returns          void
   2827  *
   2828  ******************************************************************************/
   2829 void btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr,
   2830                                        uint8_t* p_bd_name, uint8_t status) {
   2831   tBTM_SEC_DEV_REC* p_dev_rec;
   2832   int i;
   2833   DEV_CLASS dev_class;
   2834   uint8_t old_sec_state;
   2835 
   2836   BTM_TRACE_EVENT("btm_sec_rmt_name_request_complete");
   2837   if ((!p_bd_addr && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda)) ||
   2838       (p_bd_addr && !BTM_ACL_IS_CONNECTED(*p_bd_addr))) {
   2839     btm_acl_resubmit_page();
   2840   }
   2841 
   2842   /* If remote name request failed, p_bd_addr is null and we need to search */
   2843   /* based on state assuming that we are doing 1 at a time */
   2844   if (p_bd_addr)
   2845     p_dev_rec = btm_find_dev(*p_bd_addr);
   2846   else {
   2847     list_node_t* node =
   2848         list_foreach(btm_cb.sec_dev_rec, is_state_getting_name, NULL);
   2849     if (node != NULL) {
   2850       p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(list_node(node));
   2851       p_bd_addr = &p_dev_rec->bd_addr;
   2852     } else {
   2853       p_dev_rec = NULL;
   2854     }
   2855   }
   2856 
   2857   /* Commenting out trace due to obf/compilation problems.
   2858    */
   2859   if (!p_bd_name) p_bd_name = (uint8_t*)"";
   2860 
   2861   if (p_dev_rec) {
   2862     BTM_TRACE_EVENT(
   2863         "%s PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: "
   2864         "0x%08x ",
   2865         __func__, btm_pair_state_descr(btm_cb.pairing_state), p_bd_name, status,
   2866         p_dev_rec->sec_state, p_dev_rec);
   2867   } else {
   2868     BTM_TRACE_EVENT("%s PairState: %s  RemName: %s  status: %d", __func__,
   2869                     btm_pair_state_descr(btm_cb.pairing_state), p_bd_name,
   2870                     status);
   2871   }
   2872 
   2873   if (p_dev_rec) {
   2874     old_sec_state = p_dev_rec->sec_state;
   2875     if (status == HCI_SUCCESS) {
   2876       strlcpy((char*)p_dev_rec->sec_bd_name, (char*)p_bd_name,
   2877               BTM_MAX_REM_BD_NAME_LEN);
   2878       p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
   2879       BTM_TRACE_EVENT("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x",
   2880                       p_dev_rec->sec_flags);
   2881     } else {
   2882       /* Notify all clients waiting for name to be resolved even if it failed so
   2883        * clients can continue */
   2884       p_dev_rec->sec_bd_name[0] = 0;
   2885     }
   2886 
   2887     if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)
   2888       p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   2889 
   2890     /* Notify all clients waiting for name to be resolved */
   2891     for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) {
   2892       if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
   2893         (*btm_cb.p_rmt_name_callback[i])(*p_bd_addr, p_dev_rec->dev_class,
   2894                                          p_dev_rec->sec_bd_name);
   2895     }
   2896   } else {
   2897     dev_class[0] = 0;
   2898     dev_class[1] = 0;
   2899     dev_class[2] = 0;
   2900 
   2901     /* Notify all clients waiting for name to be resolved even if not found so
   2902      * clients can continue */
   2903     for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) {
   2904       if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
   2905         (*btm_cb.p_rmt_name_callback[i])(*p_bd_addr, dev_class, (uint8_t*)"");
   2906     }
   2907 
   2908     return;
   2909   }
   2910 
   2911   /* If we were delaying asking UI for a PIN because name was not resolved, ask
   2912    * now */
   2913   if ((btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr &&
   2914       (btm_cb.pairing_bda == *p_bd_addr)) {
   2915     BTM_TRACE_EVENT(
   2916         "%s() delayed pin now being requested flags:0x%x, "
   2917         "(p_pin_callback=0x%p)",
   2918         __func__, btm_cb.pairing_flags, btm_cb.api.p_pin_callback);
   2919 
   2920     if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0 &&
   2921         btm_cb.api.p_pin_callback) {
   2922       BTM_TRACE_EVENT("%s() calling pin_callback", __func__);
   2923       btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
   2924       (*btm_cb.api.p_pin_callback)(
   2925           p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name,
   2926           (p_dev_rec->p_cur_service == NULL)
   2927               ? false
   2928               : (p_dev_rec->p_cur_service->security_flags &
   2929                  BTM_SEC_IN_MIN_16_DIGIT_PIN));
   2930     }
   2931 
   2932     /* Set the same state again to force the timer to be restarted */
   2933     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN);
   2934     return;
   2935   }
   2936 
   2937   /* Check if we were delaying bonding because name was not resolved */
   2938   if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) {
   2939     if (p_bd_addr && btm_cb.pairing_bda == *p_bd_addr) {
   2940       BTM_TRACE_EVENT("%s() continue bonding sm4: 0x%04x, status:0x%x",
   2941                       __func__, p_dev_rec->sm4, status);
   2942       if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) {
   2943         btm_sec_bond_cancel_complete();
   2944         return;
   2945       }
   2946 
   2947       if (status != HCI_SUCCESS) {
   2948         btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   2949 
   2950         if (btm_cb.api.p_auth_complete_callback)
   2951           (*btm_cb.api.p_auth_complete_callback)(
   2952               p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   2953               status);
   2954         return;
   2955       }
   2956 
   2957       /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is
   2958        * not reported */
   2959       if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) {
   2960         /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not
   2961          * set.*/
   2962         /* If it is set, there may be a race condition */
   2963         BTM_TRACE_DEBUG("%s IS_SM4_UNKNOWN Flags:0x%04x", __func__,
   2964                         btm_cb.pairing_flags);
   2965         if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
   2966           p_dev_rec->sm4 |= BTM_SM4_KNOWN;
   2967       }
   2968 
   2969       BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",
   2970                       __func__, p_dev_rec->sm4,
   2971                       BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
   2972                       BTM_SEC_IS_SM4(p_dev_rec->sm4),
   2973                       BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
   2974 
   2975       /* BT 2.1 or carkit, bring up the connection to force the peer to request
   2976        *PIN.
   2977        ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if
   2978        *needed)
   2979        */
   2980       if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) ||
   2981           !btm_sec_check_prefetch_pin(p_dev_rec)) {
   2982         /* if we rejected incoming connection request, we have to wait
   2983          * HCI_Connection_Complete event */
   2984         /*  before originating  */
   2985         if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) {
   2986           BTM_TRACE_WARNING(
   2987               "%s: waiting HCI_Connection_Complete after rejecting connection",
   2988               __func__);
   2989         }
   2990         /* Both we and the peer are 2.1 - continue to create connection */
   2991         else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) {
   2992           BTM_TRACE_WARNING("%s: failed to start connection", __func__);
   2993 
   2994           btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   2995 
   2996           if (btm_cb.api.p_auth_complete_callback) {
   2997             (*btm_cb.api.p_auth_complete_callback)(
   2998                 p_dev_rec->bd_addr, p_dev_rec->dev_class,
   2999                 p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
   3000           }
   3001         }
   3002       }
   3003       return;
   3004     } else {
   3005       BTM_TRACE_WARNING("%s: wrong BDA, retry with pairing BDA", __func__);
   3006       if (BTM_ReadRemoteDeviceName(btm_cb.pairing_bda, NULL,
   3007                                    BT_TRANSPORT_BR_EDR) != BTM_CMD_STARTED) {
   3008         BTM_TRACE_ERROR("%s: failed to start remote name request", __func__);
   3009         if (btm_cb.api.p_auth_complete_callback) {
   3010           (*btm_cb.api.p_auth_complete_callback)(
   3011               p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   3012               HCI_ERR_MEMORY_FULL);
   3013         }
   3014       };
   3015       return;
   3016     }
   3017   }
   3018 
   3019   /* check if we were delaying link_key_callback because name was not resolved
   3020    */
   3021   if (p_dev_rec->link_key_not_sent) {
   3022     /* If HCI connection complete has not arrived, wait for it */
   3023     if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) return;
   3024 
   3025     p_dev_rec->link_key_not_sent = false;
   3026     btm_send_link_key_notif(p_dev_rec);
   3027 
   3028     /* If its not us who perform authentication, we should tell stackserver */
   3029     /* that some authentication has been completed                          */
   3030     /* This is required when different entities receive link notification and
   3031      * auth complete */
   3032     if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) {
   3033       if (btm_cb.api.p_auth_complete_callback)
   3034         (*btm_cb.api.p_auth_complete_callback)(
   3035             p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   3036             HCI_SUCCESS);
   3037     }
   3038   }
   3039 
   3040   /* If this is a bonding procedure can disconnect the link now */
   3041   if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
   3042       (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) {
   3043     BTM_TRACE_WARNING("btm_sec_rmt_name_request_complete (none/ce)");
   3044     p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
   3045     l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
   3046     return;
   3047   }
   3048 
   3049   if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) return;
   3050 
   3051   /* If get name failed, notify the waiting layer */
   3052   if (status != HCI_SUCCESS) {
   3053     btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false);
   3054     return;
   3055   }
   3056 
   3057   if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) {
   3058     BTM_TRACE_EVENT("waiting for remote features!!");
   3059     return;
   3060   }
   3061 
   3062   /* Remote Name succeeded, execute the next security procedure, if any */
   3063   status = (uint8_t)btm_sec_execute_procedure(p_dev_rec);
   3064 
   3065   /* If result is pending reply from the user or from the device is pending */
   3066   if (status == BTM_CMD_STARTED) return;
   3067 
   3068   /* There is no next procedure or start of procedure failed, notify the waiting
   3069    * layer */
   3070   btm_sec_dev_rec_cback_event(p_dev_rec, status, false);
   3071 }
   3072 
   3073 /*******************************************************************************
   3074  *
   3075  * Function         btm_sec_rmt_host_support_feat_evt
   3076  *
   3077  * Description      This function is called when the
   3078  *                  HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received
   3079  *
   3080  * Returns          void
   3081  *
   3082  ******************************************************************************/
   3083 void btm_sec_rmt_host_support_feat_evt(uint8_t* p) {
   3084   tBTM_SEC_DEV_REC* p_dev_rec;
   3085   RawAddress bd_addr; /* peer address */
   3086   BD_FEATURES features;
   3087 
   3088   STREAM_TO_BDADDR(bd_addr, p);
   3089   p_dev_rec = btm_find_or_alloc_dev(bd_addr);
   3090 
   3091   BTM_TRACE_EVENT("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x",
   3092                   p_dev_rec->sm4, p[0]);
   3093 
   3094   if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) {
   3095     p_dev_rec->sm4 = BTM_SM4_KNOWN;
   3096     STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE);
   3097     if (HCI_SSP_HOST_SUPPORTED(features)) {
   3098       p_dev_rec->sm4 = BTM_SM4_TRUE;
   3099     }
   3100     BTM_TRACE_EVENT(
   3101         "btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x",
   3102         p_dev_rec->sm4, features[0]);
   3103   }
   3104 }
   3105 
   3106 /*******************************************************************************
   3107  *
   3108  * Function         btm_io_capabilities_req
   3109  *
   3110  * Description      This function is called when LM request for the IO
   3111  *                  capability of the local device and
   3112  *                  if the OOB data is present for the device in the event
   3113  *
   3114  * Returns          void
   3115  *
   3116  ******************************************************************************/
   3117 void btm_io_capabilities_req(const RawAddress& p) {
   3118   tBTM_SP_IO_REQ evt_data;
   3119   uint8_t err_code = 0;
   3120   tBTM_SEC_DEV_REC* p_dev_rec;
   3121   bool is_orig = true;
   3122   uint8_t callback_rc = BTM_SUCCESS;
   3123 
   3124   evt_data.bd_addr = p;
   3125 
   3126   /* setup the default response according to compile options */
   3127   /* assume that the local IO capability does not change
   3128    * loc_io_caps is initialized with the default value */
   3129   evt_data.io_cap = btm_cb.devcb.loc_io_caps;
   3130   evt_data.oob_data = BTM_OOB_NONE;
   3131   evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
   3132 
   3133   BTM_TRACE_EVENT("%s: State: %s", __func__,
   3134                   btm_pair_state_descr(btm_cb.pairing_state));
   3135 
   3136   p_dev_rec = btm_find_or_alloc_dev(evt_data.bd_addr);
   3137 
   3138   BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d",
   3139                   __func__, btm_cb.security_mode, p_dev_rec->num_read_pages);
   3140 
   3141   if ((btm_cb.security_mode == BTM_SEC_MODE_SC) &&
   3142       (p_dev_rec->num_read_pages == 0)) {
   3143     BTM_TRACE_EVENT("%s: Device security mode is SC only.",
   3144                     "To continue need to know remote features.", __func__);
   3145 
   3146     p_dev_rec->remote_features_needed = true;
   3147     return;
   3148   }
   3149 
   3150   p_dev_rec->sm4 |= BTM_SM4_TRUE;
   3151 
   3152   BTM_TRACE_EVENT("%s: State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
   3153                   __func__, btm_pair_state_descr(btm_cb.pairing_state),
   3154                   btm_cb.pairing_flags, p_dev_rec->p_cur_service);
   3155 
   3156   if (p_dev_rec->p_cur_service) {
   3157     BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x",
   3158                     __func__, p_dev_rec->p_cur_service->psm,
   3159                     p_dev_rec->p_cur_service->security_flags);
   3160   }
   3161 
   3162   switch (btm_cb.pairing_state) {
   3163     /* initiator connecting */
   3164     case BTM_PAIR_STATE_IDLE:
   3165       // TODO: Handle Idle pairing state
   3166       // security_required = p_dev_rec->security_required;
   3167       break;
   3168 
   3169     /* received IO capability response already->acceptor */
   3170     case BTM_PAIR_STATE_INCOMING_SSP:
   3171       is_orig = false;
   3172 
   3173       if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) {
   3174         /* acceptor in dedicated bonding */
   3175         evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
   3176       }
   3177       break;
   3178 
   3179     /* initiator, at this point it is expected to be dedicated bonding
   3180     initiated by local device */
   3181     case BTM_PAIR_STATE_WAIT_PIN_REQ:
   3182       if (evt_data.bd_addr == btm_cb.pairing_bda) {
   3183         evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
   3184       } else {
   3185         err_code = HCI_ERR_HOST_BUSY_PAIRING;
   3186       }
   3187       break;
   3188 
   3189     /* any other state is unexpected */
   3190     default:
   3191       err_code = HCI_ERR_HOST_BUSY_PAIRING;
   3192       BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __func__,
   3193                       btm_cb.pairing_state);
   3194       break;
   3195   }
   3196 
   3197   if (btm_cb.pairing_disabled) {
   3198     /* pairing is not allowed */
   3199     BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __func__);
   3200     err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
   3201   } else if (btm_cb.security_mode == BTM_SEC_MODE_SC) {
   3202     bool local_supports_sc =
   3203         controller_get_interface()->supports_secure_connections();
   3204     /* device in Secure Connections Only mode */
   3205     if (!(local_supports_sc) ||
   3206         !(p_dev_rec->remote_supports_secure_connections)) {
   3207       BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,",
   3208                       " remote_support_for_sc 0x%02x -> fail pairing", __func__,
   3209                       local_supports_sc,
   3210                       p_dev_rec->remote_supports_secure_connections);
   3211 
   3212       err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
   3213     }
   3214   }
   3215 
   3216   if (err_code != 0) {
   3217     btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code);
   3218     return;
   3219   }
   3220 
   3221   evt_data.is_orig = is_orig;
   3222 
   3223   if (is_orig) {
   3224     /* local device initiated the pairing non-bonding -> use p_cur_service */
   3225     if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
   3226         p_dev_rec->p_cur_service &&
   3227         (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) {
   3228       if (btm_cb.security_mode == BTM_SEC_MODE_SC) {
   3229         /* SC only mode device requires MITM protection */
   3230         evt_data.auth_req = BTM_AUTH_SP_YES;
   3231       } else {
   3232         evt_data.auth_req =
   3233             (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_MITM)
   3234                 ? BTM_AUTH_SP_YES
   3235                 : BTM_AUTH_SP_NO;
   3236       }
   3237     }
   3238   }
   3239 
   3240   /* Notify L2CAP to increase timeout */
   3241   l2c_pin_code_request(evt_data.bd_addr);
   3242 
   3243   btm_cb.pairing_bda = evt_data.bd_addr;
   3244 
   3245   if (evt_data.bd_addr == btm_cb.connecting_bda)
   3246     memcpy(p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
   3247 
   3248   btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS);
   3249 
   3250   callback_rc = BTM_SUCCESS;
   3251   if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) {
   3252     p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE;
   3253 
   3254     /* link key upgrade: always use SPGB_YES - assuming we want to save the link
   3255      * key */
   3256     evt_data.auth_req = BTM_AUTH_SPGB_YES;
   3257   } else if (btm_cb.api.p_sp_callback) {
   3258     /* the callback function implementation may change the IO capability... */
   3259     callback_rc = (*btm_cb.api.p_sp_callback)(BTM_SP_IO_REQ_EVT,
   3260                                               (tBTM_SP_EVT_DATA*)&evt_data);
   3261   }
   3262 
   3263   if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data)) {
   3264     if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) {
   3265       evt_data.auth_req =
   3266           (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT));
   3267     }
   3268 
   3269     if (btm_cb.security_mode == BTM_SEC_MODE_SC) {
   3270       /* At this moment we know that both sides are SC capable, device in */
   3271       /* SC only mode requires MITM for any service so let's set MITM bit */
   3272       evt_data.auth_req |= BTM_AUTH_YN_BIT;
   3273       BTM_TRACE_DEBUG(
   3274           "%s: for device in \"SC only\" mode set auth_req to 0x%02x", __func__,
   3275           evt_data.auth_req);
   3276     }
   3277 
   3278     /* if the user does not indicate "reply later" by setting the oob_data to
   3279      * unknown */
   3280     /* send the response right now. Save the current IO capability in the
   3281      * control block */
   3282     btm_cb.devcb.loc_auth_req = evt_data.auth_req;
   3283     btm_cb.devcb.loc_io_caps = evt_data.io_cap;
   3284 
   3285     BTM_TRACE_EVENT("%s: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
   3286                     __func__, btm_pair_state_descr(btm_cb.pairing_state),
   3287                     evt_data.io_cap, evt_data.oob_data, evt_data.auth_req);
   3288 
   3289     btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap,
   3290                                 evt_data.oob_data, evt_data.auth_req);
   3291   }
   3292 }
   3293 
   3294 /*******************************************************************************
   3295  *
   3296  * Function         btm_io_capabilities_rsp
   3297  *
   3298  * Description      This function is called when the IO capability of the
   3299  *                  specified device is received
   3300  *
   3301  * Returns          void
   3302  *
   3303  ******************************************************************************/
   3304 void btm_io_capabilities_rsp(uint8_t* p) {
   3305   tBTM_SEC_DEV_REC* p_dev_rec;
   3306   tBTM_SP_IO_RSP evt_data;
   3307 
   3308   STREAM_TO_BDADDR(evt_data.bd_addr, p);
   3309   STREAM_TO_UINT8(evt_data.io_cap, p);
   3310   STREAM_TO_UINT8(evt_data.oob_data, p);
   3311   STREAM_TO_UINT8(evt_data.auth_req, p);
   3312 
   3313   /* Allocate a new device record or reuse the oldest one */
   3314   p_dev_rec = btm_find_or_alloc_dev(evt_data.bd_addr);
   3315 
   3316   /* If no security is in progress, this indicates incoming security */
   3317   if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) {
   3318     btm_cb.pairing_bda = evt_data.bd_addr;
   3319 
   3320     btm_sec_change_pairing_state(BTM_PAIR_STATE_INCOMING_SSP);
   3321 
   3322     /* Make sure we reset the trusted mask to help against attacks */
   3323     BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
   3324 
   3325     /* work around for FW bug */
   3326     btm_inq_stop_on_ssp();
   3327   }
   3328 
   3329   /* Notify L2CAP to increase timeout */
   3330   l2c_pin_code_request(evt_data.bd_addr);
   3331 
   3332   /* We must have a device record here.
   3333    * Use the connecting device's CoD for the connection */
   3334   if (evt_data.bd_addr == btm_cb.connecting_bda)
   3335     memcpy(p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
   3336 
   3337   /* peer sets dedicated bonding bit and we did not initiate dedicated bonding
   3338    */
   3339   if (btm_cb.pairing_state ==
   3340           BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */
   3341       && (evt_data.auth_req &
   3342           BTM_AUTH_DD_BOND)) /* and dedicated bonding bit is set */
   3343   {
   3344     btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD;
   3345   }
   3346 
   3347   /* save the IO capability in the device record */
   3348   p_dev_rec->rmt_io_caps = evt_data.io_cap;
   3349   p_dev_rec->rmt_auth_req = evt_data.auth_req;
   3350 
   3351   if (btm_cb.api.p_sp_callback)
   3352     (*btm_cb.api.p_sp_callback)(BTM_SP_IO_RSP_EVT,
   3353                                 (tBTM_SP_EVT_DATA*)&evt_data);
   3354 }
   3355 
   3356 /*******************************************************************************
   3357  *
   3358  * Function         btm_proc_sp_req_evt
   3359  *
   3360  * Description      This function is called to process/report
   3361  *                  HCI_USER_CONFIRMATION_REQUEST_EVT
   3362  *                  or HCI_USER_PASSKEY_REQUEST_EVT
   3363  *                  or HCI_USER_PASSKEY_NOTIFY_EVT
   3364  *
   3365  * Returns          void
   3366  *
   3367  ******************************************************************************/
   3368 void btm_proc_sp_req_evt(tBTM_SP_EVT event, uint8_t* p) {
   3369   tBTM_STATUS status = BTM_ERR_PROCESSING;
   3370   tBTM_SP_EVT_DATA evt_data;
   3371   RawAddress& p_bda = evt_data.cfm_req.bd_addr;
   3372   tBTM_SEC_DEV_REC* p_dev_rec;
   3373 
   3374   /* All events start with bd_addr */
   3375   STREAM_TO_BDADDR(p_bda, p);
   3376 
   3377   VLOG(2) << " BDA: " << p_bda << " event: 0x" << std::hex << +event
   3378           << " State: " << btm_pair_state_descr(btm_cb.pairing_state);
   3379 
   3380   p_dev_rec = btm_find_dev(p_bda);
   3381   if ((p_dev_rec != NULL) && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   3382       (btm_cb.pairing_bda == p_bda)) {
   3383     evt_data.cfm_req.bd_addr = p_dev_rec->bd_addr;
   3384     memcpy(evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
   3385 
   3386     strlcpy((char*)evt_data.cfm_req.bd_name, (char*)p_dev_rec->sec_bd_name,
   3387             BTM_MAX_REM_BD_NAME_LEN);
   3388 
   3389     switch (event) {
   3390       case BTM_SP_CFM_REQ_EVT:
   3391         /* Numeric confirmation. Need user to conf the passkey */
   3392         btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM);
   3393 
   3394         /* The device record must be allocated in the "IO cap exchange" step */
   3395         STREAM_TO_UINT32(evt_data.cfm_req.num_val, p);
   3396         BTM_TRACE_DEBUG("BTM_SP_CFM_REQ_EVT:  num_val: %u",
   3397                         evt_data.cfm_req.num_val);
   3398 
   3399         evt_data.cfm_req.just_works = true;
   3400 
   3401 /* process user confirm req in association with the auth_req param */
   3402 #if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO)
   3403         if (p_dev_rec->rmt_io_caps == BTM_IO_CAP_UNKNOWN) {
   3404           BTM_TRACE_ERROR(
   3405               "%s did not receive IO cap response prior"
   3406               " to BTM_SP_CFM_REQ_EVT, failing pairing request",
   3407               __func__);
   3408           status = BTM_WRONG_MODE;
   3409           BTM_ConfirmReqReply(status, p_bda);
   3410           return;
   3411         }
   3412         if ((p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) &&
   3413             (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) &&
   3414             ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) ||
   3415              (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES))) {
   3416           /* Both devices are DisplayYesNo and one or both devices want to
   3417              authenticate -> use authenticated link key */
   3418           evt_data.cfm_req.just_works = false;
   3419         }
   3420 #endif
   3421         BTM_TRACE_DEBUG(
   3422             "btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth "
   3423             "loc:%d, rmt:%d",
   3424             evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps,
   3425             p_dev_rec->rmt_io_caps, btm_cb.devcb.loc_auth_req,
   3426             p_dev_rec->rmt_auth_req);
   3427 
   3428         evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req;
   3429         evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req;
   3430         evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps;
   3431         evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps;
   3432         break;
   3433 
   3434       case BTM_SP_KEY_NOTIF_EVT:
   3435         /* Passkey notification (other side is a keyboard) */
   3436         STREAM_TO_UINT32(evt_data.key_notif.passkey, p);
   3437         BTM_TRACE_DEBUG("BTM_SP_KEY_NOTIF_EVT:  passkey: %u",
   3438                         evt_data.key_notif.passkey);
   3439 
   3440         btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
   3441         break;
   3442 
   3443 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   3444       case BTM_SP_KEY_REQ_EVT:
   3445         /* HCI_USER_PASSKEY_REQUEST_EVT */
   3446         btm_sec_change_pairing_state(BTM_PAIR_STATE_KEY_ENTRY);
   3447         break;
   3448 #endif
   3449     }
   3450 
   3451     if (btm_cb.api.p_sp_callback) {
   3452       status = (*btm_cb.api.p_sp_callback)(event, &evt_data);
   3453       if (status != BTM_NOT_AUTHORIZED) {
   3454         return;
   3455       }
   3456       /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req
   3457        * right now */
   3458     } else if ((event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works)) {
   3459       /* automatically reply with just works if no sp_cback */
   3460       status = BTM_SUCCESS;
   3461     }
   3462 
   3463     if (event == BTM_SP_CFM_REQ_EVT) {
   3464       BTM_TRACE_DEBUG("calling BTM_ConfirmReqReply with status: %d", status);
   3465       BTM_ConfirmReqReply(status, p_bda);
   3466     }
   3467 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   3468     else if (event == BTM_SP_KEY_REQ_EVT) {
   3469       BTM_PasskeyReqReply(status, p_bda, 0);
   3470     }
   3471 #endif
   3472     return;
   3473   }
   3474 
   3475   /* Something bad. we can only fail this connection */
   3476   btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
   3477 
   3478   if (BTM_SP_CFM_REQ_EVT == event) {
   3479     btsnd_hcic_user_conf_reply(p_bda, false);
   3480   } else if (BTM_SP_KEY_NOTIF_EVT == event) {
   3481     /* do nothing -> it very unlikely to happen.
   3482     This event is most likely to be received by a HID host when it first
   3483     connects to a HID device.
   3484     Usually the Host initiated the connection in this case.
   3485     On Mobile platforms, if there's a security process happening,
   3486     the host probably can not initiate another connection.
   3487     BTW (PC) is another story.  */
   3488     p_dev_rec = btm_find_dev(p_bda);
   3489     if (p_dev_rec != NULL) {
   3490       btm_sec_disconnect(p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE);
   3491     }
   3492   }
   3493 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   3494   else {
   3495     btsnd_hcic_user_passkey_neg_reply(p_bda);
   3496   }
   3497 #endif
   3498 }
   3499 
   3500 /*******************************************************************************
   3501  *
   3502  * Function         btm_keypress_notif_evt
   3503  *
   3504  * Description      This function is called when a key press notification is
   3505  *                  received
   3506  *
   3507  * Returns          void
   3508  *
   3509  ******************************************************************************/
   3510 void btm_keypress_notif_evt(uint8_t* p) {
   3511   tBTM_SP_KEYPRESS evt_data;
   3512 
   3513   /* parse & report BTM_SP_KEYPRESS_EVT */
   3514   if (btm_cb.api.p_sp_callback) {
   3515     RawAddress& p_bda = evt_data.bd_addr;
   3516 
   3517     STREAM_TO_BDADDR(p_bda, p);
   3518     evt_data.notif_type = *p;
   3519 
   3520     (*btm_cb.api.p_sp_callback)(BTM_SP_KEYPRESS_EVT,
   3521                                 (tBTM_SP_EVT_DATA*)&evt_data);
   3522   }
   3523 }
   3524 
   3525 /*******************************************************************************
   3526  *
   3527  * Function         btm_simple_pair_complete
   3528  *
   3529  * Description      This function is called when simple pairing process is
   3530  *                  complete
   3531  *
   3532  * Returns          void
   3533  *
   3534  ******************************************************************************/
   3535 void btm_simple_pair_complete(uint8_t* p) {
   3536   tBTM_SP_COMPLT evt_data;
   3537   tBTM_SEC_DEV_REC* p_dev_rec;
   3538   uint8_t status;
   3539   bool disc = false;
   3540 
   3541   status = *p++;
   3542   STREAM_TO_BDADDR(evt_data.bd_addr, p);
   3543 
   3544   p_dev_rec = btm_find_dev(evt_data.bd_addr);
   3545   if (p_dev_rec == NULL) {
   3546     LOG(ERROR) << __func__ << " with unknown BDA: " << evt_data.bd_addr;
   3547     return;
   3548   }
   3549 
   3550   BTM_TRACE_EVENT(
   3551       "btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
   3552       btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state);
   3553 
   3554   evt_data.status = BTM_ERR_PROCESSING;
   3555   if (status == HCI_SUCCESS) {
   3556     evt_data.status = BTM_SUCCESS;
   3557     p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
   3558   } else {
   3559     if (status == HCI_ERR_PAIRING_NOT_ALLOWED) {
   3560       /* The test spec wants the peer device to get this failure code. */
   3561       btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_DISCONNECT);
   3562 
   3563       /* Change the timer to 1 second */
   3564       alarm_set_on_mloop(btm_cb.pairing_timer, BT_1SEC_TIMEOUT_MS,
   3565                          btm_sec_pairing_timeout, NULL);
   3566     } else if (btm_cb.pairing_bda == evt_data.bd_addr) {
   3567       /* stop the timer */
   3568       alarm_cancel(btm_cb.pairing_timer);
   3569 
   3570       if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) {
   3571         /* the initiating side: will receive auth complete event. disconnect ACL
   3572          * at that time */
   3573         disc = true;
   3574       }
   3575     } else
   3576       disc = true;
   3577   }
   3578 
   3579   /* Let the pairing state stay active, p_auth_complete_callback will report the
   3580    * failure */
   3581   evt_data.bd_addr = p_dev_rec->bd_addr;
   3582   memcpy(evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
   3583 
   3584   if (btm_cb.api.p_sp_callback)
   3585     (*btm_cb.api.p_sp_callback)(BTM_SP_COMPLT_EVT,
   3586                                 (tBTM_SP_EVT_DATA*)&evt_data);
   3587 
   3588   if (disc) {
   3589     /* simple pairing failed */
   3590     /* Avoid sending disconnect on HCI_ERR_PEER_USER */
   3591     if ((status != HCI_ERR_PEER_USER) &&
   3592         (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) {
   3593       btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE,
   3594                                   p_dev_rec->hci_handle);
   3595     }
   3596   }
   3597 }
   3598 
   3599 /*******************************************************************************
   3600  *
   3601  * Function         btm_rem_oob_req
   3602  *
   3603  * Description      This function is called to process/report
   3604  *                  HCI_REMOTE_OOB_DATA_REQUEST_EVT
   3605  *
   3606  * Returns          void
   3607  *
   3608  ******************************************************************************/
   3609 void btm_rem_oob_req(uint8_t* p) {
   3610   tBTM_SP_RMT_OOB evt_data;
   3611   tBTM_SEC_DEV_REC* p_dev_rec;
   3612   BT_OCTET16 c;
   3613   BT_OCTET16 r;
   3614 
   3615   RawAddress& p_bda = evt_data.bd_addr;
   3616 
   3617   STREAM_TO_BDADDR(p_bda, p);
   3618 
   3619   VLOG(2) << __func__ << " BDA: " << p_bda;
   3620   p_dev_rec = btm_find_dev(p_bda);
   3621   if ((p_dev_rec != NULL) && btm_cb.api.p_sp_callback) {
   3622     evt_data.bd_addr = p_dev_rec->bd_addr;
   3623     memcpy(evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
   3624     strlcpy((char*)evt_data.bd_name, (char*)p_dev_rec->sec_bd_name,
   3625             BTM_MAX_REM_BD_NAME_LEN);
   3626 
   3627     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP);
   3628     if ((*btm_cb.api.p_sp_callback)(BTM_SP_RMT_OOB_EVT,
   3629                                     (tBTM_SP_EVT_DATA*)&evt_data) ==
   3630         BTM_NOT_AUTHORIZED) {
   3631       BTM_RemoteOobDataReply(true, p_bda, c, r);
   3632     }
   3633     return;
   3634   }
   3635 
   3636   /* something bad. we can only fail this connection */
   3637   btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
   3638   btsnd_hcic_rem_oob_neg_reply(p_bda);
   3639 }
   3640 
   3641 /*******************************************************************************
   3642  *
   3643  * Function         btm_read_local_oob_complete
   3644  *
   3645  * Description      This function is called when read local oob data is
   3646  *                  completed by the LM
   3647  *
   3648  * Returns          void
   3649  *
   3650  ******************************************************************************/
   3651 void btm_read_local_oob_complete(uint8_t* p) {
   3652   tBTM_SP_LOC_OOB evt_data;
   3653   uint8_t status = *p++;
   3654 
   3655   BTM_TRACE_EVENT("btm_read_local_oob_complete:%d", status);
   3656   if (status == HCI_SUCCESS) {
   3657     evt_data.status = BTM_SUCCESS;
   3658     STREAM_TO_ARRAY16(evt_data.c, p);
   3659     STREAM_TO_ARRAY16(evt_data.r, p);
   3660   } else
   3661     evt_data.status = BTM_ERR_PROCESSING;
   3662 
   3663   if (btm_cb.api.p_sp_callback) {
   3664     tBTM_SP_EVT_DATA btm_sp_evt_data;
   3665     btm_sp_evt_data.loc_oob = evt_data;
   3666     (*btm_cb.api.p_sp_callback)(BTM_SP_LOC_OOB_EVT, &btm_sp_evt_data);
   3667   }
   3668 }
   3669 
   3670 /*******************************************************************************
   3671  *
   3672  * Function         btm_sec_auth_collision
   3673  *
   3674  * Description      This function is called when authentication or encryption
   3675  *                  needs to be retried at a later time.
   3676  *
   3677  * Returns          void
   3678  *
   3679  ******************************************************************************/
   3680 static void btm_sec_auth_collision(uint16_t handle) {
   3681   tBTM_SEC_DEV_REC* p_dev_rec;
   3682 
   3683   if (!btm_cb.collision_start_time)
   3684     btm_cb.collision_start_time = time_get_os_boottime_ms();
   3685 
   3686   if ((time_get_os_boottime_ms() - btm_cb.collision_start_time) <
   3687       btm_cb.max_collision_delay) {
   3688     if (handle == BTM_SEC_INVALID_HANDLE) {
   3689       p_dev_rec = btm_sec_find_dev_by_sec_state(BTM_SEC_STATE_AUTHENTICATING);
   3690       if (p_dev_rec == NULL)
   3691         p_dev_rec = btm_sec_find_dev_by_sec_state(BTM_SEC_STATE_ENCRYPTING);
   3692     } else
   3693       p_dev_rec = btm_find_dev_by_handle(handle);
   3694 
   3695     if (p_dev_rec != NULL) {
   3696       BTM_TRACE_DEBUG(
   3697           "btm_sec_auth_collision: state %d (retrying in a moment...)",
   3698           p_dev_rec->sec_state);
   3699       /* We will restart authentication after timeout */
   3700       if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING ||
   3701           p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
   3702         p_dev_rec->sec_state = 0;
   3703 
   3704       btm_cb.p_collided_dev_rec = p_dev_rec;
   3705       alarm_set_on_mloop(btm_cb.sec_collision_timer, BT_1SEC_TIMEOUT_MS,
   3706                          btm_sec_collision_timeout, NULL);
   3707     }
   3708   }
   3709 }
   3710 
   3711 /******************************************************************************
   3712  *
   3713  * Function         btm_sec_auth_retry
   3714  *
   3715  * Description      This function is called when authentication or encryption
   3716  *                  needs to be retried at a later time.
   3717  *
   3718  * Returns          TRUE if a security retry required
   3719  *
   3720  *****************************************************************************/
   3721 static bool btm_sec_auth_retry(uint16_t handle, uint8_t status) {
   3722   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
   3723   if (!p_dev_rec) return false;
   3724 
   3725   /* keep the old sm4 flag and clear the retry bit in control block */
   3726   uint8_t old_sm4 = p_dev_rec->sm4;
   3727   p_dev_rec->sm4 &= ~BTM_SM4_RETRY;
   3728 
   3729   if ((btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) &&
   3730       ((old_sm4 & BTM_SM4_RETRY) == 0) && (HCI_ERR_KEY_MISSING == status) &&
   3731       BTM_SEC_IS_SM4(p_dev_rec->sm4)) {
   3732     /* This retry for missing key is for Lisbon or later only.
   3733        Legacy device do not need this. the controller will drive the retry
   3734        automatically
   3735        set the retry bit */
   3736     btm_cb.collision_start_time = 0;
   3737     btm_restore_mode();
   3738     p_dev_rec->sm4 |= BTM_SM4_RETRY;
   3739     p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
   3740     BTM_TRACE_DEBUG("%s Retry for missing key sm4:x%x sec_flags:0x%x", __func__,
   3741                     p_dev_rec->sm4, p_dev_rec->sec_flags);
   3742 
   3743     /* With BRCM controller, we do not need to delete the stored link key in
   3744        controller.
   3745        If the stack may sit on top of other controller, we may need this
   3746        BTM_DeleteStoredLinkKey (bd_addr, NULL); */
   3747     p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   3748     btm_sec_execute_procedure(p_dev_rec);
   3749     return true;
   3750   }
   3751 
   3752   return false;
   3753 }
   3754 
   3755 /*******************************************************************************
   3756  *
   3757  * Function         btm_sec_auth_complete
   3758  *
   3759  * Description      This function is when authentication of the connection is
   3760  *                  completed by the LM
   3761  *
   3762  * Returns          void
   3763  *
   3764  ******************************************************************************/
   3765 void btm_sec_auth_complete(uint16_t handle, uint8_t status) {
   3766   tBTM_PAIRING_STATE old_state = btm_cb.pairing_state;
   3767   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
   3768   bool are_bonding = false;
   3769 
   3770   if (p_dev_rec) {
   3771     VLOG(2) << __func__ << ": Security Manager: in state: "
   3772             << btm_pair_state_descr(btm_cb.pairing_state)
   3773             << " handle:" << handle << " status:" << status
   3774             << "dev->sec_state:" << p_dev_rec->sec_state
   3775             << " bda:" << p_dev_rec->bd_addr
   3776             << "RName:" << p_dev_rec->sec_bd_name;
   3777   } else {
   3778     VLOG(2) << __func__ << ": Security Manager: in state: "
   3779             << btm_pair_state_descr(btm_cb.pairing_state)
   3780             << " handle:" << handle << " status:" << status;
   3781   }
   3782 
   3783   /* For transaction collision we need to wait and repeat.  There is no need */
   3784   /* for random timeout because only slave should receive the result */
   3785   if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) ||
   3786       (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) {
   3787     btm_sec_auth_collision(handle);
   3788     return;
   3789   } else if (btm_sec_auth_retry(handle, status)) {
   3790     return;
   3791   }
   3792 
   3793   btm_cb.collision_start_time = 0;
   3794 
   3795   btm_restore_mode();
   3796 
   3797   /* Check if connection was made just to do bonding.  If we authenticate
   3798      the connection that is up, this is the last event received.
   3799   */
   3800   if (p_dev_rec && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
   3801       !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) {
   3802     p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
   3803 
   3804     l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
   3805   }
   3806 
   3807   if (!p_dev_rec) return;
   3808 
   3809   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   3810       (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
   3811       (p_dev_rec->bd_addr == btm_cb.pairing_bda))
   3812     are_bonding = true;
   3813 
   3814   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   3815       (p_dev_rec->bd_addr == btm_cb.pairing_bda))
   3816     btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   3817 
   3818   if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) {
   3819     if ((btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS) &&
   3820         (old_state != BTM_PAIR_STATE_IDLE)) {
   3821       (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr,
   3822                                              p_dev_rec->dev_class,
   3823                                              p_dev_rec->sec_bd_name, status);
   3824     }
   3825     return;
   3826   }
   3827 
   3828   /* There can be a race condition, when we are starting authentication and
   3829   ** the peer device is doing encryption.
   3830   ** If first we receive encryption change up, then initiated authentication
   3831   ** can not be performed.  According to the spec we can not do authentication
   3832   ** on the encrypted link, so device is correct.
   3833   */
   3834   if ((status == HCI_ERR_COMMAND_DISALLOWED) &&
   3835       ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) ==
   3836        (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) {
   3837     status = HCI_SUCCESS;
   3838   }
   3839   /* Currently we do not notify user if it is a keyboard which connects */
   3840   /* User probably Disabled the keyboard while it was asleap.  Let her try */
   3841   if (btm_cb.api.p_auth_complete_callback) {
   3842     /* report the suthentication status */
   3843     if ((old_state != BTM_PAIR_STATE_IDLE) || (status != HCI_SUCCESS))
   3844       (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr,
   3845                                              p_dev_rec->dev_class,
   3846                                              p_dev_rec->sec_bd_name, status);
   3847   }
   3848 
   3849   p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   3850 
   3851   /* If this is a bonding procedure can disconnect the link now */
   3852   if (are_bonding) {
   3853     p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
   3854 
   3855     if (status != HCI_SUCCESS) {
   3856       if (((status != HCI_ERR_PEER_USER) &&
   3857            (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
   3858         btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER,
   3859                                     p_dev_rec->hci_handle);
   3860     } else {
   3861       BTM_TRACE_DEBUG("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL");
   3862       if (p_dev_rec->new_encryption_key_is_p256 &&
   3863           (btm_sec_use_smp_br_chnl(p_dev_rec))
   3864           /* no LE keys are available, do deriving */
   3865           && (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) ||
   3866               /* or BR key is higher security than existing LE keys */
   3867               (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) &&
   3868                (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) {
   3869         BTM_TRACE_DEBUG(
   3870             "link encrypted afer dedic bonding can use SMP_BR_CHNL");
   3871 
   3872         if (btm_sec_is_master(p_dev_rec)) {
   3873           // Encryption is required to start SM over BR/EDR
   3874           // indicate that this is encryption after authentication
   3875           BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL,
   3876                             0);
   3877         }
   3878       }
   3879       l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
   3880     }
   3881 
   3882     return;
   3883   }
   3884 
   3885   /* If authentication failed, notify the waiting layer */
   3886   if (status != HCI_SUCCESS) {
   3887     btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false);
   3888 
   3889     if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) {
   3890       btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE,
   3891                                   p_dev_rec->hci_handle);
   3892     }
   3893     return;
   3894   }
   3895 
   3896   p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
   3897 
   3898   if (p_dev_rec->pin_code_length >= 16 ||
   3899       p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
   3900       p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
   3901     // If we have MITM protection we have a higher level of security than
   3902     // provided by 16 digits PIN
   3903     p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
   3904   }
   3905 
   3906   /* Authentication succeeded, execute the next security procedure, if any */
   3907   status = btm_sec_execute_procedure(p_dev_rec);
   3908 
   3909   /* If there is no next procedure, or procedure failed to start, notify the
   3910    * caller */
   3911   if (status != BTM_CMD_STARTED)
   3912     btm_sec_dev_rec_cback_event(p_dev_rec, status, false);
   3913 }
   3914 
   3915 /*******************************************************************************
   3916  *
   3917  * Function         btm_sec_encrypt_change
   3918  *
   3919  * Description      This function is when encryption of the connection is
   3920  *                  completed by the LM
   3921  *
   3922  * Returns          void
   3923  *
   3924  ******************************************************************************/
   3925 void btm_sec_encrypt_change(uint16_t handle, uint8_t status,
   3926                             uint8_t encr_enable) {
   3927   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
   3928   tACL_CONN* p_acl = NULL;
   3929   uint8_t acl_idx = btm_handle_to_acl_index(handle);
   3930   BTM_TRACE_EVENT(
   3931       "Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
   3932       status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
   3933   BTM_TRACE_DEBUG("before update p_dev_rec->sec_flags=0x%x",
   3934                   (p_dev_rec) ? p_dev_rec->sec_flags : 0);
   3935 
   3936   /* For transaction collision we need to wait and repeat.  There is no need */
   3937   /* for random timeout because only slave should receive the result */
   3938   if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) ||
   3939       (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) {
   3940     btm_sec_auth_collision(handle);
   3941     return;
   3942   }
   3943   btm_cb.collision_start_time = 0;
   3944 
   3945   if (!p_dev_rec) return;
   3946 
   3947   if ((status == HCI_SUCCESS) && encr_enable) {
   3948     if (p_dev_rec->hci_handle == handle) {
   3949       p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
   3950       if (p_dev_rec->pin_code_length >= 16 ||
   3951           p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
   3952           p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
   3953         p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
   3954       }
   3955     } else {
   3956       p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
   3957     }
   3958   }
   3959 
   3960   /* It is possible that we decrypted the link to perform role switch */
   3961   /* mark link not to be encrypted, so that when we execute security next time
   3962    * it will kick in again */
   3963   if ((status == HCI_SUCCESS) && !encr_enable) {
   3964     if (p_dev_rec->hci_handle == handle)
   3965       p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
   3966     else
   3967       p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
   3968   }
   3969 
   3970   BTM_TRACE_DEBUG("after update p_dev_rec->sec_flags=0x%x",
   3971                   p_dev_rec->sec_flags);
   3972 
   3973   if (acl_idx != MAX_L2CAP_LINKS) p_acl = &btm_cb.acl_db[acl_idx];
   3974 
   3975   if (p_acl != NULL)
   3976     btm_sec_check_pending_enc_req(p_dev_rec, p_acl->transport, encr_enable);
   3977 
   3978   if (p_acl && p_acl->transport == BT_TRANSPORT_LE) {
   3979     if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE ||
   3980         status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) {
   3981       p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_KNOWN);
   3982       p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
   3983     }
   3984     btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable);
   3985     return;
   3986   } else {
   3987     /* BR/EDR connection, update the encryption key size to be 16 as always */
   3988     p_dev_rec->enc_key_size = 16;
   3989   }
   3990 
   3991   BTM_TRACE_DEBUG("in %s new_encr_key_256 is %d", __func__,
   3992                   p_dev_rec->new_encryption_key_is_p256);
   3993 
   3994   if ((status == HCI_SUCCESS) && encr_enable &&
   3995       (p_dev_rec->hci_handle == handle)) {
   3996     /* if BR key is temporary no need for LE LTK derivation */
   3997     bool derive_ltk = true;
   3998     if (p_dev_rec->rmt_auth_req == BTM_AUTH_SP_NO &&
   3999         btm_cb.devcb.loc_auth_req == BTM_AUTH_SP_NO) {
   4000       derive_ltk = false;
   4001       BTM_TRACE_DEBUG("%s: BR key is temporary, skip derivation of LE LTK",
   4002                       __func__);
   4003     }
   4004     if (p_dev_rec->new_encryption_key_is_p256) {
   4005       if (btm_sec_use_smp_br_chnl(p_dev_rec) && btm_sec_is_master(p_dev_rec) &&
   4006           /* if LE key is not known, do deriving */
   4007           (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) ||
   4008            /* or BR key is higher security than existing LE keys */
   4009            (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) &&
   4010             (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))) &&
   4011           derive_ltk) {
   4012         /* BR/EDR is encrypted with LK that can be used to derive LE LTK */
   4013         p_dev_rec->new_encryption_key_is_p256 = false;
   4014 
   4015         if (p_dev_rec->no_smp_on_br) {
   4016           BTM_TRACE_DEBUG("%s NO SM over BR/EDR", __func__);
   4017         } else {
   4018           BTM_TRACE_DEBUG("%s start SM over BR/EDR", __func__);
   4019           SMP_BR_PairWith(p_dev_rec->bd_addr);
   4020         }
   4021       }
   4022     } else {
   4023       // BR/EDR is successfully encrypted. Correct LK type if needed
   4024       // (BR/EDR LK derived from LE LTK was used for encryption)
   4025       if ((encr_enable == 1) && /* encryption is ON for SSP */
   4026           /* LK type is for BR/EDR SC */
   4027           (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 ||
   4028            p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   4029         if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)
   4030           p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB;
   4031         else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */
   4032           p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB;
   4033 
   4034         BTM_TRACE_DEBUG("updated link key type to %d",
   4035                         p_dev_rec->link_key_type);
   4036         btm_send_link_key_notif(p_dev_rec);
   4037       }
   4038     }
   4039   }
   4040 
   4041   /* If this encryption was started by peer do not need to do anything */
   4042   if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) {
   4043     if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) {
   4044       p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   4045       BTM_TRACE_DEBUG("%s: clearing callback. p_dev_rec=%p, p_callback=%p",
   4046                       __func__, p_dev_rec, p_dev_rec->p_callback);
   4047       p_dev_rec->p_callback = NULL;
   4048       l2cu_resubmit_pending_sec_req(&p_dev_rec->bd_addr);
   4049     }
   4050     return;
   4051   }
   4052 
   4053   p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   4054   /* If encryption setup failed, notify the waiting layer */
   4055   if (status != HCI_SUCCESS) {
   4056     btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false);
   4057     return;
   4058   }
   4059 
   4060   /* Encryption setup succeeded, execute the next security procedure, if any */
   4061   status = (uint8_t)btm_sec_execute_procedure(p_dev_rec);
   4062   /* If there is no next procedure, or procedure failed to start, notify the
   4063    * caller */
   4064   if (status != BTM_CMD_STARTED)
   4065     btm_sec_dev_rec_cback_event(p_dev_rec, status, false);
   4066 }
   4067 
   4068 /*******************************************************************************
   4069  *
   4070  * Function         btm_sec_connect_after_reject_timeout
   4071  *
   4072  * Description      Connection for bonding could not start because of the
   4073  *                  collision. Initiate outgoing connection
   4074  *
   4075  * Returns          Pointer to the TLE struct
   4076  *
   4077  ******************************************************************************/
   4078 static void btm_sec_connect_after_reject_timeout(UNUSED_ATTR void* data) {
   4079   tBTM_SEC_DEV_REC* p_dev_rec = btm_cb.p_collided_dev_rec;
   4080 
   4081   BTM_TRACE_EVENT("%s", __func__);
   4082   btm_cb.p_collided_dev_rec = 0;
   4083 
   4084   if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) {
   4085     BTM_TRACE_WARNING("Security Manager: %s: failed to start connection",
   4086                       __func__);
   4087 
   4088     btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4089 
   4090     if (btm_cb.api.p_auth_complete_callback)
   4091       (*btm_cb.api.p_auth_complete_callback)(
   4092           p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   4093           HCI_ERR_MEMORY_FULL);
   4094   }
   4095 }
   4096 
   4097 /*******************************************************************************
   4098  *
   4099  * Function         btm_sec_connected
   4100  *
   4101  * Description      This function is when a connection to the peer device is
   4102  *                  established
   4103  *
   4104  * Returns          void
   4105  *
   4106  ******************************************************************************/
   4107 void btm_sec_connected(const RawAddress& bda, uint16_t handle, uint8_t status,
   4108                        uint8_t enc_mode) {
   4109   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
   4110   uint8_t res;
   4111   bool is_pairing_device = false;
   4112   tACL_CONN* p_acl_cb;
   4113   uint8_t bit_shift = 0;
   4114 
   4115   btm_acl_resubmit_page();
   4116 
   4117   if (p_dev_rec) {
   4118     VLOG(2) << __func__ << ": Security Manager: in state: "
   4119             << btm_pair_state_descr(btm_cb.pairing_state)
   4120             << " handle:" << handle << " status:" << loghex(status)
   4121             << " enc_mode:" << loghex(enc_mode) << " bda:" << bda
   4122             << " RName:" << p_dev_rec->sec_bd_name;
   4123   } else {
   4124     VLOG(2) << __func__ << ": Security Manager: in state: "
   4125             << btm_pair_state_descr(btm_cb.pairing_state)
   4126             << " handle:" << handle << " status:" << loghex(status)
   4127             << " enc_mode:" << loghex(enc_mode) << " bda:" << bda;
   4128   }
   4129 
   4130   if (!p_dev_rec) {
   4131     /* There is no device record for new connection.  Allocate one */
   4132     if (status == HCI_SUCCESS) {
   4133       p_dev_rec = btm_sec_alloc_dev(bda);
   4134     } else {
   4135       /* If the device matches with stored paring address
   4136        * reset the paring state to idle */
   4137       if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   4138           btm_cb.pairing_bda == bda) {
   4139         btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4140       }
   4141 
   4142       /* can not find the device record and the status is error,
   4143        * just ignore it */
   4144       return;
   4145     }
   4146   } else /* Update the timestamp for this device */
   4147   {
   4148     bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 : 0;
   4149     p_dev_rec->timestamp = btm_cb.dev_rec_count++;
   4150     if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) {
   4151       /* tell L2CAP it's a bonding connection. */
   4152       if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   4153           (btm_cb.pairing_bda == p_dev_rec->bd_addr) &&
   4154           (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) {
   4155         /* if incoming connection failed while pairing, then try to connect and
   4156          * continue */
   4157         /* Motorola S9 disconnects without asking pin code */
   4158         if ((status != HCI_SUCCESS) &&
   4159             (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) {
   4160           BTM_TRACE_WARNING(
   4161               "Security Manager: btm_sec_connected: incoming connection failed "
   4162               "without asking PIN");
   4163 
   4164           p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
   4165           if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) {
   4166             /* Start timer with 0 to initiate connection with new LCB */
   4167             /* because L2CAP will delete current LCB with this event  */
   4168             btm_cb.p_collided_dev_rec = p_dev_rec;
   4169             alarm_set_on_mloop(btm_cb.sec_collision_timer, 0,
   4170                                btm_sec_connect_after_reject_timeout, NULL);
   4171           } else {
   4172             btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME);
   4173             if (BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL,
   4174                                          BT_TRANSPORT_BR_EDR) !=
   4175                 BTM_CMD_STARTED) {
   4176               BTM_TRACE_ERROR("%s cannot read remote name", __func__);
   4177               btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4178             }
   4179           }
   4180 #if (BTM_DISC_DURING_RS == TRUE)
   4181           p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
   4182 #endif
   4183           return;
   4184         } else {
   4185           l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, true);
   4186         }
   4187       }
   4188       /* always clear the pending flag */
   4189       p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
   4190     }
   4191   }
   4192 
   4193   p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
   4194 
   4195 #if (BTM_DISC_DURING_RS == TRUE)
   4196   p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
   4197 #endif
   4198 
   4199   p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
   4200 
   4201   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   4202       (btm_cb.pairing_bda == bda)) {
   4203     /* if we rejected incoming connection from bonding device */
   4204     if ((status == HCI_ERR_HOST_REJECT_DEVICE) &&
   4205         (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) {
   4206       BTM_TRACE_WARNING(
   4207           "Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, "
   4208           "sm4: 0x%x",
   4209           btm_cb.pairing_flags, p_dev_rec->sm4);
   4210 
   4211       btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
   4212       if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) {
   4213         /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
   4214         btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME);
   4215         if (BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR) !=
   4216             BTM_CMD_STARTED) {
   4217           BTM_TRACE_ERROR("%s cannot read remote name", __func__);
   4218           btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4219         }
   4220         return;
   4221       }
   4222 
   4223       /* if we already have pin code */
   4224       if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) {
   4225         /* Start timer with 0 to initiate connection with new LCB */
   4226         /* because L2CAP will delete current LCB with this event  */
   4227         btm_cb.p_collided_dev_rec = p_dev_rec;
   4228         alarm_set_on_mloop(btm_cb.sec_collision_timer, 0,
   4229                            btm_sec_connect_after_reject_timeout, NULL);
   4230       }
   4231 
   4232       return;
   4233     }
   4234     /* wait for incoming connection without resetting pairing state */
   4235     else if (status == HCI_ERR_CONNECTION_EXISTS) {
   4236       BTM_TRACE_WARNING(
   4237           "Security Manager: btm_sec_connected: Wait for incoming connection");
   4238       return;
   4239     }
   4240 
   4241     is_pairing_device = true;
   4242   }
   4243 
   4244   /* If connection was made to do bonding restore link security if changed */
   4245   btm_restore_mode();
   4246 
   4247   /* if connection fails during pin request, notify application */
   4248   if (status != HCI_SUCCESS) {
   4249     /* If connection failed because of during pairing, need to tell user */
   4250     if (is_pairing_device) {
   4251       p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
   4252       p_dev_rec->sec_flags &=
   4253           ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
   4254       BTM_TRACE_DEBUG("security_required:%x ", p_dev_rec->security_required);
   4255 
   4256       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4257 
   4258       /* We need to notify host that the key is not known any more */
   4259       if (btm_cb.api.p_auth_complete_callback) {
   4260         (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr,
   4261                                                p_dev_rec->dev_class,
   4262                                                p_dev_rec->sec_bd_name, status);
   4263       }
   4264     }
   4265     /*
   4266         Do not send authentication failure, if following conditions hold good
   4267          1.  BTM Sec Pairing state is idle
   4268          2.  Link key for the remote device is present.
   4269          3.  Remote is SSP capable.
   4270      */
   4271     else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
   4272              (((status == HCI_ERR_AUTH_FAILURE) ||
   4273                (status == HCI_ERR_KEY_MISSING) ||
   4274                (status == HCI_ERR_HOST_REJECT_SECURITY) ||
   4275                (status == HCI_ERR_PAIRING_NOT_ALLOWED) ||
   4276                (status == HCI_ERR_UNIT_KEY_USED) ||
   4277                (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
   4278                (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) ||
   4279                (status == HCI_ERR_REPEATED_ATTEMPTS)))) {
   4280       p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
   4281       p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
   4282 
   4283 #ifdef BRCM_NOT_4_BTE
   4284       /* If we rejected pairing, pass this special result code */
   4285       if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) {
   4286         status = HCI_ERR_HOST_REJECT_SECURITY;
   4287       }
   4288 #endif
   4289 
   4290       /* We need to notify host that the key is not known any more */
   4291       if (btm_cb.api.p_auth_complete_callback) {
   4292         (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr,
   4293                                                p_dev_rec->dev_class,
   4294                                                p_dev_rec->sec_bd_name, status);
   4295       }
   4296     }
   4297 
   4298     if (btm_cb.pairing_bda != bda) {
   4299       /* Don't callback unless this Connection-Complete-failure event has the
   4300        * same mac address as the bonding device */
   4301       VLOG(1) << __func__
   4302               << ": Different mac addresses: pairing_bda=" << btm_cb.pairing_bda
   4303               << ", bda=" << bda << ", do not callback";
   4304       return;
   4305     }
   4306 
   4307     if (status == HCI_ERR_CONNECTION_TOUT ||
   4308         status == HCI_ERR_LMP_RESPONSE_TIMEOUT ||
   4309         status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT)
   4310       btm_sec_dev_rec_cback_event(p_dev_rec, BTM_DEVICE_TIMEOUT, false);
   4311     else
   4312       btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, false);
   4313 
   4314     return;
   4315   }
   4316 
   4317   /* If initiated dedicated bonding, return the link key now, and initiate
   4318    * disconnect */
   4319   /* If dedicated bonding, and we now have a link key, we are all done */
   4320   if (is_pairing_device && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) {
   4321     if (p_dev_rec->link_key_not_sent) {
   4322       p_dev_rec->link_key_not_sent = false;
   4323       btm_send_link_key_notif(p_dev_rec);
   4324     }
   4325 
   4326     p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
   4327 
   4328     /* remember flag before it is initialized */
   4329     if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
   4330       res = true;
   4331     else
   4332       res = false;
   4333 
   4334     if (btm_cb.api.p_auth_complete_callback)
   4335       (*btm_cb.api.p_auth_complete_callback)(
   4336           p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   4337           HCI_SUCCESS);
   4338 
   4339     btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4340 
   4341     if (res) {
   4342       /* Let l2cap start bond timer */
   4343       l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, true);
   4344     }
   4345 
   4346     return;
   4347   }
   4348 
   4349   p_dev_rec->hci_handle = handle;
   4350 
   4351   /* role may not be correct here, it will be updated by l2cap, but we need to
   4352    */
   4353   /* notify btm_acl that link is up, so starting of rmt name request will not */
   4354   /* set paging flag up */
   4355   p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
   4356   if (p_acl_cb) {
   4357 /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT
   4358  * event */
   4359 #if (BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
   4360     /* For now there are a some devices that do not like sending */
   4361     /* commands events and data at the same time. */
   4362     /* Set the packet types to the default allowed by the device */
   4363     btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
   4364 
   4365     if (btm_cb.btm_def_link_policy)
   4366       BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
   4367 #endif
   4368   }
   4369   btm_acl_created(bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle,
   4370                   HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR);
   4371 
   4372   /* Initialize security flags.  We need to do that because some            */
   4373   /* authorization complete could have come after the connection is dropped */
   4374   /* and that would set wrong flag that link has been authorized already    */
   4375   p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
   4376                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED)
   4377                             << bit_shift);
   4378 
   4379   if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
   4380     p_dev_rec->sec_flags |=
   4381         ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
   4382 
   4383   if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
   4384     p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
   4385 
   4386   if (p_dev_rec->pin_code_length >= 16 ||
   4387       p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
   4388       p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
   4389     p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift);
   4390   }
   4391 
   4392   p_dev_rec->link_key_changed = false;
   4393 
   4394   /* After connection is established we perform security if we do not know */
   4395   /* the name, or if we are originator because some procedure can have */
   4396   /* been scheduled while connection was down */
   4397   BTM_TRACE_DEBUG("is_originator:%d ", p_dev_rec->is_originator);
   4398   if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) ||
   4399       p_dev_rec->is_originator) {
   4400     res = btm_sec_execute_procedure(p_dev_rec);
   4401     if (res != BTM_CMD_STARTED)
   4402       btm_sec_dev_rec_cback_event(p_dev_rec, res, false);
   4403   }
   4404   return;
   4405 }
   4406 
   4407 /*******************************************************************************
   4408  *
   4409  * Function         btm_sec_disconnect
   4410  *
   4411  * Description      This function is called to disconnect HCI link
   4412  *
   4413  * Returns          btm status
   4414  *
   4415  ******************************************************************************/
   4416 tBTM_STATUS btm_sec_disconnect(uint16_t handle, uint8_t reason) {
   4417   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
   4418 
   4419   /* In some weird race condition we may not have a record */
   4420   if (!p_dev_rec) {
   4421     btsnd_hcic_disconnect(handle, reason);
   4422     return (BTM_SUCCESS);
   4423   }
   4424 
   4425   /* If we are in the process of bonding we need to tell client that auth failed
   4426    */
   4427   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   4428       (btm_cb.pairing_bda == p_dev_rec->bd_addr) &&
   4429       (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) {
   4430     /* we are currently doing bonding.  Link will be disconnected when done */
   4431     btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
   4432     return (BTM_BUSY);
   4433   }
   4434 
   4435   return (btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
   4436 }
   4437 
   4438 /*******************************************************************************
   4439  *
   4440  * Function         btm_sec_disconnected
   4441  *
   4442  * Description      This function is when a connection to the peer device is
   4443  *                  dropped
   4444  *
   4445  * Returns          void
   4446  *
   4447  ******************************************************************************/
   4448 void btm_sec_disconnected(uint16_t handle, uint8_t reason) {
   4449   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
   4450   uint8_t old_pairing_flags = btm_cb.pairing_flags;
   4451   int result = HCI_ERR_AUTH_FAILURE;
   4452   tBTM_SEC_CALLBACK* p_callback = NULL;
   4453   tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
   4454 
   4455   /* If page was delayed for disc complete, can do it now */
   4456   btm_cb.discing = false;
   4457 
   4458   btm_acl_resubmit_page();
   4459 
   4460   if (!p_dev_rec) return;
   4461 
   4462   transport =
   4463       (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR : BT_TRANSPORT_LE;
   4464 
   4465   p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
   4466 
   4467 #if (BTM_DISC_DURING_RS == TRUE)
   4468   LOG_INFO(LOG_TAG, "%s clearing pending flag handle:%d reason:%d", __func__,
   4469            handle, reason);
   4470   p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */
   4471 #endif
   4472 
   4473   /* clear unused flags */
   4474   p_dev_rec->sm4 &= BTM_SM4_TRUE;
   4475 
   4476   VLOG(2) << __func__ << " bd_addr: " << p_dev_rec->bd_addr
   4477           << " name: " << p_dev_rec->sec_bd_name
   4478           << " state: " << btm_pair_state_descr(btm_cb.pairing_state)
   4479           << " reason: " << reason << " sec_req: " << std::hex
   4480           << p_dev_rec->security_required;
   4481 
   4482   BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__,
   4483                   p_dev_rec->sec_flags);
   4484 
   4485   /* If we are in the process of bonding we need to tell client that auth failed
   4486    */
   4487   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   4488       (btm_cb.pairing_bda == p_dev_rec->bd_addr)) {
   4489     btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4490     p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
   4491     if (btm_cb.api.p_auth_complete_callback) {
   4492       /* If the disconnection reason is REPEATED_ATTEMPTS,
   4493          send this error message to complete callback function
   4494          to display the error message of Repeated attempts.
   4495          All others, send HCI_ERR_AUTH_FAILURE. */
   4496       if (reason == HCI_ERR_REPEATED_ATTEMPTS) {
   4497         result = HCI_ERR_REPEATED_ATTEMPTS;
   4498       } else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) {
   4499         result = HCI_ERR_HOST_REJECT_SECURITY;
   4500       }
   4501       (*btm_cb.api.p_auth_complete_callback)(p_dev_rec->bd_addr,
   4502                                              p_dev_rec->dev_class,
   4503                                              p_dev_rec->sec_bd_name, result);
   4504 
   4505       // |btm_cb.api.p_auth_complete_callback| may cause |p_dev_rec| to be
   4506       // deallocated.
   4507       p_dev_rec = btm_find_dev_by_handle(handle);
   4508       if (!p_dev_rec) {
   4509         return;
   4510       }
   4511     }
   4512   }
   4513 
   4514   btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, &p_dev_rec->bd_addr,
   4515                                 HCI_SUCCESS);
   4516   /* see sec_flags processing in btm_acl_removed */
   4517 
   4518   if (transport == BT_TRANSPORT_LE) {
   4519     p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
   4520     p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
   4521     p_dev_rec->enc_key_size = 0;
   4522   } else {
   4523     p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
   4524     p_dev_rec->sec_flags &=
   4525         ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED |
   4526           BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED);
   4527 
   4528     // Remove temporary key.
   4529     if (p_dev_rec->bond_type == BOND_TYPE_TEMPORARY)
   4530       p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN);
   4531   }
   4532 
   4533   BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__,
   4534                   p_dev_rec->sec_flags);
   4535 
   4536   if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) {
   4537     p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE)
   4538                                ? BTM_SEC_STATE_DISCONNECTING
   4539                                : BTM_SEC_STATE_DISCONNECTING_BLE;
   4540     return;
   4541   }
   4542   p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   4543   p_dev_rec->security_required = BTM_SEC_NONE;
   4544 
   4545   p_callback = p_dev_rec->p_callback;
   4546 
   4547   /* if security is pending, send callback to clean up the security state */
   4548   if (p_callback) {
   4549     BTM_TRACE_DEBUG("%s: clearing callback. p_dev_rec=%p, p_callback=%p",
   4550                     __func__, p_dev_rec, p_dev_rec->p_callback);
   4551     p_dev_rec->p_callback =
   4552         NULL; /* when the peer device time out the authentication before
   4553                  we do, this call back must be reset here */
   4554     (*p_callback)(&p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data,
   4555                   BTM_ERR_PROCESSING);
   4556   }
   4557 }
   4558 
   4559 /*******************************************************************************
   4560  *
   4561  * Function         btm_sec_link_key_notification
   4562  *
   4563  * Description      This function is called when a new connection link key is
   4564  *                  generated
   4565  *
   4566  * Returns          Pointer to the record or NULL
   4567  *
   4568  ******************************************************************************/
   4569 void btm_sec_link_key_notification(const RawAddress& p_bda, uint8_t* p_link_key,
   4570                                    uint8_t key_type) {
   4571   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_or_alloc_dev(p_bda);
   4572   bool we_are_bonding = false;
   4573   bool ltk_derived_lk = false;
   4574 
   4575   VLOG(2) << __func__ << " BDA: " << p_bda << ", TYPE: " << +key_type;
   4576 
   4577   if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) &&
   4578       (key_type <=
   4579        BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   4580     ltk_derived_lk = true;
   4581     key_type -= BTM_LTK_DERIVED_LKEY_OFFSET;
   4582   }
   4583   /* If connection was made to do bonding restore link security if changed */
   4584   btm_restore_mode();
   4585 
   4586   if (key_type != BTM_LKEY_TYPE_CHANGED_COMB)
   4587     p_dev_rec->link_key_type = key_type;
   4588 
   4589   p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
   4590 
   4591   /*
   4592    * Until this point in time, we do not know if MITM was enabled, hence we
   4593    * add the extended security flag here.
   4594    */
   4595   if (p_dev_rec->pin_code_length >= 16 ||
   4596       p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
   4597       p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
   4598     p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
   4599   }
   4600 
   4601   /* BR/EDR connection, update the encryption key size to be 16 as always */
   4602   p_dev_rec->enc_key_size = 16;
   4603   memcpy(p_dev_rec->link_key, p_link_key, LINK_KEY_LEN);
   4604 
   4605   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
   4606       (btm_cb.pairing_bda == p_bda)) {
   4607     if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
   4608       we_are_bonding = true;
   4609     else
   4610       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4611   }
   4612 
   4613   /* save LTK derived LK no matter what */
   4614   if (ltk_derived_lk) {
   4615     if (btm_cb.api.p_link_key_callback) {
   4616       BTM_TRACE_DEBUG("%s() Save LTK derived LK (key_type = %d)", __func__,
   4617                       p_dev_rec->link_key_type);
   4618       (*btm_cb.api.p_link_key_callback)(p_bda, p_dev_rec->dev_class,
   4619                                         p_dev_rec->sec_bd_name, p_link_key,
   4620                                         p_dev_rec->link_key_type);
   4621     }
   4622   } else {
   4623     if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) ||
   4624         (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   4625       p_dev_rec->new_encryption_key_is_p256 = true;
   4626       BTM_TRACE_DEBUG("%s set new_encr_key_256 to %d", __func__,
   4627                       p_dev_rec->new_encryption_key_is_p256);
   4628     }
   4629   }
   4630 
   4631   /* If name is not known at this point delay calling callback until the name is
   4632    */
   4633   /* resolved. Unless it is a HID Device and we really need to send all link
   4634    * keys. */
   4635   if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) &&
   4636        ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) !=
   4637         BTM_COD_MAJOR_PERIPHERAL)) &&
   4638       !ltk_derived_lk) {
   4639     VLOG(2) << __func__ << " Delayed BDA: " << p_bda << " Type:" << +key_type;
   4640 
   4641     p_dev_rec->link_key_not_sent = true;
   4642 
   4643     /* If it is for bonding nothing else will follow, so we need to start name
   4644      * resolution */
   4645     if (we_are_bonding) {
   4646       btsnd_hcic_rmt_name_req(p_bda, HCI_PAGE_SCAN_REP_MODE_R1,
   4647                               HCI_MANDATARY_PAGE_SCAN_MODE, 0);
   4648     }
   4649 
   4650     BTM_TRACE_EVENT("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x",
   4651                     p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags,
   4652                     p_dev_rec->dev_class[1])
   4653     return;
   4654   }
   4655 
   4656   /* If its not us who perform authentication, we should tell stackserver */
   4657   /* that some authentication has been completed                          */
   4658   /* This is required when different entities receive link notification and auth
   4659    * complete */
   4660   if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)
   4661       /* for derived key, always send authentication callback for BR channel */
   4662       || ltk_derived_lk) {
   4663     if (btm_cb.api.p_auth_complete_callback)
   4664       (*btm_cb.api.p_auth_complete_callback)(
   4665           p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   4666           HCI_SUCCESS);
   4667   }
   4668 
   4669 /* We will save link key only if the user authorized it - BTE report link key in
   4670  * all cases */
   4671 #ifdef BRCM_NONE_BTE
   4672   if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
   4673 #endif
   4674   {
   4675     if (btm_cb.api.p_link_key_callback) {
   4676       if (ltk_derived_lk) {
   4677         BTM_TRACE_DEBUG(
   4678             "btm_sec_link_key_notification()  LTK derived LK is saved already"
   4679             " (key_type = %d)",
   4680             p_dev_rec->link_key_type);
   4681       } else {
   4682         (*btm_cb.api.p_link_key_callback)(p_bda, p_dev_rec->dev_class,
   4683                                           p_dev_rec->sec_bd_name, p_link_key,
   4684                                           p_dev_rec->link_key_type);
   4685       }
   4686     }
   4687   }
   4688 }
   4689 
   4690 /*******************************************************************************
   4691  *
   4692  * Function         btm_sec_link_key_request
   4693  *
   4694  * Description      This function is called when controller requests link key
   4695  *
   4696  * Returns          Pointer to the record or NULL
   4697  *
   4698  ******************************************************************************/
   4699 void btm_sec_link_key_request(const RawAddress& bda) {
   4700   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_or_alloc_dev(bda);
   4701 
   4702   VLOG(2) << __func__ << " bda: " << bda;
   4703 
   4704   if ((btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
   4705       (btm_cb.collision_start_time != 0) &&
   4706       (btm_cb.p_collided_dev_rec->bd_addr == bda)) {
   4707     BTM_TRACE_EVENT(
   4708         "btm_sec_link_key_request() rejecting link key req "
   4709         "State: %d START_TIMEOUT : %d",
   4710         btm_cb.pairing_state, btm_cb.collision_start_time);
   4711     btsnd_hcic_link_key_neg_reply(bda);
   4712     return;
   4713   }
   4714   if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) {
   4715     btsnd_hcic_link_key_req_reply(bda, p_dev_rec->link_key);
   4716     return;
   4717   }
   4718 
   4719   /* Notify L2CAP to increase timeout */
   4720   l2c_pin_code_request(bda);
   4721 
   4722   /* The link key is not in the database and it is not known to the manager */
   4723   btsnd_hcic_link_key_neg_reply(bda);
   4724 }
   4725 
   4726 /*******************************************************************************
   4727  *
   4728  * Function         btm_sec_pairing_timeout
   4729  *
   4730  * Description      This function is called when host does not provide PIN
   4731  *                  within requested time
   4732  *
   4733  * Returns          Pointer to the TLE struct
   4734  *
   4735  ******************************************************************************/
   4736 static void btm_sec_pairing_timeout(UNUSED_ATTR void* data) {
   4737   tBTM_CB* p_cb = &btm_cb;
   4738   tBTM_SEC_DEV_REC* p_dev_rec;
   4739 #if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE)
   4740   tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO;
   4741 #else
   4742   tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_YES;
   4743 #endif
   4744   uint8_t name[2];
   4745 
   4746   p_dev_rec = btm_find_dev(p_cb->pairing_bda);
   4747 
   4748   BTM_TRACE_EVENT("%s  State: %s   Flags: %u", __func__,
   4749                   btm_pair_state_descr(p_cb->pairing_state),
   4750                   p_cb->pairing_flags);
   4751 
   4752   switch (p_cb->pairing_state) {
   4753     case BTM_PAIR_STATE_WAIT_PIN_REQ:
   4754       btm_sec_bond_cancel_complete();
   4755       break;
   4756 
   4757     case BTM_PAIR_STATE_WAIT_LOCAL_PIN:
   4758       if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0)
   4759         btsnd_hcic_pin_code_neg_reply(p_cb->pairing_bda);
   4760       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4761       /* We need to notify the UI that no longer need the PIN */
   4762       if (btm_cb.api.p_auth_complete_callback) {
   4763         if (p_dev_rec == NULL) {
   4764           name[0] = 0;
   4765           (*btm_cb.api.p_auth_complete_callback)(p_cb->pairing_bda, NULL, name,
   4766                                                  HCI_ERR_CONNECTION_TOUT);
   4767         } else
   4768           (*btm_cb.api.p_auth_complete_callback)(
   4769               p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   4770               HCI_ERR_CONNECTION_TOUT);
   4771       }
   4772       break;
   4773 
   4774     case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:
   4775       btsnd_hcic_user_conf_reply(p_cb->pairing_bda, false);
   4776       /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
   4777       break;
   4778 
   4779 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   4780     case BTM_PAIR_STATE_KEY_ENTRY:
   4781       btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda);
   4782       /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
   4783       break;
   4784 #endif /* !BTM_IO_CAP_NONE */
   4785 
   4786     case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:
   4787       if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
   4788         auth_req |= BTM_AUTH_DD_BOND;
   4789 
   4790       btsnd_hcic_io_cap_req_reply(p_cb->pairing_bda, btm_cb.devcb.loc_io_caps,
   4791                                   BTM_OOB_NONE, auth_req);
   4792       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4793       break;
   4794 
   4795     case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:
   4796       btsnd_hcic_rem_oob_neg_reply(p_cb->pairing_bda);
   4797       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4798       break;
   4799 
   4800     case BTM_PAIR_STATE_WAIT_DISCONNECT:
   4801       /* simple pairing failed. Started a 1-sec timer at simple pairing
   4802        * complete.
   4803        * now it's time to tear down the ACL link*/
   4804       if (p_dev_rec == NULL) {
   4805         LOG(ERROR) << __func__
   4806                    << " BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: "
   4807                    << p_cb->pairing_bda;
   4808         break;
   4809       }
   4810       btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_AUTH_FAILURE,
   4811                                   p_dev_rec->hci_handle);
   4812       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4813       break;
   4814 
   4815     case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:
   4816     case BTM_PAIR_STATE_GET_REM_NAME:
   4817       /* We need to notify the UI that timeout has happened while waiting for
   4818        * authentication*/
   4819       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4820       if (btm_cb.api.p_auth_complete_callback) {
   4821         if (p_dev_rec == NULL) {
   4822           name[0] = 0;
   4823           (*btm_cb.api.p_auth_complete_callback)(p_cb->pairing_bda, NULL, name,
   4824                                                  HCI_ERR_CONNECTION_TOUT);
   4825         } else
   4826           (*btm_cb.api.p_auth_complete_callback)(
   4827               p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   4828               HCI_ERR_CONNECTION_TOUT);
   4829       }
   4830       break;
   4831 
   4832     default:
   4833       BTM_TRACE_WARNING("%s not processed state: %s", __func__,
   4834                         btm_pair_state_descr(btm_cb.pairing_state));
   4835       btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
   4836       break;
   4837   }
   4838 }
   4839 
   4840 /*******************************************************************************
   4841  *
   4842  * Function         btm_sec_pin_code_request
   4843  *
   4844  * Description      This function is called when controller requests PIN code
   4845  *
   4846  * Returns          Pointer to the record or NULL
   4847  *
   4848  ******************************************************************************/
   4849 void btm_sec_pin_code_request(const RawAddress& p_bda) {
   4850   tBTM_SEC_DEV_REC* p_dev_rec;
   4851   tBTM_CB* p_cb = &btm_cb;
   4852 
   4853   VLOG(2) << __func__ << " BDA: " << p_bda
   4854           << " state: " << btm_pair_state_descr(btm_cb.pairing_state);
   4855 
   4856   if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) {
   4857     if ((p_bda == btm_cb.pairing_bda) &&
   4858         (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE)) {
   4859       btsnd_hcic_pin_code_neg_reply(p_bda);
   4860       return;
   4861     } else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) ||
   4862                p_bda != btm_cb.pairing_bda) {
   4863       BTM_TRACE_WARNING("btm_sec_pin_code_request() rejected - state: %s",
   4864                         btm_pair_state_descr(btm_cb.pairing_state));
   4865       btsnd_hcic_pin_code_neg_reply(p_bda);
   4866       return;
   4867     }
   4868   }
   4869 
   4870   p_dev_rec = btm_find_or_alloc_dev(p_bda);
   4871   /* received PIN code request. must be non-sm4 */
   4872   p_dev_rec->sm4 = BTM_SM4_KNOWN;
   4873 
   4874   if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) {
   4875     btm_cb.pairing_bda = p_bda;
   4876 
   4877     btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD;
   4878     /* Make sure we reset the trusted mask to help against attacks */
   4879     BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
   4880   }
   4881 
   4882   if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) {
   4883     BTM_TRACE_EVENT("btm_sec_pin_code_request fixed pin replying");
   4884     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
   4885     btsnd_hcic_pin_code_req_reply(p_bda, p_cb->cfg.pin_code_len,
   4886                                   p_cb->cfg.pin_code);
   4887     return;
   4888   }
   4889 
   4890   /* Use the connecting device's CoD for the connection */
   4891   if ((p_bda == p_cb->connecting_bda) &&
   4892       (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] ||
   4893        p_cb->connecting_dc[2]))
   4894     memcpy(p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN);
   4895 
   4896   /* We could have started connection after asking user for the PIN code */
   4897   if (btm_cb.pin_code_len != 0) {
   4898     BTM_TRACE_EVENT("btm_sec_pin_code_request bonding sending reply");
   4899     btsnd_hcic_pin_code_req_reply(p_bda, btm_cb.pin_code_len, p_cb->pin_code);
   4900 
   4901     /* Mark that we forwarded received from the user PIN code */
   4902     btm_cb.pin_code_len = 0;
   4903 
   4904     /* We can change mode back right away, that other connection being
   4905      * established */
   4906     /* is not forced to be secure - found a FW issue, so we can not do this
   4907     btm_restore_mode(); */
   4908 
   4909     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
   4910   }
   4911 
   4912   /* If pairing disabled OR (no PIN callback and not bonding) */
   4913   /* OR we could not allocate entry in the database reject pairing request */
   4914   else if (
   4915       p_cb->pairing_disabled ||
   4916       (p_cb->api.p_pin_callback == NULL)
   4917 
   4918       /* OR Microsoft keyboard can for some reason try to establish connection
   4919        */
   4920       /*  the only thing we can do here is to shut it up.  Normally we will be
   4921          originator */
   4922       /*  for keyboard bonding */
   4923       || (!p_dev_rec->is_originator &&
   4924           ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) ==
   4925            BTM_COD_MAJOR_PERIPHERAL) &&
   4926           (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD))) {
   4927     BTM_TRACE_WARNING(
   4928         "btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev "
   4929         "Rec:%x!",
   4930         p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
   4931 
   4932     btsnd_hcic_pin_code_neg_reply(p_bda);
   4933   }
   4934   /* Notify upper layer of PIN request and start expiration timer */
   4935   else {
   4936     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN);
   4937     /* Pin code request can not come at the same time as connection request */
   4938     p_cb->connecting_bda = p_bda;
   4939     memcpy(p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN);
   4940 
   4941     /* Check if the name is known */
   4942     /* Even if name is not known we might not be able to get one */
   4943     /* this is the case when we are already getting something from the */
   4944     /* device, so HCI level is flow controlled */
   4945     /* Also cannot send remote name request while paging, i.e. connection is not
   4946      * completed */
   4947     if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) {
   4948       BTM_TRACE_EVENT("btm_sec_pin_code_request going for callback");
   4949 
   4950       btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
   4951       if (p_cb->api.p_pin_callback) {
   4952         (*p_cb->api.p_pin_callback)(
   4953             p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   4954             (p_dev_rec->p_cur_service == NULL)
   4955                 ? false
   4956                 : (p_dev_rec->p_cur_service->security_flags &
   4957                    BTM_SEC_IN_MIN_16_DIGIT_PIN));
   4958       }
   4959     } else {
   4960       BTM_TRACE_EVENT("btm_sec_pin_code_request going for remote name");
   4961 
   4962       /* We received PIN code request for the device with unknown name */
   4963       /* it is not user friendly just to ask for the PIN without name */
   4964       /* try to get name at first */
   4965       btsnd_hcic_rmt_name_req(p_dev_rec->bd_addr, HCI_PAGE_SCAN_REP_MODE_R1,
   4966                               HCI_MANDATARY_PAGE_SCAN_MODE, 0);
   4967     }
   4968   }
   4969 
   4970   return;
   4971 }
   4972 
   4973 /*******************************************************************************
   4974  *
   4975  * Function         btm_sec_update_clock_offset
   4976  *
   4977  * Description      This function is called to update clock offset
   4978  *
   4979  * Returns          void
   4980  *
   4981  ******************************************************************************/
   4982 void btm_sec_update_clock_offset(uint16_t handle, uint16_t clock_offset) {
   4983   tBTM_SEC_DEV_REC* p_dev_rec;
   4984   tBTM_INQ_INFO* p_inq_info;
   4985 
   4986   p_dev_rec = btm_find_dev_by_handle(handle);
   4987   if (p_dev_rec == NULL) return;
   4988 
   4989   p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
   4990 
   4991   p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr);
   4992   if (p_inq_info == NULL) return;
   4993 
   4994   p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
   4995 }
   4996 
   4997 /******************************************************************
   4998  * S T A T I C     F U N C T I O N S
   4999  ******************************************************************/
   5000 
   5001 /*******************************************************************************
   5002  *
   5003  * Function         btm_sec_execute_procedure
   5004  *
   5005  * Description      This function is called to start required security
   5006  *                  procedure.  There is a case when multiplexing protocol
   5007  *                  calls this function on the originating side, connection to
   5008  *                  the peer will not be established.  This function in this
   5009  *                  case performs only authorization.
   5010  *
   5011  * Returns          BTM_SUCCESS     - permission is granted
   5012  *                  BTM_CMD_STARTED - in process
   5013  *                  BTM_NO_RESOURCES  - permission declined
   5014  *
   5015  ******************************************************************************/
   5016 tBTM_STATUS btm_sec_execute_procedure(tBTM_SEC_DEV_REC* p_dev_rec) {
   5017   BTM_TRACE_EVENT(
   5018       "btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
   5019       p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
   5020 
   5021   /* There is a chance that we are getting name.  Wait until done. */
   5022   if (p_dev_rec->sec_state != 0) return (BTM_CMD_STARTED);
   5023 
   5024   /* If any security is required, get the name first */
   5025   if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) &&
   5026       (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) {
   5027     BTM_TRACE_EVENT("Security Manager: Start get name");
   5028     if (!btm_sec_start_get_name(p_dev_rec)) {
   5029       return (BTM_NO_RESOURCES);
   5030     }
   5031     return (BTM_CMD_STARTED);
   5032   }
   5033 
   5034   /* If connection is not authenticated and authentication is required */
   5035   /* start authentication and return PENDING to the caller */
   5036   if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) &&
   5037         ((p_dev_rec->is_originator &&
   5038           (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) ||
   5039          (!p_dev_rec->is_originator &&
   5040           (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))) ||
   5041        (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) &&
   5042         (!p_dev_rec->is_originator &&
   5043          (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) &&
   5044       (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) {
   5045 /*
   5046  * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use,
   5047  * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the
   5048  * BTM_SEC_AUTHENTICATED is used for both MITM and non-MITM
   5049  * authenticated connections, hence we cannot distinguish here.
   5050  */
   5051 
   5052     BTM_TRACE_EVENT("Security Manager: Start authentication");
   5053 
   5054     /*
   5055      * If we do have a link-key, but we end up here because we need an
   5056      * upgrade, then clear the link-key known and authenticated flag before
   5057      * restarting authentication.
   5058      * WARNING: If the controller has link-key, it is optional and
   5059      * recommended for the controller to send a Link_Key_Request.
   5060      * In case we need an upgrade, the only alternative would be to delete
   5061      * the existing link-key. That could lead to very bad user experience
   5062      * or even IOP issues, if a reconnect causes a new connection that
   5063      * requires an upgrade.
   5064      */
   5065     if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) &&
   5066         (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) &&
   5067          (!p_dev_rec->is_originator &&
   5068           (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) {
   5069       p_dev_rec->sec_flags &=
   5070           ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
   5071             BTM_SEC_AUTHENTICATED);
   5072     }
   5073 
   5074     btm_sec_start_authentication(p_dev_rec);
   5075     return (BTM_CMD_STARTED);
   5076   }
   5077 
   5078   /* If connection is not encrypted and encryption is required */
   5079   /* start encryption and return PENDING to the caller */
   5080   if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) &&
   5081       ((p_dev_rec->is_originator &&
   5082         (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) ||
   5083        (!p_dev_rec->is_originator &&
   5084         (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) &&
   5085       (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) {
   5086 
   5087     BTM_TRACE_EVENT("Security Manager: Start encryption");
   5088 
   5089     btm_sec_start_encryption(p_dev_rec);
   5090     return (BTM_CMD_STARTED);
   5091   }
   5092 
   5093   if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
   5094       (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) {
   5095     BTM_TRACE_EVENT(
   5096         "%s: Security Manager: SC only service, but link key type is 0x%02x -",
   5097         "security failure", __func__, p_dev_rec->link_key_type);
   5098     return (BTM_FAILED_ON_SECURITY);
   5099   }
   5100 
   5101   /* If connection is not authorized and authorization is required */
   5102   /* start authorization and return PENDING to the caller */
   5103   if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) &&
   5104       ((p_dev_rec->is_originator &&
   5105         (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) ||
   5106        (!p_dev_rec->is_originator &&
   5107         (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) {
   5108     BTM_TRACE_EVENT(
   5109         "service id:%d, is trusted:%d", p_dev_rec->p_cur_service->service_id,
   5110         (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
   5111                                     p_dev_rec->p_cur_service->service_id)));
   5112     if ((!btm_sec_are_all_trusted(p_dev_rec->trusted_mask)) &&
   5113         (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) &&
   5114         (!BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
   5115                                      p_dev_rec->p_cur_service->service_id))) {
   5116       BTM_TRACE_EVENT("Security Manager: Start authorization");
   5117       return (btm_sec_start_authorization(p_dev_rec));
   5118     }
   5119   }
   5120 
   5121   /* All required  security procedures already established */
   5122   p_dev_rec->security_required &=
   5123       ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE |
   5124         BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE |
   5125         BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT | BTM_SEC_FORCE_MASTER |
   5126         BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
   5127 
   5128   BTM_TRACE_EVENT("Security Manager: trusted:0x%04x%04x",
   5129                   p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
   5130   BTM_TRACE_EVENT("Security Manager: access granted");
   5131 
   5132   return (BTM_SUCCESS);
   5133 }
   5134 
   5135 /*******************************************************************************
   5136  *
   5137  * Function         btm_sec_start_get_name
   5138  *
   5139  * Description      This function is called to start get name procedure
   5140  *
   5141  * Returns          true if started
   5142  *
   5143  ******************************************************************************/
   5144 static bool btm_sec_start_get_name(tBTM_SEC_DEV_REC* p_dev_rec) {
   5145   uint8_t tempstate = p_dev_rec->sec_state;
   5146 
   5147   p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME;
   5148 
   5149   /* 0 and NULL are as timeout and callback params because they are not used in
   5150    * security get name case */
   5151   if ((btm_initiate_rem_name(p_dev_rec->bd_addr, BTM_RMT_NAME_SEC, 0, NULL)) !=
   5152       BTM_CMD_STARTED) {
   5153     p_dev_rec->sec_state = tempstate;
   5154     return (false);
   5155   }
   5156 
   5157   return (true);
   5158 }
   5159 
   5160 /*******************************************************************************
   5161  *
   5162  * Function         btm_sec_start_authentication
   5163  *
   5164  * Description      This function is called to start authentication
   5165  *
   5166  ******************************************************************************/
   5167 static void btm_sec_start_authentication(tBTM_SEC_DEV_REC* p_dev_rec) {
   5168   p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
   5169   btsnd_hcic_auth_request(p_dev_rec->hci_handle);
   5170 }
   5171 
   5172 /*******************************************************************************
   5173  *
   5174  * Function         btm_sec_start_encryption
   5175  *
   5176  * Description      This function is called to start encryption
   5177  *
   5178  ******************************************************************************/
   5179 static void btm_sec_start_encryption(tBTM_SEC_DEV_REC* p_dev_rec) {
   5180   btsnd_hcic_set_conn_encrypt(p_dev_rec->hci_handle, true);
   5181   p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
   5182 }
   5183 
   5184 /*******************************************************************************
   5185  *
   5186  * Function         btm_sec_start_authorization
   5187  *
   5188  * Description      This function is called to start authorization
   5189  *
   5190  * Returns          true if started
   5191  *
   5192  ******************************************************************************/
   5193 static uint8_t btm_sec_start_authorization(tBTM_SEC_DEV_REC* p_dev_rec) {
   5194   uint8_t result;
   5195   uint8_t* p_service_name = NULL;
   5196   uint8_t service_id;
   5197 
   5198   if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) ||
   5199       (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) {
   5200     if (!btm_cb.api.p_authorize_callback) return (BTM_MODE_UNSUPPORTED);
   5201 
   5202     if (p_dev_rec->p_cur_service) {
   5203 #if BTM_SEC_SERVICE_NAME_LEN > 0
   5204       if (p_dev_rec->is_originator)
   5205         p_service_name = p_dev_rec->p_cur_service->orig_service_name;
   5206       else
   5207         p_service_name = p_dev_rec->p_cur_service->term_service_name;
   5208 #endif
   5209       service_id = p_dev_rec->p_cur_service->service_id;
   5210     } else
   5211       service_id = 0;
   5212 
   5213     /* Send authorization request if not already sent during this service
   5214      * connection */
   5215     if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID ||
   5216         p_dev_rec->last_author_service_id != service_id) {
   5217       p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING;
   5218       result = (*btm_cb.api.p_authorize_callback)(
   5219           p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   5220           p_service_name, service_id, p_dev_rec->is_originator);
   5221     }
   5222 
   5223     else /* Already authorized once for this L2CAP bringup */
   5224     {
   5225       BTM_TRACE_DEBUG(
   5226           "btm_sec_start_authorization: (Ignoring extra Authorization prompt "
   5227           "for service %d)",
   5228           service_id);
   5229       return (BTM_SUCCESS);
   5230     }
   5231 
   5232     if (result == BTM_SUCCESS) {
   5233       p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED;
   5234 
   5235       /* Save the currently authorized service in case we are asked again by
   5236        * another multiplexer layer */
   5237       if (!p_dev_rec->is_originator)
   5238         p_dev_rec->last_author_service_id = service_id;
   5239 
   5240       p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   5241     }
   5242     return (result);
   5243   }
   5244   btm_sec_start_get_name(p_dev_rec);
   5245   return (BTM_CMD_STARTED);
   5246 }
   5247 
   5248 /*******************************************************************************
   5249  *
   5250  * Function         btm_sec_are_all_trusted
   5251  *
   5252  * Description      This function is called check if all services are trusted
   5253  *
   5254  * Returns          true if all are trusted, otherwise false
   5255  *
   5256  ******************************************************************************/
   5257 bool btm_sec_are_all_trusted(uint32_t p_mask[]) {
   5258   uint32_t trusted_inx;
   5259   for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE;
   5260        trusted_inx++) {
   5261     if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) return (false);
   5262   }
   5263 
   5264   return (true);
   5265 }
   5266 
   5267 /*******************************************************************************
   5268  *
   5269  * Function         btm_sec_find_first_serv
   5270  *
   5271  * Description      Look for the first record in the service database
   5272  *                  with specified PSM
   5273  *
   5274  * Returns          Pointer to the record or NULL
   5275  *
   5276  ******************************************************************************/
   5277 tBTM_SEC_SERV_REC* btm_sec_find_first_serv(CONNECTION_TYPE conn_type,
   5278                                            uint16_t psm) {
   5279   tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0];
   5280   int i;
   5281   bool is_originator = conn_type;
   5282 
   5283   if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) {
   5284     /* If this is outgoing connection and the PSM matches p_out_serv,
   5285      * use it as the current service */
   5286     return btm_cb.p_out_serv;
   5287   }
   5288 
   5289   /* otherwise, just find the first record with the specified PSM */
   5290   for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) {
   5291     if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) &&
   5292         (p_serv_rec->psm == psm))
   5293       return (p_serv_rec);
   5294   }
   5295   return (NULL);
   5296 }
   5297 
   5298 /*******************************************************************************
   5299  *
   5300  * Function         btm_sec_find_next_serv
   5301  *
   5302  * Description      Look for the next record in the service database
   5303  *                  with specified PSM
   5304  *
   5305  * Returns          Pointer to the record or NULL
   5306  *
   5307  ******************************************************************************/
   5308 static tBTM_SEC_SERV_REC* btm_sec_find_next_serv(tBTM_SEC_SERV_REC* p_cur) {
   5309   tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0];
   5310   int i;
   5311 
   5312   for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) {
   5313     if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) &&
   5314         (p_serv_rec->psm == p_cur->psm)) {
   5315       if (p_cur != p_serv_rec) {
   5316         return (p_serv_rec);
   5317       }
   5318     }
   5319   }
   5320   return (NULL);
   5321 }
   5322 
   5323 /*******************************************************************************
   5324  *
   5325  * Function         btm_sec_find_mx_serv
   5326  *
   5327  * Description      Look for the record in the service database with specified
   5328  *                  PSM and multiplexor channel information
   5329  *
   5330  * Returns          Pointer to the record or NULL
   5331  *
   5332  ******************************************************************************/
   5333 static tBTM_SEC_SERV_REC* btm_sec_find_mx_serv(uint8_t is_originator,
   5334                                                uint16_t psm,
   5335                                                uint32_t mx_proto_id,
   5336                                                uint32_t mx_chan_id) {
   5337   tBTM_SEC_SERV_REC* p_out_serv = btm_cb.p_out_serv;
   5338   tBTM_SEC_SERV_REC* p_serv_rec = &btm_cb.sec_serv_rec[0];
   5339   int i;
   5340 
   5341   BTM_TRACE_DEBUG("%s()", __func__);
   5342   if (is_originator && p_out_serv && p_out_serv->psm == psm &&
   5343       p_out_serv->mx_proto_id == mx_proto_id &&
   5344       p_out_serv->orig_mx_chan_id == mx_chan_id) {
   5345     /* If this is outgoing connection and the parameters match p_out_serv,
   5346      * use it as the current service */
   5347     return btm_cb.p_out_serv;
   5348   }
   5349 
   5350   /* otherwise, the old way */
   5351   for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) {
   5352     if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) &&
   5353         (p_serv_rec->psm == psm) && (p_serv_rec->mx_proto_id == mx_proto_id) &&
   5354         ((is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) ||
   5355          (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) {
   5356       return (p_serv_rec);
   5357     }
   5358   }
   5359   return (NULL);
   5360 }
   5361 
   5362 /*******************************************************************************
   5363  *
   5364  * Function         btm_sec_collision_timeout
   5365  *
   5366  * Description      Encryption could not start because of the collision
   5367  *                  try to do it again
   5368  *
   5369  * Returns          Pointer to the TLE struct
   5370  *
   5371  ******************************************************************************/
   5372 static void btm_sec_collision_timeout(UNUSED_ATTR void* data) {
   5373   BTM_TRACE_EVENT("%s()", __func__);
   5374 
   5375   tBTM_STATUS status = btm_sec_execute_procedure(btm_cb.p_collided_dev_rec);
   5376 
   5377   /* If result is pending reply from the user or from the device is pending */
   5378   if (status != BTM_CMD_STARTED) {
   5379     /* There is no next procedure or start of procedure failed, notify the
   5380      * waiting layer */
   5381     btm_sec_dev_rec_cback_event(btm_cb.p_collided_dev_rec, status, false);
   5382   }
   5383 }
   5384 
   5385 /*******************************************************************************
   5386  *
   5387  * Function         btm_send_link_key_notif
   5388  *
   5389  * Description      Call the link key callback.
   5390  *
   5391  * Returns          void
   5392  *
   5393  ******************************************************************************/
   5394 static void btm_send_link_key_notif(tBTM_SEC_DEV_REC* p_dev_rec) {
   5395   if (btm_cb.api.p_link_key_callback)
   5396     (*btm_cb.api.p_link_key_callback)(
   5397         p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   5398         p_dev_rec->link_key, p_dev_rec->link_key_type);
   5399 }
   5400 
   5401 /*******************************************************************************
   5402  *
   5403  * Function         BTM_ReadTrustedMask
   5404  *
   5405  * Description      Get trusted mask for the peer device
   5406  *
   5407  * Parameters:      bd_addr   - Address of the device
   5408  *
   5409  * Returns          NULL, if the device record is not found.
   5410  *                  otherwise, the trusted mask
   5411  *
   5412  ******************************************************************************/
   5413 uint32_t* BTM_ReadTrustedMask(const RawAddress& bd_addr) {
   5414   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
   5415   if (p_dev_rec != NULL) return (p_dev_rec->trusted_mask);
   5416   return NULL;
   5417 }
   5418 
   5419 /*******************************************************************************
   5420  *
   5421  * Function         btm_restore_mode
   5422  *
   5423  * Description      This function returns the security mode to previous setting
   5424  *                  if it was changed during bonding.
   5425  *
   5426  *
   5427  * Parameters:      void
   5428  *
   5429  ******************************************************************************/
   5430 static void btm_restore_mode(void) {
   5431   if (btm_cb.security_mode_changed) {
   5432     btm_cb.security_mode_changed = false;
   5433     BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__,
   5434                     (btm_cb.security_mode == BTM_SEC_MODE_LINK));
   5435     btsnd_hcic_write_auth_enable(
   5436         (uint8_t)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
   5437   }
   5438 
   5439   if (btm_cb.pin_type_changed) {
   5440     btm_cb.pin_type_changed = false;
   5441     btsnd_hcic_write_pin_type(btm_cb.cfg.pin_type);
   5442   }
   5443 }
   5444 
   5445 bool is_sec_state_equal(void* data, void* context) {
   5446   tBTM_SEC_DEV_REC* p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(data);
   5447   uint8_t* state = static_cast<uint8_t*>(context);
   5448 
   5449   if (p_dev_rec->sec_state == *state) return false;
   5450 
   5451   return true;
   5452 }
   5453 
   5454 /*******************************************************************************
   5455  *
   5456  * Function         btm_sec_find_dev_by_sec_state
   5457  *
   5458  * Description      Look for the record in the device database for the device
   5459  *                  which is being authenticated or encrypted
   5460  *
   5461  * Returns          Pointer to the record or NULL
   5462  *
   5463  ******************************************************************************/
   5464 tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state) {
   5465   list_node_t* n = list_foreach(btm_cb.sec_dev_rec, is_sec_state_equal, &state);
   5466   if (n) return static_cast<tBTM_SEC_DEV_REC*>(list_node(n));
   5467 
   5468   return NULL;
   5469 }
   5470 
   5471 /*******************************************************************************
   5472  *
   5473  * Function         btm_sec_change_pairing_state
   5474  *
   5475  * Description      This function is called to change pairing state
   5476  *
   5477  ******************************************************************************/
   5478 static void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state) {
   5479   tBTM_PAIRING_STATE old_state = btm_cb.pairing_state;
   5480 
   5481   BTM_TRACE_EVENT("%s()  Old: %s", __func__,
   5482                   btm_pair_state_descr(btm_cb.pairing_state));
   5483   BTM_TRACE_EVENT("%s()  New: %s pairing_flags:0x%x", __func__,
   5484                   btm_pair_state_descr(new_state), btm_cb.pairing_flags);
   5485 
   5486   btm_cb.pairing_state = new_state;
   5487 
   5488   if (new_state == BTM_PAIR_STATE_IDLE) {
   5489     alarm_cancel(btm_cb.pairing_timer);
   5490 
   5491     btm_cb.pairing_flags = 0;
   5492     btm_cb.pin_code_len = 0;
   5493 
   5494     /* Make sure the the lcb shows we are not bonding */
   5495     l2cu_update_lcb_4_bonding(btm_cb.pairing_bda, false);
   5496 
   5497     btm_restore_mode();
   5498     btm_sec_check_pending_reqs();
   5499     btm_inq_clear_ssp();
   5500 
   5501     btm_cb.pairing_bda = RawAddress::kAny;
   5502   } else {
   5503     /* If transitioning out of idle, mark the lcb as bonding */
   5504     if (old_state == BTM_PAIR_STATE_IDLE)
   5505       l2cu_update_lcb_4_bonding(btm_cb.pairing_bda, true);
   5506 
   5507     alarm_set_on_mloop(btm_cb.pairing_timer, BTM_SEC_TIMEOUT_VALUE * 1000,
   5508                        btm_sec_pairing_timeout, NULL);
   5509   }
   5510 }
   5511 
   5512 /*******************************************************************************
   5513  *
   5514  * Function         btm_pair_state_descr
   5515  *
   5516  * Description      Return state description for tracing
   5517  *
   5518  ******************************************************************************/
   5519 static const char* btm_pair_state_descr(tBTM_PAIRING_STATE state) {
   5520   switch (state) {
   5521     case BTM_PAIR_STATE_IDLE:
   5522       return ("IDLE");
   5523     case BTM_PAIR_STATE_GET_REM_NAME:
   5524       return ("GET_REM_NAME");
   5525     case BTM_PAIR_STATE_WAIT_PIN_REQ:
   5526       return ("WAIT_PIN_REQ");
   5527     case BTM_PAIR_STATE_WAIT_LOCAL_PIN:
   5528       return ("WAIT_LOCAL_PIN");
   5529     case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:
   5530       return ("WAIT_NUM_CONFIRM");
   5531     case BTM_PAIR_STATE_KEY_ENTRY:
   5532       return ("KEY_ENTRY");
   5533     case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:
   5534       return ("WAIT_LOCAL_OOB_RSP");
   5535     case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:
   5536       return ("WAIT_LOCAL_IOCAPS");
   5537     case BTM_PAIR_STATE_INCOMING_SSP:
   5538       return ("INCOMING_SSP");
   5539     case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:
   5540       return ("WAIT_AUTH_COMPLETE");
   5541     case BTM_PAIR_STATE_WAIT_DISCONNECT:
   5542       return ("WAIT_DISCONNECT");
   5543   }
   5544 
   5545   return ("???");
   5546 }
   5547 
   5548 /*******************************************************************************
   5549  *
   5550  * Function         btm_sec_dev_rec_cback_event
   5551  *
   5552  * Description      This function calls the callback function with the given
   5553  *                  result and clear the callback function.
   5554  *
   5555  * Parameters:      void
   5556  *
   5557  ******************************************************************************/
   5558 void btm_sec_dev_rec_cback_event(tBTM_SEC_DEV_REC* p_dev_rec, uint8_t res,
   5559                                  bool is_le_transport) {
   5560   tBTM_SEC_CALLBACK* p_callback = p_dev_rec->p_callback;
   5561 
   5562   BTM_TRACE_DEBUG("%s: p_callback=%p, is_le_transport=%d, res=%d, p_dev_rec=%p",
   5563                   __func__, p_dev_rec->p_callback, is_le_transport, res,
   5564                   p_dev_rec);
   5565 
   5566   if (p_dev_rec->p_callback) {
   5567     p_dev_rec->p_callback = NULL;
   5568 
   5569     if (is_le_transport)
   5570       (*p_callback)(&p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE,
   5571                     p_dev_rec->p_ref_data, res);
   5572     else
   5573       (*p_callback)(&p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR,
   5574                     p_dev_rec->p_ref_data, res);
   5575   }
   5576 
   5577   btm_sec_check_pending_reqs();
   5578 }
   5579 
   5580 /*******************************************************************************
   5581  *
   5582  * Function         btm_sec_queue_mx_request
   5583  *
   5584  * Description      Return state description for tracing
   5585  *
   5586  ******************************************************************************/
   5587 static bool btm_sec_queue_mx_request(const RawAddress& bd_addr, uint16_t psm,
   5588                                      bool is_orig, uint32_t mx_proto_id,
   5589                                      uint32_t mx_chan_id,
   5590                                      tBTM_SEC_CALLBACK* p_callback,
   5591                                      void* p_ref_data) {
   5592   tBTM_SEC_QUEUE_ENTRY* p_e =
   5593       (tBTM_SEC_QUEUE_ENTRY*)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY));
   5594 
   5595   p_e->psm = psm;
   5596   p_e->is_orig = is_orig;
   5597   p_e->p_callback = p_callback;
   5598   p_e->p_ref_data = p_ref_data;
   5599   p_e->mx_proto_id = mx_proto_id;
   5600   p_e->mx_chan_id = mx_chan_id;
   5601   p_e->transport = BT_TRANSPORT_BR_EDR;
   5602   p_e->sec_act = 0;
   5603   p_e->bd_addr = bd_addr;
   5604 
   5605   BTM_TRACE_EVENT(
   5606       "%s() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
   5607       __func__, psm, is_orig, mx_proto_id, mx_chan_id);
   5608 
   5609   fixed_queue_enqueue(btm_cb.sec_pending_q, p_e);
   5610 
   5611   return true;
   5612 }
   5613 
   5614 static bool btm_sec_check_prefetch_pin(tBTM_SEC_DEV_REC* p_dev_rec) {
   5615   uint8_t major = (uint8_t)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK);
   5616   uint8_t minor = (uint8_t)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK);
   5617   bool rv = false;
   5618 
   5619   if ((major == BTM_COD_MAJOR_AUDIO) &&
   5620       ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) ||
   5621        (minor == BTM_COD_MINOR_CAR_AUDIO))) {
   5622     BTM_TRACE_EVENT(
   5623         "%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: "
   5624         "0x%02x",
   5625         __func__, major, minor);
   5626 
   5627     if (!btm_cb.security_mode_changed) {
   5628       btm_cb.security_mode_changed = true;
   5629 #ifdef APPL_AUTH_WRITE_EXCEPTION
   5630       if (!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
   5631 #endif
   5632         btsnd_hcic_write_auth_enable(true);
   5633     }
   5634   } else {
   5635     btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN);
   5636 
   5637     /* If we got a PIN, use that, else try to get one */
   5638     if (btm_cb.pin_code_len) {
   5639       BTM_PINCodeReply(p_dev_rec->bd_addr, BTM_SUCCESS, btm_cb.pin_code_len,
   5640                        btm_cb.pin_code, p_dev_rec->trusted_mask);
   5641     } else {
   5642       /* pin was not supplied - pre-fetch pin code now */
   5643       if (btm_cb.api.p_pin_callback &&
   5644           ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) {
   5645         BTM_TRACE_DEBUG("%s() PIN code callback called", __func__);
   5646         if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
   5647           btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
   5648         (btm_cb.api.p_pin_callback)(
   5649             p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
   5650             (p_dev_rec->p_cur_service == NULL)
   5651                 ? false
   5652                 : (p_dev_rec->p_cur_service->security_flags &
   5653                    BTM_SEC_IN_MIN_16_DIGIT_PIN));
   5654       }
   5655     }
   5656 
   5657     rv = true;
   5658   }
   5659 
   5660   return rv;
   5661 }
   5662 
   5663 /*******************************************************************************
   5664  *
   5665  * Function         btm_sec_auth_payload_tout
   5666  *
   5667  * Description      Processes the HCI Autheniticated Payload Timeout Event
   5668  *                  indicating that a packet containing a valid MIC on the
   5669  *                  connection handle was not received within the programmed
   5670  *                  timeout value. (Spec Default is 30 secs, but can be
   5671  *                  changed via the BTM_SecSetAuthPayloadTimeout() function.
   5672  *
   5673  ******************************************************************************/
   5674 void btm_sec_auth_payload_tout(uint8_t* p, uint16_t hci_evt_len) {
   5675   uint16_t handle;
   5676 
   5677   STREAM_TO_UINT16(handle, p);
   5678   handle = HCID_GET_HANDLE(handle);
   5679 
   5680   /* Will be exposed to upper layers in the future if/when determined necessary
   5681    */
   5682   BTM_TRACE_ERROR("%s on handle 0x%02x", __func__, handle);
   5683 }
   5684 
   5685 /*******************************************************************************
   5686  *
   5687  * Function         btm_sec_queue_encrypt_request
   5688  *
   5689  * Description      encqueue encryption request when device has active security
   5690  *                  process pending.
   5691  *
   5692  ******************************************************************************/
   5693 static bool btm_sec_queue_encrypt_request(const RawAddress& bd_addr,
   5694                                           tBT_TRANSPORT transport,
   5695                                           tBTM_SEC_CALLBACK* p_callback,
   5696                                           void* p_ref_data,
   5697                                           tBTM_BLE_SEC_ACT sec_act) {
   5698   tBTM_SEC_QUEUE_ENTRY* p_e =
   5699       (tBTM_SEC_QUEUE_ENTRY*)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1);
   5700 
   5701   p_e->psm = 0; /* if PSM 0, encryption request */
   5702   p_e->p_callback = p_callback;
   5703   p_e->p_ref_data = p_ref_data;
   5704   p_e->transport = transport;
   5705   p_e->sec_act = sec_act;
   5706   p_e->bd_addr = bd_addr;
   5707   fixed_queue_enqueue(btm_cb.sec_pending_q, p_e);
   5708 
   5709   return true;
   5710 }
   5711 
   5712 /*******************************************************************************
   5713  *
   5714  * Function         btm_sec_set_peer_sec_caps
   5715  *
   5716  * Description      This function is called to set sm4 and rmt_sec_caps fields
   5717  *                  based on the available peer device features.
   5718  *
   5719  * Returns          void
   5720  *
   5721  ******************************************************************************/
   5722 void btm_sec_set_peer_sec_caps(tACL_CONN* p_acl_cb,
   5723                                tBTM_SEC_DEV_REC* p_dev_rec) {
   5724   if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
   5725        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
   5726        btm_cb.security_mode == BTM_SEC_MODE_SC) &&
   5727       HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_feature_pages[1])) {
   5728     p_dev_rec->sm4 = BTM_SM4_TRUE;
   5729     p_dev_rec->remote_supports_secure_connections =
   5730         (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_feature_pages[1]));
   5731   } else {
   5732     p_dev_rec->sm4 = BTM_SM4_KNOWN;
   5733     p_dev_rec->remote_supports_secure_connections = false;
   5734   }
   5735 
   5736   BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d",
   5737                 __func__, p_dev_rec->sm4,
   5738                 p_dev_rec->remote_supports_secure_connections);
   5739 
   5740   if (p_dev_rec->remote_features_needed) {
   5741     BTM_TRACE_EVENT(
   5742         "%s: Now device in SC Only mode, waiting for peer remote features!",
   5743         __func__);
   5744     btm_io_capabilities_req(p_dev_rec->bd_addr);
   5745     p_dev_rec->remote_features_needed = false;
   5746   }
   5747 }
   5748 
   5749 /*******************************************************************************
   5750  *
   5751  * Function         btm_sec_is_serv_level0
   5752  *
   5753  * Description      This function is called to check if the service
   5754  *                  corresponding to PSM is security mode 4 level 0 service.
   5755  *
   5756  * Returns          true if the service is security mode 4 level 0 service
   5757  *
   5758  ******************************************************************************/
   5759 static bool btm_sec_is_serv_level0(uint16_t psm) {
   5760   if (psm == BT_PSM_SDP) {
   5761     BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __func__, psm);
   5762     return true;
   5763   }
   5764   return false;
   5765 }
   5766 
   5767 /*******************************************************************************
   5768  *
   5769  * Function         btm_sec_check_pending_enc_req
   5770  *
   5771  * Description      This function is called to send pending encryption callback
   5772  *                  if waiting
   5773  *
   5774  * Returns          void
   5775  *
   5776  ******************************************************************************/
   5777 static void btm_sec_check_pending_enc_req(tBTM_SEC_DEV_REC* p_dev_rec,
   5778                                           tBT_TRANSPORT transport,
   5779                                           uint8_t encr_enable) {
   5780   if (fixed_queue_is_empty(btm_cb.sec_pending_q)) return;
   5781 
   5782   uint8_t res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
   5783   list_t* list = fixed_queue_get_list(btm_cb.sec_pending_q);
   5784   for (const list_node_t* node = list_begin(list); node != list_end(list);) {
   5785     tBTM_SEC_QUEUE_ENTRY* p_e = (tBTM_SEC_QUEUE_ENTRY*)list_node(node);
   5786     node = list_next(node);
   5787 
   5788     if (p_e->bd_addr == p_dev_rec->bd_addr && p_e->psm == 0 &&
   5789         p_e->transport == transport) {
   5790       if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR ||
   5791           p_e->sec_act == BTM_BLE_SEC_ENCRYPT ||
   5792           p_e->sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM ||
   5793           (p_e->sec_act == BTM_BLE_SEC_ENCRYPT_MITM &&
   5794            p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) {
   5795         if (p_e->p_callback)
   5796           (*p_e->p_callback)(&p_dev_rec->bd_addr, transport, p_e->p_ref_data,
   5797                              res);
   5798         fixed_queue_try_remove_from_queue(btm_cb.sec_pending_q, (void*)p_e);
   5799       }
   5800     }
   5801   }
   5802 }
   5803 
   5804 /*******************************************************************************
   5805  *
   5806  * Function         btm_sec_set_serv_level4_flags
   5807  *
   5808  * Description      This function is called to set security mode 4 level 4
   5809  *                  flags.
   5810  *
   5811  * Returns          service security requirements updated to include secure
   5812  *                  connections only mode.
   5813  *
   5814  ******************************************************************************/
   5815 static uint16_t btm_sec_set_serv_level4_flags(uint16_t cur_security,
   5816                                               bool is_originator) {
   5817   uint16_t sec_level4_flags =
   5818       is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS;
   5819 
   5820   return cur_security | sec_level4_flags;
   5821 }
   5822 
   5823 /*******************************************************************************
   5824  *
   5825  * Function         btm_sec_clear_ble_keys
   5826  *
   5827  * Description      This function is called to clear out the BLE keys.
   5828  *                  Typically when devices are removed in BTM_SecDeleteDevice,
   5829  *                  or when a new BT Link key is generated.
   5830  *
   5831  * Returns          void
   5832  *
   5833  ******************************************************************************/
   5834 void btm_sec_clear_ble_keys(tBTM_SEC_DEV_REC* p_dev_rec) {
   5835   BTM_TRACE_DEBUG("%s() Clearing BLE Keys", __func__);
   5836   p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
   5837   memset(&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
   5838 
   5839 #if (BLE_PRIVACY_SPT == TRUE)
   5840   btm_ble_resolving_list_remove_dev(p_dev_rec);
   5841 #endif
   5842 }
   5843 
   5844 /*******************************************************************************
   5845  *
   5846  * Function         btm_sec_is_a_bonded_dev
   5847  *
   5848  * Description       Is the specified device is a bonded device
   5849  *
   5850  * Returns          true - dev is bonded
   5851  *
   5852  ******************************************************************************/
   5853 bool btm_sec_is_a_bonded_dev(const RawAddress& bda) {
   5854   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
   5855   bool is_bonded = false;
   5856 
   5857   if (p_dev_rec && ((p_dev_rec->ble.key_type &&
   5858                      (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN)) ||
   5859                     (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) {
   5860     is_bonded = true;
   5861   }
   5862   BTM_TRACE_DEBUG("%s() is_bonded=%d", __func__, is_bonded);
   5863   return (is_bonded);
   5864 }
   5865 
   5866 /*******************************************************************************
   5867  *
   5868  * Function         btm_sec_is_le_capable_dev
   5869  *
   5870  * Description       Is the specified device is dual mode or LE only device
   5871  *
   5872  * Returns          true - dev is a dual mode
   5873  *
   5874  ******************************************************************************/
   5875 bool btm_sec_is_le_capable_dev(const RawAddress& bda) {
   5876   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bda);
   5877   bool le_capable = false;
   5878 
   5879   if (p_dev_rec &&
   5880       (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE)
   5881     le_capable = true;
   5882   return le_capable;
   5883 }
   5884 
   5885 /*******************************************************************************
   5886  *
   5887  * Function         btm_sec_use_smp_br_chnl
   5888  *
   5889  * Description      The function checks if SMP BR connection can be used with
   5890  *                  the peer.
   5891  *                  Is called when authentication for dedicated bonding is
   5892  *                  successfully completed.
   5893  *
   5894  * Returns          true - if SMP BR connection can be used (the link key is
   5895  *                         generated from P-256 and the peer supports Security
   5896  *                         Manager over BR).
   5897  *
   5898  ******************************************************************************/
   5899 static bool btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC* p_dev_rec) {
   5900   uint32_t ext_feat;
   5901   uint8_t chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE];
   5902 
   5903   BTM_TRACE_DEBUG("%s() link_key_type = 0x%x", __func__,
   5904                   p_dev_rec->link_key_type);
   5905 
   5906   if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) &&
   5907       (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
   5908     return false;
   5909 
   5910   if (!L2CA_GetPeerFeatures(p_dev_rec->bd_addr, &ext_feat, chnl_mask))
   5911     return false;
   5912 
   5913   if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT)) return false;
   5914 
   5915   return true;
   5916 }
   5917 
   5918 /*******************************************************************************
   5919  *
   5920  * Function         btm_sec_is_master
   5921  *
   5922  * Description      The function checks if the device is BR/EDR master after
   5923  *                  pairing is completed.
   5924  *
   5925  * Returns          true - if the device is master.
   5926  *
   5927  ******************************************************************************/
   5928 static bool btm_sec_is_master(tBTM_SEC_DEV_REC* p_dev_rec) {
   5929   tACL_CONN* p = btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
   5930   return (p && (p->link_role == BTM_ROLE_MASTER));
   5931 }
   5932