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