1 /* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the copyright holders nor the names of 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 4. Any redistribution, use, or modification is done solely for 17 * personal benefit and not for any commercial purpose or for 18 * monetary gain. 19 * 20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24 * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * Please inquire about commercial licensing options at 34 * [email protected] 35 * 36 */ 37 38 #define BTSTACK_FILE__ "sm.c" 39 40 #include <string.h> 41 #include <inttypes.h> 42 43 #include "ble/le_device_db.h" 44 #include "ble/core.h" 45 #include "ble/sm.h" 46 #include "bluetooth_company_id.h" 47 #include "btstack_bool.h" 48 #include "btstack_crypto.h" 49 #include "btstack_debug.h" 50 #include "btstack_event.h" 51 #include "btstack_linked_list.h" 52 #include "btstack_memory.h" 53 #include "btstack_tlv.h" 54 #include "gap.h" 55 #include "hci.h" 56 #include "hci_dump.h" 57 #include "l2cap.h" 58 59 #if !defined(ENABLE_LE_PERIPHERAL) && !defined(ENABLE_LE_CENTRAL) 60 #error "LE Security Manager used, but neither ENABLE_LE_PERIPHERAL nor ENABLE_LE_CENTRAL defined. Please add at least one to btstack_config.h." 61 #endif 62 63 #if defined(ENABLE_CROSS_TRANSPORT_KEY_DERIVATION) && (!defined(ENABLE_CLASSIC) || !defined(ENABLE_LE_SECURE_CONNECTIONS)) 64 #error "Cross Transport Key Derivation requires support for LE Secure Connections and BR/EDR (Classic)" 65 #endif 66 67 // assert SM Public Key can be sent/received 68 #ifdef ENABLE_LE_SECURE_CONNECTIONS 69 #if HCI_ACL_PAYLOAD_SIZE < 69 70 #error "HCI_ACL_PAYLOAD_SIZE must be at least 69 bytes when using LE Secure Conection. Please increase HCI_ACL_PAYLOAD_SIZE or disable ENABLE_LE_SECURE_CONNECTIONS" 71 #endif 72 #endif 73 74 #if defined(ENABLE_LE_PERIPHERAL) && defined(ENABLE_LE_CENTRAL) 75 #define IS_RESPONDER(role) ((role) == HCI_ROLE_SLAVE) 76 #else 77 #ifdef ENABLE_LE_CENTRAL 78 // only central - never responder (avoid 'unused variable' warnings) 79 #define IS_RESPONDER(role) (0 && ((role) == HCI_ROLE_SLAVE)) 80 #else 81 // only peripheral - always responder (avoid 'unused variable' warnings) 82 #define IS_RESPONDER(role) (1 || ((role) == HCI_ROLE_SLAVE)) 83 #endif 84 #endif 85 86 #if defined(ENABLE_LE_SIGNED_WRITE) || defined(ENABLE_LE_SECURE_CONNECTIONS) 87 #define USE_CMAC_ENGINE 88 #endif 89 90 91 #define BTSTACK_TAG32(A,B,C,D) (((A) << 24) | ((B) << 16) | ((C) << 8) | (D)) 92 93 // 94 // SM internal types and globals 95 // 96 97 typedef enum { 98 DKG_W4_WORKING, 99 DKG_CALC_IRK, 100 DKG_CALC_DHK, 101 DKG_READY 102 } derived_key_generation_t; 103 104 typedef enum { 105 RAU_IDLE, 106 RAU_GET_RANDOM, 107 RAU_W4_RANDOM, 108 RAU_GET_ENC, 109 RAU_W4_ENC, 110 } random_address_update_t; 111 112 typedef enum { 113 CMAC_IDLE, 114 CMAC_CALC_SUBKEYS, 115 CMAC_W4_SUBKEYS, 116 CMAC_CALC_MI, 117 CMAC_W4_MI, 118 CMAC_CALC_MLAST, 119 CMAC_W4_MLAST 120 } cmac_state_t; 121 122 typedef enum { 123 JUST_WORKS, 124 PK_RESP_INPUT, // Initiator displays PK, responder inputs PK 125 PK_INIT_INPUT, // Responder displays PK, initiator inputs PK 126 PK_BOTH_INPUT, // Only input on both, both input PK 127 NUMERIC_COMPARISON, // Only numerical compparison (yes/no) on on both sides 128 OOB // OOB available on one (SC) or both sides (legacy) 129 } stk_generation_method_t; 130 131 typedef enum { 132 SM_USER_RESPONSE_IDLE, 133 SM_USER_RESPONSE_PENDING, 134 SM_USER_RESPONSE_CONFIRM, 135 SM_USER_RESPONSE_PASSKEY, 136 SM_USER_RESPONSE_DECLINE 137 } sm_user_response_t; 138 139 typedef enum { 140 SM_AES128_IDLE, 141 SM_AES128_ACTIVE 142 } sm_aes128_state_t; 143 144 typedef enum { 145 ADDRESS_RESOLUTION_IDLE, 146 ADDRESS_RESOLUTION_GENERAL, 147 ADDRESS_RESOLUTION_FOR_CONNECTION, 148 } address_resolution_mode_t; 149 150 typedef enum { 151 ADDRESS_RESOLUTION_SUCCEEDED, 152 ADDRESS_RESOLUTION_FAILED, 153 } address_resolution_event_t; 154 155 typedef enum { 156 EC_KEY_GENERATION_IDLE, 157 EC_KEY_GENERATION_ACTIVE, 158 EC_KEY_GENERATION_DONE, 159 } ec_key_generation_state_t; 160 161 typedef enum { 162 SM_STATE_VAR_DHKEY_NEEDED = 1 << 0, 163 SM_STATE_VAR_DHKEY_CALCULATED = 1 << 1, 164 SM_STATE_VAR_DHKEY_COMMAND_RECEIVED = 1 << 2, 165 } sm_state_var_t; 166 167 typedef enum { 168 SM_SC_OOB_IDLE, 169 SM_SC_OOB_W4_RANDOM, 170 SM_SC_OOB_W2_CALC_CONFIRM, 171 SM_SC_OOB_W4_CONFIRM, 172 } sm_sc_oob_state_t; 173 174 typedef uint8_t sm_key24_t[3]; 175 typedef uint8_t sm_key56_t[7]; 176 typedef uint8_t sm_key256_t[32]; 177 178 // 179 // GLOBAL DATA 180 // 181 182 static bool sm_initialized; 183 184 static bool test_use_fixed_local_csrk; 185 static bool test_use_fixed_local_irk; 186 187 #ifdef ENABLE_TESTING_SUPPORT 188 static uint8_t test_pairing_failure; 189 #endif 190 191 // configuration 192 static uint8_t sm_accepted_stk_generation_methods; 193 static uint8_t sm_max_encryption_key_size; 194 static uint8_t sm_min_encryption_key_size; 195 static uint8_t sm_auth_req = 0; 196 static uint8_t sm_io_capabilities = IO_CAPABILITY_NO_INPUT_NO_OUTPUT; 197 static uint32_t sm_fixed_passkey_in_display_role; 198 static bool sm_reconstruct_ltk_without_le_device_db_entry; 199 200 #ifdef ENABLE_LE_PERIPHERAL 201 static bool sm_slave_request_security; 202 #endif 203 204 #ifdef ENABLE_LE_SECURE_CONNECTIONS 205 static bool sm_sc_only_mode; 206 static uint8_t sm_sc_oob_random[16]; 207 static void (*sm_sc_oob_callback)(const uint8_t * confirm_value, const uint8_t * random_value); 208 static sm_sc_oob_state_t sm_sc_oob_state; 209 #ifdef ENABLE_LE_SECURE_CONNECTIONS_DEBUG_KEY 210 static bool sm_sc_debug_keys_enabled; 211 #endif 212 #endif 213 214 215 static bool sm_persistent_keys_random_active; 216 static const btstack_tlv_t * sm_tlv_impl; 217 static void * sm_tlv_context; 218 219 // Security Manager Master Keys, please use sm_set_er(er) and sm_set_ir(ir) with your own 128 bit random values 220 static sm_key_t sm_persistent_er; 221 static sm_key_t sm_persistent_ir; 222 223 // derived from sm_persistent_ir 224 static sm_key_t sm_persistent_dhk; 225 static sm_key_t sm_persistent_irk; 226 static derived_key_generation_t dkg_state; 227 228 // derived from sm_persistent_er 229 // .. 230 231 // random address update 232 static random_address_update_t rau_state; 233 static bd_addr_t sm_random_address; 234 235 #ifdef USE_CMAC_ENGINE 236 // CMAC Calculation: General 237 static btstack_crypto_aes128_cmac_t sm_cmac_request; 238 static void (*sm_cmac_done_callback)(uint8_t hash[8]); 239 static uint8_t sm_cmac_active; 240 static uint8_t sm_cmac_hash[16]; 241 #endif 242 243 // CMAC for ATT Signed Writes 244 #ifdef ENABLE_LE_SIGNED_WRITE 245 static uint16_t sm_cmac_signed_write_message_len; 246 static uint8_t sm_cmac_signed_write_header[3]; 247 static const uint8_t * sm_cmac_signed_write_message; 248 static uint8_t sm_cmac_signed_write_sign_counter[4]; 249 #endif 250 251 // CMAC for Secure Connection functions 252 #ifdef ENABLE_LE_SECURE_CONNECTIONS 253 static sm_connection_t * sm_cmac_connection; 254 static uint8_t sm_cmac_sc_buffer[80]; 255 #endif 256 257 // resolvable private address lookup / CSRK calculation 258 static int sm_address_resolution_test; 259 static uint8_t sm_address_resolution_addr_type; 260 static bd_addr_t sm_address_resolution_address; 261 static void * sm_address_resolution_context; 262 static address_resolution_mode_t sm_address_resolution_mode; 263 static btstack_linked_list_t sm_address_resolution_general_queue; 264 265 // aes128 crypto engine. 266 static sm_aes128_state_t sm_aes128_state; 267 268 // crypto 269 static btstack_crypto_random_t sm_crypto_random_request; 270 static btstack_crypto_aes128_t sm_crypto_aes128_request; 271 #ifdef ENABLE_LE_SECURE_CONNECTIONS 272 static btstack_crypto_ecc_p256_t sm_crypto_ecc_p256_request; 273 #endif 274 275 // temp storage for random data 276 static uint8_t sm_random_data[8]; 277 static uint8_t sm_aes128_key[16]; 278 static uint8_t sm_aes128_plaintext[16]; 279 static uint8_t sm_aes128_ciphertext[16]; 280 281 // to receive events 282 static btstack_packet_callback_registration_t hci_event_callback_registration; 283 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 284 static btstack_packet_callback_registration_t l2cap_event_callback_registration; 285 #endif 286 287 /* to dispatch sm event */ 288 static btstack_linked_list_t sm_event_handlers; 289 290 /* to schedule calls to sm_run */ 291 static btstack_timer_source_t sm_run_timer; 292 293 // LE Secure Connections 294 #ifdef ENABLE_LE_SECURE_CONNECTIONS 295 static ec_key_generation_state_t ec_key_generation_state; 296 static uint8_t ec_q[64]; 297 #endif 298 299 // 300 // Volume 3, Part H, Chapter 24 301 // "Security shall be initiated by the Security Manager in the device in the master role. 302 // The device in the slave role shall be the responding device." 303 // -> master := initiator, slave := responder 304 // 305 306 // data needed for security setup 307 typedef struct sm_setup_context { 308 309 btstack_timer_source_t sm_timeout; 310 311 // user response, (Phase 1 and/or 2) 312 uint8_t sm_user_response; 313 uint8_t sm_keypress_notification; // bitmap: passkey started, digit entered, digit erased, passkey cleared, passkey complete, 3 bit count 314 315 // defines which keys will be send after connection is encrypted - calculated during Phase 1, used Phase 3 316 uint8_t sm_key_distribution_send_set; 317 uint8_t sm_key_distribution_sent_set; 318 uint8_t sm_key_distribution_expected_set; 319 uint8_t sm_key_distribution_received_set; 320 321 // Phase 2 (Pairing over SMP) 322 stk_generation_method_t sm_stk_generation_method; 323 sm_key_t sm_tk; 324 uint8_t sm_have_oob_data; 325 bool sm_use_secure_connections; 326 327 sm_key_t sm_c1_t3_value; // c1 calculation 328 sm_pairing_packet_t sm_m_preq; // pairing request - needed only for c1 329 sm_pairing_packet_t sm_s_pres; // pairing response - needed only for c1 330 sm_key_t sm_local_random; 331 sm_key_t sm_local_confirm; 332 sm_key_t sm_peer_random; 333 sm_key_t sm_peer_confirm; 334 uint8_t sm_m_addr_type; // address and type can be removed 335 uint8_t sm_s_addr_type; // '' 336 bd_addr_t sm_m_address; // '' 337 bd_addr_t sm_s_address; // '' 338 sm_key_t sm_ltk; 339 340 uint8_t sm_state_vars; 341 #ifdef ENABLE_LE_SECURE_CONNECTIONS 342 uint8_t sm_peer_q[64]; // also stores random for EC key generation during init 343 sm_key_t sm_peer_nonce; // might be combined with sm_peer_random 344 sm_key_t sm_local_nonce; // might be combined with sm_local_random 345 uint8_t sm_dhkey[32]; 346 sm_key_t sm_peer_dhkey_check; 347 sm_key_t sm_local_dhkey_check; 348 sm_key_t sm_ra; 349 sm_key_t sm_rb; 350 sm_key_t sm_t; // used for f5 and h6 351 sm_key_t sm_mackey; 352 uint8_t sm_passkey_bit; // also stores number of generated random bytes for EC key generation 353 #endif 354 355 // Phase 3 356 357 // key distribution, we generate 358 uint16_t sm_local_y; 359 uint16_t sm_local_div; 360 uint16_t sm_local_ediv; 361 uint8_t sm_local_rand[8]; 362 sm_key_t sm_local_ltk; 363 sm_key_t sm_local_csrk; 364 sm_key_t sm_local_irk; 365 // sm_local_address/addr_type not needed 366 367 // key distribution, received from peer 368 uint16_t sm_peer_y; 369 uint16_t sm_peer_div; 370 uint16_t sm_peer_ediv; 371 uint8_t sm_peer_rand[8]; 372 sm_key_t sm_peer_ltk; 373 sm_key_t sm_peer_irk; 374 sm_key_t sm_peer_csrk; 375 uint8_t sm_peer_addr_type; 376 bd_addr_t sm_peer_address; 377 #ifdef ENABLE_LE_SIGNED_WRITE 378 int sm_le_device_index; 379 #endif 380 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 381 link_key_t sm_link_key; 382 link_key_type_t sm_link_key_type; 383 #endif 384 } sm_setup_context_t; 385 386 // 387 static sm_setup_context_t the_setup; 388 static sm_setup_context_t * setup = &the_setup; 389 390 // active connection - the one for which the_setup is used for 391 static uint16_t sm_active_connection_handle = HCI_CON_HANDLE_INVALID; 392 393 // @return 1 if oob data is available 394 // stores oob data in provided 16 byte buffer if not null 395 static int (*sm_get_oob_data)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_data) = NULL; 396 static int (*sm_get_sc_oob_data)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_sc_peer_confirm, uint8_t * oob_sc_peer_random); 397 static bool (*sm_get_ltk_callback)(hci_con_handle_t con_handle, uint8_t addres_type, bd_addr_t addr, uint8_t * ltk); 398 399 static void sm_run(void); 400 static void sm_state_reset(void); 401 static void sm_done_for_handle(hci_con_handle_t con_handle); 402 static sm_connection_t * sm_get_connection_for_handle(hci_con_handle_t con_handle); 403 static void sm_cache_ltk(sm_connection_t * connection, const sm_key_t ltk); 404 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 405 static sm_connection_t * sm_get_connection_for_bd_addr_and_type(bd_addr_t address, bd_addr_type_t addr_type); 406 #endif 407 static inline int sm_calc_actual_encryption_key_size(int other); 408 static int sm_validate_stk_generation_method(void); 409 static void sm_handle_encryption_result_address_resolution(void *arg); 410 static void sm_handle_encryption_result_dkg_dhk(void *arg); 411 static void sm_handle_encryption_result_dkg_irk(void *arg); 412 static void sm_handle_encryption_result_enc_a(void *arg); 413 static void sm_handle_encryption_result_enc_b(void *arg); 414 static void sm_handle_encryption_result_enc_c(void *arg); 415 static void sm_handle_encryption_result_enc_csrk(void *arg); 416 static void sm_handle_encryption_result_enc_d(void * arg); 417 static void sm_handle_encryption_result_enc_ph3_ltk(void *arg); 418 static void sm_handle_encryption_result_enc_ph3_y(void *arg); 419 #ifdef ENABLE_LE_PERIPHERAL 420 static void sm_handle_encryption_result_enc_ph4_ltk(void *arg); 421 static void sm_handle_encryption_result_enc_ph4_y(void *arg); 422 #endif 423 static void sm_handle_encryption_result_enc_stk(void *arg); 424 static void sm_handle_encryption_result_rau(void *arg); 425 static void sm_handle_random_result_ph2_tk(void * arg); 426 static void sm_handle_random_result_rau(void * arg); 427 #ifdef ENABLE_LE_SECURE_CONNECTIONS 428 static void sm_cmac_message_start(const sm_key_t key, uint16_t message_len, const uint8_t * message, void (*done_callback)(uint8_t * hash)); 429 static void sm_ec_generate_new_key(void); 430 static void sm_handle_random_result_sc_next_w2_cmac_for_confirmation(void * arg); 431 static void sm_handle_random_result_sc_next_send_pairing_random(void * arg); 432 static bool sm_passkey_entry(stk_generation_method_t method); 433 #endif 434 static void sm_pairing_complete(sm_connection_t * sm_conn, uint8_t status, uint8_t reason); 435 436 static void log_info_hex16(const char * name, uint16_t value){ 437 log_info("%-6s 0x%04x", name, value); 438 } 439 440 // static inline uint8_t sm_pairing_packet_get_code(sm_pairing_packet_t packet){ 441 // return packet[0]; 442 // } 443 static inline uint8_t sm_pairing_packet_get_io_capability(sm_pairing_packet_t packet){ 444 return packet[1]; 445 } 446 static inline uint8_t sm_pairing_packet_get_oob_data_flag(sm_pairing_packet_t packet){ 447 return packet[2]; 448 } 449 static inline uint8_t sm_pairing_packet_get_auth_req(sm_pairing_packet_t packet){ 450 return packet[3]; 451 } 452 static inline uint8_t sm_pairing_packet_get_max_encryption_key_size(sm_pairing_packet_t packet){ 453 return packet[4]; 454 } 455 static inline uint8_t sm_pairing_packet_get_initiator_key_distribution(sm_pairing_packet_t packet){ 456 return packet[5]; 457 } 458 static inline uint8_t sm_pairing_packet_get_responder_key_distribution(sm_pairing_packet_t packet){ 459 return packet[6]; 460 } 461 462 static inline void sm_pairing_packet_set_code(sm_pairing_packet_t packet, uint8_t code){ 463 packet[0] = code; 464 } 465 static inline void sm_pairing_packet_set_io_capability(sm_pairing_packet_t packet, uint8_t io_capability){ 466 packet[1] = io_capability; 467 } 468 static inline void sm_pairing_packet_set_oob_data_flag(sm_pairing_packet_t packet, uint8_t oob_data_flag){ 469 packet[2] = oob_data_flag; 470 } 471 static inline void sm_pairing_packet_set_auth_req(sm_pairing_packet_t packet, uint8_t auth_req){ 472 packet[3] = auth_req; 473 } 474 static inline void sm_pairing_packet_set_max_encryption_key_size(sm_pairing_packet_t packet, uint8_t max_encryption_key_size){ 475 packet[4] = max_encryption_key_size; 476 } 477 static inline void sm_pairing_packet_set_initiator_key_distribution(sm_pairing_packet_t packet, uint8_t initiator_key_distribution){ 478 packet[5] = initiator_key_distribution; 479 } 480 static inline void sm_pairing_packet_set_responder_key_distribution(sm_pairing_packet_t packet, uint8_t responder_key_distribution){ 481 packet[6] = responder_key_distribution; 482 } 483 484 static bool sm_is_null_random(uint8_t random[8]){ 485 return btstack_is_null(random, 8); 486 } 487 488 static bool sm_is_null_key(uint8_t * key){ 489 return btstack_is_null(key, 16); 490 } 491 492 #ifdef ENABLE_LE_SECURE_CONNECTIONS 493 static bool sm_is_ff(const uint8_t * buffer, uint16_t size){ 494 uint16_t i; 495 for (i=0; i < size ; i++){ 496 if (buffer[i] != 0xff) { 497 return false; 498 } 499 } 500 return true; 501 } 502 #endif 503 504 // sm_trigger_run allows to schedule callback from main run loop // reduces stack depth 505 static void sm_run_timer_handler(btstack_timer_source_t * ts){ 506 UNUSED(ts); 507 sm_run(); 508 } 509 static void sm_trigger_run(void){ 510 if (!sm_initialized) return; 511 (void)btstack_run_loop_remove_timer(&sm_run_timer); 512 btstack_run_loop_set_timer(&sm_run_timer, 0); 513 btstack_run_loop_add_timer(&sm_run_timer); 514 } 515 516 // Key utils 517 static void sm_reset_tk(void){ 518 int i; 519 for (i=0;i<16;i++){ 520 setup->sm_tk[i] = 0; 521 } 522 } 523 524 // "For example, if a 128-bit encryption key is 0x123456789ABCDEF0123456789ABCDEF0 525 // and it is reduced to 7 octets (56 bits), then the resulting key is 0x0000000000000000003456789ABCDEF0."" 526 static void sm_truncate_key(sm_key_t key, int max_encryption_size){ 527 int i; 528 for (i = max_encryption_size ; i < 16 ; i++){ 529 key[15-i] = 0; 530 } 531 } 532 533 // ER / IR checks 534 static void sm_er_ir_set_default(void){ 535 int i; 536 for (i=0;i<16;i++){ 537 sm_persistent_er[i] = 0x30 + i; 538 sm_persistent_ir[i] = 0x90 + i; 539 } 540 } 541 542 static bool sm_er_is_default(void){ 543 int i; 544 for (i=0;i<16;i++){ 545 if (sm_persistent_er[i] != (0x30+i)) return true; 546 } 547 return false; 548 } 549 550 static bool sm_ir_is_default(void){ 551 int i; 552 for (i=0;i<16;i++){ 553 if (sm_persistent_ir[i] != (0x90+i)) return true; 554 } 555 return false; 556 } 557 558 static void sm_dispatch_event(uint8_t packet_type, uint16_t channel, uint8_t * packet, uint16_t size){ 559 UNUSED(channel); 560 561 // log event 562 hci_dump_btstack_event(packet, size); 563 // dispatch to all event handlers 564 btstack_linked_list_iterator_t it; 565 btstack_linked_list_iterator_init(&it, &sm_event_handlers); 566 while (btstack_linked_list_iterator_has_next(&it)){ 567 btstack_packet_callback_registration_t * entry = (btstack_packet_callback_registration_t*) btstack_linked_list_iterator_next(&it); 568 entry->callback(packet_type, 0, packet, size); 569 } 570 } 571 572 static void sm_setup_event_base(uint8_t * event, int event_size, uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address){ 573 event[0] = type; 574 event[1] = event_size - 2; 575 little_endian_store_16(event, 2, con_handle); 576 event[4] = addr_type; 577 reverse_bd_addr(address, &event[5]); 578 } 579 580 static void sm_notify_client_base(uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address){ 581 uint8_t event[11]; 582 sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address); 583 sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event)); 584 } 585 586 static void sm_notify_client_index(uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address, uint16_t index){ 587 // fetch addr and addr type from db, only called for valid entries 588 bd_addr_t identity_address; 589 int identity_address_type; 590 le_device_db_info(index, &identity_address_type, identity_address, NULL); 591 592 uint8_t event[20]; 593 sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address); 594 event[11] = identity_address_type; 595 reverse_bd_addr(identity_address, &event[12]); 596 little_endian_store_16(event, 18, index); 597 sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event)); 598 } 599 600 static void sm_notify_client_status(uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address, uint8_t status){ 601 uint8_t event[12]; 602 sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address); 603 event[11] = status; 604 sm_dispatch_event(HCI_EVENT_PACKET, 0, (uint8_t*) &event, sizeof(event)); 605 } 606 607 608 static void sm_reencryption_started(sm_connection_t * sm_conn){ 609 610 if (sm_conn->sm_reencryption_active) return; 611 612 sm_conn->sm_reencryption_active = true; 613 614 int identity_addr_type; 615 bd_addr_t identity_addr; 616 if (sm_conn->sm_le_db_index >= 0){ 617 // fetch addr and addr type from db, only called for valid entries 618 le_device_db_info(sm_conn->sm_le_db_index, &identity_addr_type, identity_addr, NULL); 619 } else { 620 // for legacy pairing with LTK re-construction, use current peer addr 621 identity_addr_type = sm_conn->sm_peer_addr_type; 622 // cppcheck-suppress uninitvar ; identity_addr is reported as uninitialized although it's the destination of the memcpy 623 memcpy(identity_addr, sm_conn->sm_peer_address, 6); 624 } 625 626 sm_notify_client_base(SM_EVENT_REENCRYPTION_STARTED, sm_conn->sm_handle, identity_addr_type, identity_addr); 627 } 628 629 static void sm_reencryption_complete(sm_connection_t * sm_conn, uint8_t status){ 630 631 if (!sm_conn->sm_reencryption_active) return; 632 633 sm_conn->sm_reencryption_active = false; 634 635 int identity_addr_type; 636 bd_addr_t identity_addr; 637 if (sm_conn->sm_le_db_index >= 0){ 638 // fetch addr and addr type from db, only called for valid entries 639 le_device_db_info(sm_conn->sm_le_db_index, &identity_addr_type, identity_addr, NULL); 640 } else { 641 // for legacy pairing with LTK re-construction, use current peer addr 642 identity_addr_type = sm_conn->sm_peer_addr_type; 643 // cppcheck-suppress uninitvar ; identity_addr is reported as uninitialized although it's the destination of the memcpy 644 memcpy(identity_addr, sm_conn->sm_peer_address, 6); 645 } 646 647 sm_notify_client_status(SM_EVENT_REENCRYPTION_COMPLETE, sm_conn->sm_handle, identity_addr_type, identity_addr, status); 648 } 649 650 static void sm_pairing_started(sm_connection_t * sm_conn){ 651 652 if (sm_conn->sm_pairing_active) return; 653 654 sm_conn->sm_pairing_active = true; 655 656 uint8_t event[11]; 657 sm_setup_event_base(event, sizeof(event), SM_EVENT_PAIRING_STARTED, sm_conn->sm_handle, setup->sm_peer_addr_type, setup->sm_peer_address); 658 sm_dispatch_event(HCI_EVENT_PACKET, 0, (uint8_t*) &event, sizeof(event)); 659 } 660 661 static void sm_pairing_complete(sm_connection_t * sm_conn, uint8_t status, uint8_t reason){ 662 663 if (!sm_conn->sm_pairing_active) return; 664 665 sm_conn->sm_pairing_active = false; 666 667 uint8_t event[13]; 668 sm_setup_event_base(event, sizeof(event), SM_EVENT_PAIRING_COMPLETE, sm_conn->sm_handle, setup->sm_peer_addr_type, setup->sm_peer_address); 669 event[11] = status; 670 event[12] = reason; 671 sm_dispatch_event(HCI_EVENT_PACKET, 0, (uint8_t*) &event, sizeof(event)); 672 } 673 674 // SMP Timeout implementation 675 676 // Upon transmission of the Pairing Request command or reception of the Pairing Request command, 677 // the Security Manager Timer shall be reset and started. 678 // 679 // The Security Manager Timer shall be reset when an L2CAP SMP command is queued for transmission. 680 // 681 // If the Security Manager Timer reaches 30 seconds, the procedure shall be considered to have failed, 682 // and the local higher layer shall be notified. No further SMP commands shall be sent over the L2CAP 683 // Security Manager Channel. A new SM procedure shall only be performed when a new physical link has been 684 // established. 685 686 static void sm_timeout_handler(btstack_timer_source_t * timer){ 687 log_info("SM timeout"); 688 sm_connection_t * sm_conn = (sm_connection_t*) btstack_run_loop_get_timer_context(timer); 689 sm_conn->sm_engine_state = SM_GENERAL_TIMEOUT; 690 sm_reencryption_complete(sm_conn, ERROR_CODE_CONNECTION_TIMEOUT); 691 sm_pairing_complete(sm_conn, ERROR_CODE_CONNECTION_TIMEOUT, 0); 692 sm_done_for_handle(sm_conn->sm_handle); 693 694 // trigger handling of next ready connection 695 sm_run(); 696 } 697 static void sm_timeout_start(sm_connection_t * sm_conn){ 698 btstack_run_loop_remove_timer(&setup->sm_timeout); 699 btstack_run_loop_set_timer_context(&setup->sm_timeout, sm_conn); 700 btstack_run_loop_set_timer_handler(&setup->sm_timeout, sm_timeout_handler); 701 btstack_run_loop_set_timer(&setup->sm_timeout, 30000); // 30 seconds sm timeout 702 btstack_run_loop_add_timer(&setup->sm_timeout); 703 } 704 static void sm_timeout_stop(void){ 705 btstack_run_loop_remove_timer(&setup->sm_timeout); 706 } 707 static void sm_timeout_reset(sm_connection_t * sm_conn){ 708 sm_timeout_stop(); 709 sm_timeout_start(sm_conn); 710 } 711 712 // end of sm timeout 713 714 // GAP Random Address updates 715 static gap_random_address_type_t gap_random_adress_type; 716 static btstack_timer_source_t gap_random_address_update_timer; 717 static uint32_t gap_random_adress_update_period; 718 719 static void gap_random_address_trigger(void){ 720 log_info("gap_random_address_trigger, state %u", rau_state); 721 if (rau_state != RAU_IDLE) return; 722 rau_state = RAU_GET_RANDOM; 723 sm_trigger_run(); 724 } 725 726 static void gap_random_address_update_handler(btstack_timer_source_t * timer){ 727 UNUSED(timer); 728 729 log_info("GAP Random Address Update due"); 730 btstack_run_loop_set_timer(&gap_random_address_update_timer, gap_random_adress_update_period); 731 btstack_run_loop_add_timer(&gap_random_address_update_timer); 732 gap_random_address_trigger(); 733 } 734 735 static void gap_random_address_update_start(void){ 736 btstack_run_loop_set_timer_handler(&gap_random_address_update_timer, gap_random_address_update_handler); 737 btstack_run_loop_set_timer(&gap_random_address_update_timer, gap_random_adress_update_period); 738 btstack_run_loop_add_timer(&gap_random_address_update_timer); 739 } 740 741 static void gap_random_address_update_stop(void){ 742 btstack_run_loop_remove_timer(&gap_random_address_update_timer); 743 } 744 745 // ah(k,r) helper 746 // r = padding || r 747 // r - 24 bit value 748 static void sm_ah_r_prime(uint8_t r[3], uint8_t * r_prime){ 749 // r'= padding || r 750 memset(r_prime, 0, 16); 751 (void)memcpy(&r_prime[13], r, 3); 752 } 753 754 // d1 helper 755 // d' = padding || r || d 756 // d,r - 16 bit values 757 static void sm_d1_d_prime(uint16_t d, uint16_t r, uint8_t * d1_prime){ 758 // d'= padding || r || d 759 memset(d1_prime, 0, 16); 760 big_endian_store_16(d1_prime, 12, r); 761 big_endian_store_16(d1_prime, 14, d); 762 } 763 764 // calculate arguments for first AES128 operation in C1 function 765 static void sm_c1_t1(sm_key_t r, uint8_t preq[7], uint8_t pres[7], uint8_t iat, uint8_t rat, uint8_t * t1){ 766 767 // p1 = pres || preq || rat’ || iat’ 768 // "The octet of iat’ becomes the least significant octet of p1 and the most signifi- 769 // cant octet of pres becomes the most significant octet of p1. 770 // For example, if the 8-bit iat’ is 0x01, the 8-bit rat’ is 0x00, the 56-bit preq 771 // is 0x07071000000101 and the 56 bit pres is 0x05000800000302 then 772 // p1 is 0x05000800000302070710000001010001." 773 774 sm_key_t p1; 775 reverse_56(pres, &p1[0]); 776 reverse_56(preq, &p1[7]); 777 p1[14] = rat; 778 p1[15] = iat; 779 log_info_key("p1", p1); 780 log_info_key("r", r); 781 782 // t1 = r xor p1 783 int i; 784 for (i=0;i<16;i++){ 785 t1[i] = r[i] ^ p1[i]; 786 } 787 log_info_key("t1", t1); 788 } 789 790 // calculate arguments for second AES128 operation in C1 function 791 static void sm_c1_t3(sm_key_t t2, bd_addr_t ia, bd_addr_t ra, uint8_t * t3){ 792 // p2 = padding || ia || ra 793 // "The least significant octet of ra becomes the least significant octet of p2 and 794 // the most significant octet of padding becomes the most significant octet of p2. 795 // For example, if 48-bit ia is 0xA1A2A3A4A5A6 and the 48-bit ra is 796 // 0xB1B2B3B4B5B6 then p2 is 0x00000000A1A2A3A4A5A6B1B2B3B4B5B6. 797 798 sm_key_t p2; 799 // cppcheck-suppress uninitvar ; p2 is reported as uninitialized 800 memset(p2, 0, 16); 801 (void)memcpy(&p2[4], ia, 6); 802 (void)memcpy(&p2[10], ra, 6); 803 log_info_key("p2", p2); 804 805 // c1 = e(k, t2_xor_p2) 806 int i; 807 for (i=0;i<16;i++){ 808 t3[i] = t2[i] ^ p2[i]; 809 } 810 log_info_key("t3", t3); 811 } 812 813 static void sm_s1_r_prime(sm_key_t r1, sm_key_t r2, uint8_t * r_prime){ 814 log_info_key("r1", r1); 815 log_info_key("r2", r2); 816 (void)memcpy(&r_prime[8], &r2[8], 8); 817 (void)memcpy(&r_prime[0], &r1[8], 8); 818 } 819 820 821 // decide on stk generation based on 822 // - pairing request 823 // - io capabilities 824 // - OOB data availability 825 static void sm_setup_tk(void){ 826 827 // horizontal: initiator capabilities 828 // vertial: responder capabilities 829 static const stk_generation_method_t stk_generation_method [5] [5] = { 830 { JUST_WORKS, JUST_WORKS, PK_INIT_INPUT, JUST_WORKS, PK_INIT_INPUT }, 831 { JUST_WORKS, JUST_WORKS, PK_INIT_INPUT, JUST_WORKS, PK_INIT_INPUT }, 832 { PK_RESP_INPUT, PK_RESP_INPUT, PK_BOTH_INPUT, JUST_WORKS, PK_RESP_INPUT }, 833 { JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS }, 834 { PK_RESP_INPUT, PK_RESP_INPUT, PK_INIT_INPUT, JUST_WORKS, PK_RESP_INPUT }, 835 }; 836 837 // uses numeric comparison if one side has DisplayYesNo and KeyboardDisplay combinations 838 #ifdef ENABLE_LE_SECURE_CONNECTIONS 839 static const stk_generation_method_t stk_generation_method_with_secure_connection[5][5] = { 840 { JUST_WORKS, JUST_WORKS, PK_INIT_INPUT, JUST_WORKS, PK_INIT_INPUT }, 841 { JUST_WORKS, NUMERIC_COMPARISON, PK_INIT_INPUT, JUST_WORKS, NUMERIC_COMPARISON }, 842 { PK_RESP_INPUT, PK_RESP_INPUT, PK_BOTH_INPUT, JUST_WORKS, PK_RESP_INPUT }, 843 { JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS, JUST_WORKS }, 844 { PK_RESP_INPUT, NUMERIC_COMPARISON, PK_INIT_INPUT, JUST_WORKS, NUMERIC_COMPARISON }, 845 }; 846 #endif 847 848 // default: just works 849 setup->sm_stk_generation_method = JUST_WORKS; 850 851 #ifdef ENABLE_LE_SECURE_CONNECTIONS 852 setup->sm_use_secure_connections = ( sm_pairing_packet_get_auth_req(setup->sm_m_preq) 853 & sm_pairing_packet_get_auth_req(setup->sm_s_pres) 854 & SM_AUTHREQ_SECURE_CONNECTION ) != 0u; 855 #else 856 setup->sm_use_secure_connections = false; 857 #endif 858 log_info("Secure pairing: %u", setup->sm_use_secure_connections); 859 860 861 // decide if OOB will be used based on SC vs. Legacy and oob flags 862 bool use_oob; 863 if (setup->sm_use_secure_connections){ 864 // In LE Secure Connections pairing, the out of band method is used if at least 865 // one device has the peer device's out of band authentication data available. 866 use_oob = (sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq) | sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres)) != 0; 867 } else { 868 // In LE legacy pairing, the out of band method is used if both the devices have 869 // the other device's out of band authentication data available. 870 use_oob = (sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq) & sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres)) != 0; 871 } 872 if (use_oob){ 873 log_info("SM: have OOB data"); 874 log_info_key("OOB", setup->sm_tk); 875 setup->sm_stk_generation_method = OOB; 876 return; 877 } 878 879 // If both devices have not set the MITM option in the Authentication Requirements 880 // Flags, then the IO capabilities shall be ignored and the Just Works association 881 // model shall be used. 882 if (((sm_pairing_packet_get_auth_req(setup->sm_m_preq) & SM_AUTHREQ_MITM_PROTECTION) == 0u) 883 && ((sm_pairing_packet_get_auth_req(setup->sm_s_pres) & SM_AUTHREQ_MITM_PROTECTION) == 0u)){ 884 log_info("SM: MITM not required by both -> JUST WORKS"); 885 return; 886 } 887 888 // Reset TK as it has been setup in sm_init_setup 889 sm_reset_tk(); 890 891 // Also use just works if unknown io capabilites 892 if ((sm_pairing_packet_get_io_capability(setup->sm_m_preq) > IO_CAPABILITY_KEYBOARD_DISPLAY) || (sm_pairing_packet_get_io_capability(setup->sm_s_pres) > IO_CAPABILITY_KEYBOARD_DISPLAY)){ 893 return; 894 } 895 896 // Otherwise the IO capabilities of the devices shall be used to determine the 897 // pairing method as defined in Table 2.4. 898 // see http://stackoverflow.com/a/1052837/393697 for how to specify pointer to 2-dimensional array 899 const stk_generation_method_t (*generation_method)[5] = stk_generation_method; 900 901 #ifdef ENABLE_LE_SECURE_CONNECTIONS 902 // table not define by default 903 if (setup->sm_use_secure_connections){ 904 generation_method = stk_generation_method_with_secure_connection; 905 } 906 #endif 907 setup->sm_stk_generation_method = generation_method[sm_pairing_packet_get_io_capability(setup->sm_s_pres)][sm_pairing_packet_get_io_capability(setup->sm_m_preq)]; 908 909 log_info("sm_setup_tk: master io cap: %u, slave io cap: %u -> method %u", 910 sm_pairing_packet_get_io_capability(setup->sm_m_preq), sm_pairing_packet_get_io_capability(setup->sm_s_pres), setup->sm_stk_generation_method); 911 } 912 913 static int sm_key_distribution_flags_for_set(uint8_t key_set){ 914 int flags = 0; 915 if ((key_set & SM_KEYDIST_ENC_KEY) != 0u){ 916 flags |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION; 917 flags |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION; 918 } 919 if ((key_set & SM_KEYDIST_ID_KEY) != 0u){ 920 flags |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION; 921 flags |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION; 922 } 923 if ((key_set & SM_KEYDIST_SIGN) != 0u){ 924 flags |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION; 925 } 926 return flags; 927 } 928 929 static void sm_setup_key_distribution(uint8_t keys_to_send, uint8_t keys_to_receive){ 930 setup->sm_key_distribution_received_set = 0; 931 setup->sm_key_distribution_expected_set = sm_key_distribution_flags_for_set(keys_to_receive); 932 setup->sm_key_distribution_send_set = sm_key_distribution_flags_for_set(keys_to_send); 933 setup->sm_key_distribution_sent_set = 0; 934 #ifdef ENABLE_LE_SIGNED_WRITE 935 setup->sm_le_device_index = -1; 936 #endif 937 } 938 939 // CSRK Key Lookup 940 941 942 static bool sm_address_resolution_idle(void){ 943 return sm_address_resolution_mode == ADDRESS_RESOLUTION_IDLE; 944 } 945 946 static void sm_address_resolution_start_lookup(uint8_t addr_type, hci_con_handle_t con_handle, bd_addr_t addr, address_resolution_mode_t mode, void * context){ 947 (void)memcpy(sm_address_resolution_address, addr, 6); 948 sm_address_resolution_addr_type = addr_type; 949 sm_address_resolution_test = 0; 950 sm_address_resolution_mode = mode; 951 sm_address_resolution_context = context; 952 sm_notify_client_base(SM_EVENT_IDENTITY_RESOLVING_STARTED, con_handle, addr_type, addr); 953 } 954 955 int sm_address_resolution_lookup(uint8_t address_type, bd_addr_t address){ 956 // check if already in list 957 btstack_linked_list_iterator_t it; 958 sm_lookup_entry_t * entry; 959 btstack_linked_list_iterator_init(&it, &sm_address_resolution_general_queue); 960 while(btstack_linked_list_iterator_has_next(&it)){ 961 entry = (sm_lookup_entry_t *) btstack_linked_list_iterator_next(&it); 962 if (entry->address_type != address_type) continue; 963 if (memcmp(entry->address, address, 6) != 0) continue; 964 // already in list 965 return BTSTACK_BUSY; 966 } 967 entry = btstack_memory_sm_lookup_entry_get(); 968 if (!entry) return BTSTACK_MEMORY_ALLOC_FAILED; 969 entry->address_type = (bd_addr_type_t) address_type; 970 (void)memcpy(entry->address, address, 6); 971 btstack_linked_list_add(&sm_address_resolution_general_queue, (btstack_linked_item_t *) entry); 972 sm_trigger_run(); 973 return 0; 974 } 975 976 // CMAC calculation using AES Engineq 977 #ifdef USE_CMAC_ENGINE 978 979 static void sm_cmac_done_trampoline(void * arg){ 980 UNUSED(arg); 981 sm_cmac_active = 0; 982 (*sm_cmac_done_callback)(sm_cmac_hash); 983 sm_trigger_run(); 984 } 985 986 int sm_cmac_ready(void){ 987 return sm_cmac_active == 0u; 988 } 989 #endif 990 991 #ifdef ENABLE_LE_SECURE_CONNECTIONS 992 // generic cmac calculation 993 static void sm_cmac_message_start(const sm_key_t key, uint16_t message_len, const uint8_t * message, void (*done_callback)(uint8_t * hash)){ 994 sm_cmac_active = 1; 995 sm_cmac_done_callback = done_callback; 996 btstack_crypto_aes128_cmac_message(&sm_cmac_request, key, message_len, message, sm_cmac_hash, sm_cmac_done_trampoline, NULL); 997 } 998 #endif 999 1000 // cmac for ATT Message signing 1001 #ifdef ENABLE_LE_SIGNED_WRITE 1002 1003 static void sm_cmac_generator_start(const sm_key_t key, uint16_t message_len, uint8_t (*get_byte_callback)(uint16_t offset), void (*done_callback)(uint8_t * hash)){ 1004 sm_cmac_active = 1; 1005 sm_cmac_done_callback = done_callback; 1006 btstack_crypto_aes128_cmac_generator(&sm_cmac_request, key, message_len, get_byte_callback, sm_cmac_hash, sm_cmac_done_trampoline, NULL); 1007 } 1008 1009 static uint8_t sm_cmac_signed_write_message_get_byte(uint16_t offset){ 1010 if (offset >= sm_cmac_signed_write_message_len) { 1011 log_error("sm_cmac_signed_write_message_get_byte. out of bounds, access %u, len %u", offset, sm_cmac_signed_write_message_len); 1012 return 0; 1013 } 1014 1015 offset = sm_cmac_signed_write_message_len - 1 - offset; 1016 1017 // sm_cmac_signed_write_header[3] | message[] | sm_cmac_signed_write_sign_counter[4] 1018 if (offset < 3){ 1019 return sm_cmac_signed_write_header[offset]; 1020 } 1021 int actual_message_len_incl_header = sm_cmac_signed_write_message_len - 4; 1022 if (offset < actual_message_len_incl_header){ 1023 return sm_cmac_signed_write_message[offset - 3]; 1024 } 1025 return sm_cmac_signed_write_sign_counter[offset - actual_message_len_incl_header]; 1026 } 1027 1028 void sm_cmac_signed_write_start(const sm_key_t k, uint8_t opcode, hci_con_handle_t con_handle, uint16_t message_len, const uint8_t * message, uint32_t sign_counter, void (*done_handler)(uint8_t * hash)){ 1029 // ATT Message Signing 1030 sm_cmac_signed_write_header[0] = opcode; 1031 little_endian_store_16(sm_cmac_signed_write_header, 1, con_handle); 1032 little_endian_store_32(sm_cmac_signed_write_sign_counter, 0, sign_counter); 1033 uint16_t total_message_len = 3 + message_len + 4; // incl. virtually prepended att opcode, handle and appended sign_counter in LE 1034 sm_cmac_signed_write_message = message; 1035 sm_cmac_signed_write_message_len = total_message_len; 1036 sm_cmac_generator_start(k, total_message_len, &sm_cmac_signed_write_message_get_byte, done_handler); 1037 } 1038 #endif 1039 1040 static void sm_trigger_user_response_basic(sm_connection_t * sm_conn, uint8_t event_type){ 1041 setup->sm_user_response = SM_USER_RESPONSE_PENDING; 1042 uint8_t event[12]; 1043 sm_setup_event_base(event, sizeof(event), event_type, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address); 1044 event[11] = setup->sm_use_secure_connections ? 1 : 0; 1045 sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event)); 1046 } 1047 1048 static void sm_trigger_user_response_passkey(sm_connection_t * sm_conn, uint8_t event_type){ 1049 uint8_t event[16]; 1050 uint32_t passkey = big_endian_read_32(setup->sm_tk, 12); 1051 sm_setup_event_base(event, sizeof(event), event_type, sm_conn->sm_handle, 1052 sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address); 1053 event[11] = setup->sm_use_secure_connections ? 1 : 0; 1054 little_endian_store_32(event, 12, passkey); 1055 sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event)); 1056 } 1057 1058 static void sm_trigger_user_response(sm_connection_t * sm_conn){ 1059 // notify client for: JUST WORKS confirm, Numeric comparison confirm, PASSKEY display or input 1060 setup->sm_user_response = SM_USER_RESPONSE_IDLE; 1061 sm_conn->sm_pairing_active = true; 1062 switch (setup->sm_stk_generation_method){ 1063 case PK_RESP_INPUT: 1064 if (IS_RESPONDER(sm_conn->sm_role)){ 1065 sm_trigger_user_response_basic(sm_conn, SM_EVENT_PASSKEY_INPUT_NUMBER); 1066 } else { 1067 sm_trigger_user_response_passkey(sm_conn, SM_EVENT_PASSKEY_DISPLAY_NUMBER); 1068 } 1069 break; 1070 case PK_INIT_INPUT: 1071 if (IS_RESPONDER(sm_conn->sm_role)){ 1072 sm_trigger_user_response_passkey(sm_conn, SM_EVENT_PASSKEY_DISPLAY_NUMBER); 1073 } else { 1074 sm_trigger_user_response_basic(sm_conn, SM_EVENT_PASSKEY_INPUT_NUMBER); 1075 } 1076 break; 1077 case PK_BOTH_INPUT: 1078 sm_trigger_user_response_basic(sm_conn, SM_EVENT_PASSKEY_INPUT_NUMBER); 1079 break; 1080 case NUMERIC_COMPARISON: 1081 sm_trigger_user_response_passkey(sm_conn, SM_EVENT_NUMERIC_COMPARISON_REQUEST); 1082 break; 1083 case JUST_WORKS: 1084 sm_trigger_user_response_basic(sm_conn, SM_EVENT_JUST_WORKS_REQUEST); 1085 break; 1086 case OOB: 1087 // client already provided OOB data, let's skip notification. 1088 break; 1089 default: 1090 btstack_assert(false); 1091 break; 1092 } 1093 } 1094 1095 static bool sm_key_distribution_all_received(void) { 1096 log_debug("sm_key_distribution_all_received: received 0x%02x, expecting 0x%02x", setup->sm_key_distribution_received_set, setup->sm_key_distribution_expected_set); 1097 return (setup->sm_key_distribution_expected_set & setup->sm_key_distribution_received_set) == setup->sm_key_distribution_expected_set; 1098 } 1099 1100 static void sm_done_for_handle(hci_con_handle_t con_handle){ 1101 if (sm_active_connection_handle == con_handle){ 1102 sm_timeout_stop(); 1103 sm_active_connection_handle = HCI_CON_HANDLE_INVALID; 1104 log_info("sm: connection 0x%x released setup context", con_handle); 1105 1106 #ifdef ENABLE_LE_SECURE_CONNECTIONS 1107 // generate new ec key after each pairing (that used it) 1108 if (setup->sm_use_secure_connections){ 1109 sm_ec_generate_new_key(); 1110 } 1111 #endif 1112 } 1113 } 1114 1115 static void sm_master_pairing_success(sm_connection_t *connection) {// master -> all done 1116 connection->sm_engine_state = SM_INITIATOR_CONNECTED; 1117 sm_pairing_complete(connection, ERROR_CODE_SUCCESS, 0); 1118 sm_done_for_handle(connection->sm_handle); 1119 } 1120 1121 static int sm_key_distribution_flags_for_auth_req(void){ 1122 1123 int flags = SM_KEYDIST_ID_KEY; 1124 if ((sm_auth_req & SM_AUTHREQ_BONDING) != 0u){ 1125 // encryption and signing information only if bonding requested 1126 flags |= SM_KEYDIST_ENC_KEY; 1127 #ifdef ENABLE_LE_SIGNED_WRITE 1128 flags |= SM_KEYDIST_SIGN; 1129 #endif 1130 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 1131 // LinkKey for CTKD requires SC and BR/EDR Support 1132 if (hci_classic_supported() && ((sm_auth_req & SM_AUTHREQ_SECURE_CONNECTION) != 0)){ 1133 flags |= SM_KEYDIST_LINK_KEY; 1134 } 1135 #endif 1136 } 1137 return flags; 1138 } 1139 1140 static void sm_reset_setup(void){ 1141 // fill in sm setup 1142 setup->sm_state_vars = 0; 1143 setup->sm_keypress_notification = 0; 1144 setup->sm_have_oob_data = 0; 1145 sm_reset_tk(); 1146 } 1147 1148 static void sm_init_setup(sm_connection_t * sm_conn){ 1149 // fill in sm setup 1150 setup->sm_peer_addr_type = sm_conn->sm_peer_addr_type; 1151 (void)memcpy(setup->sm_peer_address, sm_conn->sm_peer_address, 6); 1152 1153 // query client for Legacy Pairing OOB data 1154 if (sm_get_oob_data != NULL) { 1155 setup->sm_have_oob_data = (*sm_get_oob_data)(sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, setup->sm_tk); 1156 } 1157 1158 // if available and SC supported, also ask for SC OOB Data 1159 #ifdef ENABLE_LE_SECURE_CONNECTIONS 1160 memset(setup->sm_ra, 0, 16); 1161 memset(setup->sm_rb, 0, 16); 1162 if (setup->sm_have_oob_data && (sm_auth_req & SM_AUTHREQ_SECURE_CONNECTION)){ 1163 if (sm_get_sc_oob_data != NULL){ 1164 if (IS_RESPONDER(sm_conn->sm_role)){ 1165 setup->sm_have_oob_data = (*sm_get_sc_oob_data)( 1166 sm_conn->sm_peer_addr_type, 1167 sm_conn->sm_peer_address, 1168 setup->sm_peer_confirm, 1169 setup->sm_ra); 1170 } else { 1171 setup->sm_have_oob_data = (*sm_get_sc_oob_data)( 1172 sm_conn->sm_peer_addr_type, 1173 sm_conn->sm_peer_address, 1174 setup->sm_peer_confirm, 1175 setup->sm_rb); 1176 } 1177 } else { 1178 setup->sm_have_oob_data = 0; 1179 } 1180 } 1181 #endif 1182 1183 sm_pairing_packet_t * local_packet; 1184 if (IS_RESPONDER(sm_conn->sm_role)){ 1185 // slave 1186 local_packet = &setup->sm_s_pres; 1187 setup->sm_m_addr_type = sm_conn->sm_peer_addr_type; 1188 setup->sm_s_addr_type = sm_conn->sm_own_addr_type; 1189 (void)memcpy(setup->sm_m_address, sm_conn->sm_peer_address, 6); 1190 (void)memcpy(setup->sm_s_address, sm_conn->sm_own_address, 6); 1191 } else { 1192 // master 1193 local_packet = &setup->sm_m_preq; 1194 setup->sm_s_addr_type = sm_conn->sm_peer_addr_type; 1195 setup->sm_m_addr_type = sm_conn->sm_own_addr_type; 1196 (void)memcpy(setup->sm_s_address, sm_conn->sm_peer_address, 6); 1197 (void)memcpy(setup->sm_m_address, sm_conn->sm_own_address, 6); 1198 1199 uint8_t key_distribution_flags = sm_key_distribution_flags_for_auth_req(); 1200 sm_pairing_packet_set_initiator_key_distribution(setup->sm_m_preq, key_distribution_flags); 1201 sm_pairing_packet_set_responder_key_distribution(setup->sm_m_preq, key_distribution_flags); 1202 } 1203 1204 log_info("our address %s type %u", bd_addr_to_str(sm_conn->sm_own_address), sm_conn->sm_own_addr_type); 1205 log_info("peer address %s type %u", bd_addr_to_str(sm_conn->sm_peer_address), sm_conn->sm_peer_addr_type); 1206 1207 uint8_t auth_req = sm_auth_req & ~SM_AUTHREQ_CT2; 1208 uint8_t max_encryption_key_size = sm_max_encryption_key_size; 1209 #ifdef ENABLE_LE_SECURE_CONNECTIONS 1210 // enable SC for SC only mode 1211 if (sm_sc_only_mode){ 1212 auth_req |= SM_AUTHREQ_SECURE_CONNECTION; 1213 max_encryption_key_size = 16; 1214 } 1215 #endif 1216 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 1217 // set CT2 if SC + Bonding + CTKD 1218 const uint8_t auth_req_for_ct2 = SM_AUTHREQ_SECURE_CONNECTION | SM_AUTHREQ_BONDING; 1219 if ((auth_req & auth_req_for_ct2) == auth_req_for_ct2){ 1220 auth_req |= SM_AUTHREQ_CT2; 1221 } 1222 #endif 1223 sm_pairing_packet_set_io_capability(*local_packet, sm_io_capabilities); 1224 sm_pairing_packet_set_oob_data_flag(*local_packet, setup->sm_have_oob_data); 1225 sm_pairing_packet_set_auth_req(*local_packet, auth_req); 1226 sm_pairing_packet_set_max_encryption_key_size(*local_packet, max_encryption_key_size); 1227 } 1228 1229 static int sm_stk_generation_init(sm_connection_t * sm_conn){ 1230 1231 sm_pairing_packet_t * remote_packet; 1232 uint8_t keys_to_send; 1233 uint8_t keys_to_receive; 1234 if (IS_RESPONDER(sm_conn->sm_role)){ 1235 // slave / responder 1236 remote_packet = &setup->sm_m_preq; 1237 keys_to_send = sm_pairing_packet_get_responder_key_distribution(setup->sm_m_preq); 1238 keys_to_receive = sm_pairing_packet_get_initiator_key_distribution(setup->sm_m_preq); 1239 } else { 1240 // master / initiator 1241 remote_packet = &setup->sm_s_pres; 1242 keys_to_send = sm_pairing_packet_get_initiator_key_distribution(setup->sm_s_pres); 1243 keys_to_receive = sm_pairing_packet_get_responder_key_distribution(setup->sm_s_pres); 1244 } 1245 1246 // check key size 1247 #ifdef ENABLE_LE_SECURE_CONNECTIONS 1248 // SC Only mandates 128 bit key size 1249 if (sm_sc_only_mode && (sm_pairing_packet_get_max_encryption_key_size(*remote_packet) < 16)) { 1250 return SM_REASON_ENCRYPTION_KEY_SIZE; 1251 } 1252 #endif 1253 sm_conn->sm_actual_encryption_key_size = sm_calc_actual_encryption_key_size(sm_pairing_packet_get_max_encryption_key_size(*remote_packet)); 1254 if (sm_conn->sm_actual_encryption_key_size == 0u) return SM_REASON_ENCRYPTION_KEY_SIZE; 1255 1256 // decide on STK generation method / SC 1257 sm_setup_tk(); 1258 log_info("SMP: generation method %u", setup->sm_stk_generation_method); 1259 1260 // check if STK generation method is acceptable by client 1261 if (!sm_validate_stk_generation_method()) return SM_REASON_AUTHENTHICATION_REQUIREMENTS; 1262 1263 #ifdef ENABLE_LE_SECURE_CONNECTIONS 1264 // Check LE SC Only mode 1265 if (sm_sc_only_mode && (setup->sm_use_secure_connections == false)){ 1266 log_info("SC Only mode active but SC not possible"); 1267 return SM_REASON_AUTHENTHICATION_REQUIREMENTS; 1268 } 1269 1270 // LTK (= encryption information & master identification) only used exchanged for LE Legacy Connection 1271 if (setup->sm_use_secure_connections){ 1272 keys_to_send &= ~SM_KEYDIST_ENC_KEY; 1273 keys_to_receive &= ~SM_KEYDIST_ENC_KEY; 1274 } 1275 #endif 1276 1277 // identical to responder 1278 sm_setup_key_distribution(keys_to_send, keys_to_receive); 1279 1280 // JUST WORKS doens't provide authentication 1281 sm_conn->sm_connection_authenticated = (setup->sm_stk_generation_method == JUST_WORKS) ? 0 : 1; 1282 1283 return 0; 1284 } 1285 1286 static void sm_address_resolution_handle_event(address_resolution_event_t event){ 1287 1288 // cache and reset context 1289 int matched_device_id = sm_address_resolution_test; 1290 address_resolution_mode_t mode = sm_address_resolution_mode; 1291 void * context = sm_address_resolution_context; 1292 1293 // reset context 1294 sm_address_resolution_mode = ADDRESS_RESOLUTION_IDLE; 1295 sm_address_resolution_context = NULL; 1296 sm_address_resolution_test = -1; 1297 1298 hci_con_handle_t con_handle = HCI_CON_HANDLE_INVALID; 1299 sm_connection_t * sm_connection; 1300 sm_key_t ltk; 1301 bool have_ltk; 1302 int authenticated; 1303 #ifdef ENABLE_LE_CENTRAL 1304 bool trigger_pairing; 1305 #endif 1306 1307 switch (mode){ 1308 case ADDRESS_RESOLUTION_GENERAL: 1309 break; 1310 case ADDRESS_RESOLUTION_FOR_CONNECTION: 1311 sm_connection = (sm_connection_t *) context; 1312 con_handle = sm_connection->sm_handle; 1313 1314 // have ltk -> start encryption / send security request 1315 // Core 5, Vol 3, Part C, 10.3.2 Initiating a Service Request 1316 // "When a bond has been created between two devices, any reconnection should result in the local device 1317 // enabling or requesting encryption with the remote device before initiating any service request." 1318 1319 switch (event){ 1320 case ADDRESS_RESOLUTION_SUCCEEDED: 1321 sm_connection->sm_irk_lookup_state = IRK_LOOKUP_SUCCEEDED; 1322 sm_connection->sm_le_db_index = matched_device_id; 1323 log_info("ADDRESS_RESOLUTION_SUCCEEDED, index %d", sm_connection->sm_le_db_index); 1324 1325 le_device_db_encryption_get(sm_connection->sm_le_db_index, NULL, NULL, ltk, NULL, &authenticated, NULL, NULL); 1326 have_ltk = !sm_is_null_key(ltk); 1327 1328 if (IS_RESPONDER(sm_connection->sm_role)) { 1329 #ifdef ENABLE_LE_PERIPHERAL 1330 // IRK required before, continue 1331 if (sm_connection->sm_engine_state == SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK){ 1332 sm_connection->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST; 1333 break; 1334 } 1335 // Pairing request before, continue 1336 if (sm_connection->sm_engine_state == SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK){ 1337 sm_connection->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED; 1338 break; 1339 } 1340 bool trigger_security_request = sm_connection->sm_pairing_requested || sm_slave_request_security; 1341 sm_connection->sm_pairing_requested = false; 1342 #ifdef ENABLE_LE_PROACTIVE_AUTHENTICATION 1343 // trigger security request for Proactive Authentication if LTK available 1344 trigger_security_request = trigger_security_request || have_ltk; 1345 #endif 1346 1347 log_info("peripheral: pairing request local %u, have_ltk %u => trigger_security_request %u", 1348 (int) sm_connection->sm_pairing_requested, (int) have_ltk, trigger_security_request); 1349 1350 if (trigger_security_request){ 1351 sm_connection->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST; 1352 if (have_ltk){ 1353 sm_reencryption_started(sm_connection); 1354 } else { 1355 sm_pairing_started(sm_connection); 1356 } 1357 sm_trigger_run(); 1358 } 1359 #endif 1360 } else { 1361 1362 #ifdef ENABLE_LE_CENTRAL 1363 // check if pairing already requested and reset requests 1364 trigger_pairing = sm_connection->sm_pairing_requested || sm_connection->sm_security_request_received; 1365 bool auth_required = sm_auth_req & SM_AUTHREQ_MITM_PROTECTION; 1366 1367 log_info("central: pairing request local %u, remote %u => trigger_pairing %u. have_ltk %u", 1368 (int) sm_connection->sm_pairing_requested, (int) sm_connection->sm_security_request_received, (int) trigger_pairing, (int) have_ltk); 1369 sm_connection->sm_security_request_received = false; 1370 sm_connection->sm_pairing_requested = false; 1371 bool trigger_reencryption = false; 1372 1373 if (have_ltk){ 1374 if (trigger_pairing){ 1375 // if pairing is requested, re-encryption is sufficient, if ltk is already authenticated or we don't require authentication 1376 trigger_reencryption = (authenticated != 0) || (auth_required == false); 1377 } else { 1378 #ifdef ENABLE_LE_PROACTIVE_AUTHENTICATION 1379 trigger_reencryption = true; 1380 #else 1381 log_info("central: defer enabling encryption for bonded device"); 1382 #endif 1383 } 1384 } 1385 1386 if (trigger_reencryption){ 1387 log_info("central: enable encryption for bonded device"); 1388 sm_connection->sm_engine_state = SM_INITIATOR_PH4_HAS_LTK; 1389 break; 1390 } 1391 1392 // pairing_request -> send pairing request 1393 if (trigger_pairing){ 1394 sm_connection->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 1395 break; 1396 } 1397 #endif 1398 } 1399 break; 1400 case ADDRESS_RESOLUTION_FAILED: 1401 sm_connection->sm_irk_lookup_state = IRK_LOOKUP_FAILED; 1402 if (IS_RESPONDER(sm_connection->sm_role)) { 1403 #ifdef ENABLE_LE_PERIPHERAL 1404 // LTK request received before, IRK required -> negative LTK reply 1405 if (sm_connection->sm_engine_state == SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK){ 1406 sm_connection->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY; 1407 } 1408 // Pairing request before, continue 1409 if (sm_connection->sm_engine_state == SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK){ 1410 sm_connection->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED; 1411 break; 1412 } 1413 // send security request if requested 1414 bool trigger_security_request = sm_connection->sm_pairing_requested || sm_slave_request_security; 1415 sm_connection->sm_pairing_requested = false; 1416 if (trigger_security_request){ 1417 sm_connection->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST; 1418 sm_pairing_started(sm_connection); 1419 } 1420 break; 1421 #endif 1422 } 1423 #ifdef ENABLE_LE_CENTRAL 1424 if ((sm_connection->sm_pairing_requested == false) && (sm_connection->sm_security_request_received == false)) break; 1425 sm_connection->sm_security_request_received = false; 1426 sm_connection->sm_pairing_requested = false; 1427 sm_connection->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 1428 #endif 1429 break; 1430 1431 default: 1432 btstack_assert(false); 1433 break; 1434 } 1435 break; 1436 default: 1437 break; 1438 } 1439 1440 switch (event){ 1441 case ADDRESS_RESOLUTION_SUCCEEDED: 1442 sm_notify_client_index(SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED, con_handle, sm_address_resolution_addr_type, sm_address_resolution_address, matched_device_id); 1443 break; 1444 case ADDRESS_RESOLUTION_FAILED: 1445 sm_notify_client_base(SM_EVENT_IDENTITY_RESOLVING_FAILED, con_handle, sm_address_resolution_addr_type, sm_address_resolution_address); 1446 break; 1447 default: 1448 btstack_assert(false); 1449 break; 1450 } 1451 } 1452 1453 static void sm_store_bonding_information(sm_connection_t * sm_conn){ 1454 int le_db_index = -1; 1455 1456 // lookup device based on IRK 1457 if ((setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_IDENTITY_INFORMATION) != 0u){ 1458 int i; 1459 for (i=0; i < le_device_db_max_count(); i++){ 1460 sm_key_t irk; 1461 bd_addr_t address; 1462 int address_type = BD_ADDR_TYPE_UNKNOWN; 1463 le_device_db_info(i, &address_type, address, irk); 1464 // skip unused entries 1465 if (address_type == BD_ADDR_TYPE_UNKNOWN) continue; 1466 // compare Identity Address 1467 if (memcmp(address, setup->sm_peer_address, 6) != 0) continue; 1468 // compare Identity Resolving Key 1469 if (memcmp(irk, setup->sm_peer_irk, 16) != 0) continue; 1470 1471 log_info("sm: device found for IRK, updating"); 1472 le_db_index = i; 1473 break; 1474 } 1475 } else { 1476 // assert IRK is set to zero 1477 memset(setup->sm_peer_irk, 0, 16); 1478 } 1479 1480 // if not found, lookup via public address if possible 1481 log_info("sm peer addr type %u, peer addres %s", setup->sm_peer_addr_type, bd_addr_to_str(setup->sm_peer_address)); 1482 if ((le_db_index < 0) && (setup->sm_peer_addr_type == BD_ADDR_TYPE_LE_PUBLIC)){ 1483 int i; 1484 for (i=0; i < le_device_db_max_count(); i++){ 1485 bd_addr_t address; 1486 int address_type = BD_ADDR_TYPE_UNKNOWN; 1487 le_device_db_info(i, &address_type, address, NULL); 1488 // skip unused entries 1489 if (address_type == BD_ADDR_TYPE_UNKNOWN) continue; 1490 log_info("device %u, sm peer addr type %u, peer addres %s", i, address_type, bd_addr_to_str(address)); 1491 if ((address_type == BD_ADDR_TYPE_LE_PUBLIC) && (memcmp(address, setup->sm_peer_address, 6) == 0)){ 1492 log_info("sm: device found for public address, updating"); 1493 le_db_index = i; 1494 break; 1495 } 1496 } 1497 } 1498 1499 // if not found, add to db 1500 bool new_to_le_device_db = false; 1501 if (le_db_index < 0) { 1502 le_db_index = le_device_db_add(setup->sm_peer_addr_type, setup->sm_peer_address, setup->sm_peer_irk); 1503 new_to_le_device_db = true; 1504 } 1505 1506 if (le_db_index >= 0){ 1507 1508 #ifdef ENABLE_LE_PRIVACY_ADDRESS_RESOLUTION 1509 if (!new_to_le_device_db){ 1510 hci_remove_le_device_db_entry_from_resolving_list(le_db_index); 1511 } 1512 hci_load_le_device_db_entry_into_resolving_list(le_db_index); 1513 #else 1514 UNUSED(new_to_le_device_db); 1515 #endif 1516 1517 sm_notify_client_index(SM_EVENT_IDENTITY_CREATED, sm_conn->sm_handle, setup->sm_peer_addr_type, setup->sm_peer_address, le_db_index); 1518 sm_conn->sm_irk_lookup_state = IRK_LOOKUP_SUCCEEDED; 1519 sm_conn->sm_le_db_index = le_db_index; 1520 1521 #ifdef ENABLE_LE_SIGNED_WRITE 1522 // store local CSRK 1523 setup->sm_le_device_index = le_db_index; 1524 if ((setup->sm_key_distribution_sent_set) & SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){ 1525 log_info("sm: store local CSRK"); 1526 le_device_db_local_csrk_set(le_db_index, setup->sm_local_csrk); 1527 le_device_db_local_counter_set(le_db_index, 0); 1528 } 1529 1530 // store remote CSRK 1531 if (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){ 1532 log_info("sm: store remote CSRK"); 1533 le_device_db_remote_csrk_set(le_db_index, setup->sm_peer_csrk); 1534 le_device_db_remote_counter_set(le_db_index, 0); 1535 } 1536 #endif 1537 // store encryption information for secure connections: LTK generated by ECDH 1538 if (setup->sm_use_secure_connections){ 1539 log_info("sm: store SC LTK (key size %u, authenticated %u)", sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated); 1540 uint8_t zero_rand[8]; 1541 memset(zero_rand, 0, 8); 1542 le_device_db_encryption_set(le_db_index, 0, zero_rand, setup->sm_ltk, sm_conn->sm_actual_encryption_key_size, 1543 sm_conn->sm_connection_authenticated, sm_conn->sm_connection_authorization_state == AUTHORIZATION_GRANTED, 1); 1544 } 1545 1546 // store encryption information for legacy pairing: peer LTK, EDIV, RAND 1547 else if ( (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION) 1548 && (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_MASTER_IDENTIFICATION )){ 1549 log_info("sm: set encryption information (key size %u, authenticated %u)", sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated); 1550 le_device_db_encryption_set(le_db_index, setup->sm_peer_ediv, setup->sm_peer_rand, setup->sm_peer_ltk, 1551 sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated, sm_conn->sm_connection_authorization_state == AUTHORIZATION_GRANTED, 0); 1552 1553 } 1554 } 1555 } 1556 1557 static void sm_pairing_error(sm_connection_t * sm_conn, uint8_t reason){ 1558 sm_conn->sm_pairing_failed_reason = reason; 1559 sm_conn->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED; 1560 } 1561 1562 static int sm_le_device_db_index_lookup(bd_addr_type_t address_type, bd_addr_t address){ 1563 int i; 1564 for (i=0; i < le_device_db_max_count(); i++){ 1565 bd_addr_t db_address; 1566 int db_address_type = BD_ADDR_TYPE_UNKNOWN; 1567 le_device_db_info(i, &db_address_type, db_address, NULL); 1568 // skip unused entries 1569 if (address_type == BD_ADDR_TYPE_UNKNOWN) continue; 1570 if ((address_type == (unsigned int)db_address_type) && (memcmp(address, db_address, 6) == 0)){ 1571 return i; 1572 } 1573 } 1574 return -1; 1575 } 1576 1577 static void sm_remove_le_device_db_entry(uint16_t i) { 1578 le_device_db_remove(i); 1579 #ifdef ENABLE_LE_PRIVACY_ADDRESS_RESOLUTION 1580 // to remove an entry from the resolving list requires its identity address, which was already deleted 1581 // fully reload resolving list instead 1582 gap_load_resolving_list_from_le_device_db(); 1583 #endif 1584 } 1585 1586 static uint8_t sm_key_distribution_validate_received(sm_connection_t * sm_conn){ 1587 // if identity is provided, abort if we have bonding with same address but different irk 1588 if ((setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_IDENTITY_INFORMATION) != 0u){ 1589 int index = sm_le_device_db_index_lookup(BD_ADDR_TYPE_LE_PUBLIC, setup->sm_peer_address); 1590 if (index >= 0){ 1591 sm_key_t irk; 1592 le_device_db_info(index, NULL, NULL, irk); 1593 if (memcmp(irk, setup->sm_peer_irk, 16) != 0){ 1594 // IRK doesn't match, delete bonding information 1595 log_info("New IRK for %s (type %u) does not match stored IRK -> delete bonding information", bd_addr_to_str(sm_conn->sm_peer_address), sm_conn->sm_peer_addr_type); 1596 sm_remove_le_device_db_entry(index); 1597 } 1598 } 1599 } 1600 return 0; 1601 } 1602 1603 static void sm_key_distribution_handle_all_received(sm_connection_t * sm_conn){ 1604 1605 // abort pairing if received keys are not valid 1606 uint8_t reason = sm_key_distribution_validate_received(sm_conn); 1607 if (reason != 0){ 1608 sm_pairing_error(sm_conn, reason); 1609 return; 1610 } 1611 1612 // only store pairing information if both sides are bondable, i.e., the bonadble flag is set 1613 bool bonding_enabled = (sm_pairing_packet_get_auth_req(setup->sm_m_preq) 1614 & sm_pairing_packet_get_auth_req(setup->sm_s_pres) 1615 & SM_AUTHREQ_BONDING ) != 0u; 1616 1617 if (bonding_enabled){ 1618 sm_store_bonding_information(sm_conn); 1619 } else { 1620 log_info("Ignoring received keys, bonding not enabled"); 1621 } 1622 } 1623 1624 static inline void sm_pdu_received_in_wrong_state(sm_connection_t * sm_conn){ 1625 sm_pairing_error(sm_conn, SM_REASON_UNSPECIFIED_REASON); 1626 } 1627 1628 #ifdef ENABLE_LE_SECURE_CONNECTIONS 1629 1630 static void sm_sc_prepare_dhkey_check(sm_connection_t * sm_conn); 1631 static bool sm_passkey_used(stk_generation_method_t method); 1632 static bool sm_just_works_or_numeric_comparison(stk_generation_method_t method); 1633 1634 static void sm_sc_start_calculating_local_confirm(sm_connection_t * sm_conn){ 1635 if (setup->sm_stk_generation_method == OOB){ 1636 sm_conn->sm_engine_state = SM_SC_W2_CMAC_FOR_CONFIRMATION; 1637 } else { 1638 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_nonce, 16, &sm_handle_random_result_sc_next_w2_cmac_for_confirmation, (void *)(uintptr_t) sm_conn->sm_handle); 1639 } 1640 } 1641 1642 static void sm_sc_state_after_receiving_random(sm_connection_t * sm_conn){ 1643 if (IS_RESPONDER(sm_conn->sm_role)){ 1644 // Responder 1645 if (setup->sm_stk_generation_method == OOB){ 1646 // generate Nb 1647 log_info("Generate Nb"); 1648 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_nonce, 16, &sm_handle_random_result_sc_next_send_pairing_random, (void *)(uintptr_t) sm_conn->sm_handle); 1649 } else { 1650 sm_conn->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM; 1651 } 1652 } else { 1653 // Initiator role 1654 switch (setup->sm_stk_generation_method){ 1655 case JUST_WORKS: 1656 sm_sc_prepare_dhkey_check(sm_conn); 1657 break; 1658 1659 case NUMERIC_COMPARISON: 1660 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_G2; 1661 break; 1662 case PK_INIT_INPUT: 1663 case PK_RESP_INPUT: 1664 case PK_BOTH_INPUT: 1665 if (setup->sm_passkey_bit < 20u) { 1666 sm_sc_start_calculating_local_confirm(sm_conn); 1667 } else { 1668 sm_sc_prepare_dhkey_check(sm_conn); 1669 } 1670 break; 1671 case OOB: 1672 sm_sc_prepare_dhkey_check(sm_conn); 1673 break; 1674 default: 1675 btstack_assert(false); 1676 break; 1677 } 1678 } 1679 } 1680 1681 static void sm_sc_cmac_done(uint8_t * hash){ 1682 log_info("sm_sc_cmac_done: "); 1683 log_info_hexdump(hash, 16); 1684 1685 if (sm_sc_oob_state == SM_SC_OOB_W4_CONFIRM){ 1686 sm_sc_oob_state = SM_SC_OOB_IDLE; 1687 (*sm_sc_oob_callback)(hash, sm_sc_oob_random); 1688 return; 1689 } 1690 1691 sm_connection_t * sm_conn = sm_cmac_connection; 1692 sm_cmac_connection = NULL; 1693 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 1694 link_key_type_t link_key_type; 1695 #endif 1696 1697 switch (sm_conn->sm_engine_state){ 1698 case SM_SC_W4_CMAC_FOR_CONFIRMATION: 1699 (void)memcpy(setup->sm_local_confirm, hash, 16); 1700 sm_conn->sm_engine_state = SM_SC_SEND_CONFIRMATION; 1701 break; 1702 case SM_SC_W4_CMAC_FOR_CHECK_CONFIRMATION: 1703 // check 1704 if (0 != memcmp(hash, setup->sm_peer_confirm, 16)){ 1705 sm_pairing_error(sm_conn, SM_REASON_CONFIRM_VALUE_FAILED); 1706 break; 1707 } 1708 sm_sc_state_after_receiving_random(sm_conn); 1709 break; 1710 case SM_SC_W4_CALCULATE_G2: { 1711 uint32_t vab = big_endian_read_32(hash, 12) % 1000000; 1712 big_endian_store_32(setup->sm_tk, 12, vab); 1713 sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE; 1714 sm_trigger_user_response(sm_conn); 1715 break; 1716 } 1717 case SM_SC_W4_CALCULATE_F5_SALT: 1718 (void)memcpy(setup->sm_t, hash, 16); 1719 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_MACKEY; 1720 break; 1721 case SM_SC_W4_CALCULATE_F5_MACKEY: 1722 (void)memcpy(setup->sm_mackey, hash, 16); 1723 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_LTK; 1724 break; 1725 case SM_SC_W4_CALCULATE_F5_LTK: 1726 // truncate sm_ltk, but keep full LTK for cross-transport key derivation in sm_local_ltk 1727 // Errata Service Release to the Bluetooth Specification: ESR09 1728 // E6405 – Cross transport key derivation from a key of size less than 128 bits 1729 // Note: When the BR/EDR link key is being derived from the LTK, the derivation is done before the LTK gets masked." 1730 (void)memcpy(setup->sm_ltk, hash, 16); 1731 (void)memcpy(setup->sm_local_ltk, hash, 16); 1732 sm_truncate_key(setup->sm_ltk, sm_conn->sm_actual_encryption_key_size); 1733 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK; 1734 break; 1735 case SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK: 1736 (void)memcpy(setup->sm_local_dhkey_check, hash, 16); 1737 if (IS_RESPONDER(sm_conn->sm_role)){ 1738 // responder 1739 if ((setup->sm_state_vars & SM_STATE_VAR_DHKEY_COMMAND_RECEIVED) != 0u){ 1740 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK; 1741 } else { 1742 sm_conn->sm_engine_state = SM_SC_W4_DHKEY_CHECK_COMMAND; 1743 } 1744 } else { 1745 sm_conn->sm_engine_state = SM_SC_SEND_DHKEY_CHECK_COMMAND; 1746 } 1747 break; 1748 case SM_SC_W4_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK: 1749 if (0 != memcmp(hash, setup->sm_peer_dhkey_check, 16) ){ 1750 sm_pairing_error(sm_conn, SM_REASON_DHKEY_CHECK_FAILED); 1751 break; 1752 } 1753 if (IS_RESPONDER(sm_conn->sm_role)){ 1754 // responder 1755 sm_conn->sm_engine_state = SM_SC_SEND_DHKEY_CHECK_COMMAND; 1756 } else { 1757 // initiator 1758 sm_conn->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION; 1759 } 1760 break; 1761 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 1762 case SM_SC_W4_CALCULATE_ILK: 1763 (void)memcpy(setup->sm_t, hash, 16); 1764 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_BR_EDR_LINK_KEY; 1765 break; 1766 case SM_SC_W4_CALCULATE_BR_EDR_LINK_KEY: 1767 reverse_128(hash, setup->sm_t); 1768 link_key_type = sm_conn->sm_connection_authenticated ? 1769 AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256 : UNAUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256; 1770 log_info("Derived classic link key from LE using h6, type %u", (int) link_key_type); 1771 gap_store_link_key_for_bd_addr(setup->sm_peer_address, setup->sm_t, link_key_type); 1772 if (IS_RESPONDER(sm_conn->sm_role)){ 1773 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 1774 } else { 1775 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 1776 } 1777 sm_pairing_complete(sm_conn, ERROR_CODE_SUCCESS, 0); 1778 sm_done_for_handle(sm_conn->sm_handle); 1779 break; 1780 case SM_BR_EDR_W4_CALCULATE_ILK: 1781 (void)memcpy(setup->sm_t, hash, 16); 1782 sm_conn->sm_engine_state = SM_BR_EDR_W2_CALCULATE_LE_LTK; 1783 break; 1784 case SM_BR_EDR_W4_CALCULATE_LE_LTK: 1785 log_info("Derived LE LTK from BR/EDR Link Key"); 1786 log_info_key("Link Key", hash); 1787 (void)memcpy(setup->sm_ltk, hash, 16); 1788 sm_truncate_key(setup->sm_ltk, sm_conn->sm_actual_encryption_key_size); 1789 sm_conn->sm_connection_authenticated = setup->sm_link_key_type == AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256; 1790 sm_store_bonding_information(sm_conn); 1791 sm_done_for_handle(sm_conn->sm_handle); 1792 break; 1793 #endif 1794 default: 1795 log_error("sm_sc_cmac_done in state %u", sm_conn->sm_engine_state); 1796 break; 1797 } 1798 sm_trigger_run(); 1799 } 1800 1801 static void f4_engine(sm_connection_t * sm_conn, const sm_key256_t u, const sm_key256_t v, const sm_key_t x, uint8_t z){ 1802 const uint16_t message_len = 65; 1803 sm_cmac_connection = sm_conn; 1804 (void)memcpy(sm_cmac_sc_buffer, u, 32); 1805 (void)memcpy(sm_cmac_sc_buffer + 32, v, 32); 1806 sm_cmac_sc_buffer[64] = z; 1807 log_info("f4 key"); 1808 log_info_hexdump(x, 16); 1809 log_info("f4 message"); 1810 log_info_hexdump(sm_cmac_sc_buffer, message_len); 1811 sm_cmac_message_start(x, message_len, sm_cmac_sc_buffer, &sm_sc_cmac_done); 1812 } 1813 1814 static const uint8_t f5_key_id[] = { 0x62, 0x74, 0x6c, 0x65 }; 1815 static const uint8_t f5_length[] = { 0x01, 0x00}; 1816 1817 static void f5_calculate_salt(sm_connection_t * sm_conn){ 1818 1819 static const sm_key_t f5_salt = { 0x6C ,0x88, 0x83, 0x91, 0xAA, 0xF5, 0xA5, 0x38, 0x60, 0x37, 0x0B, 0xDB, 0x5A, 0x60, 0x83, 0xBE}; 1820 1821 log_info("f5_calculate_salt"); 1822 // calculate salt for f5 1823 const uint16_t message_len = 32; 1824 sm_cmac_connection = sm_conn; 1825 (void)memcpy(sm_cmac_sc_buffer, setup->sm_dhkey, message_len); 1826 sm_cmac_message_start(f5_salt, message_len, sm_cmac_sc_buffer, &sm_sc_cmac_done); 1827 } 1828 1829 static inline void f5_mackkey(sm_connection_t * sm_conn, sm_key_t t, const sm_key_t n1, const sm_key_t n2, const sm_key56_t a1, const sm_key56_t a2){ 1830 const uint16_t message_len = 53; 1831 sm_cmac_connection = sm_conn; 1832 1833 // f5(W, N1, N2, A1, A2) = AES-CMACT (Counter = 0 || keyID || N1 || N2|| A1|| A2 || Length = 256) -- this is the MacKey 1834 sm_cmac_sc_buffer[0] = 0; 1835 (void)memcpy(sm_cmac_sc_buffer + 01, f5_key_id, 4); 1836 (void)memcpy(sm_cmac_sc_buffer + 05, n1, 16); 1837 (void)memcpy(sm_cmac_sc_buffer + 21, n2, 16); 1838 (void)memcpy(sm_cmac_sc_buffer + 37, a1, 7); 1839 (void)memcpy(sm_cmac_sc_buffer + 44, a2, 7); 1840 (void)memcpy(sm_cmac_sc_buffer + 51, f5_length, 2); 1841 log_info("f5 key"); 1842 log_info_hexdump(t, 16); 1843 log_info("f5 message for MacKey"); 1844 log_info_hexdump(sm_cmac_sc_buffer, message_len); 1845 sm_cmac_message_start(t, message_len, sm_cmac_sc_buffer, &sm_sc_cmac_done); 1846 } 1847 1848 static void f5_calculate_mackey(sm_connection_t * sm_conn){ 1849 sm_key56_t bd_addr_master, bd_addr_slave; 1850 bd_addr_master[0] = setup->sm_m_addr_type; 1851 bd_addr_slave[0] = setup->sm_s_addr_type; 1852 (void)memcpy(&bd_addr_master[1], setup->sm_m_address, 6); 1853 (void)memcpy(&bd_addr_slave[1], setup->sm_s_address, 6); 1854 if (IS_RESPONDER(sm_conn->sm_role)){ 1855 // responder 1856 f5_mackkey(sm_conn, setup->sm_t, setup->sm_peer_nonce, setup->sm_local_nonce, bd_addr_master, bd_addr_slave); 1857 } else { 1858 // initiator 1859 f5_mackkey(sm_conn, setup->sm_t, setup->sm_local_nonce, setup->sm_peer_nonce, bd_addr_master, bd_addr_slave); 1860 } 1861 } 1862 1863 // note: must be called right after f5_mackey, as sm_cmac_buffer[1..52] will be reused 1864 static inline void f5_ltk(sm_connection_t * sm_conn, sm_key_t t){ 1865 const uint16_t message_len = 53; 1866 sm_cmac_connection = sm_conn; 1867 sm_cmac_sc_buffer[0] = 1; 1868 // 1..52 setup before 1869 log_info("f5 key"); 1870 log_info_hexdump(t, 16); 1871 log_info("f5 message for LTK"); 1872 log_info_hexdump(sm_cmac_sc_buffer, message_len); 1873 sm_cmac_message_start(t, message_len, sm_cmac_sc_buffer, &sm_sc_cmac_done); 1874 } 1875 1876 static void f5_calculate_ltk(sm_connection_t * sm_conn){ 1877 f5_ltk(sm_conn, setup->sm_t); 1878 } 1879 1880 static void f6_setup(const sm_key_t n1, const sm_key_t n2, const sm_key_t r, const sm_key24_t io_cap, const sm_key56_t a1, const sm_key56_t a2){ 1881 (void)memcpy(sm_cmac_sc_buffer, n1, 16); 1882 (void)memcpy(sm_cmac_sc_buffer + 16, n2, 16); 1883 (void)memcpy(sm_cmac_sc_buffer + 32, r, 16); 1884 (void)memcpy(sm_cmac_sc_buffer + 48, io_cap, 3); 1885 (void)memcpy(sm_cmac_sc_buffer + 51, a1, 7); 1886 (void)memcpy(sm_cmac_sc_buffer + 58, a2, 7); 1887 } 1888 1889 static void f6_engine(sm_connection_t * sm_conn, const sm_key_t w){ 1890 const uint16_t message_len = 65; 1891 sm_cmac_connection = sm_conn; 1892 log_info("f6 key"); 1893 log_info_hexdump(w, 16); 1894 log_info("f6 message"); 1895 log_info_hexdump(sm_cmac_sc_buffer, message_len); 1896 sm_cmac_message_start(w, 65, sm_cmac_sc_buffer, &sm_sc_cmac_done); 1897 } 1898 1899 // g2(U, V, X, Y) = AES-CMACX(U || V || Y) mod 2^32 1900 // - U is 256 bits 1901 // - V is 256 bits 1902 // - X is 128 bits 1903 // - Y is 128 bits 1904 static void g2_engine(sm_connection_t * sm_conn, const sm_key256_t u, const sm_key256_t v, const sm_key_t x, const sm_key_t y){ 1905 const uint16_t message_len = 80; 1906 sm_cmac_connection = sm_conn; 1907 (void)memcpy(sm_cmac_sc_buffer, u, 32); 1908 (void)memcpy(sm_cmac_sc_buffer + 32, v, 32); 1909 (void)memcpy(sm_cmac_sc_buffer + 64, y, 16); 1910 log_info("g2 key"); 1911 log_info_hexdump(x, 16); 1912 log_info("g2 message"); 1913 log_info_hexdump(sm_cmac_sc_buffer, message_len); 1914 sm_cmac_message_start(x, message_len, sm_cmac_sc_buffer, &sm_sc_cmac_done); 1915 } 1916 1917 static void g2_calculate(sm_connection_t * sm_conn) { 1918 // calc Va if numeric comparison 1919 if (IS_RESPONDER(sm_conn->sm_role)){ 1920 // responder 1921 g2_engine(sm_conn, setup->sm_peer_q, ec_q, setup->sm_peer_nonce, setup->sm_local_nonce);; 1922 } else { 1923 // initiator 1924 g2_engine(sm_conn, ec_q, setup->sm_peer_q, setup->sm_local_nonce, setup->sm_peer_nonce); 1925 } 1926 } 1927 1928 static void sm_sc_calculate_local_confirm(sm_connection_t * sm_conn){ 1929 uint8_t z = 0; 1930 if (sm_passkey_entry(setup->sm_stk_generation_method)){ 1931 // some form of passkey 1932 uint32_t pk = big_endian_read_32(setup->sm_tk, 12); 1933 z = 0x80u | ((pk >> setup->sm_passkey_bit) & 1u); 1934 setup->sm_passkey_bit++; 1935 } 1936 f4_engine(sm_conn, ec_q, setup->sm_peer_q, setup->sm_local_nonce, z); 1937 } 1938 1939 static void sm_sc_calculate_remote_confirm(sm_connection_t * sm_conn){ 1940 // OOB 1941 if (setup->sm_stk_generation_method == OOB){ 1942 if (IS_RESPONDER(sm_conn->sm_role)){ 1943 f4_engine(sm_conn, setup->sm_peer_q, setup->sm_peer_q, setup->sm_ra, 0); 1944 } else { 1945 f4_engine(sm_conn, setup->sm_peer_q, setup->sm_peer_q, setup->sm_rb, 0); 1946 } 1947 return; 1948 } 1949 1950 uint8_t z = 0; 1951 if (sm_passkey_entry(setup->sm_stk_generation_method)){ 1952 // some form of passkey 1953 uint32_t pk = big_endian_read_32(setup->sm_tk, 12); 1954 // sm_passkey_bit was increased before sending confirm value 1955 z = 0x80u | ((pk >> (setup->sm_passkey_bit-1u)) & 1u); 1956 } 1957 f4_engine(sm_conn, setup->sm_peer_q, ec_q, setup->sm_peer_nonce, z); 1958 } 1959 1960 static void sm_sc_prepare_dhkey_check(sm_connection_t * sm_conn){ 1961 log_info("sm_sc_prepare_dhkey_check, DHKEY calculated %u", (setup->sm_state_vars & SM_STATE_VAR_DHKEY_CALCULATED) != 0 ? 1 : 0); 1962 1963 if ((setup->sm_state_vars & SM_STATE_VAR_DHKEY_CALCULATED) != 0u){ 1964 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_SALT; 1965 } else { 1966 sm_conn->sm_engine_state = SM_SC_W4_CALCULATE_DHKEY; 1967 } 1968 } 1969 1970 static void sm_sc_dhkey_calculated(void * arg){ 1971 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 1972 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 1973 if (sm_conn == NULL) return; 1974 1975 // check for invalid public key detected by Controller 1976 if (sm_is_ff(setup->sm_dhkey, 32)){ 1977 log_info("sm: peer public key invalid"); 1978 sm_pairing_error(sm_conn, SM_REASON_DHKEY_CHECK_FAILED); 1979 return; 1980 } 1981 1982 log_info("dhkey"); 1983 log_info_hexdump(&setup->sm_dhkey[0], 32); 1984 setup->sm_state_vars |= SM_STATE_VAR_DHKEY_CALCULATED; 1985 // trigger next step 1986 if (sm_conn->sm_engine_state == SM_SC_W4_CALCULATE_DHKEY){ 1987 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_SALT; 1988 } 1989 sm_trigger_run(); 1990 } 1991 1992 static void sm_sc_calculate_f6_for_dhkey_check(sm_connection_t * sm_conn){ 1993 // calculate DHKCheck 1994 sm_key56_t bd_addr_master, bd_addr_slave; 1995 bd_addr_master[0] = setup->sm_m_addr_type; 1996 bd_addr_slave[0] = setup->sm_s_addr_type; 1997 (void)memcpy(&bd_addr_master[1], setup->sm_m_address, 6); 1998 (void)memcpy(&bd_addr_slave[1], setup->sm_s_address, 6); 1999 uint8_t iocap_a[3]; 2000 iocap_a[0] = sm_pairing_packet_get_auth_req(setup->sm_m_preq); 2001 iocap_a[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq); 2002 iocap_a[2] = sm_pairing_packet_get_io_capability(setup->sm_m_preq); 2003 uint8_t iocap_b[3]; 2004 iocap_b[0] = sm_pairing_packet_get_auth_req(setup->sm_s_pres); 2005 iocap_b[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres); 2006 iocap_b[2] = sm_pairing_packet_get_io_capability(setup->sm_s_pres); 2007 if (IS_RESPONDER(sm_conn->sm_role)){ 2008 // responder 2009 f6_setup(setup->sm_local_nonce, setup->sm_peer_nonce, setup->sm_ra, iocap_b, bd_addr_slave, bd_addr_master); 2010 f6_engine(sm_conn, setup->sm_mackey); 2011 } else { 2012 // initiator 2013 f6_setup( setup->sm_local_nonce, setup->sm_peer_nonce, setup->sm_rb, iocap_a, bd_addr_master, bd_addr_slave); 2014 f6_engine(sm_conn, setup->sm_mackey); 2015 } 2016 } 2017 2018 static void sm_sc_calculate_f6_to_verify_dhkey_check(sm_connection_t * sm_conn){ 2019 // validate E = f6() 2020 sm_key56_t bd_addr_master, bd_addr_slave; 2021 bd_addr_master[0] = setup->sm_m_addr_type; 2022 bd_addr_slave[0] = setup->sm_s_addr_type; 2023 (void)memcpy(&bd_addr_master[1], setup->sm_m_address, 6); 2024 (void)memcpy(&bd_addr_slave[1], setup->sm_s_address, 6); 2025 2026 uint8_t iocap_a[3]; 2027 iocap_a[0] = sm_pairing_packet_get_auth_req(setup->sm_m_preq); 2028 iocap_a[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq); 2029 iocap_a[2] = sm_pairing_packet_get_io_capability(setup->sm_m_preq); 2030 uint8_t iocap_b[3]; 2031 iocap_b[0] = sm_pairing_packet_get_auth_req(setup->sm_s_pres); 2032 iocap_b[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres); 2033 iocap_b[2] = sm_pairing_packet_get_io_capability(setup->sm_s_pres); 2034 if (IS_RESPONDER(sm_conn->sm_role)){ 2035 // responder 2036 f6_setup(setup->sm_peer_nonce, setup->sm_local_nonce, setup->sm_rb, iocap_a, bd_addr_master, bd_addr_slave); 2037 f6_engine(sm_conn, setup->sm_mackey); 2038 } else { 2039 // initiator 2040 f6_setup(setup->sm_peer_nonce, setup->sm_local_nonce, setup->sm_ra, iocap_b, bd_addr_slave, bd_addr_master); 2041 f6_engine(sm_conn, setup->sm_mackey); 2042 } 2043 } 2044 2045 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 2046 2047 // 2048 // Link Key Conversion Function h6 2049 // 2050 // h6(W, keyID) = AES-CMAC_W(keyID) 2051 // - W is 128 bits 2052 // - keyID is 32 bits 2053 static void h6_engine(sm_connection_t * sm_conn, const sm_key_t w, const uint32_t key_id){ 2054 const uint16_t message_len = 4; 2055 sm_cmac_connection = sm_conn; 2056 big_endian_store_32(sm_cmac_sc_buffer, 0, key_id); 2057 log_info("h6 key"); 2058 log_info_hexdump(w, 16); 2059 log_info("h6 message"); 2060 log_info_hexdump(sm_cmac_sc_buffer, message_len); 2061 sm_cmac_message_start(w, message_len, sm_cmac_sc_buffer, &sm_sc_cmac_done); 2062 } 2063 // 2064 // Link Key Conversion Function h7 2065 // 2066 // h7(SALT, W) = AES-CMAC_SALT(W) 2067 // - SALT is 128 bits 2068 // - W is 128 bits 2069 static void h7_engine(sm_connection_t * sm_conn, const sm_key_t salt, const sm_key_t w) { 2070 const uint16_t message_len = 16; 2071 sm_cmac_connection = sm_conn; 2072 log_info("h7 key"); 2073 log_info_hexdump(salt, 16); 2074 log_info("h7 message"); 2075 log_info_hexdump(w, 16); 2076 sm_cmac_message_start(salt, message_len, w, &sm_sc_cmac_done); 2077 } 2078 2079 // For SC, setup->sm_local_ltk holds full LTK (sm_ltk is already truncated) 2080 // Errata Service Release to the Bluetooth Specification: ESR09 2081 // E6405 – Cross transport key derivation from a key of size less than 128 bits 2082 // "Note: When the BR/EDR link key is being derived from the LTK, the derivation is done before the LTK gets masked." 2083 2084 static void h6_calculate_ilk_from_le_ltk(sm_connection_t * sm_conn){ 2085 h6_engine(sm_conn, setup->sm_local_ltk, 0x746D7031); // "tmp1" 2086 } 2087 2088 static void h6_calculate_ilk_from_br_edr(sm_connection_t * sm_conn){ 2089 h6_engine(sm_conn, setup->sm_link_key, 0x746D7032); // "tmp2" 2090 } 2091 2092 static void h6_calculate_br_edr_link_key(sm_connection_t * sm_conn){ 2093 h6_engine(sm_conn, setup->sm_t, 0x6c656272); // "lebr" 2094 } 2095 2096 static void h6_calculate_le_ltk(sm_connection_t * sm_conn){ 2097 h6_engine(sm_conn, setup->sm_t, 0x62726C65); // "brle" 2098 } 2099 2100 static void h7_calculate_ilk_from_le_ltk(sm_connection_t * sm_conn){ 2101 const uint8_t salt[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x6D, 0x70, 0x31}; // "tmp1" 2102 h7_engine(sm_conn, salt, setup->sm_local_ltk); 2103 } 2104 2105 static void h7_calculate_ilk_from_br_edr(sm_connection_t * sm_conn){ 2106 const uint8_t salt[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x6D, 0x70, 0x32}; // "tmp2" 2107 h7_engine(sm_conn, salt, setup->sm_link_key); 2108 } 2109 2110 static void sm_ctkd_fetch_br_edr_link_key(sm_connection_t * sm_conn){ 2111 hci_connection_t * hci_connection = hci_connection_for_handle(sm_conn->sm_handle); 2112 btstack_assert(hci_connection != NULL); 2113 reverse_128(hci_connection->link_key, setup->sm_link_key); 2114 setup->sm_link_key_type = hci_connection->link_key_type; 2115 } 2116 2117 static void sm_ctkd_start_from_br_edr(sm_connection_t * sm_conn){ 2118 // only derive LTK if EncKey is set by both 2119 bool derive_ltk = (sm_pairing_packet_get_initiator_key_distribution(setup->sm_s_pres) & 2120 sm_pairing_packet_get_responder_key_distribution(setup->sm_s_pres) & SM_KEYDIST_ENC_KEY) != 0; 2121 if (derive_ltk){ 2122 bool use_h7 = (sm_pairing_packet_get_auth_req(setup->sm_m_preq) & sm_pairing_packet_get_auth_req(setup->sm_s_pres) & SM_AUTHREQ_CT2) != 0; 2123 sm_conn->sm_engine_state = use_h7 ? SM_BR_EDR_W2_CALCULATE_ILK_USING_H7 : SM_BR_EDR_W2_CALCULATE_ILK_USING_H6; 2124 } else { 2125 sm_done_for_handle(sm_conn->sm_handle); 2126 } 2127 } 2128 2129 #endif 2130 2131 #endif 2132 2133 // key management legacy connections: 2134 // - potentially two different LTKs based on direction. each device stores LTK provided by peer 2135 // - master stores LTK, EDIV, RAND. responder optionally stored master LTK (only if it needs to reconnect) 2136 // - initiators reconnects: initiator uses stored LTK, EDIV, RAND generated by responder 2137 // - responder reconnects: responder uses LTK receveived from master 2138 2139 // key management secure connections: 2140 // - both devices store same LTK from ECDH key exchange. 2141 2142 #if defined(ENABLE_LE_SECURE_CONNECTIONS) || defined(ENABLE_LE_CENTRAL) 2143 static void sm_load_security_info(sm_connection_t * sm_connection){ 2144 int encryption_key_size; 2145 int authenticated; 2146 int authorized; 2147 int secure_connection; 2148 2149 // fetch data from device db - incl. authenticated/authorized/key size. Note all sm_connection_X require encryption enabled 2150 le_device_db_encryption_get(sm_connection->sm_le_db_index, &setup->sm_peer_ediv, setup->sm_peer_rand, setup->sm_peer_ltk, 2151 &encryption_key_size, &authenticated, &authorized, &secure_connection); 2152 log_info("db index %u, key size %u, authenticated %u, authorized %u, secure connetion %u", sm_connection->sm_le_db_index, encryption_key_size, authenticated, authorized, secure_connection); 2153 sm_connection->sm_actual_encryption_key_size = encryption_key_size; 2154 sm_connection->sm_connection_authenticated = authenticated; 2155 sm_connection->sm_connection_authorization_state = authorized ? AUTHORIZATION_GRANTED : AUTHORIZATION_UNKNOWN; 2156 sm_connection->sm_connection_sc = secure_connection != 0; 2157 } 2158 #endif 2159 2160 #ifdef ENABLE_LE_PERIPHERAL 2161 static void sm_start_calculating_ltk_from_ediv_and_rand(sm_connection_t * sm_connection){ 2162 (void)memcpy(setup->sm_local_rand, sm_connection->sm_local_rand, 8); 2163 setup->sm_local_ediv = sm_connection->sm_local_ediv; 2164 // re-establish used key encryption size 2165 // no db for encryption size hack: encryption size is stored in lowest nibble of setup->sm_local_rand 2166 sm_connection->sm_actual_encryption_key_size = (setup->sm_local_rand[7u] & 0x0fu) + 1u; 2167 // no db for authenticated flag hack: flag is stored in bit 4 of LSB 2168 sm_connection->sm_connection_authenticated = (setup->sm_local_rand[7u] & 0x10u) >> 4u; 2169 // Legacy paring -> not SC 2170 sm_connection->sm_connection_sc = false; 2171 log_info("sm: received ltk request with key size %u, authenticated %u", 2172 sm_connection->sm_actual_encryption_key_size, sm_connection->sm_connection_authenticated); 2173 } 2174 #endif 2175 2176 // distributed key generation 2177 static bool sm_run_dpkg(void){ 2178 switch (dkg_state){ 2179 case DKG_CALC_IRK: 2180 // already busy? 2181 if (sm_aes128_state == SM_AES128_IDLE) { 2182 log_info("DKG_CALC_IRK started"); 2183 // IRK = d1(IR, 1, 0) 2184 sm_d1_d_prime(1, 0, sm_aes128_plaintext); // plaintext = d1 prime 2185 sm_aes128_state = SM_AES128_ACTIVE; 2186 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_ir, sm_aes128_plaintext, sm_persistent_irk, sm_handle_encryption_result_dkg_irk, NULL); 2187 return true; 2188 } 2189 break; 2190 case DKG_CALC_DHK: 2191 // already busy? 2192 if (sm_aes128_state == SM_AES128_IDLE) { 2193 log_info("DKG_CALC_DHK started"); 2194 // DHK = d1(IR, 3, 0) 2195 sm_d1_d_prime(3, 0, sm_aes128_plaintext); // plaintext = d1 prime 2196 sm_aes128_state = SM_AES128_ACTIVE; 2197 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_ir, sm_aes128_plaintext, sm_persistent_dhk, sm_handle_encryption_result_dkg_dhk, NULL); 2198 return true; 2199 } 2200 break; 2201 default: 2202 break; 2203 } 2204 return false; 2205 } 2206 2207 // random address updates 2208 static bool sm_run_rau(void){ 2209 switch (rau_state){ 2210 case RAU_GET_RANDOM: 2211 rau_state = RAU_W4_RANDOM; 2212 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_address, 6, &sm_handle_random_result_rau, NULL); 2213 return true; 2214 case RAU_GET_ENC: 2215 // already busy? 2216 if (sm_aes128_state == SM_AES128_IDLE) { 2217 sm_ah_r_prime(sm_random_address, sm_aes128_plaintext); 2218 sm_aes128_state = SM_AES128_ACTIVE; 2219 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_irk, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_rau, NULL); 2220 return true; 2221 } 2222 break; 2223 default: 2224 break; 2225 } 2226 return false; 2227 } 2228 2229 // device lookup with IRK 2230 static bool sm_run_irk_lookup(void){ 2231 btstack_linked_list_iterator_t it; 2232 2233 // -- if IRK lookup ready, find connection that require csrk lookup 2234 if (sm_address_resolution_idle()){ 2235 hci_connections_get_iterator(&it); 2236 while(btstack_linked_list_iterator_has_next(&it)){ 2237 hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it); 2238 sm_connection_t * sm_connection = &hci_connection->sm_connection; 2239 if (sm_connection->sm_irk_lookup_state == IRK_LOOKUP_W4_READY){ 2240 // and start lookup 2241 sm_address_resolution_start_lookup(sm_connection->sm_peer_addr_type, sm_connection->sm_handle, sm_connection->sm_peer_address, ADDRESS_RESOLUTION_FOR_CONNECTION, sm_connection); 2242 sm_connection->sm_irk_lookup_state = IRK_LOOKUP_STARTED; 2243 break; 2244 } 2245 } 2246 } 2247 2248 // -- if csrk lookup ready, resolved addresses for received addresses 2249 if (sm_address_resolution_idle()) { 2250 if (!btstack_linked_list_empty(&sm_address_resolution_general_queue)){ 2251 sm_lookup_entry_t * entry = (sm_lookup_entry_t *) sm_address_resolution_general_queue; 2252 btstack_linked_list_remove(&sm_address_resolution_general_queue, (btstack_linked_item_t *) entry); 2253 sm_address_resolution_start_lookup(entry->address_type, 0, entry->address, ADDRESS_RESOLUTION_GENERAL, NULL); 2254 btstack_memory_sm_lookup_entry_free(entry); 2255 } 2256 } 2257 2258 // -- Continue with device lookup by public or resolvable private address 2259 if (!sm_address_resolution_idle()){ 2260 while (sm_address_resolution_test < le_device_db_max_count()){ 2261 int addr_type = BD_ADDR_TYPE_UNKNOWN; 2262 bd_addr_t addr; 2263 sm_key_t irk; 2264 le_device_db_info(sm_address_resolution_test, &addr_type, addr, irk); 2265 2266 // skip unused entries 2267 if (addr_type == BD_ADDR_TYPE_UNKNOWN){ 2268 sm_address_resolution_test++; 2269 continue; 2270 } 2271 2272 log_info("LE Device Lookup: device %u of %u - type %u, %s", sm_address_resolution_test, 2273 le_device_db_max_count(), addr_type, bd_addr_to_str(addr)); 2274 2275 // map resolved identity addresses to regular addresses 2276 int regular_addr_type = sm_address_resolution_addr_type & 1; 2277 if ((regular_addr_type == addr_type) && (memcmp(addr, sm_address_resolution_address, 6) == 0)){ 2278 log_info("LE Device Lookup: found by { addr_type, address} "); 2279 sm_address_resolution_handle_event(ADDRESS_RESOLUTION_SUCCEEDED); 2280 break; 2281 } 2282 2283 // if connection type is not random (i.e. public or resolved identity), it must be a different entry 2284 if (sm_address_resolution_addr_type != BD_ADDR_TYPE_LE_RANDOM){ 2285 sm_address_resolution_test++; 2286 continue; 2287 } 2288 2289 // skip AH if no IRK 2290 if (sm_is_null_key(irk)){ 2291 sm_address_resolution_test++; 2292 continue; 2293 } 2294 2295 if (sm_aes128_state == SM_AES128_ACTIVE) break; 2296 2297 log_info("LE Device Lookup: calculate AH"); 2298 log_info_key("IRK", irk); 2299 2300 (void)memcpy(sm_aes128_key, irk, 16); 2301 sm_ah_r_prime(sm_address_resolution_address, sm_aes128_plaintext); 2302 sm_aes128_state = SM_AES128_ACTIVE; 2303 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_aes128_key, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_address_resolution, NULL); 2304 return true; 2305 } 2306 2307 if (sm_address_resolution_test >= le_device_db_max_count()){ 2308 log_info("LE Device Lookup: not found"); 2309 sm_address_resolution_handle_event(ADDRESS_RESOLUTION_FAILED); 2310 } 2311 } 2312 return false; 2313 } 2314 2315 // SC OOB 2316 static bool sm_run_oob(void){ 2317 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2318 switch (sm_sc_oob_state){ 2319 case SM_SC_OOB_W2_CALC_CONFIRM: 2320 if (!sm_cmac_ready()) break; 2321 sm_sc_oob_state = SM_SC_OOB_W4_CONFIRM; 2322 f4_engine(NULL, ec_q, ec_q, sm_sc_oob_random, 0); 2323 return true; 2324 default: 2325 break; 2326 } 2327 #endif 2328 return false; 2329 } 2330 2331 static void sm_send_connectionless(sm_connection_t * sm_connection, const uint8_t * buffer, uint16_t size){ 2332 l2cap_send_connectionless(sm_connection->sm_handle, sm_connection->sm_cid, (uint8_t*) buffer, size); 2333 } 2334 2335 // handle basic actions that don't requires the full context 2336 static bool sm_run_basic(void){ 2337 btstack_linked_list_iterator_t it; 2338 hci_connections_get_iterator(&it); 2339 while(btstack_linked_list_iterator_has_next(&it)){ 2340 hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it); 2341 sm_connection_t * sm_connection = &hci_connection->sm_connection; 2342 switch(sm_connection->sm_engine_state){ 2343 2344 // general 2345 case SM_GENERAL_SEND_PAIRING_FAILED: { 2346 uint8_t buffer[2]; 2347 buffer[0] = SM_CODE_PAIRING_FAILED; 2348 buffer[1] = sm_connection->sm_pairing_failed_reason; 2349 sm_connection->sm_engine_state = sm_connection->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED; 2350 sm_send_connectionless(sm_connection, (uint8_t*) buffer, sizeof(buffer)); 2351 sm_pairing_complete(sm_connection, ERROR_CODE_AUTHENTICATION_FAILURE, sm_connection->sm_pairing_failed_reason); 2352 sm_done_for_handle(sm_connection->sm_handle); 2353 break; 2354 } 2355 2356 // responder side 2357 case SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY: 2358 sm_connection->sm_engine_state = SM_RESPONDER_IDLE; 2359 hci_send_cmd(&hci_le_long_term_key_negative_reply, sm_connection->sm_handle); 2360 return true; 2361 2362 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2363 case SM_SC_RECEIVED_LTK_REQUEST: 2364 switch (sm_connection->sm_irk_lookup_state){ 2365 case IRK_LOOKUP_FAILED: 2366 log_info("LTK Request: IRK Lookup Failed)"); 2367 sm_connection->sm_engine_state = SM_RESPONDER_IDLE; 2368 hci_send_cmd(&hci_le_long_term_key_negative_reply, sm_connection->sm_handle); 2369 return true; 2370 default: 2371 break; 2372 } 2373 break; 2374 #endif 2375 default: 2376 break; 2377 } 2378 } 2379 return false; 2380 } 2381 2382 static void sm_run_activate_connection(void){ 2383 // Find connections that requires setup context and make active if no other is locked 2384 btstack_linked_list_iterator_t it; 2385 hci_connections_get_iterator(&it); 2386 while((sm_active_connection_handle == HCI_CON_HANDLE_INVALID) && btstack_linked_list_iterator_has_next(&it)){ 2387 hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it); 2388 sm_connection_t * sm_connection = &hci_connection->sm_connection; 2389 // - if no connection locked and we're ready/waiting for setup context, fetch it and start 2390 bool done = true; 2391 int err; 2392 UNUSED(err); 2393 2394 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2395 // assert ec key is ready 2396 if ( (sm_connection->sm_engine_state == SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED) 2397 || (sm_connection->sm_engine_state == SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST) 2398 || (sm_connection->sm_engine_state == SM_RESPONDER_SEND_SECURITY_REQUEST)){ 2399 if (ec_key_generation_state == EC_KEY_GENERATION_IDLE){ 2400 sm_ec_generate_new_key(); 2401 } 2402 if (ec_key_generation_state != EC_KEY_GENERATION_DONE){ 2403 continue; 2404 } 2405 } 2406 #endif 2407 2408 switch (sm_connection->sm_engine_state) { 2409 #ifdef ENABLE_LE_PERIPHERAL 2410 case SM_RESPONDER_SEND_SECURITY_REQUEST: 2411 case SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED: 2412 case SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST: 2413 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2414 case SM_SC_RECEIVED_LTK_REQUEST: 2415 #endif 2416 #endif 2417 #ifdef ENABLE_LE_CENTRAL 2418 case SM_INITIATOR_PH4_HAS_LTK: 2419 case SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST: 2420 #endif 2421 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 2422 case SM_BR_EDR_RESPONDER_PAIRING_REQUEST_RECEIVED: 2423 case SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST: 2424 #endif 2425 // just lock context 2426 break; 2427 default: 2428 done = false; 2429 break; 2430 } 2431 if (done){ 2432 sm_active_connection_handle = sm_connection->sm_handle; 2433 log_info("sm: connection 0x%04x locked setup context as %s, state %u", sm_active_connection_handle, sm_connection->sm_role ? "responder" : "initiator", sm_connection->sm_engine_state); 2434 } 2435 } 2436 } 2437 2438 static void sm_run_send_keypress_notification(sm_connection_t * connection){ 2439 int i; 2440 uint8_t flags = setup->sm_keypress_notification & 0x1fu; 2441 uint8_t num_actions = setup->sm_keypress_notification >> 5; 2442 uint8_t action = 0; 2443 for (i=SM_KEYPRESS_PASSKEY_ENTRY_STARTED;i<=SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED;i++){ 2444 if ((flags & (1u<<i)) != 0u){ 2445 bool clear_flag = true; 2446 switch (i){ 2447 case SM_KEYPRESS_PASSKEY_ENTRY_STARTED: 2448 case SM_KEYPRESS_PASSKEY_CLEARED: 2449 case SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED: 2450 default: 2451 break; 2452 case SM_KEYPRESS_PASSKEY_DIGIT_ENTERED: 2453 case SM_KEYPRESS_PASSKEY_DIGIT_ERASED: 2454 num_actions--; 2455 clear_flag = num_actions == 0u; 2456 break; 2457 } 2458 if (clear_flag){ 2459 flags &= ~(1<<i); 2460 } 2461 action = i; 2462 break; 2463 } 2464 } 2465 setup->sm_keypress_notification = (num_actions << 5) | flags; 2466 2467 // send keypress notification 2468 uint8_t buffer[2]; 2469 buffer[0] = SM_CODE_KEYPRESS_NOTIFICATION; 2470 buffer[1] = action; 2471 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2472 2473 // try 2474 l2cap_request_can_send_fix_channel_now_event(sm_active_connection_handle, connection->sm_cid); 2475 } 2476 2477 static void sm_run_distribute_keys(sm_connection_t * connection){ 2478 if ((setup->sm_key_distribution_send_set & SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION) != 0u){ 2479 setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION; 2480 setup->sm_key_distribution_sent_set |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION; 2481 uint8_t buffer[17]; 2482 buffer[0] = SM_CODE_ENCRYPTION_INFORMATION; 2483 reverse_128(setup->sm_ltk, &buffer[1]); 2484 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2485 sm_timeout_reset(connection); 2486 return; 2487 } 2488 if ((setup->sm_key_distribution_send_set & SM_KEYDIST_FLAG_MASTER_IDENTIFICATION) != 0u){ 2489 setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_MASTER_IDENTIFICATION; 2490 setup->sm_key_distribution_sent_set |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION; 2491 uint8_t buffer[11]; 2492 buffer[0] = SM_CODE_MASTER_IDENTIFICATION; 2493 little_endian_store_16(buffer, 1, setup->sm_local_ediv); 2494 reverse_64(setup->sm_local_rand, &buffer[3]); 2495 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2496 sm_timeout_reset(connection); 2497 return; 2498 } 2499 if ((setup->sm_key_distribution_send_set & SM_KEYDIST_FLAG_IDENTITY_INFORMATION) != 0u){ 2500 setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_IDENTITY_INFORMATION; 2501 setup->sm_key_distribution_sent_set |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION; 2502 uint8_t buffer[17]; 2503 buffer[0] = SM_CODE_IDENTITY_INFORMATION; 2504 reverse_128(sm_persistent_irk, &buffer[1]); 2505 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2506 sm_timeout_reset(connection); 2507 return; 2508 } 2509 if ((setup->sm_key_distribution_send_set & SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION) != 0u){ 2510 setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION; 2511 setup->sm_key_distribution_sent_set |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION; 2512 bd_addr_t local_address; 2513 uint8_t buffer[8]; 2514 buffer[0] = SM_CODE_IDENTITY_ADDRESS_INFORMATION; 2515 switch (gap_random_address_get_mode()){ 2516 case GAP_RANDOM_ADDRESS_TYPE_OFF: 2517 case GAP_RANDOM_ADDRESS_TYPE_STATIC: 2518 // public or static random 2519 gap_le_get_own_address(&buffer[1], local_address); 2520 break; 2521 case GAP_RANDOM_ADDRESS_NON_RESOLVABLE: 2522 case GAP_RANDOM_ADDRESS_RESOLVABLE: 2523 // fallback to public 2524 gap_local_bd_addr(local_address); 2525 buffer[1] = 0; 2526 break; 2527 default: 2528 btstack_assert(false); 2529 break; 2530 } 2531 reverse_bd_addr(local_address, &buffer[2]); 2532 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2533 sm_timeout_reset(connection); 2534 return; 2535 } 2536 if ((setup->sm_key_distribution_send_set & SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION) != 0u){ 2537 setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION; 2538 setup->sm_key_distribution_sent_set |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION; 2539 2540 #ifdef ENABLE_LE_SIGNED_WRITE 2541 // hack to reproduce test runs 2542 if (test_use_fixed_local_csrk){ 2543 memset(setup->sm_local_csrk, 0xcc, 16); 2544 } 2545 2546 // store local CSRK 2547 if (setup->sm_le_device_index >= 0){ 2548 log_info("sm: store local CSRK"); 2549 le_device_db_local_csrk_set(setup->sm_le_device_index, setup->sm_local_csrk); 2550 le_device_db_local_counter_set(setup->sm_le_device_index, 0); 2551 } 2552 #endif 2553 2554 uint8_t buffer[17]; 2555 buffer[0] = SM_CODE_SIGNING_INFORMATION; 2556 reverse_128(setup->sm_local_csrk, &buffer[1]); 2557 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2558 sm_timeout_reset(connection); 2559 return; 2560 } 2561 btstack_assert(false); 2562 } 2563 2564 static bool sm_ctkd_from_le(sm_connection_t *sm_connection) { 2565 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 2566 // requirements to derive link key from LE: 2567 // - use secure connections 2568 if (setup->sm_use_secure_connections == 0) return false; 2569 // - bonding needs to be enabled: 2570 bool bonding_enabled = (sm_pairing_packet_get_auth_req(setup->sm_m_preq) & sm_pairing_packet_get_auth_req(setup->sm_s_pres) & SM_AUTHREQ_BONDING ) != 0u; 2571 if (!bonding_enabled) return false; 2572 // - need identity address / public addr 2573 bool have_identity_address_info = ((setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION) != 0) || (setup->sm_peer_addr_type == 0); 2574 if (!have_identity_address_info) return false; 2575 // - there is no stored BR/EDR link key or the derived key has at least the same level of authentication (bail if stored key has higher authentication) 2576 // this requirement is motivated by BLURtooth paper. The paper recommends to not overwrite keys at all. 2577 // If SC is authenticated, we consider it safe to overwrite a stored key. 2578 // If stored link key is not authenticated, it could already be compromised by a MITM attack. Allowing overwrite by unauthenticated derived key does not make it worse. 2579 uint8_t link_key[16]; 2580 link_key_type_t link_key_type; 2581 bool have_link_key = gap_get_link_key_for_bd_addr(setup->sm_peer_address, link_key, &link_key_type); 2582 bool link_key_authenticated = gap_authenticated_for_link_key_type(link_key_type); 2583 bool derived_key_authenticated = sm_connection->sm_connection_authenticated != 0; 2584 if (have_link_key && link_key_authenticated && !derived_key_authenticated) { 2585 return false; 2586 } 2587 // get started (all of the above are true) 2588 return true; 2589 #else 2590 UNUSED(sm_connection); 2591 return false; 2592 #endif 2593 } 2594 2595 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 2596 static bool sm_ctkd_from_classic(sm_connection_t * sm_connection){ 2597 hci_connection_t * hci_connection = hci_connection_for_handle(sm_connection->sm_handle); 2598 btstack_assert(hci_connection != NULL); 2599 // requirements to derive ltk from BR/EDR: 2600 // - BR/EDR uses secure connections 2601 if (gap_secure_connection_for_link_key_type(hci_connection->link_key_type) == false) return false; 2602 // - there is no stored LTK or the derived key has at least the same level of authentication (bail if LTK is authenticated but Link Key isn't) 2603 bool link_key_authenticated = gap_authenticated_for_link_key_type(hci_connection->link_key_type); 2604 if (link_key_authenticated) return true; 2605 int index = sm_le_device_db_index_lookup(BD_ADDR_TYPE_LE_PUBLIC, hci_connection->address); 2606 if (index >= 0){ 2607 int ltk_authenticated; 2608 sm_key_t ltk; 2609 le_device_db_encryption_get(sm_connection->sm_le_db_index, NULL, NULL, ltk, NULL, <k_authenticated, NULL, NULL); 2610 bool have_ltk = !sm_is_null_key(ltk); 2611 if (have_ltk && ltk_authenticated) return false; 2612 } 2613 return true; 2614 } 2615 #endif 2616 2617 static void sm_key_distribution_complete_responder(sm_connection_t * connection){ 2618 if (sm_ctkd_from_le(connection)){ 2619 bool use_h7 = (sm_pairing_packet_get_auth_req(setup->sm_m_preq) & sm_pairing_packet_get_auth_req(setup->sm_s_pres) & SM_AUTHREQ_CT2) != 0; 2620 connection->sm_engine_state = use_h7 ? SM_SC_W2_CALCULATE_ILK_USING_H7 : SM_SC_W2_CALCULATE_ILK_USING_H6; 2621 } else { 2622 connection->sm_engine_state = SM_RESPONDER_IDLE; 2623 sm_pairing_complete(connection, ERROR_CODE_SUCCESS, 0); 2624 sm_done_for_handle(connection->sm_handle); 2625 } 2626 } 2627 2628 static void sm_key_distribution_complete_initiator(sm_connection_t * connection){ 2629 if (sm_ctkd_from_le(connection)){ 2630 bool use_h7 = (sm_pairing_packet_get_auth_req(setup->sm_m_preq) & sm_pairing_packet_get_auth_req(setup->sm_s_pres) & SM_AUTHREQ_CT2) != 0; 2631 connection->sm_engine_state = use_h7 ? SM_SC_W2_CALCULATE_ILK_USING_H7 : SM_SC_W2_CALCULATE_ILK_USING_H6; 2632 } else { 2633 sm_master_pairing_success(connection); 2634 } 2635 } 2636 2637 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2638 static void sm_run_state_sc_send_confirmation(sm_connection_t *connection) { 2639 uint8_t buffer[17]; 2640 buffer[0] = SM_CODE_PAIRING_CONFIRM; 2641 reverse_128(setup->sm_local_confirm, &buffer[1]); 2642 if (IS_RESPONDER(connection->sm_role)){ 2643 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2644 } else { 2645 connection->sm_engine_state = SM_SC_W4_CONFIRMATION; 2646 } 2647 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2648 sm_timeout_reset(connection); 2649 } 2650 2651 static void sm_run_state_sc_send_pairing_random(sm_connection_t *connection) { 2652 uint8_t buffer[17]; 2653 buffer[0] = SM_CODE_PAIRING_RANDOM; 2654 reverse_128(setup->sm_local_nonce, &buffer[1]); 2655 log_info("stk method %u, bit num: %u", setup->sm_stk_generation_method, setup->sm_passkey_bit); 2656 if (sm_passkey_entry(setup->sm_stk_generation_method) && (setup->sm_passkey_bit < 20u)){ 2657 log_info("SM_SC_SEND_PAIRING_RANDOM A"); 2658 if (IS_RESPONDER(connection->sm_role)){ 2659 // responder 2660 connection->sm_engine_state = SM_SC_W4_CONFIRMATION; 2661 } else { 2662 // initiator 2663 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2664 } 2665 } else { 2666 log_info("SM_SC_SEND_PAIRING_RANDOM B"); 2667 if (IS_RESPONDER(connection->sm_role)){ 2668 // responder 2669 if (setup->sm_stk_generation_method == NUMERIC_COMPARISON){ 2670 log_info("SM_SC_SEND_PAIRING_RANDOM B1"); 2671 connection->sm_engine_state = SM_SC_W2_CALCULATE_G2; 2672 } else { 2673 log_info("SM_SC_SEND_PAIRING_RANDOM B2"); 2674 sm_sc_prepare_dhkey_check(connection); 2675 } 2676 } else { 2677 // initiator 2678 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2679 } 2680 } 2681 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2682 sm_timeout_reset(connection); 2683 } 2684 2685 static void sm_run_state_sc_send_dhkey_check_command(sm_connection_t *connection) { 2686 uint8_t buffer[17]; 2687 buffer[0] = SM_CODE_PAIRING_DHKEY_CHECK; 2688 reverse_128(setup->sm_local_dhkey_check, &buffer[1]); 2689 2690 if (IS_RESPONDER(connection->sm_role)){ 2691 connection->sm_engine_state = SM_SC_W4_LTK_REQUEST_SC; 2692 } else { 2693 connection->sm_engine_state = SM_SC_W4_DHKEY_CHECK_COMMAND; 2694 } 2695 2696 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2697 sm_timeout_reset(connection); 2698 } 2699 2700 static void sm_run_state_sc_send_public_key_command(sm_connection_t *connection) { 2701 bool trigger_user_response = false; 2702 bool trigger_start_calculating_local_confirm = false; 2703 uint8_t buffer[65]; 2704 buffer[0] = SM_CODE_PAIRING_PUBLIC_KEY; 2705 // 2706 reverse_256(&ec_q[0], &buffer[1]); 2707 reverse_256(&ec_q[32], &buffer[33]); 2708 2709 #ifdef ENABLE_TESTING_SUPPORT 2710 if (test_pairing_failure == SM_REASON_DHKEY_CHECK_FAILED){ 2711 log_info("testing_support: invalidating public key"); 2712 // flip single bit of public key coordinate 2713 buffer[1] ^= 1; 2714 } 2715 #endif 2716 2717 // stk generation method 2718 // passkey entry: notify app to show passkey or to request passkey 2719 switch (setup->sm_stk_generation_method){ 2720 case JUST_WORKS: 2721 case NUMERIC_COMPARISON: 2722 if (IS_RESPONDER(connection->sm_role)){ 2723 // responder 2724 trigger_start_calculating_local_confirm = true; 2725 connection->sm_engine_state = SM_SC_W4_LOCAL_NONCE; 2726 } else { 2727 // initiator 2728 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 2729 } 2730 break; 2731 case PK_INIT_INPUT: 2732 case PK_RESP_INPUT: 2733 case PK_BOTH_INPUT: 2734 // use random TK for display 2735 (void)memcpy(setup->sm_ra, setup->sm_tk, 16); 2736 (void)memcpy(setup->sm_rb, setup->sm_tk, 16); 2737 setup->sm_passkey_bit = 0; 2738 2739 if (IS_RESPONDER(connection->sm_role)){ 2740 // responder 2741 connection->sm_engine_state = SM_SC_W4_CONFIRMATION; 2742 } else { 2743 // initiator 2744 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 2745 } 2746 trigger_user_response = true; 2747 break; 2748 case OOB: 2749 if (IS_RESPONDER(connection->sm_role)){ 2750 // responder 2751 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2752 } else { 2753 // initiator 2754 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 2755 } 2756 break; 2757 default: 2758 btstack_assert(false); 2759 break; 2760 } 2761 2762 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2763 sm_timeout_reset(connection); 2764 2765 // trigger user response and calc confirm after sending pdu 2766 if (trigger_user_response){ 2767 sm_trigger_user_response(connection); 2768 } 2769 if (trigger_start_calculating_local_confirm){ 2770 sm_sc_start_calculating_local_confirm(connection); 2771 } 2772 } 2773 #endif 2774 2775 static bool sm_run_non_connection_logic(void){ 2776 bool done;; 2777 2778 done = sm_run_dpkg(); 2779 if (done) return true; 2780 2781 done = sm_run_rau(); 2782 if (done) return true; 2783 2784 done = sm_run_irk_lookup(); 2785 if (done) return true; 2786 2787 done = sm_run_oob(); 2788 return done; 2789 } 2790 2791 static void sm_run(void){ 2792 2793 // assert that stack has already bootet 2794 if (hci_get_state() != HCI_STATE_WORKING) return; 2795 2796 // assert that we can send at least commands 2797 if (!hci_can_send_command_packet_now()) return; 2798 2799 // pause until IR/ER are ready 2800 if (sm_persistent_keys_random_active) return; 2801 2802 // non-connection related behaviour 2803 bool done = sm_run_non_connection_logic(); 2804 if (done) return; 2805 2806 // assert that we can send at least commands - cmd might have been sent by crypto engine 2807 if (!hci_can_send_command_packet_now()) return; 2808 2809 // handle basic actions that don't requires the full context 2810 done = sm_run_basic(); 2811 if (done) return; 2812 2813 // 2814 // active connection handling 2815 // -- use loop to handle next connection if lock on setup context is released 2816 2817 while (true) { 2818 2819 sm_run_activate_connection(); 2820 2821 if (sm_active_connection_handle == HCI_CON_HANDLE_INVALID) return; 2822 2823 // 2824 // active connection handling 2825 // 2826 2827 sm_connection_t * connection = sm_get_connection_for_handle(sm_active_connection_handle); 2828 if (!connection) { 2829 log_info("no connection for handle 0x%04x", sm_active_connection_handle); 2830 return; 2831 } 2832 2833 // assert that we could send a SM PDU - not needed for all of the following 2834 if (!l2cap_can_send_fixed_channel_packet_now(sm_active_connection_handle, connection->sm_cid)) { 2835 log_info("cannot send now, requesting can send now event"); 2836 l2cap_request_can_send_fix_channel_now_event(sm_active_connection_handle, connection->sm_cid); 2837 return; 2838 } 2839 2840 // send keypress notifications 2841 if (setup->sm_keypress_notification != 0u){ 2842 sm_run_send_keypress_notification(connection); 2843 return; 2844 } 2845 2846 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2847 // assert that sm cmac engine is ready 2848 if (sm_cmac_ready() == false){ 2849 break; 2850 } 2851 #endif 2852 2853 int key_distribution_flags; 2854 UNUSED(key_distribution_flags); 2855 #ifdef ENABLE_LE_PERIPHERAL 2856 int err; 2857 bool have_ltk; 2858 uint8_t ltk[16]; 2859 #endif 2860 2861 log_info("sm_run: state %u", connection->sm_engine_state); 2862 switch (connection->sm_engine_state){ 2863 2864 // secure connections, initiator + responding states 2865 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2866 case SM_SC_W2_CMAC_FOR_CONFIRMATION: 2867 connection->sm_engine_state = SM_SC_W4_CMAC_FOR_CONFIRMATION; 2868 sm_sc_calculate_local_confirm(connection); 2869 break; 2870 case SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION: 2871 connection->sm_engine_state = SM_SC_W4_CMAC_FOR_CHECK_CONFIRMATION; 2872 sm_sc_calculate_remote_confirm(connection); 2873 break; 2874 case SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK: 2875 connection->sm_engine_state = SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK; 2876 sm_sc_calculate_f6_for_dhkey_check(connection); 2877 break; 2878 case SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK: 2879 connection->sm_engine_state = SM_SC_W4_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK; 2880 sm_sc_calculate_f6_to_verify_dhkey_check(connection); 2881 break; 2882 case SM_SC_W2_CALCULATE_F5_SALT: 2883 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_SALT; 2884 f5_calculate_salt(connection); 2885 break; 2886 case SM_SC_W2_CALCULATE_F5_MACKEY: 2887 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_MACKEY; 2888 f5_calculate_mackey(connection); 2889 break; 2890 case SM_SC_W2_CALCULATE_F5_LTK: 2891 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_LTK; 2892 f5_calculate_ltk(connection); 2893 break; 2894 case SM_SC_W2_CALCULATE_G2: 2895 connection->sm_engine_state = SM_SC_W4_CALCULATE_G2; 2896 g2_calculate(connection); 2897 break; 2898 #endif 2899 2900 #ifdef ENABLE_LE_CENTRAL 2901 // initiator side 2902 2903 case SM_INITIATOR_PH4_HAS_LTK: { 2904 sm_reset_setup(); 2905 sm_load_security_info(connection); 2906 2907 // cache key before using 2908 sm_cache_ltk(connection, setup->sm_peer_ltk); 2909 2910 sm_key_t peer_ltk_flipped; 2911 reverse_128(setup->sm_peer_ltk, peer_ltk_flipped); 2912 connection->sm_engine_state = SM_PH4_W4_CONNECTION_ENCRYPTED; 2913 log_info("sm: hci_le_start_encryption ediv 0x%04x", setup->sm_peer_ediv); 2914 uint32_t rand_high = big_endian_read_32(setup->sm_peer_rand, 0); 2915 uint32_t rand_low = big_endian_read_32(setup->sm_peer_rand, 4); 2916 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle,rand_low, rand_high, setup->sm_peer_ediv, peer_ltk_flipped); 2917 2918 // notify after sending 2919 sm_reencryption_started(connection); 2920 return; 2921 } 2922 2923 case SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST: 2924 sm_reset_setup(); 2925 sm_init_setup(connection); 2926 2927 sm_pairing_packet_set_code(setup->sm_m_preq, SM_CODE_PAIRING_REQUEST); 2928 connection->sm_engine_state = SM_INITIATOR_PH1_W4_PAIRING_RESPONSE; 2929 sm_send_connectionless(connection, (uint8_t*) &setup->sm_m_preq, sizeof(sm_pairing_packet_t)); 2930 sm_timeout_reset(connection); 2931 2932 // notify after sending 2933 sm_pairing_started(connection); 2934 break; 2935 #endif 2936 2937 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2938 case SM_SC_SEND_PUBLIC_KEY_COMMAND: 2939 sm_run_state_sc_send_public_key_command(connection); 2940 break; 2941 case SM_SC_SEND_CONFIRMATION: 2942 sm_run_state_sc_send_confirmation(connection); 2943 break; 2944 case SM_SC_SEND_PAIRING_RANDOM: 2945 sm_run_state_sc_send_pairing_random(connection); 2946 break; 2947 case SM_SC_SEND_DHKEY_CHECK_COMMAND: 2948 sm_run_state_sc_send_dhkey_check_command(connection); 2949 break; 2950 #endif 2951 2952 #ifdef ENABLE_LE_PERIPHERAL 2953 2954 case SM_RESPONDER_SEND_SECURITY_REQUEST: { 2955 const uint8_t buffer[2] = {SM_CODE_SECURITY_REQUEST, sm_auth_req}; 2956 connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_REQUEST; 2957 sm_send_connectionless(connection, (uint8_t *) buffer, sizeof(buffer)); 2958 sm_timeout_start(connection); 2959 break; 2960 } 2961 2962 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2963 case SM_SC_RECEIVED_LTK_REQUEST: 2964 switch (connection->sm_irk_lookup_state){ 2965 case IRK_LOOKUP_SUCCEEDED: 2966 // assuming Secure Connection, we have a stored LTK and the EDIV/RAND are null 2967 // start using context by loading security info 2968 sm_reset_setup(); 2969 sm_load_security_info(connection); 2970 if ((setup->sm_peer_ediv == 0u) && sm_is_null_random(setup->sm_peer_rand) && !sm_is_null_key(setup->sm_peer_ltk)){ 2971 (void)memcpy(setup->sm_ltk, setup->sm_peer_ltk, 16); 2972 connection->sm_engine_state = SM_RESPONDER_PH4_SEND_LTK_REPLY; 2973 sm_reencryption_started(connection); 2974 sm_trigger_run(); 2975 break; 2976 } 2977 log_info("LTK Request: ediv & random are empty, but no stored LTK (IRK Lookup Succeeded)"); 2978 connection->sm_engine_state = SM_RESPONDER_IDLE; 2979 hci_send_cmd(&hci_le_long_term_key_negative_reply, connection->sm_handle); 2980 return; 2981 default: 2982 // just wait until IRK lookup is completed 2983 break; 2984 } 2985 break; 2986 #endif /* ENABLE_LE_SECURE_CONNECTIONS */ 2987 2988 case SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED: 2989 sm_reset_setup(); 2990 2991 // handle Pairing Request with LTK available 2992 switch (connection->sm_irk_lookup_state) { 2993 case IRK_LOOKUP_SUCCEEDED: 2994 le_device_db_encryption_get(connection->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL, NULL); 2995 have_ltk = !sm_is_null_key(ltk); 2996 if (have_ltk){ 2997 log_info("pairing request but LTK available"); 2998 // emit re-encryption start/fail sequence 2999 sm_reencryption_started(connection); 3000 sm_reencryption_complete(connection, ERROR_CODE_PIN_OR_KEY_MISSING); 3001 } 3002 break; 3003 default: 3004 break; 3005 } 3006 3007 sm_init_setup(connection); 3008 3009 // recover pairing request 3010 (void)memcpy(&setup->sm_m_preq, &connection->sm_m_preq, sizeof(sm_pairing_packet_t)); 3011 err = sm_stk_generation_init(connection); 3012 3013 #ifdef ENABLE_TESTING_SUPPORT 3014 if ((0 < test_pairing_failure) && (test_pairing_failure < SM_REASON_DHKEY_CHECK_FAILED)){ 3015 log_info("testing_support: respond with pairing failure %u", test_pairing_failure); 3016 err = test_pairing_failure; 3017 } 3018 #endif 3019 if (err != 0){ 3020 // emit pairing started/failed sequence 3021 sm_pairing_started(connection); 3022 sm_pairing_error(connection, err); 3023 sm_trigger_run(); 3024 break; 3025 } 3026 3027 sm_timeout_start(connection); 3028 3029 // generate random number first, if we need to show passkey, otherwise send response 3030 if (setup->sm_stk_generation_method == PK_INIT_INPUT){ 3031 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph2_tk, (void *)(uintptr_t) connection->sm_handle); 3032 break; 3033 } 3034 3035 /* fall through */ 3036 3037 case SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE: 3038 sm_pairing_packet_set_code(setup->sm_s_pres,SM_CODE_PAIRING_RESPONSE); 3039 3040 // start with initiator key dist flags 3041 key_distribution_flags = sm_key_distribution_flags_for_auth_req(); 3042 3043 #ifdef ENABLE_LE_SECURE_CONNECTIONS 3044 // LTK (= encryption information & master identification) only exchanged for LE Legacy Connection 3045 if (setup->sm_use_secure_connections){ 3046 key_distribution_flags &= ~SM_KEYDIST_ENC_KEY; 3047 } 3048 #endif 3049 // setup in response 3050 sm_pairing_packet_set_initiator_key_distribution(setup->sm_s_pres, sm_pairing_packet_get_initiator_key_distribution(setup->sm_m_preq) & key_distribution_flags); 3051 sm_pairing_packet_set_responder_key_distribution(setup->sm_s_pres, sm_pairing_packet_get_responder_key_distribution(setup->sm_m_preq) & key_distribution_flags); 3052 3053 // update key distribution after ENC was dropped 3054 sm_setup_key_distribution(sm_pairing_packet_get_responder_key_distribution(setup->sm_s_pres), sm_pairing_packet_get_initiator_key_distribution(setup->sm_s_pres)); 3055 3056 if (setup->sm_use_secure_connections){ 3057 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 3058 } else { 3059 connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_CONFIRM; 3060 } 3061 3062 sm_send_connectionless(connection, (uint8_t*) &setup->sm_s_pres, sizeof(sm_pairing_packet_t)); 3063 sm_timeout_reset(connection); 3064 3065 // notify after sending 3066 sm_pairing_started(connection); 3067 3068 // SC Numeric Comparison will trigger user response after public keys & nonces have been exchanged 3069 if (!setup->sm_use_secure_connections || (setup->sm_stk_generation_method == JUST_WORKS)){ 3070 sm_trigger_user_response(connection); 3071 } 3072 return; 3073 #endif 3074 3075 case SM_PH2_SEND_PAIRING_RANDOM: { 3076 uint8_t buffer[17]; 3077 buffer[0] = SM_CODE_PAIRING_RANDOM; 3078 reverse_128(setup->sm_local_random, &buffer[1]); 3079 if (IS_RESPONDER(connection->sm_role)){ 3080 connection->sm_engine_state = SM_RESPONDER_PH2_W4_LTK_REQUEST; 3081 } else { 3082 connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_RANDOM; 3083 } 3084 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 3085 sm_timeout_reset(connection); 3086 break; 3087 } 3088 3089 case SM_PH2_C1_GET_ENC_A: 3090 // already busy? 3091 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3092 // calculate confirm using aes128 engine - step 1 3093 sm_c1_t1(setup->sm_local_random, (uint8_t*) &setup->sm_m_preq, (uint8_t*) &setup->sm_s_pres, setup->sm_m_addr_type, setup->sm_s_addr_type, sm_aes128_plaintext); 3094 connection->sm_engine_state = SM_PH2_C1_W4_ENC_A; 3095 sm_aes128_state = SM_AES128_ACTIVE; 3096 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, setup->sm_tk, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_enc_a, (void *)(uintptr_t) connection->sm_handle); 3097 break; 3098 3099 case SM_PH2_C1_GET_ENC_C: 3100 // already busy? 3101 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3102 // calculate m_confirm using aes128 engine - step 1 3103 sm_c1_t1(setup->sm_peer_random, (uint8_t*) &setup->sm_m_preq, (uint8_t*) &setup->sm_s_pres, setup->sm_m_addr_type, setup->sm_s_addr_type, sm_aes128_plaintext); 3104 connection->sm_engine_state = SM_PH2_C1_W4_ENC_C; 3105 sm_aes128_state = SM_AES128_ACTIVE; 3106 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, setup->sm_tk, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_enc_c, (void *)(uintptr_t) connection->sm_handle); 3107 break; 3108 3109 case SM_PH2_CALC_STK: 3110 // already busy? 3111 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3112 // calculate STK 3113 if (IS_RESPONDER(connection->sm_role)){ 3114 sm_s1_r_prime(setup->sm_local_random, setup->sm_peer_random, sm_aes128_plaintext); 3115 } else { 3116 sm_s1_r_prime(setup->sm_peer_random, setup->sm_local_random, sm_aes128_plaintext); 3117 } 3118 connection->sm_engine_state = SM_PH2_W4_STK; 3119 sm_aes128_state = SM_AES128_ACTIVE; 3120 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, setup->sm_tk, sm_aes128_plaintext, setup->sm_ltk, sm_handle_encryption_result_enc_stk, (void *)(uintptr_t) connection->sm_handle); 3121 break; 3122 3123 case SM_PH3_Y_GET_ENC: 3124 // already busy? 3125 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3126 // PH3B2 - calculate Y from - enc 3127 3128 // dm helper (was sm_dm_r_prime) 3129 // r' = padding || r 3130 // r - 64 bit value 3131 memset(&sm_aes128_plaintext[0], 0, 8); 3132 (void)memcpy(&sm_aes128_plaintext[8], setup->sm_local_rand, 8); 3133 3134 // Y = dm(DHK, Rand) 3135 connection->sm_engine_state = SM_PH3_Y_W4_ENC; 3136 sm_aes128_state = SM_AES128_ACTIVE; 3137 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_dhk, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_enc_ph3_y, (void *)(uintptr_t) connection->sm_handle); 3138 break; 3139 3140 case SM_PH2_C1_SEND_PAIRING_CONFIRM: { 3141 uint8_t buffer[17]; 3142 buffer[0] = SM_CODE_PAIRING_CONFIRM; 3143 reverse_128(setup->sm_local_confirm, &buffer[1]); 3144 if (IS_RESPONDER(connection->sm_role)){ 3145 connection->sm_engine_state = SM_RESPONDER_PH2_W4_PAIRING_RANDOM; 3146 } else { 3147 connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_CONFIRM; 3148 } 3149 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 3150 sm_timeout_reset(connection); 3151 return; 3152 } 3153 #ifdef ENABLE_LE_PERIPHERAL 3154 case SM_RESPONDER_PH2_SEND_LTK_REPLY: { 3155 // cache key before using 3156 sm_cache_ltk(connection, setup->sm_ltk); 3157 sm_key_t stk_flipped; 3158 reverse_128(setup->sm_ltk, stk_flipped); 3159 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED; 3160 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, stk_flipped); 3161 return; 3162 } 3163 case SM_RESPONDER_PH4_SEND_LTK_REPLY: { 3164 // allow to override LTK 3165 if (sm_get_ltk_callback != NULL){ 3166 (void)(*sm_get_ltk_callback)(connection->sm_handle, connection->sm_peer_addr_type, connection->sm_peer_address, setup->sm_ltk); 3167 } 3168 // cache key before using 3169 sm_cache_ltk(connection, setup->sm_ltk); 3170 sm_key_t ltk_flipped; 3171 reverse_128(setup->sm_ltk, ltk_flipped); 3172 connection->sm_engine_state = SM_PH4_W4_CONNECTION_ENCRYPTED; 3173 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, ltk_flipped); 3174 return; 3175 } 3176 3177 case SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST: 3178 // already busy? 3179 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3180 log_info("LTK Request: recalculating with ediv 0x%04x", setup->sm_local_ediv); 3181 3182 sm_reset_setup(); 3183 sm_start_calculating_ltk_from_ediv_and_rand(connection); 3184 3185 sm_reencryption_started(connection); 3186 3187 // dm helper (was sm_dm_r_prime) 3188 // r' = padding || r 3189 // r - 64 bit value 3190 memset(&sm_aes128_plaintext[0], 0, 8); 3191 (void)memcpy(&sm_aes128_plaintext[8], setup->sm_local_rand, 8); 3192 3193 // Y = dm(DHK, Rand) 3194 connection->sm_engine_state = SM_RESPONDER_PH4_Y_W4_ENC; 3195 sm_aes128_state = SM_AES128_ACTIVE; 3196 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_dhk, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_enc_ph4_y, (void *)(uintptr_t) connection->sm_handle); 3197 return; 3198 #endif 3199 #ifdef ENABLE_LE_CENTRAL 3200 case SM_INITIATOR_PH3_SEND_START_ENCRYPTION: { 3201 // cache key before using 3202 sm_cache_ltk(connection, setup->sm_ltk); 3203 3204 sm_key_t stk_flipped; 3205 reverse_128(setup->sm_ltk, stk_flipped); 3206 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED; 3207 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle, 0, 0, 0, stk_flipped); 3208 return; 3209 } 3210 #endif 3211 3212 case SM_PH3_DISTRIBUTE_KEYS: 3213 // send next key 3214 if (setup->sm_key_distribution_send_set != 0){ 3215 sm_run_distribute_keys(connection); 3216 } 3217 3218 // more to send? 3219 if (setup->sm_key_distribution_send_set != 0){ 3220 return; 3221 } 3222 3223 // keys are sent 3224 if (IS_RESPONDER(connection->sm_role)){ 3225 // slave -> receive master keys if any 3226 if (sm_key_distribution_all_received()){ 3227 sm_key_distribution_handle_all_received(connection); 3228 sm_key_distribution_complete_responder(connection); 3229 // start CTKD right away 3230 continue; 3231 } else { 3232 connection->sm_engine_state = SM_PH3_RECEIVE_KEYS; 3233 } 3234 } else { 3235 sm_master_pairing_success(connection); 3236 } 3237 break; 3238 3239 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 3240 case SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST: 3241 // fill in sm setup (lite version of sm_init_setup) 3242 sm_reset_setup(); 3243 setup->sm_peer_addr_type = connection->sm_peer_addr_type; 3244 setup->sm_m_addr_type = connection->sm_peer_addr_type; 3245 setup->sm_s_addr_type = connection->sm_own_addr_type; 3246 (void) memcpy(setup->sm_peer_address, connection->sm_peer_address, 6); 3247 (void) memcpy(setup->sm_m_address, connection->sm_peer_address, 6); 3248 (void) memcpy(setup->sm_s_address, connection->sm_own_address, 6); 3249 setup->sm_use_secure_connections = true; 3250 sm_ctkd_fetch_br_edr_link_key(connection); 3251 3252 // Enc Key and IRK if requested 3253 key_distribution_flags = SM_KEYDIST_ID_KEY | SM_KEYDIST_ENC_KEY; 3254 #ifdef ENABLE_LE_SIGNED_WRITE 3255 // Plus signing key if supported 3256 key_distribution_flags |= SM_KEYDIST_ID_KEY; 3257 #endif 3258 sm_pairing_packet_set_code(setup->sm_m_preq, SM_CODE_PAIRING_REQUEST); 3259 sm_pairing_packet_set_io_capability(setup->sm_m_preq, 0); 3260 sm_pairing_packet_set_oob_data_flag(setup->sm_m_preq, 0); 3261 sm_pairing_packet_set_auth_req(setup->sm_m_preq, SM_AUTHREQ_CT2); 3262 sm_pairing_packet_set_max_encryption_key_size(setup->sm_m_preq, sm_max_encryption_key_size); 3263 sm_pairing_packet_set_initiator_key_distribution(setup->sm_m_preq, key_distribution_flags); 3264 sm_pairing_packet_set_responder_key_distribution(setup->sm_m_preq, key_distribution_flags); 3265 3266 // set state and send pairing response 3267 sm_timeout_start(connection); 3268 connection->sm_engine_state = SM_BR_EDR_INITIATOR_W4_PAIRING_RESPONSE; 3269 sm_send_connectionless(connection, (uint8_t *) &setup->sm_m_preq, sizeof(sm_pairing_packet_t)); 3270 break; 3271 3272 case SM_BR_EDR_RESPONDER_PAIRING_REQUEST_RECEIVED: 3273 // fill in sm setup (lite version of sm_init_setup) 3274 sm_reset_setup(); 3275 setup->sm_peer_addr_type = connection->sm_peer_addr_type; 3276 setup->sm_m_addr_type = connection->sm_peer_addr_type; 3277 setup->sm_s_addr_type = connection->sm_own_addr_type; 3278 (void) memcpy(setup->sm_peer_address, connection->sm_peer_address, 6); 3279 (void) memcpy(setup->sm_m_address, connection->sm_peer_address, 6); 3280 (void) memcpy(setup->sm_s_address, connection->sm_own_address, 6); 3281 setup->sm_use_secure_connections = true; 3282 sm_ctkd_fetch_br_edr_link_key(connection); 3283 (void) memcpy(&setup->sm_m_preq, &connection->sm_m_preq, sizeof(sm_pairing_packet_t)); 3284 3285 // Enc Key and IRK if requested 3286 key_distribution_flags = SM_KEYDIST_ID_KEY | SM_KEYDIST_ENC_KEY; 3287 #ifdef ENABLE_LE_SIGNED_WRITE 3288 // Plus signing key if supported 3289 key_distribution_flags |= SM_KEYDIST_ID_KEY; 3290 #endif 3291 // drop flags not requested by initiator 3292 key_distribution_flags &= sm_pairing_packet_get_initiator_key_distribution(connection->sm_m_preq); 3293 3294 // If Secure Connections pairing has been initiated over BR/EDR, the following fields of the SM Pairing Request PDU are reserved for future use: 3295 // - the IO Capability field, 3296 // - the OOB data flag field, and 3297 // - all bits in the Auth Req field except the CT2 bit. 3298 sm_pairing_packet_set_code(setup->sm_s_pres, SM_CODE_PAIRING_RESPONSE); 3299 sm_pairing_packet_set_io_capability(setup->sm_s_pres, 0); 3300 sm_pairing_packet_set_oob_data_flag(setup->sm_s_pres, 0); 3301 sm_pairing_packet_set_auth_req(setup->sm_s_pres, SM_AUTHREQ_CT2); 3302 sm_pairing_packet_set_max_encryption_key_size(setup->sm_s_pres, connection->sm_actual_encryption_key_size); 3303 sm_pairing_packet_set_initiator_key_distribution(setup->sm_s_pres, key_distribution_flags); 3304 sm_pairing_packet_set_responder_key_distribution(setup->sm_s_pres, key_distribution_flags); 3305 3306 // configure key distribution, LTK is derived locally 3307 key_distribution_flags &= ~SM_KEYDIST_ENC_KEY; 3308 sm_setup_key_distribution(key_distribution_flags, key_distribution_flags); 3309 3310 // set state and send pairing response 3311 sm_timeout_start(connection); 3312 connection->sm_engine_state = SM_BR_EDR_DISTRIBUTE_KEYS; 3313 sm_send_connectionless(connection, (uint8_t *) &setup->sm_s_pres, sizeof(sm_pairing_packet_t)); 3314 break; 3315 case SM_BR_EDR_DISTRIBUTE_KEYS: 3316 if (setup->sm_key_distribution_send_set != 0) { 3317 sm_run_distribute_keys(connection); 3318 return; 3319 } 3320 // keys are sent 3321 if (IS_RESPONDER(connection->sm_role)) { 3322 // responder -> receive master keys if there are any 3323 if (!sm_key_distribution_all_received()){ 3324 connection->sm_engine_state = SM_BR_EDR_RECEIVE_KEYS; 3325 break; 3326 } 3327 } 3328 // otherwise start CTKD right away (responder and no keys to receive / initiator) 3329 sm_ctkd_start_from_br_edr(connection); 3330 continue; 3331 case SM_SC_W2_CALCULATE_ILK_USING_H6: 3332 connection->sm_engine_state = SM_SC_W4_CALCULATE_ILK; 3333 h6_calculate_ilk_from_le_ltk(connection); 3334 break; 3335 case SM_SC_W2_CALCULATE_BR_EDR_LINK_KEY: 3336 connection->sm_engine_state = SM_SC_W4_CALCULATE_BR_EDR_LINK_KEY; 3337 h6_calculate_br_edr_link_key(connection); 3338 break; 3339 case SM_SC_W2_CALCULATE_ILK_USING_H7: 3340 connection->sm_engine_state = SM_SC_W4_CALCULATE_ILK; 3341 h7_calculate_ilk_from_le_ltk(connection); 3342 break; 3343 case SM_BR_EDR_W2_CALCULATE_ILK_USING_H6: 3344 connection->sm_engine_state = SM_BR_EDR_W4_CALCULATE_ILK; 3345 h6_calculate_ilk_from_br_edr(connection); 3346 break; 3347 case SM_BR_EDR_W2_CALCULATE_LE_LTK: 3348 connection->sm_engine_state = SM_BR_EDR_W4_CALCULATE_LE_LTK; 3349 h6_calculate_le_ltk(connection); 3350 break; 3351 case SM_BR_EDR_W2_CALCULATE_ILK_USING_H7: 3352 connection->sm_engine_state = SM_BR_EDR_W4_CALCULATE_ILK; 3353 h7_calculate_ilk_from_br_edr(connection); 3354 break; 3355 #endif 3356 3357 default: 3358 break; 3359 } 3360 3361 // check again if active connection was released 3362 if (sm_active_connection_handle != HCI_CON_HANDLE_INVALID) break; 3363 } 3364 } 3365 3366 // sm_aes128_state stays active 3367 static void sm_handle_encryption_result_enc_a(void *arg){ 3368 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3369 sm_aes128_state = SM_AES128_IDLE; 3370 3371 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3372 if (connection == NULL) return; 3373 3374 sm_c1_t3(sm_aes128_ciphertext, setup->sm_m_address, setup->sm_s_address, setup->sm_c1_t3_value); 3375 sm_aes128_state = SM_AES128_ACTIVE; 3376 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, setup->sm_tk, setup->sm_c1_t3_value, setup->sm_local_confirm, sm_handle_encryption_result_enc_b, (void *)(uintptr_t) connection->sm_handle); 3377 } 3378 3379 static void sm_handle_encryption_result_enc_b(void *arg){ 3380 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3381 sm_aes128_state = SM_AES128_IDLE; 3382 3383 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3384 if (connection == NULL) return; 3385 3386 log_info_key("c1!", setup->sm_local_confirm); 3387 connection->sm_engine_state = SM_PH2_C1_SEND_PAIRING_CONFIRM; 3388 sm_trigger_run(); 3389 } 3390 3391 // sm_aes128_state stays active 3392 static void sm_handle_encryption_result_enc_c(void *arg){ 3393 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3394 sm_aes128_state = SM_AES128_IDLE; 3395 3396 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3397 if (connection == NULL) return; 3398 3399 sm_c1_t3(sm_aes128_ciphertext, setup->sm_m_address, setup->sm_s_address, setup->sm_c1_t3_value); 3400 sm_aes128_state = SM_AES128_ACTIVE; 3401 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, setup->sm_tk, setup->sm_c1_t3_value, sm_aes128_ciphertext, sm_handle_encryption_result_enc_d, (void *)(uintptr_t) connection->sm_handle); 3402 } 3403 3404 static void sm_handle_encryption_result_enc_d(void * arg){ 3405 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3406 sm_aes128_state = SM_AES128_IDLE; 3407 3408 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3409 if (connection == NULL) return; 3410 3411 log_info_key("c1!", sm_aes128_ciphertext); 3412 if (memcmp(setup->sm_peer_confirm, sm_aes128_ciphertext, 16) != 0){ 3413 sm_pairing_error(connection, SM_REASON_CONFIRM_VALUE_FAILED); 3414 sm_trigger_run(); 3415 return; 3416 } 3417 if (IS_RESPONDER(connection->sm_role)){ 3418 connection->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM; 3419 sm_trigger_run(); 3420 } else { 3421 sm_s1_r_prime(setup->sm_peer_random, setup->sm_local_random, sm_aes128_plaintext); 3422 sm_aes128_state = SM_AES128_ACTIVE; 3423 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, setup->sm_tk, sm_aes128_plaintext, setup->sm_ltk, sm_handle_encryption_result_enc_stk, (void *)(uintptr_t) connection->sm_handle); 3424 } 3425 } 3426 3427 static void sm_handle_encryption_result_enc_stk(void *arg){ 3428 sm_aes128_state = SM_AES128_IDLE; 3429 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3430 3431 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3432 if (connection == NULL) return; 3433 3434 sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size); 3435 log_info_key("stk", setup->sm_ltk); 3436 if (IS_RESPONDER(connection->sm_role)){ 3437 connection->sm_engine_state = SM_RESPONDER_PH2_SEND_LTK_REPLY; 3438 } else { 3439 connection->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION; 3440 } 3441 sm_trigger_run(); 3442 } 3443 3444 // sm_aes128_state stays active 3445 static void sm_handle_encryption_result_enc_ph3_y(void *arg){ 3446 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3447 sm_aes128_state = SM_AES128_IDLE; 3448 3449 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3450 if (connection == NULL) return; 3451 3452 setup->sm_local_y = big_endian_read_16(sm_aes128_ciphertext, 14); 3453 log_info_hex16("y", setup->sm_local_y); 3454 // PH3B3 - calculate EDIV 3455 setup->sm_local_ediv = setup->sm_local_y ^ setup->sm_local_div; 3456 log_info_hex16("ediv", setup->sm_local_ediv); 3457 // PH3B4 - calculate LTK - enc 3458 // LTK = d1(ER, DIV, 0)) 3459 sm_d1_d_prime(setup->sm_local_div, 0, sm_aes128_plaintext); 3460 sm_aes128_state = SM_AES128_ACTIVE; 3461 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_er, sm_aes128_plaintext, setup->sm_ltk, sm_handle_encryption_result_enc_ph3_ltk, (void *)(uintptr_t) connection->sm_handle); 3462 } 3463 3464 #ifdef ENABLE_LE_PERIPHERAL 3465 // sm_aes128_state stays active 3466 static void sm_handle_encryption_result_enc_ph4_y(void *arg){ 3467 sm_aes128_state = SM_AES128_IDLE; 3468 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3469 3470 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3471 if (connection == NULL) return; 3472 3473 setup->sm_local_y = big_endian_read_16(sm_aes128_ciphertext, 14); 3474 log_info_hex16("y", setup->sm_local_y); 3475 3476 // PH3B3 - calculate DIV 3477 setup->sm_local_div = setup->sm_local_y ^ setup->sm_local_ediv; 3478 log_info_hex16("ediv", setup->sm_local_ediv); 3479 // PH3B4 - calculate LTK - enc 3480 // LTK = d1(ER, DIV, 0)) 3481 sm_d1_d_prime(setup->sm_local_div, 0, sm_aes128_plaintext); 3482 sm_aes128_state = SM_AES128_ACTIVE; 3483 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_er, sm_aes128_plaintext, setup->sm_ltk, sm_handle_encryption_result_enc_ph4_ltk, (void *)(uintptr_t) connection->sm_handle); 3484 } 3485 #endif 3486 3487 // sm_aes128_state stays active 3488 static void sm_handle_encryption_result_enc_ph3_ltk(void *arg){ 3489 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3490 sm_aes128_state = SM_AES128_IDLE; 3491 3492 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3493 if (connection == NULL) return; 3494 3495 log_info_key("ltk", setup->sm_ltk); 3496 // calc CSRK next 3497 sm_d1_d_prime(setup->sm_local_div, 1, sm_aes128_plaintext); 3498 sm_aes128_state = SM_AES128_ACTIVE; 3499 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_er, sm_aes128_plaintext, setup->sm_local_csrk, sm_handle_encryption_result_enc_csrk, (void *)(uintptr_t) connection->sm_handle); 3500 } 3501 3502 static void sm_handle_encryption_result_enc_csrk(void *arg){ 3503 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3504 sm_aes128_state = SM_AES128_IDLE; 3505 3506 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3507 if (connection == NULL) return; 3508 3509 sm_aes128_state = SM_AES128_IDLE; 3510 log_info_key("csrk", setup->sm_local_csrk); 3511 if (setup->sm_key_distribution_send_set != 0u){ 3512 connection->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 3513 } else { 3514 // no keys to send, just continue 3515 if (IS_RESPONDER(connection->sm_role)){ 3516 if (sm_key_distribution_all_received()){ 3517 sm_key_distribution_handle_all_received(connection); 3518 sm_key_distribution_complete_responder(connection); 3519 } else { 3520 // slave -> receive master keys 3521 connection->sm_engine_state = SM_PH3_RECEIVE_KEYS; 3522 } 3523 } else { 3524 sm_key_distribution_complete_initiator(connection); 3525 } 3526 } 3527 sm_trigger_run(); 3528 } 3529 3530 #ifdef ENABLE_LE_PERIPHERAL 3531 static void sm_handle_encryption_result_enc_ph4_ltk(void *arg){ 3532 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3533 sm_aes128_state = SM_AES128_IDLE; 3534 3535 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3536 if (connection == NULL) return; 3537 3538 sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size); 3539 log_info_key("ltk", setup->sm_ltk); 3540 connection->sm_engine_state = SM_RESPONDER_PH4_SEND_LTK_REPLY; 3541 sm_trigger_run(); 3542 } 3543 #endif 3544 3545 static void sm_handle_encryption_result_address_resolution(void *arg){ 3546 UNUSED(arg); 3547 sm_aes128_state = SM_AES128_IDLE; 3548 3549 // compare calulated address against connecting device 3550 uint8_t * hash = &sm_aes128_ciphertext[13]; 3551 if (memcmp(&sm_address_resolution_address[3], hash, 3) == 0){ 3552 log_info("LE Device Lookup: matched resolvable private address"); 3553 sm_address_resolution_handle_event(ADDRESS_RESOLUTION_SUCCEEDED); 3554 sm_trigger_run(); 3555 return; 3556 } 3557 // no match, try next 3558 sm_address_resolution_test++; 3559 sm_trigger_run(); 3560 } 3561 3562 static void sm_handle_encryption_result_dkg_irk(void *arg){ 3563 UNUSED(arg); 3564 sm_aes128_state = SM_AES128_IDLE; 3565 3566 log_info_key("irk", sm_persistent_irk); 3567 dkg_state = DKG_CALC_DHK; 3568 sm_trigger_run(); 3569 } 3570 3571 static void sm_handle_encryption_result_dkg_dhk(void *arg){ 3572 UNUSED(arg); 3573 sm_aes128_state = SM_AES128_IDLE; 3574 3575 log_info_key("dhk", sm_persistent_dhk); 3576 dkg_state = DKG_READY; 3577 sm_trigger_run(); 3578 } 3579 3580 static void sm_handle_encryption_result_rau(void *arg){ 3581 UNUSED(arg); 3582 sm_aes128_state = SM_AES128_IDLE; 3583 3584 (void)memcpy(&sm_random_address[3], &sm_aes128_ciphertext[13], 3); 3585 rau_state = RAU_IDLE; 3586 hci_le_random_address_set(sm_random_address); 3587 3588 sm_trigger_run(); 3589 } 3590 3591 static void sm_handle_random_result_rau(void * arg){ 3592 UNUSED(arg); 3593 // non-resolvable vs. resolvable 3594 switch (gap_random_adress_type){ 3595 case GAP_RANDOM_ADDRESS_RESOLVABLE: 3596 // resolvable: use random as prand and calc address hash 3597 // "The two most significant bits of prand shall be equal to ‘0’ and ‘1" 3598 sm_random_address[0u] &= 0x3fu; 3599 sm_random_address[0u] |= 0x40u; 3600 rau_state = RAU_GET_ENC; 3601 break; 3602 case GAP_RANDOM_ADDRESS_NON_RESOLVABLE: 3603 default: 3604 // "The two most significant bits of the address shall be equal to ‘0’"" 3605 sm_random_address[0u] &= 0x3fu; 3606 rau_state = RAU_IDLE; 3607 hci_le_random_address_set(sm_random_address); 3608 break; 3609 } 3610 sm_trigger_run(); 3611 } 3612 3613 #ifdef ENABLE_LE_SECURE_CONNECTIONS 3614 static void sm_handle_random_result_sc_next_send_pairing_random(void * arg){ 3615 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3616 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3617 if (connection == NULL) return; 3618 3619 connection->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM; 3620 sm_trigger_run(); 3621 } 3622 3623 static void sm_handle_random_result_sc_next_w2_cmac_for_confirmation(void * arg){ 3624 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3625 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3626 if (connection == NULL) return; 3627 3628 connection->sm_engine_state = SM_SC_W2_CMAC_FOR_CONFIRMATION; 3629 sm_trigger_run(); 3630 } 3631 #endif 3632 3633 static void sm_handle_random_result_ph2_random(void * arg){ 3634 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3635 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3636 if (connection == NULL) return; 3637 3638 connection->sm_engine_state = SM_PH2_C1_GET_ENC_A; 3639 sm_trigger_run(); 3640 } 3641 3642 static void sm_handle_random_result_ph2_tk(void * arg){ 3643 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3644 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3645 if (connection == NULL) return; 3646 3647 sm_reset_tk(); 3648 uint32_t tk; 3649 if (sm_fixed_passkey_in_display_role == 0xffffffffU){ 3650 // map random to 0-999999 without speding much cycles on a modulus operation 3651 tk = little_endian_read_32(sm_random_data,0); 3652 tk = tk & 0xfffff; // 1048575 3653 if (tk >= 999999u){ 3654 tk = tk - 999999u; 3655 } 3656 } else { 3657 // override with pre-defined passkey 3658 tk = sm_fixed_passkey_in_display_role; 3659 } 3660 big_endian_store_32(setup->sm_tk, 12, tk); 3661 if (IS_RESPONDER(connection->sm_role)){ 3662 connection->sm_engine_state = SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE; 3663 } else { 3664 if (setup->sm_use_secure_connections){ 3665 connection->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 3666 } else { 3667 connection->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 3668 sm_trigger_user_response(connection); 3669 // response_idle == nothing <--> sm_trigger_user_response() did not require response 3670 if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){ 3671 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_random, 16, &sm_handle_random_result_ph2_random, (void *)(uintptr_t) connection->sm_handle); 3672 } 3673 } 3674 } 3675 sm_trigger_run(); 3676 } 3677 3678 static void sm_handle_random_result_ph3_div(void * arg){ 3679 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3680 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3681 if (connection == NULL) return; 3682 3683 // use 16 bit from random value as div 3684 setup->sm_local_div = big_endian_read_16(sm_random_data, 0); 3685 log_info_hex16("div", setup->sm_local_div); 3686 connection->sm_engine_state = SM_PH3_Y_GET_ENC; 3687 sm_trigger_run(); 3688 } 3689 3690 static void sm_handle_random_result_ph3_random(void * arg){ 3691 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3692 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3693 if (connection == NULL) return; 3694 3695 reverse_64(sm_random_data, setup->sm_local_rand); 3696 // no db for encryption size hack: encryption size is stored in lowest nibble of setup->sm_local_rand 3697 setup->sm_local_rand[7u] = (setup->sm_local_rand[7u] & 0xf0u) + (connection->sm_actual_encryption_key_size - 1u); 3698 // no db for authenticated flag hack: store flag in bit 4 of LSB 3699 setup->sm_local_rand[7u] = (setup->sm_local_rand[7u] & 0xefu) + (connection->sm_connection_authenticated << 4u); 3700 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 2, &sm_handle_random_result_ph3_div, (void *)(uintptr_t) connection->sm_handle); 3701 } 3702 static void sm_validate_er_ir(void){ 3703 // warn about default ER/IR 3704 bool warning = false; 3705 if (sm_ir_is_default()){ 3706 warning = true; 3707 log_error("Persistent IR not set with sm_set_ir. Use of private addresses will cause pairing issues"); 3708 } 3709 if (sm_er_is_default()){ 3710 warning = true; 3711 log_error("Persistent ER not set with sm_set_er. Legacy Pairing LTK is not secure"); 3712 } 3713 if (warning) { 3714 log_error("Please configure btstack_tlv to let BTstack setup ER and IR keys"); 3715 } 3716 } 3717 3718 static void sm_handle_random_result_ir(void *arg){ 3719 sm_persistent_keys_random_active = false; 3720 if (arg != NULL){ 3721 // key generated, store in tlv 3722 int status = sm_tlv_impl->store_tag(sm_tlv_context, BTSTACK_TAG32('S','M','I','R'), sm_persistent_ir, 16u); 3723 log_info("Generated IR key. Store in TLV status: %d", status); 3724 UNUSED(status); 3725 } 3726 log_info_key("IR", sm_persistent_ir); 3727 dkg_state = DKG_CALC_IRK; 3728 3729 if (test_use_fixed_local_irk){ 3730 log_info_key("IRK", sm_persistent_irk); 3731 dkg_state = DKG_CALC_DHK; 3732 } 3733 3734 sm_trigger_run(); 3735 } 3736 3737 static void sm_handle_random_result_er(void *arg){ 3738 sm_persistent_keys_random_active = false; 3739 if (arg != 0){ 3740 // key generated, store in tlv 3741 int status = sm_tlv_impl->store_tag(sm_tlv_context, BTSTACK_TAG32('S','M','E','R'), sm_persistent_er, 16u); 3742 log_info("Generated ER key. Store in TLV status: %d", status); 3743 UNUSED(status); 3744 } 3745 log_info_key("ER", sm_persistent_er); 3746 3747 // try load ir 3748 int key_size = sm_tlv_impl->get_tag(sm_tlv_context, BTSTACK_TAG32('S','M','I','R'), sm_persistent_ir, 16u); 3749 if (key_size == 16){ 3750 // ok, let's continue 3751 log_info("IR from TLV"); 3752 sm_handle_random_result_ir( NULL ); 3753 } else { 3754 // invalid, generate new random one 3755 sm_persistent_keys_random_active = true; 3756 btstack_crypto_random_generate(&sm_crypto_random_request, sm_persistent_ir, 16, &sm_handle_random_result_ir, &sm_persistent_ir); 3757 } 3758 } 3759 3760 static void sm_connection_init(sm_connection_t * sm_conn, hci_con_handle_t con_handle, uint8_t role, uint8_t peer_addr_type, bd_addr_t peer_address){ 3761 3762 // connection info 3763 sm_conn->sm_handle = con_handle; 3764 sm_conn->sm_role = role; 3765 sm_conn->sm_peer_addr_type = peer_addr_type; 3766 memcpy(sm_conn->sm_peer_address, peer_address, 6); 3767 3768 // security properties 3769 sm_conn->sm_connection_encrypted = 0; 3770 sm_conn->sm_connection_authenticated = 0; 3771 sm_conn->sm_connection_authorization_state = AUTHORIZATION_UNKNOWN; 3772 sm_conn->sm_le_db_index = -1; 3773 sm_conn->sm_reencryption_active = false; 3774 3775 // prepare CSRK lookup (does not involve setup) 3776 sm_conn->sm_irk_lookup_state = IRK_LOOKUP_W4_READY; 3777 3778 sm_conn->sm_engine_state = SM_GENERAL_IDLE; 3779 } 3780 3781 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 3782 static void sm_event_handle_classic_encryption_event(sm_connection_t * sm_conn, hci_con_handle_t con_handle){ 3783 // CTKD requires BR/EDR Secure Connection 3784 if (sm_conn->sm_connection_encrypted != 2) return; 3785 // prepare for pairing request 3786 if (IS_RESPONDER(sm_conn->sm_role)){ 3787 sm_conn->sm_engine_state = SM_BR_EDR_RESPONDER_W4_PAIRING_REQUEST; 3788 } else if (sm_conn->sm_pairing_requested){ 3789 // check if remote supports fixed channels 3790 bool defer = true; 3791 const hci_connection_t * hci_connection = hci_connection_for_handle(con_handle); 3792 if (hci_connection->l2cap_state.information_state == L2CAP_INFORMATION_STATE_DONE){ 3793 // check if remote supports SMP over BR/EDR 3794 if ((hci_connection->l2cap_state.fixed_channels_supported & (1 << L2CAP_CID_BR_EDR_SECURITY_MANAGER)) != 0){ 3795 log_info("CTKD: SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST"); 3796 sm_conn->sm_engine_state = SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST; 3797 } else { 3798 defer = false; 3799 } 3800 } else { 3801 // wait for fixed channel info 3802 log_info("CTKD: SM_BR_EDR_INITIATOR_W4_FIXED_CHANNEL_MASK"); 3803 sm_conn->sm_engine_state = SM_BR_EDR_INITIATOR_W4_FIXED_CHANNEL_MASK; 3804 } 3805 if (defer){ 3806 hci_dedicated_bonding_defer_disconnect(con_handle, true); 3807 } 3808 } 3809 } 3810 #endif 3811 3812 static void sm_event_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 3813 3814 UNUSED(channel); // ok: there is no channel 3815 UNUSED(size); // ok: fixed format HCI events 3816 3817 sm_connection_t * sm_conn; 3818 hci_con_handle_t con_handle; 3819 uint8_t status; 3820 bd_addr_t addr; 3821 bd_addr_type_t addr_type; 3822 3823 switch (packet_type) { 3824 3825 case HCI_EVENT_PACKET: 3826 switch (hci_event_packet_get_type(packet)) { 3827 3828 case BTSTACK_EVENT_STATE: 3829 switch (btstack_event_state_get_state(packet)){ 3830 case HCI_STATE_WORKING: 3831 log_info("HCI Working!"); 3832 // setup IR/ER with TLV 3833 btstack_tlv_get_instance(&sm_tlv_impl, &sm_tlv_context); 3834 if (sm_tlv_impl != NULL){ 3835 int key_size = sm_tlv_impl->get_tag(sm_tlv_context, BTSTACK_TAG32('S','M','E','R'), sm_persistent_er, 16u); 3836 if (key_size == 16){ 3837 // ok, let's continue 3838 log_info("ER from TLV"); 3839 sm_handle_random_result_er( NULL ); 3840 } else { 3841 // invalid, generate random one 3842 sm_persistent_keys_random_active = true; 3843 btstack_crypto_random_generate(&sm_crypto_random_request, sm_persistent_er, 16, &sm_handle_random_result_er, &sm_persistent_er); 3844 } 3845 } else { 3846 sm_validate_er_ir(); 3847 dkg_state = DKG_CALC_IRK; 3848 3849 if (test_use_fixed_local_irk){ 3850 log_info_key("IRK", sm_persistent_irk); 3851 dkg_state = DKG_CALC_DHK; 3852 } 3853 } 3854 3855 #ifdef ENABLE_LE_SECURE_CONNECTIONS 3856 // trigger ECC key generation 3857 if (ec_key_generation_state == EC_KEY_GENERATION_IDLE){ 3858 sm_ec_generate_new_key(); 3859 } 3860 #endif 3861 3862 // restart random address updates after power cycle 3863 if (gap_random_adress_type == GAP_RANDOM_ADDRESS_TYPE_STATIC){ 3864 gap_random_address_set(sm_random_address); 3865 } else { 3866 gap_random_address_set_mode(gap_random_adress_type); 3867 } 3868 break; 3869 3870 case HCI_STATE_OFF: 3871 case HCI_STATE_HALTING: 3872 log_info("SM: reset state"); 3873 // stop random address update 3874 gap_random_address_update_stop(); 3875 // reset state 3876 sm_state_reset(); 3877 break; 3878 3879 default: 3880 break; 3881 } 3882 break; 3883 3884 #ifdef ENABLE_CLASSIC 3885 case HCI_EVENT_CONNECTION_COMPLETE: 3886 // ignore if connection failed 3887 if (hci_event_connection_complete_get_status(packet)) return; 3888 3889 con_handle = hci_event_connection_complete_get_connection_handle(packet); 3890 sm_conn = sm_get_connection_for_handle(con_handle); 3891 if (!sm_conn) break; 3892 3893 hci_event_connection_complete_get_bd_addr(packet, addr); 3894 sm_connection_init(sm_conn, 3895 con_handle, 3896 (uint8_t) gap_get_role(con_handle), 3897 BD_ADDR_TYPE_LE_PUBLIC, 3898 addr); 3899 // classic connection corresponds to public le address 3900 sm_conn->sm_own_addr_type = BD_ADDR_TYPE_LE_PUBLIC; 3901 gap_local_bd_addr(sm_conn->sm_own_address); 3902 sm_conn->sm_cid = L2CAP_CID_BR_EDR_SECURITY_MANAGER; 3903 sm_conn->sm_engine_state = SM_BR_EDR_W4_ENCRYPTION_COMPLETE; 3904 break; 3905 #endif 3906 3907 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 3908 case HCI_EVENT_SIMPLE_PAIRING_COMPLETE: 3909 if (hci_event_simple_pairing_complete_get_status(packet) != ERROR_CODE_SUCCESS) break; 3910 hci_event_simple_pairing_complete_get_bd_addr(packet, addr); 3911 sm_conn = sm_get_connection_for_bd_addr_and_type(addr, BD_ADDR_TYPE_ACL); 3912 if (sm_conn == NULL) break; 3913 sm_conn->sm_pairing_requested = true; 3914 break; 3915 #endif 3916 3917 case HCI_EVENT_META_GAP: 3918 switch (hci_event_gap_meta_get_subevent_code(packet)) { 3919 case GAP_SUBEVENT_LE_CONNECTION_COMPLETE: 3920 // ignore if connection failed 3921 if (gap_subevent_le_connection_complete_get_status(packet) != ERROR_CODE_SUCCESS) break; 3922 3923 con_handle = gap_subevent_le_connection_complete_get_connection_handle(packet); 3924 sm_conn = sm_get_connection_for_handle(con_handle); 3925 if (!sm_conn) break; 3926 3927 // Get current peer address 3928 addr_type = gap_subevent_le_connection_complete_get_peer_address_type(packet); 3929 if (hci_is_le_identity_address_type(addr_type)){ 3930 addr_type = BD_ADDR_TYPE_LE_RANDOM; 3931 gap_subevent_le_connection_complete_get_peer_resolvable_private_address(packet, addr); 3932 } else { 3933 gap_subevent_le_connection_complete_get_peer_address(packet, addr); 3934 } 3935 sm_connection_init(sm_conn, 3936 con_handle, 3937 gap_subevent_le_connection_complete_get_role(packet), 3938 addr_type, 3939 addr); 3940 sm_conn->sm_cid = L2CAP_CID_SECURITY_MANAGER_PROTOCOL; 3941 3942 // track our addr used for this connection and set state 3943 #ifdef ENABLE_LE_PERIPHERAL 3944 if (gap_subevent_le_connection_complete_get_role(packet) != 0){ 3945 // responder - use own address from advertisements 3946 #ifdef ENABLE_LE_EXTENDED_ADVERTISING 3947 if (hci_le_extended_advertising_supported()){ 3948 // cache local resolvable address 3949 // note: will be overwritten if random or private address was used in adv set by HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED 3950 sm_conn->sm_own_addr_type = BD_ADDR_TYPE_LE_RANDOM; 3951 gap_subevent_le_connection_complete_get_local_resolvable_private_address(packet,sm_conn->sm_own_address); 3952 } else 3953 #endif 3954 { 3955 gap_le_get_own_advertisements_address(&sm_conn->sm_own_addr_type, sm_conn->sm_own_address); 3956 } 3957 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 3958 } 3959 #endif 3960 #ifdef ENABLE_LE_CENTRAL 3961 if (gap_subevent_le_connection_complete_get_role(packet) == 0){ 3962 // initiator - use own address from create connection 3963 gap_le_get_own_connection_address(&sm_conn->sm_own_addr_type, sm_conn->sm_own_address); 3964 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 3965 } 3966 #endif 3967 break; 3968 default: 3969 break; 3970 } 3971 break; 3972 case HCI_EVENT_LE_META: 3973 switch (hci_event_le_meta_get_subevent_code(packet)) { 3974 #ifdef ENABLE_LE_PERIPHERAL 3975 #ifdef ENABLE_LE_EXTENDED_ADVERTISING 3976 case HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED: 3977 if (hci_subevent_le_advertising_set_terminated_get_status(packet) == ERROR_CODE_SUCCESS){ 3978 uint8_t advertising_handle = hci_subevent_le_advertising_set_terminated_get_advertising_handle(packet); 3979 con_handle = hci_subevent_le_advertising_set_terminated_get_connection_handle(packet); 3980 sm_conn = sm_get_connection_for_handle(con_handle); 3981 gap_le_get_own_advertising_set_address(&sm_conn->sm_own_addr_type, sm_conn->sm_own_address, advertising_handle); 3982 log_info("Adv set %u terminated -> use addr type %u, addr %s for con handle 0x%04x", advertising_handle, sm_conn->sm_own_addr_type, 3983 bd_addr_to_str(sm_conn->sm_own_address), con_handle); 3984 } 3985 break; 3986 #endif 3987 #endif 3988 case HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST: 3989 con_handle = hci_subevent_le_long_term_key_request_get_connection_handle(packet); 3990 sm_conn = sm_get_connection_for_handle(con_handle); 3991 if (!sm_conn) break; 3992 3993 log_info("LTK Request: state %u", sm_conn->sm_engine_state); 3994 if (sm_conn->sm_engine_state == SM_RESPONDER_PH2_W4_LTK_REQUEST){ 3995 sm_conn->sm_engine_state = SM_PH2_CALC_STK; 3996 break; 3997 } 3998 if (sm_conn->sm_engine_state == SM_SC_W4_LTK_REQUEST_SC){ 3999 // PH2 SEND LTK as we need to exchange keys in PH3 4000 sm_conn->sm_engine_state = SM_RESPONDER_PH2_SEND_LTK_REPLY; 4001 break; 4002 } 4003 4004 // store rand and ediv 4005 reverse_64(&packet[5], sm_conn->sm_local_rand); 4006 sm_conn->sm_local_ediv = hci_subevent_le_long_term_key_request_get_encryption_diversifier(packet); 4007 4008 // For Legacy Pairing (<=> EDIV != 0 || RAND != NULL), we need to recalculated our LTK as a 4009 // potentially stored LTK is from the master 4010 if ((sm_conn->sm_local_ediv != 0u) || !sm_is_null_random(sm_conn->sm_local_rand)){ 4011 if (sm_reconstruct_ltk_without_le_device_db_entry){ 4012 sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST; 4013 break; 4014 } 4015 // additionally check if remote is in LE Device DB if requested 4016 switch(sm_conn->sm_irk_lookup_state){ 4017 case IRK_LOOKUP_FAILED: 4018 log_info("LTK Request: device not in device db"); 4019 sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY; 4020 break; 4021 case IRK_LOOKUP_SUCCEEDED: 4022 sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST; 4023 break; 4024 default: 4025 // wait for irk look doen 4026 sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK; 4027 break; 4028 } 4029 break; 4030 } 4031 4032 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4033 sm_conn->sm_engine_state = SM_SC_RECEIVED_LTK_REQUEST; 4034 #else 4035 log_info("LTK Request: ediv & random are empty, but LE Secure Connections not supported"); 4036 sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY; 4037 #endif 4038 break; 4039 4040 default: 4041 break; 4042 } 4043 break; 4044 4045 case HCI_EVENT_ENCRYPTION_CHANGE: 4046 case HCI_EVENT_ENCRYPTION_CHANGE_V2: 4047 con_handle = hci_event_encryption_change_get_connection_handle(packet); 4048 sm_conn = sm_get_connection_for_handle(con_handle); 4049 if (!sm_conn) break; 4050 4051 sm_conn->sm_connection_encrypted = hci_event_encryption_change_get_encryption_enabled(packet); 4052 log_info("Encryption state change: %u, key size %u", sm_conn->sm_connection_encrypted, 4053 sm_conn->sm_actual_encryption_key_size); 4054 log_info("event handler, state %u", sm_conn->sm_engine_state); 4055 4056 switch (sm_conn->sm_engine_state){ 4057 4058 case SM_PH4_W4_CONNECTION_ENCRYPTED: 4059 // encryption change event concludes re-encryption for bonded devices (even if it fails) 4060 if (sm_conn->sm_connection_encrypted != 0u) { 4061 status = ERROR_CODE_SUCCESS; 4062 if (IS_RESPONDER(sm_conn->sm_role)){ 4063 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 4064 } else { 4065 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 4066 } 4067 } else { 4068 status = hci_event_encryption_change_get_status(packet); 4069 // set state to 'RE-ENCRYPTION FAILED' to allow pairing but prevent other interactions 4070 // also, gap_reconnect_security_setup_active will return true 4071 sm_conn->sm_engine_state = SM_GENERAL_REENCRYPTION_FAILED; 4072 } 4073 4074 // emit re-encryption complete 4075 sm_reencryption_complete(sm_conn, status); 4076 4077 // notify client, if pairing was requested before 4078 if (sm_conn->sm_pairing_requested){ 4079 sm_conn->sm_pairing_requested = false; 4080 sm_pairing_complete(sm_conn, status, 0); 4081 } 4082 4083 sm_done_for_handle(sm_conn->sm_handle); 4084 break; 4085 4086 case SM_PH2_W4_CONNECTION_ENCRYPTED: 4087 if (!sm_conn->sm_connection_encrypted) break; 4088 // handler for HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE 4089 // contains the same code for this state 4090 sm_conn->sm_connection_sc = setup->sm_use_secure_connections; 4091 if (IS_RESPONDER(sm_conn->sm_role)){ 4092 // slave 4093 if (sm_conn->sm_connection_sc){ 4094 sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 4095 } else { 4096 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph3_random, (void *)(uintptr_t) sm_conn->sm_handle); 4097 } 4098 } else { 4099 // master 4100 if (sm_key_distribution_all_received()){ 4101 // skip receiving keys as there are none 4102 sm_key_distribution_handle_all_received(sm_conn); 4103 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph3_random, (void *)(uintptr_t) sm_conn->sm_handle); 4104 } else { 4105 sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS; 4106 } 4107 } 4108 break; 4109 4110 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4111 case SM_BR_EDR_W4_ENCRYPTION_COMPLETE: 4112 sm_event_handle_classic_encryption_event(sm_conn, con_handle); 4113 break; 4114 #endif 4115 default: 4116 break; 4117 } 4118 break; 4119 4120 case HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE: 4121 con_handle = little_endian_read_16(packet, 3); 4122 sm_conn = sm_get_connection_for_handle(con_handle); 4123 if (!sm_conn) break; 4124 4125 log_info("Encryption key refresh complete, key size %u", sm_conn->sm_actual_encryption_key_size); 4126 log_info("event handler, state %u", sm_conn->sm_engine_state); 4127 // continue if part of initial pairing 4128 switch (sm_conn->sm_engine_state){ 4129 case SM_PH4_W4_CONNECTION_ENCRYPTED: 4130 if (IS_RESPONDER(sm_conn->sm_role)){ 4131 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 4132 } else { 4133 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 4134 } 4135 sm_done_for_handle(sm_conn->sm_handle); 4136 break; 4137 case SM_PH2_W4_CONNECTION_ENCRYPTED: 4138 // handler for HCI_EVENT_ENCRYPTION_CHANGE 4139 // contains the same code for this state 4140 sm_conn->sm_connection_sc = setup->sm_use_secure_connections; 4141 if (IS_RESPONDER(sm_conn->sm_role)){ 4142 // slave 4143 if (sm_conn->sm_connection_sc){ 4144 sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 4145 } else { 4146 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph3_random, (void *)(uintptr_t) sm_conn->sm_handle); 4147 } 4148 } else { 4149 // master 4150 if (sm_key_distribution_all_received()){ 4151 // skip receiving keys as there are none 4152 sm_key_distribution_handle_all_received(sm_conn); 4153 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph3_random, (void *)(uintptr_t) sm_conn->sm_handle); 4154 } else { 4155 sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS; 4156 } 4157 } 4158 break; 4159 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4160 case SM_BR_EDR_W4_ENCRYPTION_COMPLETE: 4161 sm_event_handle_classic_encryption_event(sm_conn, con_handle); 4162 break; 4163 #endif 4164 default: 4165 break; 4166 } 4167 break; 4168 4169 4170 case HCI_EVENT_DISCONNECTION_COMPLETE: 4171 con_handle = little_endian_read_16(packet, 3); 4172 sm_done_for_handle(con_handle); 4173 sm_conn = sm_get_connection_for_handle(con_handle); 4174 if (!sm_conn) break; 4175 4176 // pairing failed, if it was ongoing 4177 switch (sm_conn->sm_engine_state){ 4178 case SM_GENERAL_IDLE: 4179 case SM_INITIATOR_CONNECTED: 4180 case SM_RESPONDER_IDLE: 4181 break; 4182 default: 4183 sm_reencryption_complete(sm_conn, ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION); 4184 sm_pairing_complete(sm_conn, ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION, 0); 4185 break; 4186 } 4187 4188 sm_conn->sm_engine_state = SM_GENERAL_IDLE; 4189 sm_conn->sm_handle = 0; 4190 break; 4191 4192 case HCI_EVENT_COMMAND_COMPLETE: 4193 if (hci_event_command_complete_get_command_opcode(packet) == HCI_OPCODE_HCI_READ_BD_ADDR) { 4194 // set local addr for le device db 4195 reverse_bd_addr(&packet[OFFSET_OF_DATA_IN_COMMAND_COMPLETE + 1], addr); 4196 le_device_db_set_local_bd_addr(addr); 4197 } 4198 break; 4199 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4200 case L2CAP_EVENT_INFORMATION_RESPONSE: 4201 con_handle = l2cap_event_information_response_get_con_handle(packet); 4202 sm_conn = sm_get_connection_for_handle(con_handle); 4203 if (!sm_conn) break; 4204 if (sm_conn->sm_engine_state == SM_BR_EDR_INITIATOR_W4_FIXED_CHANNEL_MASK){ 4205 // check if remote supports SMP over BR/EDR 4206 const hci_connection_t * hci_connection = hci_connection_for_handle(con_handle); 4207 if ((hci_connection->l2cap_state.fixed_channels_supported & (1 << L2CAP_CID_BR_EDR_SECURITY_MANAGER)) != 0){ 4208 sm_conn->sm_engine_state = SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST; 4209 } else { 4210 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 4211 hci_dedicated_bonding_defer_disconnect(con_handle, false); 4212 } 4213 } 4214 break; 4215 #endif 4216 default: 4217 break; 4218 } 4219 break; 4220 default: 4221 break; 4222 } 4223 4224 sm_run(); 4225 } 4226 4227 static inline int sm_calc_actual_encryption_key_size(int other){ 4228 if (other < sm_min_encryption_key_size) return 0; 4229 if (other < sm_max_encryption_key_size) return other; 4230 return sm_max_encryption_key_size; 4231 } 4232 4233 4234 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4235 static bool sm_just_works_or_numeric_comparison(stk_generation_method_t method){ 4236 switch (method){ 4237 case JUST_WORKS: 4238 case NUMERIC_COMPARISON: 4239 return true; 4240 default: 4241 return false; 4242 } 4243 } 4244 // responder 4245 4246 static bool sm_passkey_used(stk_generation_method_t method){ 4247 switch (method){ 4248 case PK_RESP_INPUT: 4249 return true; 4250 default: 4251 return 0; 4252 } 4253 } 4254 4255 static bool sm_passkey_entry(stk_generation_method_t method){ 4256 switch (method){ 4257 case PK_RESP_INPUT: 4258 case PK_INIT_INPUT: 4259 case PK_BOTH_INPUT: 4260 return true; 4261 default: 4262 return false; 4263 } 4264 } 4265 4266 #endif 4267 4268 /** 4269 * @return ok 4270 */ 4271 static int sm_validate_stk_generation_method(void){ 4272 // check if STK generation method is acceptable by client 4273 switch (setup->sm_stk_generation_method){ 4274 case JUST_WORKS: 4275 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_JUST_WORKS) != 0u; 4276 case PK_RESP_INPUT: 4277 case PK_INIT_INPUT: 4278 case PK_BOTH_INPUT: 4279 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_PASSKEY) != 0u; 4280 case OOB: 4281 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_OOB) != 0u; 4282 case NUMERIC_COMPARISON: 4283 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_NUMERIC_COMPARISON) != 0u; 4284 default: 4285 return 0; 4286 } 4287 } 4288 4289 #ifdef ENABLE_LE_CENTRAL 4290 static void sm_initiator_connected_handle_security_request(sm_connection_t * sm_conn, const uint8_t *packet){ 4291 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4292 if (sm_sc_only_mode){ 4293 uint8_t auth_req = packet[1]; 4294 if ((auth_req & SM_AUTHREQ_SECURE_CONNECTION) == 0){ 4295 sm_pairing_error(sm_conn, SM_REASON_AUTHENTHICATION_REQUIREMENTS); 4296 return; 4297 } 4298 } 4299 #else 4300 UNUSED(packet); 4301 #endif 4302 4303 int have_ltk; 4304 uint8_t ltk[16]; 4305 4306 // IRK complete? 4307 switch (sm_conn->sm_irk_lookup_state){ 4308 case IRK_LOOKUP_FAILED: 4309 // start pairing 4310 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 4311 break; 4312 case IRK_LOOKUP_SUCCEEDED: 4313 le_device_db_encryption_get(sm_conn->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL, NULL); 4314 have_ltk = !sm_is_null_key(ltk); 4315 log_info("central: security request - have_ltk %u, encryption %u", have_ltk, sm_conn->sm_connection_encrypted); 4316 if (have_ltk && (sm_conn->sm_connection_encrypted == 0)){ 4317 // start re-encrypt if we have LTK and the connection is not already encrypted 4318 sm_conn->sm_engine_state = SM_INITIATOR_PH4_HAS_LTK; 4319 } else { 4320 // start pairing 4321 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 4322 } 4323 break; 4324 default: 4325 // otherwise, store security request 4326 sm_conn->sm_security_request_received = true; 4327 break; 4328 } 4329 } 4330 #endif 4331 4332 static uint8_t sm_pdu_validate_and_get_opcode(uint8_t packet_type, const uint8_t *packet, uint16_t size){ 4333 4334 // size of complete sm_pdu used to validate input 4335 static const uint8_t sm_pdu_size[] = { 4336 0, // 0x00 invalid opcode 4337 7, // 0x01 pairing request 4338 7, // 0x02 pairing response 4339 17, // 0x03 pairing confirm 4340 17, // 0x04 pairing random 4341 2, // 0x05 pairing failed 4342 17, // 0x06 encryption information 4343 11, // 0x07 master identification 4344 17, // 0x08 identification information 4345 8, // 0x09 identify address information 4346 17, // 0x0a signing information 4347 2, // 0x0b security request 4348 65, // 0x0c pairing public key 4349 17, // 0x0d pairing dhk check 4350 2, // 0x0e keypress notification 4351 }; 4352 4353 if (packet_type != SM_DATA_PACKET) return 0; 4354 if (size == 0u) return 0; 4355 4356 uint8_t sm_pdu_code = packet[0]; 4357 4358 // validate pdu size 4359 if (sm_pdu_code >= sizeof(sm_pdu_size)) return 0; 4360 if (sm_pdu_size[sm_pdu_code] != size) return 0; 4361 4362 return sm_pdu_code; 4363 } 4364 4365 static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uint8_t *packet, uint16_t size){ 4366 4367 if ((packet_type == HCI_EVENT_PACKET) && (packet[0] == L2CAP_EVENT_CAN_SEND_NOW)){ 4368 sm_run(); 4369 } 4370 4371 uint8_t sm_pdu_code = sm_pdu_validate_and_get_opcode(packet_type, packet, size); 4372 if (sm_pdu_code == 0) return; 4373 4374 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 4375 if (!sm_conn) return; 4376 4377 if (sm_pdu_code == SM_CODE_PAIRING_FAILED){ 4378 sm_reencryption_complete(sm_conn, ERROR_CODE_AUTHENTICATION_FAILURE); 4379 sm_pairing_complete(sm_conn, ERROR_CODE_AUTHENTICATION_FAILURE, packet[1]); 4380 sm_done_for_handle(con_handle); 4381 sm_conn->sm_engine_state = sm_conn->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED; 4382 return; 4383 } 4384 4385 log_debug("sm_pdu_handler: state %u, pdu 0x%02x", sm_conn->sm_engine_state, sm_pdu_code); 4386 4387 int err; 4388 uint8_t max_encryption_key_size; 4389 UNUSED(err); 4390 4391 if (sm_pdu_code == SM_CODE_KEYPRESS_NOTIFICATION){ 4392 uint8_t buffer[5]; 4393 buffer[0] = SM_EVENT_KEYPRESS_NOTIFICATION; 4394 buffer[1] = 3; 4395 little_endian_store_16(buffer, 2, con_handle); 4396 buffer[4] = packet[1]; 4397 sm_dispatch_event(HCI_EVENT_PACKET, 0, buffer, sizeof(buffer)); 4398 return; 4399 } 4400 4401 switch (sm_conn->sm_engine_state){ 4402 4403 // a sm timeout requires a new physical connection 4404 case SM_GENERAL_TIMEOUT: 4405 return; 4406 4407 #ifdef ENABLE_LE_CENTRAL 4408 4409 // Initiator 4410 case SM_INITIATOR_CONNECTED: 4411 if ((sm_pdu_code != SM_CODE_SECURITY_REQUEST) || (sm_conn->sm_role)){ 4412 sm_pdu_received_in_wrong_state(sm_conn); 4413 break; 4414 } 4415 sm_initiator_connected_handle_security_request(sm_conn, packet); 4416 break; 4417 4418 case SM_INITIATOR_PH1_W4_PAIRING_RESPONSE: 4419 // Core 5, Vol 3, Part H, 2.4.6: 4420 // "The master shall ignore the slave’s Security Request if the master has sent a Pairing Request 4421 // without receiving a Pairing Response from the slave or if the master has initiated encryption mode setup." 4422 if (sm_pdu_code == SM_CODE_SECURITY_REQUEST){ 4423 log_info("Ignoring Security Request"); 4424 break; 4425 } 4426 4427 // all other pdus are incorrect 4428 if (sm_pdu_code != SM_CODE_PAIRING_RESPONSE){ 4429 sm_pdu_received_in_wrong_state(sm_conn); 4430 break; 4431 } 4432 4433 // store pairing request 4434 (void)memcpy(&setup->sm_s_pres, packet, 4435 sizeof(sm_pairing_packet_t)); 4436 4437 // validate encryption key size 4438 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(setup->sm_s_pres); 4439 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4440 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4441 break; 4442 } 4443 4444 err = sm_stk_generation_init(sm_conn); 4445 4446 #ifdef ENABLE_TESTING_SUPPORT 4447 if (0 < test_pairing_failure && test_pairing_failure < SM_REASON_DHKEY_CHECK_FAILED){ 4448 log_info("testing_support: abort with pairing failure %u", test_pairing_failure); 4449 err = test_pairing_failure; 4450 } 4451 #endif 4452 4453 if (err != 0){ 4454 sm_pairing_error(sm_conn, err); 4455 break; 4456 } 4457 4458 // generate random number first, if we need to show passkey 4459 if (setup->sm_stk_generation_method == PK_RESP_INPUT){ 4460 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph2_tk, (void *)(uintptr_t) sm_conn->sm_handle); 4461 break; 4462 } 4463 4464 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4465 if (setup->sm_use_secure_connections){ 4466 // SC Numeric Comparison will trigger user response after public keys & nonces have been exchanged 4467 if (setup->sm_stk_generation_method == JUST_WORKS){ 4468 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 4469 sm_trigger_user_response(sm_conn); 4470 if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){ 4471 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 4472 } 4473 } else { 4474 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 4475 } 4476 break; 4477 } 4478 #endif 4479 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 4480 sm_trigger_user_response(sm_conn); 4481 // response_idle == nothing <--> sm_trigger_user_response() did not require response 4482 if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){ 4483 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_random, 16, &sm_handle_random_result_ph2_random, (void *)(uintptr_t) sm_conn->sm_handle); 4484 } 4485 break; 4486 4487 case SM_INITIATOR_PH2_W4_PAIRING_CONFIRM: 4488 if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){ 4489 sm_pdu_received_in_wrong_state(sm_conn); 4490 break; 4491 } 4492 4493 // store s_confirm 4494 reverse_128(&packet[1], setup->sm_peer_confirm); 4495 4496 // abort if s_confirm matches m_confirm 4497 if (memcmp(setup->sm_local_confirm, setup->sm_peer_confirm, 16) == 0){ 4498 sm_pdu_received_in_wrong_state(sm_conn); 4499 break; 4500 } 4501 4502 #ifdef ENABLE_TESTING_SUPPORT 4503 if (test_pairing_failure == SM_REASON_CONFIRM_VALUE_FAILED){ 4504 log_info("testing_support: reset confirm value"); 4505 memset(setup->sm_peer_confirm, 0, 16); 4506 } 4507 #endif 4508 sm_conn->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM; 4509 break; 4510 4511 case SM_INITIATOR_PH2_W4_PAIRING_RANDOM: 4512 if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){ 4513 sm_pdu_received_in_wrong_state(sm_conn); 4514 break;; 4515 } 4516 4517 // received random value 4518 reverse_128(&packet[1], setup->sm_peer_random); 4519 sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C; 4520 break; 4521 4522 case SM_INITIATOR_PH4_HAS_LTK: 4523 case SM_PH4_W4_CONNECTION_ENCRYPTED: 4524 // ignore Security Request, see SM_INITIATOR_PH1_W4_PAIRING_RESPONSE above 4525 if (sm_pdu_code != SM_CODE_SECURITY_REQUEST){ 4526 sm_pdu_received_in_wrong_state(sm_conn); 4527 } 4528 break; 4529 #endif 4530 4531 #ifdef ENABLE_LE_PERIPHERAL 4532 // Responder 4533 case SM_RESPONDER_IDLE: 4534 case SM_RESPONDER_SEND_SECURITY_REQUEST: 4535 case SM_RESPONDER_PH1_W4_PAIRING_REQUEST: 4536 if (sm_pdu_code != SM_CODE_PAIRING_REQUEST){ 4537 sm_pdu_received_in_wrong_state(sm_conn); 4538 break;; 4539 } 4540 4541 // store pairing request 4542 (void)memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t)); 4543 4544 // validation encryption key size 4545 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(sm_conn->sm_m_preq); 4546 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4547 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4548 break; 4549 } 4550 4551 // check if IRK completed 4552 switch (sm_conn->sm_irk_lookup_state){ 4553 case IRK_LOOKUP_SUCCEEDED: 4554 case IRK_LOOKUP_FAILED: 4555 sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED; 4556 break; 4557 default: 4558 sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK; 4559 break; 4560 } 4561 break; 4562 #endif 4563 4564 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4565 case SM_SC_W4_PUBLIC_KEY_COMMAND: 4566 if (sm_pdu_code != SM_CODE_PAIRING_PUBLIC_KEY){ 4567 sm_pdu_received_in_wrong_state(sm_conn); 4568 break; 4569 } 4570 4571 // store public key for DH Key calculation 4572 reverse_256(&packet[01], &setup->sm_peer_q[0]); 4573 reverse_256(&packet[33], &setup->sm_peer_q[32]); 4574 4575 // CVE-2020-26558: abort pairing if remote uses the same public key 4576 if (memcmp(&setup->sm_peer_q, ec_q, 64) == 0){ 4577 log_info("Remote PK matches ours"); 4578 sm_pairing_error(sm_conn, SM_REASON_DHKEY_CHECK_FAILED); 4579 break; 4580 } 4581 4582 // validate public key 4583 err = btstack_crypto_ecc_p256_validate_public_key(setup->sm_peer_q); 4584 if (err != 0){ 4585 log_info("sm: peer public key invalid %x", err); 4586 sm_pairing_error(sm_conn, SM_REASON_DHKEY_CHECK_FAILED); 4587 break; 4588 } 4589 4590 // start calculating dhkey 4591 btstack_crypto_ecc_p256_calculate_dhkey(&sm_crypto_ecc_p256_request, setup->sm_peer_q, setup->sm_dhkey, sm_sc_dhkey_calculated, (void*)(uintptr_t) sm_conn->sm_handle); 4592 4593 4594 log_info("public key received, generation method %u", setup->sm_stk_generation_method); 4595 if (IS_RESPONDER(sm_conn->sm_role)){ 4596 // responder 4597 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 4598 } else { 4599 // initiator 4600 // stk generation method 4601 // passkey entry: notify app to show passkey or to request passkey 4602 switch (setup->sm_stk_generation_method){ 4603 case JUST_WORKS: 4604 case NUMERIC_COMPARISON: 4605 sm_conn->sm_engine_state = SM_SC_W4_CONFIRMATION; 4606 break; 4607 case PK_RESP_INPUT: 4608 sm_sc_start_calculating_local_confirm(sm_conn); 4609 break; 4610 case PK_INIT_INPUT: 4611 case PK_BOTH_INPUT: 4612 if (setup->sm_user_response != SM_USER_RESPONSE_PASSKEY){ 4613 sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE; 4614 break; 4615 } 4616 sm_sc_start_calculating_local_confirm(sm_conn); 4617 break; 4618 case OOB: 4619 // generate Nx 4620 log_info("Generate Na"); 4621 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_nonce, 16, &sm_handle_random_result_sc_next_send_pairing_random, (void*)(uintptr_t) sm_conn->sm_handle); 4622 break; 4623 default: 4624 btstack_assert(false); 4625 break; 4626 } 4627 } 4628 break; 4629 4630 case SM_SC_W4_CONFIRMATION: 4631 if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){ 4632 sm_pdu_received_in_wrong_state(sm_conn); 4633 break; 4634 } 4635 // received confirm value 4636 reverse_128(&packet[1], setup->sm_peer_confirm); 4637 4638 #ifdef ENABLE_TESTING_SUPPORT 4639 if (test_pairing_failure == SM_REASON_CONFIRM_VALUE_FAILED){ 4640 log_info("testing_support: reset confirm value"); 4641 memset(setup->sm_peer_confirm, 0, 16); 4642 } 4643 #endif 4644 if (IS_RESPONDER(sm_conn->sm_role)){ 4645 // responder 4646 if (sm_passkey_used(setup->sm_stk_generation_method)){ 4647 if (setup->sm_user_response != SM_USER_RESPONSE_PASSKEY){ 4648 // still waiting for passkey 4649 sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE; 4650 break; 4651 } 4652 } 4653 sm_sc_start_calculating_local_confirm(sm_conn); 4654 } else { 4655 // initiator 4656 if (sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method)){ 4657 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_nonce, 16, &sm_handle_random_result_sc_next_send_pairing_random, (void*)(uintptr_t) sm_conn->sm_handle); 4658 } else { 4659 sm_conn->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM; 4660 } 4661 } 4662 break; 4663 4664 case SM_SC_W4_PAIRING_RANDOM: 4665 if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){ 4666 sm_pdu_received_in_wrong_state(sm_conn); 4667 break; 4668 } 4669 4670 // received random value 4671 reverse_128(&packet[1], setup->sm_peer_nonce); 4672 4673 // validate confirm value if Cb = f4(Pkb, Pka, Nb, z) 4674 // only check for JUST WORK/NC in initiator role OR passkey entry 4675 log_info("SM_SC_W4_PAIRING_RANDOM, responder: %u, just works: %u, passkey used %u, passkey entry %u", 4676 IS_RESPONDER(sm_conn->sm_role), sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method), 4677 sm_passkey_used(setup->sm_stk_generation_method), sm_passkey_entry(setup->sm_stk_generation_method)); 4678 if ( (!IS_RESPONDER(sm_conn->sm_role) && sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method)) 4679 || (sm_passkey_entry(setup->sm_stk_generation_method)) ) { 4680 sm_conn->sm_engine_state = SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION; 4681 break; 4682 } 4683 4684 // OOB 4685 if (setup->sm_stk_generation_method == OOB){ 4686 4687 // setup local random, set to zero if remote did not receive our data 4688 log_info("Received nonce, setup local random ra/rb for dhkey check"); 4689 if (IS_RESPONDER(sm_conn->sm_role)){ 4690 if (sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq) == 0u){ 4691 log_info("Reset rb as A does not have OOB data"); 4692 memset(setup->sm_rb, 0, 16); 4693 } else { 4694 (void)memcpy(setup->sm_rb, sm_sc_oob_random, 16); 4695 log_info("Use stored rb"); 4696 log_info_hexdump(setup->sm_rb, 16); 4697 } 4698 } else { 4699 if (sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres) == 0u){ 4700 log_info("Reset ra as B does not have OOB data"); 4701 memset(setup->sm_ra, 0, 16); 4702 } else { 4703 (void)memcpy(setup->sm_ra, sm_sc_oob_random, 16); 4704 log_info("Use stored ra"); 4705 log_info_hexdump(setup->sm_ra, 16); 4706 } 4707 } 4708 4709 // validate confirm value if Cb = f4(PKb, Pkb, rb, 0) for OOB if data received 4710 if (setup->sm_have_oob_data){ 4711 sm_conn->sm_engine_state = SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION; 4712 break; 4713 } 4714 } 4715 4716 // TODO: we only get here for Responder role with JW/NC 4717 sm_sc_state_after_receiving_random(sm_conn); 4718 break; 4719 4720 case SM_SC_W2_CALCULATE_G2: 4721 case SM_SC_W4_CALCULATE_G2: 4722 case SM_SC_W4_CALCULATE_DHKEY: 4723 case SM_SC_W2_CALCULATE_F5_SALT: 4724 case SM_SC_W4_CALCULATE_F5_SALT: 4725 case SM_SC_W2_CALCULATE_F5_MACKEY: 4726 case SM_SC_W4_CALCULATE_F5_MACKEY: 4727 case SM_SC_W2_CALCULATE_F5_LTK: 4728 case SM_SC_W4_CALCULATE_F5_LTK: 4729 case SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK: 4730 case SM_SC_W4_DHKEY_CHECK_COMMAND: 4731 case SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK: 4732 case SM_SC_W4_USER_RESPONSE: 4733 if (sm_pdu_code != SM_CODE_PAIRING_DHKEY_CHECK){ 4734 sm_pdu_received_in_wrong_state(sm_conn); 4735 break; 4736 } 4737 // store DHKey Check 4738 setup->sm_state_vars |= SM_STATE_VAR_DHKEY_COMMAND_RECEIVED; 4739 reverse_128(&packet[01], setup->sm_peer_dhkey_check); 4740 4741 // have we been only waiting for dhkey check command? 4742 if (sm_conn->sm_engine_state == SM_SC_W4_DHKEY_CHECK_COMMAND){ 4743 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK; 4744 } 4745 break; 4746 #endif 4747 4748 #ifdef ENABLE_LE_PERIPHERAL 4749 case SM_RESPONDER_PH1_W4_PAIRING_CONFIRM: 4750 if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){ 4751 sm_pdu_received_in_wrong_state(sm_conn); 4752 break; 4753 } 4754 4755 // received confirm value 4756 reverse_128(&packet[1], setup->sm_peer_confirm); 4757 4758 #ifdef ENABLE_TESTING_SUPPORT 4759 if (test_pairing_failure == SM_REASON_CONFIRM_VALUE_FAILED){ 4760 log_info("testing_support: reset confirm value"); 4761 memset(setup->sm_peer_confirm, 0, 16); 4762 } 4763 #endif 4764 // notify client to hide shown passkey 4765 if (setup->sm_stk_generation_method == PK_INIT_INPUT){ 4766 sm_notify_client_base(SM_EVENT_PASSKEY_DISPLAY_CANCEL, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address); 4767 } 4768 4769 // handle user cancel pairing? 4770 if (setup->sm_user_response == SM_USER_RESPONSE_DECLINE){ 4771 sm_pairing_error(sm_conn, SM_REASON_PASSKEY_ENTRY_FAILED); 4772 break; 4773 } 4774 4775 // wait for user action? 4776 if (setup->sm_user_response == SM_USER_RESPONSE_PENDING){ 4777 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 4778 break; 4779 } 4780 4781 // calculate and send local_confirm 4782 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_random, 16, &sm_handle_random_result_ph2_random, (void *)(uintptr_t) sm_conn->sm_handle); 4783 break; 4784 4785 case SM_RESPONDER_PH2_W4_PAIRING_RANDOM: 4786 if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){ 4787 sm_pdu_received_in_wrong_state(sm_conn); 4788 break;; 4789 } 4790 4791 // received random value 4792 reverse_128(&packet[1], setup->sm_peer_random); 4793 sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C; 4794 break; 4795 #endif 4796 4797 case SM_PH2_W4_CONNECTION_ENCRYPTED: 4798 case SM_PH3_RECEIVE_KEYS: 4799 switch(sm_pdu_code){ 4800 case SM_CODE_ENCRYPTION_INFORMATION: 4801 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION; 4802 reverse_128(&packet[1], setup->sm_peer_ltk); 4803 break; 4804 4805 case SM_CODE_MASTER_IDENTIFICATION: 4806 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION; 4807 setup->sm_peer_ediv = little_endian_read_16(packet, 1); 4808 reverse_64(&packet[3], setup->sm_peer_rand); 4809 break; 4810 4811 case SM_CODE_IDENTITY_INFORMATION: 4812 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION; 4813 reverse_128(&packet[1], setup->sm_peer_irk); 4814 break; 4815 4816 case SM_CODE_IDENTITY_ADDRESS_INFORMATION: 4817 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION; 4818 setup->sm_peer_addr_type = packet[1]; 4819 reverse_bd_addr(&packet[2], setup->sm_peer_address); 4820 break; 4821 4822 case SM_CODE_SIGNING_INFORMATION: 4823 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION; 4824 reverse_128(&packet[1], setup->sm_peer_csrk); 4825 break; 4826 default: 4827 // Unexpected PDU 4828 log_info("Unexpected PDU %u in SM_PH3_RECEIVE_KEYS", packet[0]); 4829 break; 4830 } 4831 // done with key distribution? 4832 if (sm_key_distribution_all_received()){ 4833 4834 sm_key_distribution_handle_all_received(sm_conn); 4835 4836 if (IS_RESPONDER(sm_conn->sm_role)){ 4837 sm_key_distribution_complete_responder(sm_conn); 4838 } else { 4839 if (setup->sm_use_secure_connections){ 4840 sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 4841 } else { 4842 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph3_random, (void *)(uintptr_t) sm_conn->sm_handle); 4843 } 4844 } 4845 } 4846 break; 4847 4848 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4849 4850 case SM_BR_EDR_W4_ENCRYPTION_COMPLETE: 4851 // GAP/DM/LEP/BI-02-C - reject CTKD if P-192 encryption is used 4852 if (sm_pdu_code == SM_CODE_PAIRING_REQUEST){ 4853 sm_pairing_error(sm_conn, SM_REASON_CROSS_TRANSPORT_KEY_DERIVATION_NOT_ALLOWED); 4854 } 4855 break; 4856 4857 case SM_BR_EDR_INITIATOR_W4_PAIRING_RESPONSE: 4858 4859 // dedicated bonding complete 4860 hci_dedicated_bonding_defer_disconnect(sm_conn->sm_handle, false); 4861 4862 if (sm_pdu_code != SM_CODE_PAIRING_RESPONSE){ 4863 sm_pdu_received_in_wrong_state(sm_conn); 4864 break; 4865 } 4866 // store pairing response 4867 (void)memcpy(&setup->sm_s_pres, packet, sizeof(sm_pairing_packet_t)); 4868 4869 // validate encryption key size 4870 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(setup->sm_s_pres); 4871 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4872 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4873 break; 4874 } 4875 sm_conn->sm_actual_encryption_key_size = sm_calc_actual_encryption_key_size(max_encryption_key_size); 4876 // SC Only mandates 128 bit key size 4877 if (sm_sc_only_mode && (sm_conn->sm_actual_encryption_key_size < 16)) { 4878 sm_conn->sm_actual_encryption_key_size = 0; 4879 } 4880 if (sm_conn->sm_actual_encryption_key_size == 0){ 4881 sm_pairing_error(sm_conn, SM_REASON_ENCRYPTION_KEY_SIZE); 4882 break; 4883 } 4884 4885 // prepare key exchange, LTK is derived locally 4886 sm_setup_key_distribution(sm_pairing_packet_get_initiator_key_distribution(setup->sm_s_pres) & ~SM_KEYDIST_ENC_KEY, 4887 sm_pairing_packet_get_responder_key_distribution(setup->sm_s_pres) & ~SM_KEYDIST_ENC_KEY); 4888 4889 // skip receive if there are none 4890 if (sm_key_distribution_all_received()){ 4891 // distribute keys in run handles 'no keys to send' 4892 sm_conn->sm_engine_state = SM_BR_EDR_DISTRIBUTE_KEYS; 4893 } else { 4894 sm_conn->sm_engine_state = SM_BR_EDR_RECEIVE_KEYS; 4895 } 4896 break; 4897 4898 case SM_BR_EDR_RESPONDER_W4_PAIRING_REQUEST: 4899 if (sm_pdu_code != SM_CODE_PAIRING_REQUEST){ 4900 sm_pdu_received_in_wrong_state(sm_conn); 4901 break; 4902 } 4903 4904 // store pairing request 4905 (void)memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t)); 4906 4907 // validate encryption key size 4908 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(sm_conn->sm_m_preq); 4909 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4910 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4911 break; 4912 } 4913 sm_conn->sm_actual_encryption_key_size = sm_calc_actual_encryption_key_size(max_encryption_key_size); 4914 // SC Only mandates 128 bit key size 4915 if (sm_sc_only_mode && (sm_conn->sm_actual_encryption_key_size < 16)) { 4916 sm_conn->sm_actual_encryption_key_size = 0; 4917 } 4918 if (sm_conn->sm_actual_encryption_key_size == 0){ 4919 sm_pairing_error(sm_conn, SM_REASON_ENCRYPTION_KEY_SIZE); 4920 break; 4921 } 4922 // trigger response 4923 if (sm_ctkd_from_classic(sm_conn)){ 4924 sm_conn->sm_engine_state = SM_BR_EDR_RESPONDER_PAIRING_REQUEST_RECEIVED; 4925 } else { 4926 sm_pairing_error(sm_conn, SM_REASON_CROSS_TRANSPORT_KEY_DERIVATION_NOT_ALLOWED); 4927 } 4928 break; 4929 4930 case SM_BR_EDR_RECEIVE_KEYS: 4931 switch(sm_pdu_code){ 4932 case SM_CODE_IDENTITY_INFORMATION: 4933 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION; 4934 reverse_128(&packet[1], setup->sm_peer_irk); 4935 break; 4936 case SM_CODE_IDENTITY_ADDRESS_INFORMATION: 4937 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION; 4938 setup->sm_peer_addr_type = packet[1]; 4939 reverse_bd_addr(&packet[2], setup->sm_peer_address); 4940 break; 4941 case SM_CODE_SIGNING_INFORMATION: 4942 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION; 4943 reverse_128(&packet[1], setup->sm_peer_csrk); 4944 break; 4945 default: 4946 // Unexpected PDU 4947 log_info("Unexpected PDU %u in SM_PH3_RECEIVE_KEYS", packet[0]); 4948 break; 4949 } 4950 4951 // all keys received 4952 if (sm_key_distribution_all_received()){ 4953 if (IS_RESPONDER(sm_conn->sm_role)){ 4954 // responder -> keys exchanged, derive LE LTK 4955 sm_ctkd_start_from_br_edr(sm_conn); 4956 } else { 4957 // initiator -> send our keys if any 4958 sm_conn->sm_engine_state = SM_BR_EDR_DISTRIBUTE_KEYS; 4959 } 4960 } 4961 break; 4962 #endif 4963 4964 default: 4965 // Unexpected PDU 4966 log_info("Unexpected PDU %u in state %u", packet[0], sm_conn->sm_engine_state); 4967 sm_pdu_received_in_wrong_state(sm_conn); 4968 break; 4969 } 4970 4971 // try to send next pdu 4972 sm_trigger_run(); 4973 } 4974 4975 // Security Manager Client API 4976 void sm_register_oob_data_callback( int (*get_oob_data_callback)(uint8_t address_type, bd_addr_t addr, uint8_t * oob_data)){ 4977 sm_get_oob_data = get_oob_data_callback; 4978 } 4979 4980 void sm_register_sc_oob_data_callback( int (*get_sc_oob_data_callback)(uint8_t address_type, bd_addr_t addr, uint8_t * oob_sc_peer_confirm, uint8_t * oob_sc_peer_random)){ 4981 sm_get_sc_oob_data = get_sc_oob_data_callback; 4982 } 4983 4984 void sm_register_ltk_callback( bool (*get_ltk_callback)(hci_con_handle_t con_handle, uint8_t address_type, bd_addr_t addr, uint8_t * ltk)){ 4985 sm_get_ltk_callback = get_ltk_callback; 4986 } 4987 4988 void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler){ 4989 btstack_linked_list_add_tail(&sm_event_handlers, (btstack_linked_item_t*) callback_handler); 4990 } 4991 4992 void sm_remove_event_handler(btstack_packet_callback_registration_t * callback_handler){ 4993 btstack_linked_list_remove(&sm_event_handlers, (btstack_linked_item_t*) callback_handler); 4994 } 4995 4996 void sm_set_accepted_stk_generation_methods(uint8_t accepted_stk_generation_methods){ 4997 sm_accepted_stk_generation_methods = accepted_stk_generation_methods; 4998 } 4999 5000 void sm_set_encryption_key_size_range(uint8_t min_size, uint8_t max_size){ 5001 sm_min_encryption_key_size = min_size; 5002 sm_max_encryption_key_size = max_size; 5003 } 5004 5005 void sm_set_authentication_requirements(uint8_t auth_req){ 5006 #ifndef ENABLE_LE_SECURE_CONNECTIONS 5007 if (auth_req & SM_AUTHREQ_SECURE_CONNECTION){ 5008 log_error("ENABLE_LE_SECURE_CONNECTIONS not defined, but requested by app. Dropping SC flag"); 5009 auth_req &= ~SM_AUTHREQ_SECURE_CONNECTION; 5010 } 5011 #endif 5012 sm_auth_req = auth_req; 5013 } 5014 5015 void sm_set_io_capabilities(io_capability_t io_capability){ 5016 sm_io_capabilities = io_capability; 5017 } 5018 5019 #ifdef ENABLE_LE_PERIPHERAL 5020 void sm_set_request_security(bool enable){ 5021 sm_slave_request_security = enable; 5022 } 5023 #endif 5024 5025 void sm_set_er(sm_key_t er){ 5026 (void)memcpy(sm_persistent_er, er, 16); 5027 } 5028 5029 void sm_set_ir(sm_key_t ir){ 5030 (void)memcpy(sm_persistent_ir, ir, 16); 5031 } 5032 5033 // Testing support only 5034 void sm_test_set_irk(sm_key_t irk){ 5035 (void)memcpy(sm_persistent_irk, irk, 16); 5036 dkg_state = DKG_CALC_DHK; 5037 test_use_fixed_local_irk = true; 5038 } 5039 5040 void sm_test_use_fixed_local_csrk(void){ 5041 test_use_fixed_local_csrk = true; 5042 } 5043 5044 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5045 static void sm_ec_generated(void * arg){ 5046 UNUSED(arg); 5047 ec_key_generation_state = EC_KEY_GENERATION_DONE; 5048 // trigger pairing if pending for ec key 5049 sm_trigger_run(); 5050 } 5051 static void sm_ec_generate_new_key(void) { 5052 log_info("sm: generate new ec key"); 5053 #ifdef ENABLE_LE_SECURE_CONNECTIONS_DEBUG_KEY 5054 // LE Secure Connections Debug Key 5055 const uint8_t debug_key_public[64] = { 5056 0x20, 0xb0, 0x03, 0xd2, 0xf2, 0x97, 0xbe, 0x2c, 0x5e, 0x2c, 0x83, 0xa7, 0xe9, 0xf9, 0xa5, 0xb9, 5057 0xef, 0xf4, 0x91, 0x11, 0xac, 0xf4, 0xfd, 0xdb, 0xcc, 0x03, 0x01, 0x48, 0x0e, 0x35, 0x9d, 0xe6, 5058 0xdc, 0x80, 0x9c, 0x49, 0x65, 0x2a, 0xeb, 0x6d, 0x63, 0x32, 0x9a, 0xbf, 0x5a, 0x52, 0x15, 0x5c, 5059 0x76, 0x63, 0x45, 0xc2, 0x8f, 0xed, 0x30, 0x24, 0x74, 0x1c, 0x8e, 0xd0, 0x15, 0x89, 0xd2, 0x8b 5060 }; 5061 const uint8_t debug_key_private[32] = { 5062 0x3f, 0x49, 0xf6, 0xd4, 0xa3, 0xc5, 0x5f, 0x38, 0x74, 0xc9, 0xb3, 0xe3, 0xd2, 0x10, 0x3f, 0x50, 5063 0x4a, 0xff, 0x60, 0x7b, 0xeb, 0x40, 0xb7, 0x99, 0x58, 0x99, 0xb8, 0xa6, 0xcd, 0x3c, 0x1a, 0xbd 5064 }; 5065 if (sm_sc_debug_keys_enabled) { 5066 memcpy(ec_q, debug_key_public, 64); 5067 btstack_crypto_ecc_p256_set_key(debug_key_public, debug_key_private); 5068 ec_key_generation_state = EC_KEY_GENERATION_DONE; 5069 } else 5070 #endif 5071 { 5072 ec_key_generation_state = EC_KEY_GENERATION_ACTIVE; 5073 btstack_crypto_ecc_p256_generate_key(&sm_crypto_ecc_p256_request, ec_q, &sm_ec_generated, NULL); 5074 } 5075 } 5076 #endif 5077 5078 #ifdef ENABLE_TESTING_SUPPORT 5079 void sm_test_set_pairing_failure(int reason){ 5080 test_pairing_failure = reason; 5081 } 5082 #endif 5083 5084 static void sm_state_reset(void) { 5085 #ifdef USE_CMAC_ENGINE 5086 sm_cmac_active = 0; 5087 #endif 5088 dkg_state = DKG_W4_WORKING; 5089 rau_state = RAU_IDLE; 5090 sm_aes128_state = SM_AES128_IDLE; 5091 sm_address_resolution_test = -1; // no private address to resolve yet 5092 sm_address_resolution_mode = ADDRESS_RESOLUTION_IDLE; 5093 sm_address_resolution_general_queue = NULL; 5094 sm_active_connection_handle = HCI_CON_HANDLE_INVALID; 5095 sm_persistent_keys_random_active = false; 5096 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5097 ec_key_generation_state = EC_KEY_GENERATION_IDLE; 5098 #endif 5099 } 5100 5101 void sm_init(void){ 5102 5103 if (sm_initialized) return; 5104 5105 // set default ER and IR values (should be unique - set by app or sm later using TLV) 5106 sm_er_ir_set_default(); 5107 5108 // defaults 5109 sm_accepted_stk_generation_methods = SM_STK_GENERATION_METHOD_JUST_WORKS 5110 | SM_STK_GENERATION_METHOD_OOB 5111 | SM_STK_GENERATION_METHOD_PASSKEY 5112 | SM_STK_GENERATION_METHOD_NUMERIC_COMPARISON; 5113 5114 sm_max_encryption_key_size = 16; 5115 sm_min_encryption_key_size = 7; 5116 5117 sm_fixed_passkey_in_display_role = 0xffffffffU; 5118 sm_reconstruct_ltk_without_le_device_db_entry = true; 5119 5120 gap_random_adress_update_period = 15 * 60 * 1000L; 5121 5122 test_use_fixed_local_csrk = false; 5123 5124 // other 5125 btstack_run_loop_set_timer_handler(&sm_run_timer, &sm_run_timer_handler); 5126 5127 // register for HCI Events 5128 hci_event_callback_registration.callback = &sm_event_packet_handler; 5129 hci_add_event_handler(&hci_event_callback_registration); 5130 5131 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 5132 // register for L2CAP events 5133 l2cap_event_callback_registration.callback = &sm_event_packet_handler; 5134 l2cap_add_event_handler(&l2cap_event_callback_registration); 5135 #endif 5136 5137 // 5138 btstack_crypto_init(); 5139 5140 // init le_device_db 5141 le_device_db_init(); 5142 5143 // and L2CAP PDUs + L2CAP_EVENT_CAN_SEND_NOW 5144 l2cap_register_fixed_channel(sm_pdu_handler, L2CAP_CID_SECURITY_MANAGER_PROTOCOL); 5145 #ifdef ENABLE_CLASSIC 5146 l2cap_register_fixed_channel(sm_pdu_handler, L2CAP_CID_BR_EDR_SECURITY_MANAGER); 5147 #endif 5148 5149 // state 5150 sm_state_reset(); 5151 5152 sm_initialized = true; 5153 } 5154 5155 void sm_deinit(void){ 5156 sm_initialized = false; 5157 btstack_run_loop_remove_timer(&sm_run_timer); 5158 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && defined (ENABLE_LE_SECURE_CONNECTION_DEBUG_KEY) 5159 sm_sc_debug_keys_enabled = false; 5160 #endif 5161 } 5162 5163 void sm_use_fixed_passkey_in_display_role(uint32_t passkey){ 5164 sm_fixed_passkey_in_display_role = passkey; 5165 } 5166 5167 void sm_allow_ltk_reconstruction_without_le_device_db_entry(int allow){ 5168 sm_reconstruct_ltk_without_le_device_db_entry = allow != 0; 5169 } 5170 5171 static sm_connection_t * sm_get_connection_for_handle(hci_con_handle_t con_handle){ 5172 hci_connection_t * hci_con = hci_connection_for_handle(con_handle); 5173 if (!hci_con) return NULL; 5174 return &hci_con->sm_connection; 5175 } 5176 5177 static void sm_cache_ltk(sm_connection_t * connection, const sm_key_t ltk){ 5178 hci_connection_t * hci_con = hci_connection_for_handle(connection->sm_handle); 5179 btstack_assert(hci_con != NULL); 5180 memcpy(hci_con->link_key, ltk, 16); 5181 hci_con->link_key_type = COMBINATION_KEY; 5182 } 5183 5184 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 5185 static sm_connection_t * sm_get_connection_for_bd_addr_and_type(bd_addr_t address, bd_addr_type_t addr_type){ 5186 hci_connection_t * hci_con = hci_connection_for_bd_addr_and_type(address, addr_type); 5187 if (!hci_con) return NULL; 5188 return &hci_con->sm_connection; 5189 } 5190 #endif 5191 5192 // @deprecated: map onto sm_request_pairing 5193 void sm_send_security_request(hci_con_handle_t con_handle){ 5194 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5195 if (!sm_conn) return; 5196 if (!IS_RESPONDER(sm_conn->sm_role)) return; 5197 sm_request_pairing(con_handle); 5198 } 5199 5200 // request pairing 5201 void sm_request_pairing(hci_con_handle_t con_handle){ 5202 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5203 if (!sm_conn) return; // wrong connection 5204 5205 bool have_ltk; 5206 uint8_t ltk[16]; 5207 bool auth_required; 5208 int authenticated; 5209 bool trigger_reencryption; 5210 log_info("sm_request_pairing in role %u, state %u", sm_conn->sm_role, sm_conn->sm_engine_state); 5211 if (IS_RESPONDER(sm_conn->sm_role)){ 5212 switch (sm_conn->sm_engine_state){ 5213 case SM_GENERAL_IDLE: 5214 case SM_RESPONDER_IDLE: 5215 switch (sm_conn->sm_irk_lookup_state){ 5216 case IRK_LOOKUP_SUCCEEDED: 5217 le_device_db_encryption_get(sm_conn->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL, NULL); 5218 have_ltk = !sm_is_null_key(ltk); 5219 log_info("have ltk %u", have_ltk); 5220 if (have_ltk){ 5221 sm_conn->sm_pairing_requested = true; 5222 sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST; 5223 sm_reencryption_started(sm_conn); 5224 break; 5225 } 5226 /* fall through */ 5227 5228 case IRK_LOOKUP_FAILED: 5229 sm_conn->sm_pairing_requested = true; 5230 sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST; 5231 sm_pairing_started(sm_conn); 5232 break; 5233 default: 5234 log_info("irk lookup pending"); 5235 sm_conn->sm_pairing_requested = true; 5236 break; 5237 } 5238 break; 5239 default: 5240 break; 5241 } 5242 } else { 5243 // used as a trigger to start central/master/initiator security procedures 5244 switch (sm_conn->sm_engine_state){ 5245 case SM_INITIATOR_CONNECTED: 5246 switch (sm_conn->sm_irk_lookup_state){ 5247 case IRK_LOOKUP_SUCCEEDED: 5248 le_device_db_encryption_get(sm_conn->sm_le_db_index, NULL, NULL, ltk, NULL, &authenticated, NULL, NULL); 5249 have_ltk = !sm_is_null_key(ltk); 5250 auth_required = sm_auth_req & SM_AUTHREQ_MITM_PROTECTION; 5251 // re-encrypt is sufficient if we have ltk and that is either already authenticated or we don't require authentication 5252 trigger_reencryption = have_ltk && ((authenticated != 0) || (auth_required == false)); 5253 log_info("have ltk %u, authenticated %u, auth required %u => reencrypt %u", have_ltk, authenticated, auth_required, trigger_reencryption); 5254 if (trigger_reencryption){ 5255 sm_conn->sm_pairing_requested = true; 5256 sm_conn->sm_engine_state = SM_INITIATOR_PH4_HAS_LTK; 5257 break; 5258 } 5259 /* fall through */ 5260 5261 case IRK_LOOKUP_FAILED: 5262 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 5263 break; 5264 default: 5265 log_info("irk lookup pending"); 5266 sm_conn->sm_pairing_requested = true; 5267 break; 5268 } 5269 break; 5270 case SM_GENERAL_REENCRYPTION_FAILED: 5271 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 5272 break; 5273 case SM_GENERAL_IDLE: 5274 sm_conn->sm_pairing_requested = true; 5275 break; 5276 default: 5277 break; 5278 } 5279 } 5280 sm_trigger_run(); 5281 } 5282 5283 // called by client app on authorization request 5284 void sm_authorization_decline(hci_con_handle_t con_handle){ 5285 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5286 if (!sm_conn) return; // wrong connection 5287 sm_conn->sm_connection_authorization_state = AUTHORIZATION_DECLINED; 5288 sm_notify_client_status(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 0); 5289 } 5290 5291 void sm_authorization_grant(hci_con_handle_t con_handle){ 5292 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5293 if (!sm_conn) return; // wrong connection 5294 sm_conn->sm_connection_authorization_state = AUTHORIZATION_GRANTED; 5295 sm_notify_client_status(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 1); 5296 } 5297 5298 // GAP Bonding API 5299 5300 void sm_bonding_decline(hci_con_handle_t con_handle){ 5301 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5302 if (!sm_conn) return; // wrong connection 5303 setup->sm_user_response = SM_USER_RESPONSE_DECLINE; 5304 log_info("decline, state %u", sm_conn->sm_engine_state); 5305 switch(sm_conn->sm_engine_state){ 5306 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5307 case SM_SC_W4_USER_RESPONSE: 5308 case SM_SC_W4_CONFIRMATION: 5309 case SM_SC_W4_PUBLIC_KEY_COMMAND: 5310 #endif 5311 case SM_PH1_W4_USER_RESPONSE: 5312 switch (setup->sm_stk_generation_method){ 5313 case PK_RESP_INPUT: 5314 case PK_INIT_INPUT: 5315 case PK_BOTH_INPUT: 5316 sm_pairing_error(sm_conn, SM_REASON_PASSKEY_ENTRY_FAILED); 5317 break; 5318 case NUMERIC_COMPARISON: 5319 sm_pairing_error(sm_conn, SM_REASON_NUMERIC_COMPARISON_FAILED); 5320 break; 5321 case JUST_WORKS: 5322 case OOB: 5323 sm_pairing_error(sm_conn, SM_REASON_UNSPECIFIED_REASON); 5324 break; 5325 default: 5326 btstack_assert(false); 5327 break; 5328 } 5329 break; 5330 default: 5331 break; 5332 } 5333 sm_trigger_run(); 5334 } 5335 5336 void sm_just_works_confirm(hci_con_handle_t con_handle){ 5337 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5338 if (!sm_conn) return; // wrong connection 5339 setup->sm_user_response = SM_USER_RESPONSE_CONFIRM; 5340 if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){ 5341 if (setup->sm_use_secure_connections){ 5342 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 5343 } else { 5344 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_random, 16, &sm_handle_random_result_ph2_random, (void *)(uintptr_t) sm_conn->sm_handle); 5345 } 5346 } 5347 5348 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5349 if (sm_conn->sm_engine_state == SM_SC_W4_USER_RESPONSE){ 5350 sm_sc_prepare_dhkey_check(sm_conn); 5351 } 5352 #endif 5353 5354 sm_trigger_run(); 5355 } 5356 5357 void sm_numeric_comparison_confirm(hci_con_handle_t con_handle){ 5358 // for now, it's the same 5359 sm_just_works_confirm(con_handle); 5360 } 5361 5362 void sm_passkey_input(hci_con_handle_t con_handle, uint32_t passkey){ 5363 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5364 if (!sm_conn) return; // wrong connection 5365 sm_reset_tk(); 5366 big_endian_store_32(setup->sm_tk, 12, passkey); 5367 setup->sm_user_response = SM_USER_RESPONSE_PASSKEY; 5368 if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){ 5369 btstack_crypto_random_generate(&sm_crypto_random_request, setup->sm_local_random, 16, &sm_handle_random_result_ph2_random, (void *)(uintptr_t) sm_conn->sm_handle); 5370 } 5371 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5372 (void)memcpy(setup->sm_ra, setup->sm_tk, 16); 5373 (void)memcpy(setup->sm_rb, setup->sm_tk, 16); 5374 if (sm_conn->sm_engine_state == SM_SC_W4_USER_RESPONSE){ 5375 sm_sc_start_calculating_local_confirm(sm_conn); 5376 } 5377 #endif 5378 sm_trigger_run(); 5379 } 5380 5381 void sm_keypress_notification(hci_con_handle_t con_handle, uint8_t action){ 5382 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5383 if (!sm_conn) return; // wrong connection 5384 if (action > SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED) return; 5385 uint8_t num_actions = setup->sm_keypress_notification >> 5; 5386 uint8_t flags = setup->sm_keypress_notification & 0x1fu; 5387 switch (action){ 5388 case SM_KEYPRESS_PASSKEY_ENTRY_STARTED: 5389 case SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED: 5390 flags |= (1u << action); 5391 break; 5392 case SM_KEYPRESS_PASSKEY_CLEARED: 5393 // clear counter, keypress & erased flags + set passkey cleared 5394 flags = (flags & 0x19u) | (1u << SM_KEYPRESS_PASSKEY_CLEARED); 5395 break; 5396 case SM_KEYPRESS_PASSKEY_DIGIT_ENTERED: 5397 if ((flags & (1u << SM_KEYPRESS_PASSKEY_DIGIT_ERASED)) != 0u){ 5398 // erase actions queued 5399 num_actions--; 5400 if (num_actions == 0u){ 5401 // clear counter, keypress & erased flags 5402 flags &= 0x19u; 5403 } 5404 break; 5405 } 5406 num_actions++; 5407 flags |= (1u << SM_KEYPRESS_PASSKEY_DIGIT_ENTERED); 5408 break; 5409 case SM_KEYPRESS_PASSKEY_DIGIT_ERASED: 5410 if ((flags & (1u << SM_KEYPRESS_PASSKEY_DIGIT_ENTERED)) != 0u){ 5411 // enter actions queued 5412 num_actions--; 5413 if (num_actions == 0u){ 5414 // clear counter, keypress & erased flags 5415 flags &= 0x19u; 5416 } 5417 break; 5418 } 5419 num_actions++; 5420 flags |= (1u << SM_KEYPRESS_PASSKEY_DIGIT_ERASED); 5421 break; 5422 default: 5423 break; 5424 } 5425 setup->sm_keypress_notification = (num_actions << 5) | flags; 5426 sm_trigger_run(); 5427 } 5428 5429 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5430 static void sm_handle_random_result_oob(void * arg){ 5431 UNUSED(arg); 5432 sm_sc_oob_state = SM_SC_OOB_W2_CALC_CONFIRM; 5433 sm_trigger_run(); 5434 } 5435 uint8_t sm_generate_sc_oob_data(void (*callback)(const uint8_t * confirm_value, const uint8_t * random_value)){ 5436 5437 static btstack_crypto_random_t sm_crypto_random_oob_request; 5438 5439 if (sm_sc_oob_state != SM_SC_OOB_IDLE) return ERROR_CODE_COMMAND_DISALLOWED; 5440 sm_sc_oob_callback = callback; 5441 sm_sc_oob_state = SM_SC_OOB_W4_RANDOM; 5442 btstack_crypto_random_generate(&sm_crypto_random_oob_request, sm_sc_oob_random, 16, &sm_handle_random_result_oob, NULL); 5443 return 0; 5444 } 5445 #endif 5446 5447 /** 5448 * @brief Get Identity Resolving state 5449 * @param con_handle 5450 * @return irk_lookup_state_t 5451 */ 5452 irk_lookup_state_t sm_identity_resolving_state(hci_con_handle_t con_handle){ 5453 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5454 if (!sm_conn) return IRK_LOOKUP_IDLE; 5455 return sm_conn->sm_irk_lookup_state; 5456 } 5457 5458 /** 5459 * @brief Identify device in LE Device DB 5460 * @param handle 5461 * @return index from le_device_db or -1 if not found/identified 5462 */ 5463 int sm_le_device_index(hci_con_handle_t con_handle ){ 5464 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5465 if (!sm_conn) return -1; 5466 return sm_conn->sm_le_db_index; 5467 } 5468 5469 uint8_t sm_get_ltk(hci_con_handle_t con_handle, sm_key_t ltk){ 5470 hci_connection_t * hci_connection = hci_connection_for_handle(con_handle); 5471 if (hci_connection == NULL){ 5472 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; 5473 } 5474 if (hci_connection->link_key_type == INVALID_LINK_KEY){ 5475 return ERROR_CODE_PIN_OR_KEY_MISSING; 5476 } 5477 memcpy(ltk, hci_connection->link_key, 16); 5478 return ERROR_CODE_SUCCESS; 5479 } 5480 5481 static int gap_random_address_type_requires_updates(void){ 5482 switch (gap_random_adress_type){ 5483 case GAP_RANDOM_ADDRESS_TYPE_OFF: 5484 case GAP_RANDOM_ADDRESS_TYPE_STATIC: 5485 return 0; 5486 default: 5487 return 1; 5488 } 5489 } 5490 5491 static uint8_t own_address_type(void){ 5492 switch (gap_random_adress_type){ 5493 case GAP_RANDOM_ADDRESS_TYPE_OFF: 5494 return BD_ADDR_TYPE_LE_PUBLIC; 5495 default: 5496 return BD_ADDR_TYPE_LE_RANDOM; 5497 } 5498 } 5499 5500 // GAP LE API 5501 void gap_random_address_set_mode(gap_random_address_type_t random_address_type){ 5502 gap_random_address_update_stop(); 5503 gap_random_adress_type = random_address_type; 5504 hci_le_set_own_address_type(own_address_type()); 5505 if (!gap_random_address_type_requires_updates()) return; 5506 gap_random_address_update_start(); 5507 gap_random_address_trigger(); 5508 } 5509 5510 gap_random_address_type_t gap_random_address_get_mode(void){ 5511 return gap_random_adress_type; 5512 } 5513 5514 void gap_random_address_set_update_period(int period_ms){ 5515 gap_random_adress_update_period = period_ms; 5516 if (!gap_random_address_type_requires_updates()) return; 5517 gap_random_address_update_stop(); 5518 gap_random_address_update_start(); 5519 } 5520 5521 void gap_random_address_set(const bd_addr_t addr){ 5522 gap_random_address_set_mode(GAP_RANDOM_ADDRESS_TYPE_STATIC); 5523 (void)memcpy(sm_random_address, addr, 6); 5524 // assert msb bits are set to '11' 5525 sm_random_address[0] |= 0xc0; 5526 hci_le_random_address_set(sm_random_address); 5527 } 5528 5529 #ifdef ENABLE_LE_PERIPHERAL 5530 /* 5531 * @brief Set Advertisement Paramters 5532 * @param adv_int_min 5533 * @param adv_int_max 5534 * @param adv_type 5535 * @param direct_address_type 5536 * @param direct_address 5537 * @param channel_map 5538 * @param filter_policy 5539 * 5540 * @note own_address_type is used from gap_random_address_set_mode 5541 */ 5542 void gap_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type, 5543 uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy){ 5544 hci_le_advertisements_set_params(adv_int_min, adv_int_max, adv_type, 5545 direct_address_typ, direct_address, channel_map, filter_policy); 5546 } 5547 #endif 5548 5549 bool gap_reconnect_security_setup_active(hci_con_handle_t con_handle){ 5550 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5551 // wrong connection 5552 if (!sm_conn) return false; 5553 // already encrypted 5554 if (sm_conn->sm_connection_encrypted) return false; 5555 // irk status? 5556 switch(sm_conn->sm_irk_lookup_state){ 5557 case IRK_LOOKUP_FAILED: 5558 // done, cannot setup encryption 5559 return false; 5560 case IRK_LOOKUP_SUCCEEDED: 5561 break; 5562 default: 5563 // IR Lookup pending 5564 return true; 5565 } 5566 // IRK Lookup Succeeded, re-encryption should be initiated. When done, state gets reset or indicates failure 5567 if (sm_conn->sm_engine_state == SM_GENERAL_REENCRYPTION_FAILED) return false; 5568 if (sm_conn->sm_role != 0){ 5569 return sm_conn->sm_engine_state != SM_RESPONDER_IDLE; 5570 } else { 5571 return sm_conn->sm_engine_state != SM_INITIATOR_CONNECTED; 5572 } 5573 } 5574 5575 void sm_set_secure_connections_only_mode(bool enable){ 5576 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5577 sm_sc_only_mode = enable; 5578 #else 5579 // SC Only mode not possible without support for SC 5580 btstack_assert(enable == false); 5581 #endif 5582 } 5583 5584 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && defined (ENABLE_LE_SECURE_CONNECTION_DEBUG_KEY) 5585 void sm_test_enable_secure_connections_debug_keys(void) { 5586 log_info("Enable LE Secure Connection Debug Keys for testing"); 5587 sm_sc_debug_keys_enabled = true; 5588 // set debug key 5589 sm_ec_generate_new_key(); 5590 } 5591 #endif 5592 5593 const uint8_t * gap_get_persistent_irk(void){ 5594 return sm_persistent_irk; 5595 } 5596 5597 void gap_delete_bonding(bd_addr_type_t address_type, bd_addr_t address){ 5598 int index = sm_le_device_db_index_lookup(address_type, address); 5599 if (index >= 0){ 5600 sm_remove_le_device_db_entry(index); 5601 } 5602 } 5603