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_packet(packet_type, 1, 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 // - bonding needs to be enabled: 2603 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; 2604 if (!bonding_enabled) return false; 2605 // - 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) 2606 bool link_key_authenticated = gap_authenticated_for_link_key_type(hci_connection->link_key_type); 2607 if (link_key_authenticated) return true; 2608 int index = sm_le_device_db_index_lookup(BD_ADDR_TYPE_LE_PUBLIC, hci_connection->address); 2609 if (index >= 0){ 2610 int ltk_authenticated; 2611 sm_key_t ltk; 2612 le_device_db_encryption_get(sm_connection->sm_le_db_index, NULL, NULL, ltk, NULL, <k_authenticated, NULL, NULL); 2613 bool have_ltk = !sm_is_null_key(ltk); 2614 if (have_ltk && ltk_authenticated) return false; 2615 } 2616 return true; 2617 } 2618 #endif 2619 2620 static void sm_key_distribution_complete_responder(sm_connection_t * connection){ 2621 if (sm_ctkd_from_le(connection)){ 2622 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; 2623 connection->sm_engine_state = use_h7 ? SM_SC_W2_CALCULATE_ILK_USING_H7 : SM_SC_W2_CALCULATE_ILK_USING_H6; 2624 } else { 2625 connection->sm_engine_state = SM_RESPONDER_IDLE; 2626 sm_pairing_complete(connection, ERROR_CODE_SUCCESS, 0); 2627 sm_done_for_handle(connection->sm_handle); 2628 } 2629 } 2630 2631 static void sm_key_distribution_complete_initiator(sm_connection_t * connection){ 2632 if (sm_ctkd_from_le(connection)){ 2633 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; 2634 connection->sm_engine_state = use_h7 ? SM_SC_W2_CALCULATE_ILK_USING_H7 : SM_SC_W2_CALCULATE_ILK_USING_H6; 2635 } else { 2636 sm_master_pairing_success(connection); 2637 } 2638 } 2639 2640 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2641 static void sm_run_state_sc_send_confirmation(sm_connection_t *connection) { 2642 uint8_t buffer[17]; 2643 buffer[0] = SM_CODE_PAIRING_CONFIRM; 2644 reverse_128(setup->sm_local_confirm, &buffer[1]); 2645 if (IS_RESPONDER(connection->sm_role)){ 2646 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2647 } else { 2648 connection->sm_engine_state = SM_SC_W4_CONFIRMATION; 2649 } 2650 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2651 sm_timeout_reset(connection); 2652 } 2653 2654 static void sm_run_state_sc_send_pairing_random(sm_connection_t *connection) { 2655 uint8_t buffer[17]; 2656 buffer[0] = SM_CODE_PAIRING_RANDOM; 2657 reverse_128(setup->sm_local_nonce, &buffer[1]); 2658 log_info("stk method %u, bit num: %u", setup->sm_stk_generation_method, setup->sm_passkey_bit); 2659 if (sm_passkey_entry(setup->sm_stk_generation_method) && (setup->sm_passkey_bit < 20u)){ 2660 log_info("SM_SC_SEND_PAIRING_RANDOM A"); 2661 if (IS_RESPONDER(connection->sm_role)){ 2662 // responder 2663 connection->sm_engine_state = SM_SC_W4_CONFIRMATION; 2664 } else { 2665 // initiator 2666 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2667 } 2668 } else { 2669 log_info("SM_SC_SEND_PAIRING_RANDOM B"); 2670 if (IS_RESPONDER(connection->sm_role)){ 2671 // responder 2672 if (setup->sm_stk_generation_method == NUMERIC_COMPARISON){ 2673 log_info("SM_SC_SEND_PAIRING_RANDOM B1"); 2674 connection->sm_engine_state = SM_SC_W2_CALCULATE_G2; 2675 } else { 2676 log_info("SM_SC_SEND_PAIRING_RANDOM B2"); 2677 sm_sc_prepare_dhkey_check(connection); 2678 } 2679 } else { 2680 // initiator 2681 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2682 } 2683 } 2684 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2685 sm_timeout_reset(connection); 2686 } 2687 2688 static void sm_run_state_sc_send_dhkey_check_command(sm_connection_t *connection) { 2689 uint8_t buffer[17]; 2690 buffer[0] = SM_CODE_PAIRING_DHKEY_CHECK; 2691 reverse_128(setup->sm_local_dhkey_check, &buffer[1]); 2692 2693 if (IS_RESPONDER(connection->sm_role)){ 2694 connection->sm_engine_state = SM_SC_W4_LTK_REQUEST_SC; 2695 } else { 2696 connection->sm_engine_state = SM_SC_W4_DHKEY_CHECK_COMMAND; 2697 } 2698 2699 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2700 sm_timeout_reset(connection); 2701 } 2702 2703 static void sm_run_state_sc_send_public_key_command(sm_connection_t *connection) { 2704 bool trigger_user_response = false; 2705 bool trigger_start_calculating_local_confirm = false; 2706 uint8_t buffer[65]; 2707 buffer[0] = SM_CODE_PAIRING_PUBLIC_KEY; 2708 // 2709 reverse_256(&ec_q[0], &buffer[1]); 2710 reverse_256(&ec_q[32], &buffer[33]); 2711 2712 #ifdef ENABLE_TESTING_SUPPORT 2713 if (test_pairing_failure == SM_REASON_DHKEY_CHECK_FAILED){ 2714 log_info("testing_support: invalidating public key"); 2715 // flip single bit of public key coordinate 2716 buffer[1] ^= 1; 2717 } 2718 #endif 2719 2720 // stk generation method 2721 // passkey entry: notify app to show passkey or to request passkey 2722 switch (setup->sm_stk_generation_method){ 2723 case JUST_WORKS: 2724 case NUMERIC_COMPARISON: 2725 if (IS_RESPONDER(connection->sm_role)){ 2726 // responder 2727 trigger_start_calculating_local_confirm = true; 2728 connection->sm_engine_state = SM_SC_W4_LOCAL_NONCE; 2729 } else { 2730 // initiator 2731 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 2732 } 2733 break; 2734 case PK_INIT_INPUT: 2735 case PK_RESP_INPUT: 2736 case PK_BOTH_INPUT: 2737 // use random TK for display 2738 (void)memcpy(setup->sm_ra, setup->sm_tk, 16); 2739 (void)memcpy(setup->sm_rb, setup->sm_tk, 16); 2740 setup->sm_passkey_bit = 0; 2741 2742 if (IS_RESPONDER(connection->sm_role)){ 2743 // responder 2744 connection->sm_engine_state = SM_SC_W4_CONFIRMATION; 2745 } else { 2746 // initiator 2747 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 2748 } 2749 trigger_user_response = true; 2750 break; 2751 case OOB: 2752 if (IS_RESPONDER(connection->sm_role)){ 2753 // responder 2754 connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM; 2755 } else { 2756 // initiator 2757 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 2758 } 2759 break; 2760 default: 2761 btstack_assert(false); 2762 break; 2763 } 2764 2765 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 2766 sm_timeout_reset(connection); 2767 2768 // trigger user response and calc confirm after sending pdu 2769 if (trigger_user_response){ 2770 sm_trigger_user_response(connection); 2771 } 2772 if (trigger_start_calculating_local_confirm){ 2773 sm_sc_start_calculating_local_confirm(connection); 2774 } 2775 } 2776 #endif 2777 2778 static bool sm_run_non_connection_logic(void){ 2779 bool done;; 2780 2781 done = sm_run_dpkg(); 2782 if (done) return true; 2783 2784 done = sm_run_rau(); 2785 if (done) return true; 2786 2787 done = sm_run_irk_lookup(); 2788 if (done) return true; 2789 2790 done = sm_run_oob(); 2791 return done; 2792 } 2793 2794 static void sm_run(void){ 2795 2796 // assert that stack has already bootet 2797 if (hci_get_state() != HCI_STATE_WORKING) return; 2798 2799 // assert that we can send at least commands 2800 if (!hci_can_send_command_packet_now()) return; 2801 2802 // pause until IR/ER are ready 2803 if (sm_persistent_keys_random_active) return; 2804 2805 // non-connection related behaviour 2806 bool done = sm_run_non_connection_logic(); 2807 if (done) return; 2808 2809 // assert that we can send at least commands - cmd might have been sent by crypto engine 2810 if (!hci_can_send_command_packet_now()) return; 2811 2812 // handle basic actions that don't requires the full context 2813 done = sm_run_basic(); 2814 if (done) return; 2815 2816 // 2817 // active connection handling 2818 // -- use loop to handle next connection if lock on setup context is released 2819 2820 while (true) { 2821 2822 sm_run_activate_connection(); 2823 2824 if (sm_active_connection_handle == HCI_CON_HANDLE_INVALID) return; 2825 2826 // 2827 // active connection handling 2828 // 2829 2830 sm_connection_t * connection = sm_get_connection_for_handle(sm_active_connection_handle); 2831 if (!connection) { 2832 log_info("no connection for handle 0x%04x", sm_active_connection_handle); 2833 return; 2834 } 2835 2836 // assert that we could send a SM PDU - not needed for all of the following 2837 if (!l2cap_can_send_fixed_channel_packet_now(sm_active_connection_handle, connection->sm_cid)) { 2838 log_info("cannot send now, requesting can send now event"); 2839 l2cap_request_can_send_fix_channel_now_event(sm_active_connection_handle, connection->sm_cid); 2840 return; 2841 } 2842 2843 // send keypress notifications 2844 if (setup->sm_keypress_notification != 0u){ 2845 sm_run_send_keypress_notification(connection); 2846 return; 2847 } 2848 2849 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2850 // assert that sm cmac engine is ready 2851 if (sm_cmac_ready() == false){ 2852 break; 2853 } 2854 #endif 2855 2856 int key_distribution_flags; 2857 UNUSED(key_distribution_flags); 2858 #ifdef ENABLE_LE_PERIPHERAL 2859 int err; 2860 bool have_ltk; 2861 uint8_t ltk[16]; 2862 #endif 2863 2864 log_info("sm_run: state %u", connection->sm_engine_state); 2865 switch (connection->sm_engine_state){ 2866 2867 // secure connections, initiator + responding states 2868 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2869 case SM_SC_W2_CMAC_FOR_CONFIRMATION: 2870 connection->sm_engine_state = SM_SC_W4_CMAC_FOR_CONFIRMATION; 2871 sm_sc_calculate_local_confirm(connection); 2872 break; 2873 case SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION: 2874 connection->sm_engine_state = SM_SC_W4_CMAC_FOR_CHECK_CONFIRMATION; 2875 sm_sc_calculate_remote_confirm(connection); 2876 break; 2877 case SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK: 2878 connection->sm_engine_state = SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK; 2879 sm_sc_calculate_f6_for_dhkey_check(connection); 2880 break; 2881 case SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK: 2882 connection->sm_engine_state = SM_SC_W4_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK; 2883 sm_sc_calculate_f6_to_verify_dhkey_check(connection); 2884 break; 2885 case SM_SC_W2_CALCULATE_F5_SALT: 2886 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_SALT; 2887 f5_calculate_salt(connection); 2888 break; 2889 case SM_SC_W2_CALCULATE_F5_MACKEY: 2890 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_MACKEY; 2891 f5_calculate_mackey(connection); 2892 break; 2893 case SM_SC_W2_CALCULATE_F5_LTK: 2894 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_LTK; 2895 f5_calculate_ltk(connection); 2896 break; 2897 case SM_SC_W2_CALCULATE_G2: 2898 connection->sm_engine_state = SM_SC_W4_CALCULATE_G2; 2899 g2_calculate(connection); 2900 break; 2901 #endif 2902 2903 #ifdef ENABLE_LE_CENTRAL 2904 // initiator side 2905 2906 case SM_INITIATOR_PH4_HAS_LTK: { 2907 sm_reset_setup(); 2908 sm_load_security_info(connection); 2909 2910 // cache key before using 2911 sm_cache_ltk(connection, setup->sm_peer_ltk); 2912 2913 sm_key_t peer_ltk_flipped; 2914 reverse_128(setup->sm_peer_ltk, peer_ltk_flipped); 2915 connection->sm_engine_state = SM_PH4_W4_CONNECTION_ENCRYPTED; 2916 log_info("sm: hci_le_start_encryption ediv 0x%04x", setup->sm_peer_ediv); 2917 uint32_t rand_high = big_endian_read_32(setup->sm_peer_rand, 0); 2918 uint32_t rand_low = big_endian_read_32(setup->sm_peer_rand, 4); 2919 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle,rand_low, rand_high, setup->sm_peer_ediv, peer_ltk_flipped); 2920 2921 // notify after sending 2922 sm_reencryption_started(connection); 2923 return; 2924 } 2925 2926 case SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST: 2927 sm_reset_setup(); 2928 sm_init_setup(connection); 2929 2930 sm_pairing_packet_set_code(setup->sm_m_preq, SM_CODE_PAIRING_REQUEST); 2931 connection->sm_engine_state = SM_INITIATOR_PH1_W4_PAIRING_RESPONSE; 2932 sm_send_connectionless(connection, (uint8_t*) &setup->sm_m_preq, sizeof(sm_pairing_packet_t)); 2933 sm_timeout_reset(connection); 2934 2935 // notify after sending 2936 sm_pairing_started(connection); 2937 break; 2938 #endif 2939 2940 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2941 case SM_SC_SEND_PUBLIC_KEY_COMMAND: 2942 sm_run_state_sc_send_public_key_command(connection); 2943 break; 2944 case SM_SC_SEND_CONFIRMATION: 2945 sm_run_state_sc_send_confirmation(connection); 2946 break; 2947 case SM_SC_SEND_PAIRING_RANDOM: 2948 sm_run_state_sc_send_pairing_random(connection); 2949 break; 2950 case SM_SC_SEND_DHKEY_CHECK_COMMAND: 2951 sm_run_state_sc_send_dhkey_check_command(connection); 2952 break; 2953 #endif 2954 2955 #ifdef ENABLE_LE_PERIPHERAL 2956 2957 case SM_RESPONDER_SEND_SECURITY_REQUEST: { 2958 const uint8_t buffer[2] = {SM_CODE_SECURITY_REQUEST, sm_auth_req}; 2959 connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_REQUEST; 2960 sm_send_connectionless(connection, (uint8_t *) buffer, sizeof(buffer)); 2961 sm_timeout_start(connection); 2962 break; 2963 } 2964 2965 #ifdef ENABLE_LE_SECURE_CONNECTIONS 2966 case SM_SC_RECEIVED_LTK_REQUEST: 2967 switch (connection->sm_irk_lookup_state){ 2968 case IRK_LOOKUP_SUCCEEDED: 2969 // assuming Secure Connection, we have a stored LTK and the EDIV/RAND are null 2970 // start using context by loading security info 2971 sm_reset_setup(); 2972 sm_load_security_info(connection); 2973 if ((setup->sm_peer_ediv == 0u) && sm_is_null_random(setup->sm_peer_rand) && !sm_is_null_key(setup->sm_peer_ltk)){ 2974 (void)memcpy(setup->sm_ltk, setup->sm_peer_ltk, 16); 2975 connection->sm_engine_state = SM_RESPONDER_PH4_SEND_LTK_REPLY; 2976 sm_reencryption_started(connection); 2977 sm_trigger_run(); 2978 break; 2979 } 2980 log_info("LTK Request: ediv & random are empty, but no stored LTK (IRK Lookup Succeeded)"); 2981 connection->sm_engine_state = SM_RESPONDER_IDLE; 2982 hci_send_cmd(&hci_le_long_term_key_negative_reply, connection->sm_handle); 2983 return; 2984 default: 2985 // just wait until IRK lookup is completed 2986 break; 2987 } 2988 break; 2989 #endif /* ENABLE_LE_SECURE_CONNECTIONS */ 2990 2991 case SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED: 2992 sm_reset_setup(); 2993 2994 // handle Pairing Request with LTK available 2995 switch (connection->sm_irk_lookup_state) { 2996 case IRK_LOOKUP_SUCCEEDED: 2997 le_device_db_encryption_get(connection->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL, NULL); 2998 have_ltk = !sm_is_null_key(ltk); 2999 if (have_ltk){ 3000 log_info("pairing request but LTK available"); 3001 // emit re-encryption start/fail sequence 3002 sm_reencryption_started(connection); 3003 sm_reencryption_complete(connection, ERROR_CODE_PIN_OR_KEY_MISSING); 3004 } 3005 break; 3006 default: 3007 break; 3008 } 3009 3010 sm_init_setup(connection); 3011 3012 // recover pairing request 3013 (void)memcpy(&setup->sm_m_preq, &connection->sm_m_preq, sizeof(sm_pairing_packet_t)); 3014 err = sm_stk_generation_init(connection); 3015 3016 #ifdef ENABLE_TESTING_SUPPORT 3017 if ((0 < test_pairing_failure) && (test_pairing_failure < SM_REASON_DHKEY_CHECK_FAILED)){ 3018 log_info("testing_support: respond with pairing failure %u", test_pairing_failure); 3019 err = test_pairing_failure; 3020 } 3021 #endif 3022 if (err != 0){ 3023 // emit pairing started/failed sequence 3024 sm_pairing_started(connection); 3025 sm_pairing_error(connection, err); 3026 sm_trigger_run(); 3027 break; 3028 } 3029 3030 sm_timeout_start(connection); 3031 3032 // generate random number first, if we need to show passkey, otherwise send response 3033 if (setup->sm_stk_generation_method == PK_INIT_INPUT){ 3034 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 8, &sm_handle_random_result_ph2_tk, (void *)(uintptr_t) connection->sm_handle); 3035 break; 3036 } 3037 3038 /* fall through */ 3039 3040 case SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE: 3041 sm_pairing_packet_set_code(setup->sm_s_pres,SM_CODE_PAIRING_RESPONSE); 3042 3043 // start with initiator key dist flags 3044 key_distribution_flags = sm_key_distribution_flags_for_auth_req(); 3045 3046 #ifdef ENABLE_LE_SECURE_CONNECTIONS 3047 // LTK (= encryption information & master identification) only exchanged for LE Legacy Connection 3048 if (setup->sm_use_secure_connections){ 3049 key_distribution_flags &= ~SM_KEYDIST_ENC_KEY; 3050 } 3051 #endif 3052 // setup in response 3053 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); 3054 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); 3055 3056 // update key distribution after ENC was dropped 3057 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)); 3058 3059 if (setup->sm_use_secure_connections){ 3060 connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND; 3061 } else { 3062 connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_CONFIRM; 3063 } 3064 3065 sm_send_connectionless(connection, (uint8_t*) &setup->sm_s_pres, sizeof(sm_pairing_packet_t)); 3066 sm_timeout_reset(connection); 3067 3068 // notify after sending 3069 sm_pairing_started(connection); 3070 3071 // SC Numeric Comparison will trigger user response after public keys & nonces have been exchanged 3072 if (!setup->sm_use_secure_connections || (setup->sm_stk_generation_method == JUST_WORKS)){ 3073 sm_trigger_user_response(connection); 3074 } 3075 return; 3076 #endif 3077 3078 case SM_PH2_SEND_PAIRING_RANDOM: { 3079 uint8_t buffer[17]; 3080 buffer[0] = SM_CODE_PAIRING_RANDOM; 3081 reverse_128(setup->sm_local_random, &buffer[1]); 3082 if (IS_RESPONDER(connection->sm_role)){ 3083 connection->sm_engine_state = SM_RESPONDER_PH2_W4_LTK_REQUEST; 3084 } else { 3085 connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_RANDOM; 3086 } 3087 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 3088 sm_timeout_reset(connection); 3089 break; 3090 } 3091 3092 case SM_PH2_C1_GET_ENC_A: 3093 // already busy? 3094 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3095 // calculate confirm using aes128 engine - step 1 3096 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); 3097 connection->sm_engine_state = SM_PH2_C1_W4_ENC_A; 3098 sm_aes128_state = SM_AES128_ACTIVE; 3099 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); 3100 break; 3101 3102 case SM_PH2_C1_GET_ENC_C: 3103 // already busy? 3104 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3105 // calculate m_confirm using aes128 engine - step 1 3106 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); 3107 connection->sm_engine_state = SM_PH2_C1_W4_ENC_C; 3108 sm_aes128_state = SM_AES128_ACTIVE; 3109 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); 3110 break; 3111 3112 case SM_PH2_CALC_STK: 3113 // already busy? 3114 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3115 // calculate STK 3116 if (IS_RESPONDER(connection->sm_role)){ 3117 sm_s1_r_prime(setup->sm_local_random, setup->sm_peer_random, sm_aes128_plaintext); 3118 } else { 3119 sm_s1_r_prime(setup->sm_peer_random, setup->sm_local_random, sm_aes128_plaintext); 3120 } 3121 connection->sm_engine_state = SM_PH2_W4_STK; 3122 sm_aes128_state = SM_AES128_ACTIVE; 3123 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); 3124 break; 3125 3126 case SM_PH3_Y_GET_ENC: 3127 // already busy? 3128 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3129 // PH3B2 - calculate Y from - enc 3130 3131 // dm helper (was sm_dm_r_prime) 3132 // r' = padding || r 3133 // r - 64 bit value 3134 memset(&sm_aes128_plaintext[0], 0, 8); 3135 (void)memcpy(&sm_aes128_plaintext[8], setup->sm_local_rand, 8); 3136 3137 // Y = dm(DHK, Rand) 3138 connection->sm_engine_state = SM_PH3_Y_W4_ENC; 3139 sm_aes128_state = SM_AES128_ACTIVE; 3140 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); 3141 break; 3142 3143 case SM_PH2_C1_SEND_PAIRING_CONFIRM: { 3144 uint8_t buffer[17]; 3145 buffer[0] = SM_CODE_PAIRING_CONFIRM; 3146 reverse_128(setup->sm_local_confirm, &buffer[1]); 3147 if (IS_RESPONDER(connection->sm_role)){ 3148 connection->sm_engine_state = SM_RESPONDER_PH2_W4_PAIRING_RANDOM; 3149 } else { 3150 connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_CONFIRM; 3151 } 3152 sm_send_connectionless(connection, (uint8_t*) buffer, sizeof(buffer)); 3153 sm_timeout_reset(connection); 3154 return; 3155 } 3156 #ifdef ENABLE_LE_PERIPHERAL 3157 case SM_RESPONDER_PH2_SEND_LTK_REPLY: { 3158 // cache key before using 3159 sm_cache_ltk(connection, setup->sm_ltk); 3160 sm_key_t stk_flipped; 3161 reverse_128(setup->sm_ltk, stk_flipped); 3162 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED; 3163 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, stk_flipped); 3164 return; 3165 } 3166 case SM_RESPONDER_PH4_SEND_LTK_REPLY: { 3167 // allow to override LTK 3168 if (sm_get_ltk_callback != NULL){ 3169 (void)(*sm_get_ltk_callback)(connection->sm_handle, connection->sm_peer_addr_type, connection->sm_peer_address, setup->sm_ltk); 3170 } 3171 // cache key before using 3172 sm_cache_ltk(connection, setup->sm_ltk); 3173 sm_key_t ltk_flipped; 3174 reverse_128(setup->sm_ltk, ltk_flipped); 3175 connection->sm_engine_state = SM_PH4_W4_CONNECTION_ENCRYPTED; 3176 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, ltk_flipped); 3177 return; 3178 } 3179 3180 case SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST: 3181 // already busy? 3182 if (sm_aes128_state == SM_AES128_ACTIVE) break; 3183 log_info("LTK Request: recalculating with ediv 0x%04x", setup->sm_local_ediv); 3184 3185 sm_reset_setup(); 3186 sm_start_calculating_ltk_from_ediv_and_rand(connection); 3187 3188 sm_reencryption_started(connection); 3189 3190 // dm helper (was sm_dm_r_prime) 3191 // r' = padding || r 3192 // r - 64 bit value 3193 memset(&sm_aes128_plaintext[0], 0, 8); 3194 (void)memcpy(&sm_aes128_plaintext[8], setup->sm_local_rand, 8); 3195 3196 // Y = dm(DHK, Rand) 3197 connection->sm_engine_state = SM_RESPONDER_PH4_Y_W4_ENC; 3198 sm_aes128_state = SM_AES128_ACTIVE; 3199 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); 3200 return; 3201 #endif 3202 #ifdef ENABLE_LE_CENTRAL 3203 case SM_INITIATOR_PH3_SEND_START_ENCRYPTION: { 3204 // cache key before using 3205 sm_cache_ltk(connection, setup->sm_ltk); 3206 3207 sm_key_t stk_flipped; 3208 reverse_128(setup->sm_ltk, stk_flipped); 3209 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED; 3210 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle, 0, 0, 0, stk_flipped); 3211 return; 3212 } 3213 #endif 3214 3215 case SM_PH3_DISTRIBUTE_KEYS: 3216 // send next key 3217 if (setup->sm_key_distribution_send_set != 0){ 3218 sm_run_distribute_keys(connection); 3219 } 3220 3221 // more to send? 3222 if (setup->sm_key_distribution_send_set != 0){ 3223 return; 3224 } 3225 3226 // keys are sent 3227 if (IS_RESPONDER(connection->sm_role)){ 3228 // slave -> receive master keys if any 3229 if (sm_key_distribution_all_received()){ 3230 sm_key_distribution_handle_all_received(connection); 3231 sm_key_distribution_complete_responder(connection); 3232 // start CTKD right away 3233 continue; 3234 } else { 3235 connection->sm_engine_state = SM_PH3_RECEIVE_KEYS; 3236 } 3237 } else { 3238 sm_master_pairing_success(connection); 3239 } 3240 break; 3241 3242 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 3243 case SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST: 3244 // fill in sm setup (lite version of sm_init_setup) 3245 sm_reset_setup(); 3246 setup->sm_peer_addr_type = connection->sm_peer_addr_type; 3247 setup->sm_m_addr_type = connection->sm_peer_addr_type; 3248 setup->sm_s_addr_type = connection->sm_own_addr_type; 3249 (void) memcpy(setup->sm_peer_address, connection->sm_peer_address, 6); 3250 (void) memcpy(setup->sm_m_address, connection->sm_peer_address, 6); 3251 (void) memcpy(setup->sm_s_address, connection->sm_own_address, 6); 3252 setup->sm_use_secure_connections = true; 3253 sm_ctkd_fetch_br_edr_link_key(connection); 3254 3255 // Enc Key and IRK if requested 3256 key_distribution_flags = SM_KEYDIST_ID_KEY | SM_KEYDIST_ENC_KEY; 3257 #ifdef ENABLE_LE_SIGNED_WRITE 3258 // Plus signing key if supported 3259 key_distribution_flags |= SM_KEYDIST_ID_KEY; 3260 #endif 3261 sm_pairing_packet_set_code(setup->sm_m_preq, SM_CODE_PAIRING_REQUEST); 3262 sm_pairing_packet_set_io_capability(setup->sm_m_preq, 0); 3263 sm_pairing_packet_set_oob_data_flag(setup->sm_m_preq, 0); 3264 sm_pairing_packet_set_auth_req(setup->sm_m_preq, SM_AUTHREQ_CT2); 3265 sm_pairing_packet_set_max_encryption_key_size(setup->sm_m_preq, sm_max_encryption_key_size); 3266 sm_pairing_packet_set_initiator_key_distribution(setup->sm_m_preq, key_distribution_flags); 3267 sm_pairing_packet_set_responder_key_distribution(setup->sm_m_preq, key_distribution_flags); 3268 3269 // set state and send pairing response 3270 sm_timeout_start(connection); 3271 connection->sm_engine_state = SM_BR_EDR_INITIATOR_W4_PAIRING_RESPONSE; 3272 sm_send_connectionless(connection, (uint8_t *) &setup->sm_m_preq, sizeof(sm_pairing_packet_t)); 3273 break; 3274 3275 case SM_BR_EDR_RESPONDER_PAIRING_REQUEST_RECEIVED: 3276 // fill in sm setup (lite version of sm_init_setup) 3277 sm_reset_setup(); 3278 setup->sm_peer_addr_type = connection->sm_peer_addr_type; 3279 setup->sm_m_addr_type = connection->sm_peer_addr_type; 3280 setup->sm_s_addr_type = connection->sm_own_addr_type; 3281 (void) memcpy(setup->sm_peer_address, connection->sm_peer_address, 6); 3282 (void) memcpy(setup->sm_m_address, connection->sm_peer_address, 6); 3283 (void) memcpy(setup->sm_s_address, connection->sm_own_address, 6); 3284 setup->sm_use_secure_connections = true; 3285 sm_ctkd_fetch_br_edr_link_key(connection); 3286 (void) memcpy(&setup->sm_m_preq, &connection->sm_m_preq, sizeof(sm_pairing_packet_t)); 3287 3288 // Enc Key and IRK if requested 3289 key_distribution_flags = SM_KEYDIST_ID_KEY | SM_KEYDIST_ENC_KEY; 3290 #ifdef ENABLE_LE_SIGNED_WRITE 3291 // Plus signing key if supported 3292 key_distribution_flags |= SM_KEYDIST_ID_KEY; 3293 #endif 3294 // drop flags not requested by initiator 3295 key_distribution_flags &= sm_pairing_packet_get_initiator_key_distribution(connection->sm_m_preq); 3296 3297 // If Secure Connections pairing has been initiated over BR/EDR, the following fields of the SM Pairing Request PDU are reserved for future use: 3298 // - the IO Capability field, 3299 // - the OOB data flag field, and 3300 // - all bits in the Auth Req field except the CT2 bit. 3301 sm_pairing_packet_set_code(setup->sm_s_pres, SM_CODE_PAIRING_RESPONSE); 3302 sm_pairing_packet_set_io_capability(setup->sm_s_pres, 0); 3303 sm_pairing_packet_set_oob_data_flag(setup->sm_s_pres, 0); 3304 sm_pairing_packet_set_auth_req(setup->sm_s_pres, SM_AUTHREQ_CT2); 3305 sm_pairing_packet_set_max_encryption_key_size(setup->sm_s_pres, connection->sm_actual_encryption_key_size); 3306 sm_pairing_packet_set_initiator_key_distribution(setup->sm_s_pres, key_distribution_flags); 3307 sm_pairing_packet_set_responder_key_distribution(setup->sm_s_pres, key_distribution_flags); 3308 3309 // configure key distribution, LTK is derived locally 3310 key_distribution_flags &= ~SM_KEYDIST_ENC_KEY; 3311 sm_setup_key_distribution(key_distribution_flags, key_distribution_flags); 3312 3313 // set state and send pairing response 3314 sm_timeout_start(connection); 3315 connection->sm_engine_state = SM_BR_EDR_DISTRIBUTE_KEYS; 3316 sm_send_connectionless(connection, (uint8_t *) &setup->sm_s_pres, sizeof(sm_pairing_packet_t)); 3317 break; 3318 case SM_BR_EDR_DISTRIBUTE_KEYS: 3319 if (setup->sm_key_distribution_send_set != 0) { 3320 sm_run_distribute_keys(connection); 3321 return; 3322 } 3323 // keys are sent 3324 if (IS_RESPONDER(connection->sm_role)) { 3325 // responder -> receive master keys if there are any 3326 if (!sm_key_distribution_all_received()){ 3327 connection->sm_engine_state = SM_BR_EDR_RECEIVE_KEYS; 3328 break; 3329 } 3330 } 3331 // otherwise start CTKD right away (responder and no keys to receive / initiator) 3332 sm_ctkd_start_from_br_edr(connection); 3333 continue; 3334 case SM_SC_W2_CALCULATE_ILK_USING_H6: 3335 connection->sm_engine_state = SM_SC_W4_CALCULATE_ILK; 3336 h6_calculate_ilk_from_le_ltk(connection); 3337 break; 3338 case SM_SC_W2_CALCULATE_BR_EDR_LINK_KEY: 3339 connection->sm_engine_state = SM_SC_W4_CALCULATE_BR_EDR_LINK_KEY; 3340 h6_calculate_br_edr_link_key(connection); 3341 break; 3342 case SM_SC_W2_CALCULATE_ILK_USING_H7: 3343 connection->sm_engine_state = SM_SC_W4_CALCULATE_ILK; 3344 h7_calculate_ilk_from_le_ltk(connection); 3345 break; 3346 case SM_BR_EDR_W2_CALCULATE_ILK_USING_H6: 3347 connection->sm_engine_state = SM_BR_EDR_W4_CALCULATE_ILK; 3348 h6_calculate_ilk_from_br_edr(connection); 3349 break; 3350 case SM_BR_EDR_W2_CALCULATE_LE_LTK: 3351 connection->sm_engine_state = SM_BR_EDR_W4_CALCULATE_LE_LTK; 3352 h6_calculate_le_ltk(connection); 3353 break; 3354 case SM_BR_EDR_W2_CALCULATE_ILK_USING_H7: 3355 connection->sm_engine_state = SM_BR_EDR_W4_CALCULATE_ILK; 3356 h7_calculate_ilk_from_br_edr(connection); 3357 break; 3358 #endif 3359 3360 default: 3361 break; 3362 } 3363 3364 // check again if active connection was released 3365 if (sm_active_connection_handle != HCI_CON_HANDLE_INVALID) break; 3366 } 3367 } 3368 3369 // sm_aes128_state stays active 3370 static void sm_handle_encryption_result_enc_a(void *arg){ 3371 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3372 sm_aes128_state = SM_AES128_IDLE; 3373 3374 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3375 if (connection == NULL) return; 3376 3377 sm_c1_t3(sm_aes128_ciphertext, setup->sm_m_address, setup->sm_s_address, setup->sm_c1_t3_value); 3378 sm_aes128_state = SM_AES128_ACTIVE; 3379 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); 3380 } 3381 3382 static void sm_handle_encryption_result_enc_b(void *arg){ 3383 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3384 sm_aes128_state = SM_AES128_IDLE; 3385 3386 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3387 if (connection == NULL) return; 3388 3389 log_info_key("c1!", setup->sm_local_confirm); 3390 connection->sm_engine_state = SM_PH2_C1_SEND_PAIRING_CONFIRM; 3391 sm_trigger_run(); 3392 } 3393 3394 // sm_aes128_state stays active 3395 static void sm_handle_encryption_result_enc_c(void *arg){ 3396 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3397 sm_aes128_state = SM_AES128_IDLE; 3398 3399 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3400 if (connection == NULL) return; 3401 3402 sm_c1_t3(sm_aes128_ciphertext, setup->sm_m_address, setup->sm_s_address, setup->sm_c1_t3_value); 3403 sm_aes128_state = SM_AES128_ACTIVE; 3404 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); 3405 } 3406 3407 static void sm_handle_encryption_result_enc_d(void * arg){ 3408 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3409 sm_aes128_state = SM_AES128_IDLE; 3410 3411 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3412 if (connection == NULL) return; 3413 3414 log_info_key("c1!", sm_aes128_ciphertext); 3415 if (memcmp(setup->sm_peer_confirm, sm_aes128_ciphertext, 16) != 0){ 3416 sm_pairing_error(connection, SM_REASON_CONFIRM_VALUE_FAILED); 3417 sm_trigger_run(); 3418 return; 3419 } 3420 if (IS_RESPONDER(connection->sm_role)){ 3421 connection->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM; 3422 sm_trigger_run(); 3423 } else { 3424 sm_s1_r_prime(setup->sm_peer_random, setup->sm_local_random, sm_aes128_plaintext); 3425 sm_aes128_state = SM_AES128_ACTIVE; 3426 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); 3427 } 3428 } 3429 3430 static void sm_handle_encryption_result_enc_stk(void *arg){ 3431 sm_aes128_state = SM_AES128_IDLE; 3432 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3433 3434 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3435 if (connection == NULL) return; 3436 3437 sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size); 3438 log_info_key("stk", setup->sm_ltk); 3439 if (IS_RESPONDER(connection->sm_role)){ 3440 connection->sm_engine_state = SM_RESPONDER_PH2_SEND_LTK_REPLY; 3441 } else { 3442 connection->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION; 3443 } 3444 sm_trigger_run(); 3445 } 3446 3447 // sm_aes128_state stays active 3448 static void sm_handle_encryption_result_enc_ph3_y(void *arg){ 3449 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3450 sm_aes128_state = SM_AES128_IDLE; 3451 3452 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3453 if (connection == NULL) return; 3454 3455 setup->sm_local_y = big_endian_read_16(sm_aes128_ciphertext, 14); 3456 log_info_hex16("y", setup->sm_local_y); 3457 // PH3B3 - calculate EDIV 3458 setup->sm_local_ediv = setup->sm_local_y ^ setup->sm_local_div; 3459 log_info_hex16("ediv", setup->sm_local_ediv); 3460 // PH3B4 - calculate LTK - enc 3461 // LTK = d1(ER, DIV, 0)) 3462 sm_d1_d_prime(setup->sm_local_div, 0, sm_aes128_plaintext); 3463 sm_aes128_state = SM_AES128_ACTIVE; 3464 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); 3465 } 3466 3467 #ifdef ENABLE_LE_PERIPHERAL 3468 // sm_aes128_state stays active 3469 static void sm_handle_encryption_result_enc_ph4_y(void *arg){ 3470 sm_aes128_state = SM_AES128_IDLE; 3471 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3472 3473 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3474 if (connection == NULL) return; 3475 3476 setup->sm_local_y = big_endian_read_16(sm_aes128_ciphertext, 14); 3477 log_info_hex16("y", setup->sm_local_y); 3478 3479 // PH3B3 - calculate DIV 3480 setup->sm_local_div = setup->sm_local_y ^ setup->sm_local_ediv; 3481 log_info_hex16("ediv", setup->sm_local_ediv); 3482 // PH3B4 - calculate LTK - enc 3483 // LTK = d1(ER, DIV, 0)) 3484 sm_d1_d_prime(setup->sm_local_div, 0, sm_aes128_plaintext); 3485 sm_aes128_state = SM_AES128_ACTIVE; 3486 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); 3487 } 3488 #endif 3489 3490 // sm_aes128_state stays active 3491 static void sm_handle_encryption_result_enc_ph3_ltk(void *arg){ 3492 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3493 sm_aes128_state = SM_AES128_IDLE; 3494 3495 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3496 if (connection == NULL) return; 3497 3498 log_info_key("ltk", setup->sm_ltk); 3499 // calc CSRK next 3500 sm_d1_d_prime(setup->sm_local_div, 1, sm_aes128_plaintext); 3501 sm_aes128_state = SM_AES128_ACTIVE; 3502 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); 3503 } 3504 3505 static void sm_handle_encryption_result_enc_csrk(void *arg){ 3506 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3507 sm_aes128_state = SM_AES128_IDLE; 3508 3509 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3510 if (connection == NULL) return; 3511 3512 sm_aes128_state = SM_AES128_IDLE; 3513 log_info_key("csrk", setup->sm_local_csrk); 3514 if (setup->sm_key_distribution_send_set != 0u){ 3515 connection->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 3516 } else { 3517 // no keys to send, just continue 3518 if (IS_RESPONDER(connection->sm_role)){ 3519 if (sm_key_distribution_all_received()){ 3520 sm_key_distribution_handle_all_received(connection); 3521 sm_key_distribution_complete_responder(connection); 3522 } else { 3523 // slave -> receive master keys 3524 connection->sm_engine_state = SM_PH3_RECEIVE_KEYS; 3525 } 3526 } else { 3527 sm_key_distribution_complete_initiator(connection); 3528 } 3529 } 3530 sm_trigger_run(); 3531 } 3532 3533 #ifdef ENABLE_LE_PERIPHERAL 3534 static void sm_handle_encryption_result_enc_ph4_ltk(void *arg){ 3535 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3536 sm_aes128_state = SM_AES128_IDLE; 3537 3538 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3539 if (connection == NULL) return; 3540 3541 sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size); 3542 log_info_key("ltk", setup->sm_ltk); 3543 connection->sm_engine_state = SM_RESPONDER_PH4_SEND_LTK_REPLY; 3544 sm_trigger_run(); 3545 } 3546 #endif 3547 3548 static void sm_handle_encryption_result_address_resolution(void *arg){ 3549 UNUSED(arg); 3550 sm_aes128_state = SM_AES128_IDLE; 3551 3552 // compare calulated address against connecting device 3553 uint8_t * hash = &sm_aes128_ciphertext[13]; 3554 if (memcmp(&sm_address_resolution_address[3], hash, 3) == 0){ 3555 log_info("LE Device Lookup: matched resolvable private address"); 3556 sm_address_resolution_handle_event(ADDRESS_RESOLUTION_SUCCEEDED); 3557 sm_trigger_run(); 3558 return; 3559 } 3560 // no match, try next 3561 sm_address_resolution_test++; 3562 sm_trigger_run(); 3563 } 3564 3565 static void sm_handle_encryption_result_dkg_irk(void *arg){ 3566 UNUSED(arg); 3567 sm_aes128_state = SM_AES128_IDLE; 3568 3569 log_info_key("irk", sm_persistent_irk); 3570 dkg_state = DKG_CALC_DHK; 3571 sm_trigger_run(); 3572 } 3573 3574 static void sm_handle_encryption_result_dkg_dhk(void *arg){ 3575 UNUSED(arg); 3576 sm_aes128_state = SM_AES128_IDLE; 3577 3578 log_info_key("dhk", sm_persistent_dhk); 3579 dkg_state = DKG_READY; 3580 sm_trigger_run(); 3581 } 3582 3583 static void sm_handle_encryption_result_rau(void *arg){ 3584 UNUSED(arg); 3585 sm_aes128_state = SM_AES128_IDLE; 3586 3587 (void)memcpy(&sm_random_address[3], &sm_aes128_ciphertext[13], 3); 3588 rau_state = RAU_IDLE; 3589 hci_le_random_address_set(sm_random_address); 3590 3591 sm_trigger_run(); 3592 } 3593 3594 static void sm_handle_random_result_rau(void * arg){ 3595 UNUSED(arg); 3596 // non-resolvable vs. resolvable 3597 switch (gap_random_adress_type){ 3598 case GAP_RANDOM_ADDRESS_RESOLVABLE: 3599 // resolvable: use random as prand and calc address hash 3600 // "The two most significant bits of prand shall be equal to ‘0’ and ‘1" 3601 sm_random_address[0u] &= 0x3fu; 3602 sm_random_address[0u] |= 0x40u; 3603 rau_state = RAU_GET_ENC; 3604 break; 3605 case GAP_RANDOM_ADDRESS_NON_RESOLVABLE: 3606 default: 3607 // "The two most significant bits of the address shall be equal to ‘0’"" 3608 sm_random_address[0u] &= 0x3fu; 3609 rau_state = RAU_IDLE; 3610 hci_le_random_address_set(sm_random_address); 3611 break; 3612 } 3613 sm_trigger_run(); 3614 } 3615 3616 #ifdef ENABLE_LE_SECURE_CONNECTIONS 3617 static void sm_handle_random_result_sc_next_send_pairing_random(void * arg){ 3618 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3619 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3620 if (connection == NULL) return; 3621 3622 connection->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM; 3623 sm_trigger_run(); 3624 } 3625 3626 static void sm_handle_random_result_sc_next_w2_cmac_for_confirmation(void * arg){ 3627 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3628 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3629 if (connection == NULL) return; 3630 3631 connection->sm_engine_state = SM_SC_W2_CMAC_FOR_CONFIRMATION; 3632 sm_trigger_run(); 3633 } 3634 #endif 3635 3636 static void sm_handle_random_result_ph2_random(void * arg){ 3637 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3638 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3639 if (connection == NULL) return; 3640 3641 connection->sm_engine_state = SM_PH2_C1_GET_ENC_A; 3642 sm_trigger_run(); 3643 } 3644 3645 static void sm_handle_random_result_ph2_tk(void * arg){ 3646 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3647 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3648 if (connection == NULL) return; 3649 3650 sm_reset_tk(); 3651 uint32_t tk; 3652 if (sm_fixed_passkey_in_display_role == 0xffffffffU){ 3653 // map random to 0-999999 without speding much cycles on a modulus operation 3654 tk = little_endian_read_32(sm_random_data,0); 3655 tk = tk & 0xfffff; // 1048575 3656 if (tk >= 999999u){ 3657 tk = tk - 999999u; 3658 } 3659 } else { 3660 // override with pre-defined passkey 3661 tk = sm_fixed_passkey_in_display_role; 3662 } 3663 big_endian_store_32(setup->sm_tk, 12, tk); 3664 if (IS_RESPONDER(connection->sm_role)){ 3665 connection->sm_engine_state = SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE; 3666 } else { 3667 if (setup->sm_use_secure_connections){ 3668 connection->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 3669 } else { 3670 connection->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 3671 sm_trigger_user_response(connection); 3672 // response_idle == nothing <--> sm_trigger_user_response() did not require response 3673 if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){ 3674 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); 3675 } 3676 } 3677 } 3678 sm_trigger_run(); 3679 } 3680 3681 static void sm_handle_random_result_ph3_div(void * arg){ 3682 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3683 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3684 if (connection == NULL) return; 3685 3686 // use 16 bit from random value as div 3687 setup->sm_local_div = big_endian_read_16(sm_random_data, 0); 3688 log_info_hex16("div", setup->sm_local_div); 3689 connection->sm_engine_state = SM_PH3_Y_GET_ENC; 3690 sm_trigger_run(); 3691 } 3692 3693 static void sm_handle_random_result_ph3_random(void * arg){ 3694 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg; 3695 sm_connection_t * connection = sm_get_connection_for_handle(con_handle); 3696 if (connection == NULL) return; 3697 3698 reverse_64(sm_random_data, setup->sm_local_rand); 3699 // no db for encryption size hack: encryption size is stored in lowest nibble of setup->sm_local_rand 3700 setup->sm_local_rand[7u] = (setup->sm_local_rand[7u] & 0xf0u) + (connection->sm_actual_encryption_key_size - 1u); 3701 // no db for authenticated flag hack: store flag in bit 4 of LSB 3702 setup->sm_local_rand[7u] = (setup->sm_local_rand[7u] & 0xefu) + (connection->sm_connection_authenticated << 4u); 3703 btstack_crypto_random_generate(&sm_crypto_random_request, sm_random_data, 2, &sm_handle_random_result_ph3_div, (void *)(uintptr_t) connection->sm_handle); 3704 } 3705 static void sm_validate_er_ir(void){ 3706 // warn about default ER/IR 3707 bool warning = false; 3708 if (sm_ir_is_default()){ 3709 warning = true; 3710 log_error("Persistent IR not set with sm_set_ir. Use of private addresses will cause pairing issues"); 3711 } 3712 if (sm_er_is_default()){ 3713 warning = true; 3714 log_error("Persistent ER not set with sm_set_er. Legacy Pairing LTK is not secure"); 3715 } 3716 if (warning) { 3717 log_error("Please configure btstack_tlv to let BTstack setup ER and IR keys"); 3718 } 3719 } 3720 3721 static void sm_handle_random_result_ir(void *arg){ 3722 sm_persistent_keys_random_active = false; 3723 if (arg != NULL){ 3724 // key generated, store in tlv 3725 int status = sm_tlv_impl->store_tag(sm_tlv_context, BTSTACK_TAG32('S','M','I','R'), sm_persistent_ir, 16u); 3726 log_info("Generated IR key. Store in TLV status: %d", status); 3727 UNUSED(status); 3728 } 3729 log_info_key("IR", sm_persistent_ir); 3730 dkg_state = DKG_CALC_IRK; 3731 3732 if (test_use_fixed_local_irk){ 3733 log_info_key("IRK", sm_persistent_irk); 3734 dkg_state = DKG_CALC_DHK; 3735 } 3736 3737 sm_trigger_run(); 3738 } 3739 3740 static void sm_handle_random_result_er(void *arg){ 3741 sm_persistent_keys_random_active = false; 3742 if (arg != 0){ 3743 // key generated, store in tlv 3744 int status = sm_tlv_impl->store_tag(sm_tlv_context, BTSTACK_TAG32('S','M','E','R'), sm_persistent_er, 16u); 3745 log_info("Generated ER key. Store in TLV status: %d", status); 3746 UNUSED(status); 3747 } 3748 log_info_key("ER", sm_persistent_er); 3749 3750 // try load ir 3751 int key_size = sm_tlv_impl->get_tag(sm_tlv_context, BTSTACK_TAG32('S','M','I','R'), sm_persistent_ir, 16u); 3752 if (key_size == 16){ 3753 // ok, let's continue 3754 log_info("IR from TLV"); 3755 sm_handle_random_result_ir( NULL ); 3756 } else { 3757 // invalid, generate new random one 3758 sm_persistent_keys_random_active = true; 3759 btstack_crypto_random_generate(&sm_crypto_random_request, sm_persistent_ir, 16, &sm_handle_random_result_ir, &sm_persistent_ir); 3760 } 3761 } 3762 3763 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){ 3764 3765 // connection info 3766 sm_conn->sm_handle = con_handle; 3767 sm_conn->sm_role = role; 3768 sm_conn->sm_peer_addr_type = peer_addr_type; 3769 memcpy(sm_conn->sm_peer_address, peer_address, 6); 3770 3771 // security properties 3772 sm_conn->sm_connection_encrypted = 0; 3773 sm_conn->sm_connection_authenticated = 0; 3774 sm_conn->sm_connection_authorization_state = AUTHORIZATION_UNKNOWN; 3775 sm_conn->sm_le_db_index = -1; 3776 sm_conn->sm_reencryption_active = false; 3777 3778 // prepare CSRK lookup (does not involve setup) 3779 sm_conn->sm_irk_lookup_state = IRK_LOOKUP_W4_READY; 3780 3781 sm_conn->sm_engine_state = SM_GENERAL_IDLE; 3782 } 3783 3784 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 3785 static void sm_event_handle_classic_encryption_event(sm_connection_t * sm_conn, hci_con_handle_t con_handle){ 3786 // CTKD requires BR/EDR Secure Connection 3787 if (sm_conn->sm_connection_encrypted != 2) return; 3788 // prepare for pairing request 3789 if (IS_RESPONDER(sm_conn->sm_role)){ 3790 sm_conn->sm_engine_state = SM_BR_EDR_RESPONDER_W4_PAIRING_REQUEST; 3791 } else if (sm_conn->sm_pairing_requested){ 3792 // check if remote supports fixed channels 3793 bool defer = true; 3794 const hci_connection_t * hci_connection = hci_connection_for_handle(con_handle); 3795 if (hci_connection->l2cap_state.information_state == L2CAP_INFORMATION_STATE_DONE){ 3796 // check if remote supports SMP over BR/EDR 3797 if ((hci_connection->l2cap_state.fixed_channels_supported & (1 << L2CAP_CID_BR_EDR_SECURITY_MANAGER)) != 0){ 3798 log_info("CTKD: SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST"); 3799 sm_conn->sm_engine_state = SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST; 3800 } else { 3801 defer = false; 3802 } 3803 } else { 3804 // wait for fixed channel info 3805 log_info("CTKD: SM_BR_EDR_INITIATOR_W4_FIXED_CHANNEL_MASK"); 3806 sm_conn->sm_engine_state = SM_BR_EDR_INITIATOR_W4_FIXED_CHANNEL_MASK; 3807 } 3808 if (defer){ 3809 hci_dedicated_bonding_defer_disconnect(con_handle, true); 3810 } 3811 } 3812 } 3813 #endif 3814 3815 static void sm_event_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 3816 3817 UNUSED(channel); // ok: there is no channel 3818 UNUSED(size); // ok: fixed format HCI events 3819 3820 sm_connection_t * sm_conn; 3821 hci_con_handle_t con_handle; 3822 uint8_t status; 3823 bd_addr_t addr; 3824 bd_addr_type_t addr_type; 3825 3826 switch (packet_type) { 3827 3828 case HCI_EVENT_PACKET: 3829 switch (hci_event_packet_get_type(packet)) { 3830 3831 case BTSTACK_EVENT_STATE: 3832 switch (btstack_event_state_get_state(packet)){ 3833 case HCI_STATE_WORKING: 3834 log_info("HCI Working!"); 3835 // setup IR/ER with TLV 3836 btstack_tlv_get_instance(&sm_tlv_impl, &sm_tlv_context); 3837 if (sm_tlv_impl != NULL){ 3838 int key_size = sm_tlv_impl->get_tag(sm_tlv_context, BTSTACK_TAG32('S','M','E','R'), sm_persistent_er, 16u); 3839 if (key_size == 16){ 3840 // ok, let's continue 3841 log_info("ER from TLV"); 3842 sm_handle_random_result_er( NULL ); 3843 } else { 3844 // invalid, generate random one 3845 sm_persistent_keys_random_active = true; 3846 btstack_crypto_random_generate(&sm_crypto_random_request, sm_persistent_er, 16, &sm_handle_random_result_er, &sm_persistent_er); 3847 } 3848 } else { 3849 sm_validate_er_ir(); 3850 dkg_state = DKG_CALC_IRK; 3851 3852 if (test_use_fixed_local_irk){ 3853 log_info_key("IRK", sm_persistent_irk); 3854 dkg_state = DKG_CALC_DHK; 3855 } 3856 } 3857 3858 #ifdef ENABLE_LE_SECURE_CONNECTIONS 3859 // trigger ECC key generation 3860 if (ec_key_generation_state == EC_KEY_GENERATION_IDLE){ 3861 sm_ec_generate_new_key(); 3862 } 3863 #endif 3864 3865 // restart random address updates after power cycle 3866 if (gap_random_adress_type == GAP_RANDOM_ADDRESS_TYPE_STATIC){ 3867 gap_random_address_set(sm_random_address); 3868 } else { 3869 gap_random_address_set_mode(gap_random_adress_type); 3870 } 3871 break; 3872 3873 case HCI_STATE_OFF: 3874 case HCI_STATE_HALTING: 3875 log_info("SM: reset state"); 3876 // stop random address update 3877 gap_random_address_update_stop(); 3878 // reset state 3879 sm_state_reset(); 3880 break; 3881 3882 default: 3883 break; 3884 } 3885 break; 3886 3887 #ifdef ENABLE_CLASSIC 3888 case HCI_EVENT_CONNECTION_COMPLETE: 3889 // ignore if connection failed 3890 if (hci_event_connection_complete_get_status(packet)) return; 3891 3892 con_handle = hci_event_connection_complete_get_connection_handle(packet); 3893 sm_conn = sm_get_connection_for_handle(con_handle); 3894 if (!sm_conn) break; 3895 3896 hci_event_connection_complete_get_bd_addr(packet, addr); 3897 sm_connection_init(sm_conn, 3898 con_handle, 3899 (uint8_t) gap_get_role(con_handle), 3900 BD_ADDR_TYPE_LE_PUBLIC, 3901 addr); 3902 // classic connection corresponds to public le address 3903 sm_conn->sm_own_addr_type = BD_ADDR_TYPE_LE_PUBLIC; 3904 gap_local_bd_addr(sm_conn->sm_own_address); 3905 sm_conn->sm_cid = L2CAP_CID_BR_EDR_SECURITY_MANAGER; 3906 sm_conn->sm_engine_state = SM_BR_EDR_W4_ENCRYPTION_COMPLETE; 3907 break; 3908 #endif 3909 3910 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 3911 case HCI_EVENT_SIMPLE_PAIRING_COMPLETE: 3912 if (hci_event_simple_pairing_complete_get_status(packet) != ERROR_CODE_SUCCESS) break; 3913 hci_event_simple_pairing_complete_get_bd_addr(packet, addr); 3914 sm_conn = sm_get_connection_for_bd_addr_and_type(addr, BD_ADDR_TYPE_ACL); 3915 if (sm_conn == NULL) break; 3916 sm_conn->sm_pairing_requested = true; 3917 break; 3918 #endif 3919 3920 case HCI_EVENT_META_GAP: 3921 switch (hci_event_gap_meta_get_subevent_code(packet)) { 3922 case GAP_SUBEVENT_LE_CONNECTION_COMPLETE: 3923 // ignore if connection failed 3924 if (gap_subevent_le_connection_complete_get_status(packet) != ERROR_CODE_SUCCESS) break; 3925 3926 con_handle = gap_subevent_le_connection_complete_get_connection_handle(packet); 3927 sm_conn = sm_get_connection_for_handle(con_handle); 3928 if (!sm_conn) break; 3929 3930 // Get current peer address 3931 addr_type = gap_subevent_le_connection_complete_get_peer_address_type(packet); 3932 if (hci_is_le_identity_address_type(addr_type)){ 3933 addr_type = BD_ADDR_TYPE_LE_RANDOM; 3934 gap_subevent_le_connection_complete_get_peer_resolvable_private_address(packet, addr); 3935 } else { 3936 gap_subevent_le_connection_complete_get_peer_address(packet, addr); 3937 } 3938 sm_connection_init(sm_conn, 3939 con_handle, 3940 gap_subevent_le_connection_complete_get_role(packet), 3941 addr_type, 3942 addr); 3943 sm_conn->sm_cid = L2CAP_CID_SECURITY_MANAGER_PROTOCOL; 3944 3945 // track our addr used for this connection and set state 3946 #ifdef ENABLE_LE_PERIPHERAL 3947 if (gap_subevent_le_connection_complete_get_role(packet) != 0){ 3948 // responder - use own address from advertisements 3949 #ifdef ENABLE_LE_EXTENDED_ADVERTISING 3950 if (hci_le_extended_advertising_supported()){ 3951 // cache local resolvable address 3952 // note: will be overwritten if random or private address was used in adv set by HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED 3953 sm_conn->sm_own_addr_type = BD_ADDR_TYPE_LE_RANDOM; 3954 gap_subevent_le_connection_complete_get_local_resolvable_private_address(packet,sm_conn->sm_own_address); 3955 } else 3956 #endif 3957 { 3958 gap_le_get_own_advertisements_address(&sm_conn->sm_own_addr_type, sm_conn->sm_own_address); 3959 } 3960 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 3961 } 3962 #endif 3963 #ifdef ENABLE_LE_CENTRAL 3964 if (gap_subevent_le_connection_complete_get_role(packet) == 0){ 3965 // initiator - use own address from create connection 3966 gap_le_get_own_connection_address(&sm_conn->sm_own_addr_type, sm_conn->sm_own_address); 3967 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 3968 } 3969 #endif 3970 break; 3971 default: 3972 break; 3973 } 3974 break; 3975 case HCI_EVENT_LE_META: 3976 switch (hci_event_le_meta_get_subevent_code(packet)) { 3977 #ifdef ENABLE_LE_PERIPHERAL 3978 #ifdef ENABLE_LE_EXTENDED_ADVERTISING 3979 case HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED: 3980 if (hci_subevent_le_advertising_set_terminated_get_status(packet) == ERROR_CODE_SUCCESS){ 3981 uint8_t advertising_handle = hci_subevent_le_advertising_set_terminated_get_advertising_handle(packet); 3982 con_handle = hci_subevent_le_advertising_set_terminated_get_connection_handle(packet); 3983 sm_conn = sm_get_connection_for_handle(con_handle); 3984 gap_le_get_own_advertising_set_address(&sm_conn->sm_own_addr_type, sm_conn->sm_own_address, advertising_handle); 3985 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, 3986 bd_addr_to_str(sm_conn->sm_own_address), con_handle); 3987 } 3988 break; 3989 #endif 3990 #endif 3991 case HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST: 3992 con_handle = hci_subevent_le_long_term_key_request_get_connection_handle(packet); 3993 sm_conn = sm_get_connection_for_handle(con_handle); 3994 if (!sm_conn) break; 3995 3996 log_info("LTK Request: state %u", sm_conn->sm_engine_state); 3997 if (sm_conn->sm_engine_state == SM_RESPONDER_PH2_W4_LTK_REQUEST){ 3998 sm_conn->sm_engine_state = SM_PH2_CALC_STK; 3999 break; 4000 } 4001 if (sm_conn->sm_engine_state == SM_SC_W4_LTK_REQUEST_SC){ 4002 // PH2 SEND LTK as we need to exchange keys in PH3 4003 sm_conn->sm_engine_state = SM_RESPONDER_PH2_SEND_LTK_REPLY; 4004 break; 4005 } 4006 4007 // store rand and ediv 4008 reverse_64(&packet[5], sm_conn->sm_local_rand); 4009 sm_conn->sm_local_ediv = hci_subevent_le_long_term_key_request_get_encryption_diversifier(packet); 4010 4011 // For Legacy Pairing (<=> EDIV != 0 || RAND != NULL), we need to recalculated our LTK as a 4012 // potentially stored LTK is from the master 4013 if ((sm_conn->sm_local_ediv != 0u) || !sm_is_null_random(sm_conn->sm_local_rand)){ 4014 if (sm_reconstruct_ltk_without_le_device_db_entry){ 4015 sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST; 4016 break; 4017 } 4018 // additionally check if remote is in LE Device DB if requested 4019 switch(sm_conn->sm_irk_lookup_state){ 4020 case IRK_LOOKUP_FAILED: 4021 log_info("LTK Request: device not in device db"); 4022 sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY; 4023 break; 4024 case IRK_LOOKUP_SUCCEEDED: 4025 sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST; 4026 break; 4027 default: 4028 // wait for irk look doen 4029 sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK; 4030 break; 4031 } 4032 break; 4033 } 4034 4035 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4036 sm_conn->sm_engine_state = SM_SC_RECEIVED_LTK_REQUEST; 4037 #else 4038 log_info("LTK Request: ediv & random are empty, but LE Secure Connections not supported"); 4039 sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY; 4040 #endif 4041 break; 4042 4043 default: 4044 break; 4045 } 4046 break; 4047 4048 case HCI_EVENT_ENCRYPTION_CHANGE: 4049 case HCI_EVENT_ENCRYPTION_CHANGE_V2: 4050 con_handle = hci_event_encryption_change_get_connection_handle(packet); 4051 sm_conn = sm_get_connection_for_handle(con_handle); 4052 if (!sm_conn) break; 4053 4054 sm_conn->sm_connection_encrypted = hci_event_encryption_change_get_encryption_enabled(packet); 4055 log_info("Encryption state change: %u, key size %u", sm_conn->sm_connection_encrypted, 4056 sm_conn->sm_actual_encryption_key_size); 4057 log_info("event handler, state %u", sm_conn->sm_engine_state); 4058 4059 switch (sm_conn->sm_engine_state){ 4060 4061 case SM_PH4_W4_CONNECTION_ENCRYPTED: 4062 // encryption change event concludes re-encryption for bonded devices (even if it fails) 4063 if (sm_conn->sm_connection_encrypted != 0u) { 4064 status = ERROR_CODE_SUCCESS; 4065 if (IS_RESPONDER(sm_conn->sm_role)){ 4066 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 4067 } else { 4068 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 4069 } 4070 } else { 4071 status = hci_event_encryption_change_get_status(packet); 4072 // set state to 'RE-ENCRYPTION FAILED' to allow pairing but prevent other interactions 4073 // also, gap_reconnect_security_setup_active will return true 4074 sm_conn->sm_engine_state = SM_GENERAL_REENCRYPTION_FAILED; 4075 } 4076 4077 // emit re-encryption complete 4078 sm_reencryption_complete(sm_conn, status); 4079 4080 // notify client, if pairing was requested before 4081 if (sm_conn->sm_pairing_requested){ 4082 sm_conn->sm_pairing_requested = false; 4083 sm_pairing_complete(sm_conn, status, 0); 4084 } 4085 4086 sm_done_for_handle(sm_conn->sm_handle); 4087 break; 4088 4089 case SM_PH2_W4_CONNECTION_ENCRYPTED: 4090 if (!sm_conn->sm_connection_encrypted) break; 4091 // handler for HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE 4092 // contains the same code for this state 4093 sm_conn->sm_connection_sc = setup->sm_use_secure_connections; 4094 if (IS_RESPONDER(sm_conn->sm_role)){ 4095 // slave 4096 if (sm_conn->sm_connection_sc){ 4097 sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 4098 } else { 4099 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); 4100 } 4101 } else { 4102 // master 4103 if (sm_key_distribution_all_received()){ 4104 // skip receiving keys as there are none 4105 sm_key_distribution_handle_all_received(sm_conn); 4106 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); 4107 } else { 4108 sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS; 4109 } 4110 } 4111 break; 4112 4113 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4114 case SM_BR_EDR_W4_ENCRYPTION_COMPLETE: 4115 sm_event_handle_classic_encryption_event(sm_conn, con_handle); 4116 break; 4117 #endif 4118 default: 4119 break; 4120 } 4121 break; 4122 4123 case HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE: 4124 con_handle = little_endian_read_16(packet, 3); 4125 sm_conn = sm_get_connection_for_handle(con_handle); 4126 if (!sm_conn) break; 4127 4128 log_info("Encryption key refresh complete, key size %u", sm_conn->sm_actual_encryption_key_size); 4129 log_info("event handler, state %u", sm_conn->sm_engine_state); 4130 // continue if part of initial pairing 4131 switch (sm_conn->sm_engine_state){ 4132 case SM_PH4_W4_CONNECTION_ENCRYPTED: 4133 if (IS_RESPONDER(sm_conn->sm_role)){ 4134 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 4135 } else { 4136 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 4137 } 4138 sm_done_for_handle(sm_conn->sm_handle); 4139 break; 4140 case SM_PH2_W4_CONNECTION_ENCRYPTED: 4141 // handler for HCI_EVENT_ENCRYPTION_CHANGE 4142 // contains the same code for this state 4143 sm_conn->sm_connection_sc = setup->sm_use_secure_connections; 4144 if (IS_RESPONDER(sm_conn->sm_role)){ 4145 // slave 4146 if (sm_conn->sm_connection_sc){ 4147 sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 4148 } else { 4149 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); 4150 } 4151 } else { 4152 // master 4153 if (sm_key_distribution_all_received()){ 4154 // skip receiving keys as there are none 4155 sm_key_distribution_handle_all_received(sm_conn); 4156 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); 4157 } else { 4158 sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS; 4159 } 4160 } 4161 break; 4162 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4163 case SM_BR_EDR_W4_ENCRYPTION_COMPLETE: 4164 sm_event_handle_classic_encryption_event(sm_conn, con_handle); 4165 break; 4166 #endif 4167 default: 4168 break; 4169 } 4170 break; 4171 4172 4173 case HCI_EVENT_DISCONNECTION_COMPLETE: 4174 con_handle = little_endian_read_16(packet, 3); 4175 sm_done_for_handle(con_handle); 4176 sm_conn = sm_get_connection_for_handle(con_handle); 4177 if (!sm_conn) break; 4178 4179 // pairing failed, if it was ongoing 4180 switch (sm_conn->sm_engine_state){ 4181 case SM_GENERAL_IDLE: 4182 case SM_INITIATOR_CONNECTED: 4183 case SM_RESPONDER_IDLE: 4184 break; 4185 default: 4186 sm_reencryption_complete(sm_conn, ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION); 4187 sm_pairing_complete(sm_conn, ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION, 0); 4188 break; 4189 } 4190 4191 sm_conn->sm_engine_state = SM_GENERAL_IDLE; 4192 sm_conn->sm_handle = 0; 4193 break; 4194 4195 case HCI_EVENT_COMMAND_COMPLETE: 4196 if (hci_event_command_complete_get_command_opcode(packet) == HCI_OPCODE_HCI_READ_BD_ADDR) { 4197 // set local addr for le device db 4198 reverse_bd_addr(&packet[OFFSET_OF_DATA_IN_COMMAND_COMPLETE + 1], addr); 4199 le_device_db_set_local_bd_addr(addr); 4200 } 4201 break; 4202 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4203 case L2CAP_EVENT_INFORMATION_RESPONSE: 4204 con_handle = l2cap_event_information_response_get_con_handle(packet); 4205 sm_conn = sm_get_connection_for_handle(con_handle); 4206 if (!sm_conn) break; 4207 if (sm_conn->sm_engine_state == SM_BR_EDR_INITIATOR_W4_FIXED_CHANNEL_MASK){ 4208 // check if remote supports SMP over BR/EDR 4209 const hci_connection_t * hci_connection = hci_connection_for_handle(con_handle); 4210 if ((hci_connection->l2cap_state.fixed_channels_supported & (1 << L2CAP_CID_BR_EDR_SECURITY_MANAGER)) != 0){ 4211 sm_conn->sm_engine_state = SM_BR_EDR_INITIATOR_SEND_PAIRING_REQUEST; 4212 } else { 4213 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED; 4214 hci_dedicated_bonding_defer_disconnect(con_handle, false); 4215 } 4216 } 4217 break; 4218 #endif 4219 default: 4220 break; 4221 } 4222 break; 4223 default: 4224 break; 4225 } 4226 4227 sm_run(); 4228 } 4229 4230 static inline int sm_calc_actual_encryption_key_size(int other){ 4231 if (other < sm_min_encryption_key_size) return 0; 4232 if (other < sm_max_encryption_key_size) return other; 4233 return sm_max_encryption_key_size; 4234 } 4235 4236 4237 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4238 static bool sm_just_works_or_numeric_comparison(stk_generation_method_t method){ 4239 switch (method){ 4240 case JUST_WORKS: 4241 case NUMERIC_COMPARISON: 4242 return true; 4243 default: 4244 return false; 4245 } 4246 } 4247 // responder 4248 4249 static bool sm_passkey_used(stk_generation_method_t method){ 4250 switch (method){ 4251 case PK_RESP_INPUT: 4252 return true; 4253 default: 4254 return 0; 4255 } 4256 } 4257 4258 static bool sm_passkey_entry(stk_generation_method_t method){ 4259 switch (method){ 4260 case PK_RESP_INPUT: 4261 case PK_INIT_INPUT: 4262 case PK_BOTH_INPUT: 4263 return true; 4264 default: 4265 return false; 4266 } 4267 } 4268 4269 #endif 4270 4271 /** 4272 * @return ok 4273 */ 4274 static int sm_validate_stk_generation_method(void){ 4275 // check if STK generation method is acceptable by client 4276 switch (setup->sm_stk_generation_method){ 4277 case JUST_WORKS: 4278 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_JUST_WORKS) != 0u; 4279 case PK_RESP_INPUT: 4280 case PK_INIT_INPUT: 4281 case PK_BOTH_INPUT: 4282 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_PASSKEY) != 0u; 4283 case OOB: 4284 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_OOB) != 0u; 4285 case NUMERIC_COMPARISON: 4286 return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_NUMERIC_COMPARISON) != 0u; 4287 default: 4288 return 0; 4289 } 4290 } 4291 4292 #ifdef ENABLE_LE_CENTRAL 4293 static void sm_initiator_connected_handle_security_request(sm_connection_t * sm_conn, const uint8_t *packet){ 4294 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4295 if (sm_sc_only_mode){ 4296 uint8_t auth_req = packet[1]; 4297 if ((auth_req & SM_AUTHREQ_SECURE_CONNECTION) == 0){ 4298 sm_pairing_error(sm_conn, SM_REASON_AUTHENTHICATION_REQUIREMENTS); 4299 return; 4300 } 4301 } 4302 #else 4303 UNUSED(packet); 4304 #endif 4305 4306 int have_ltk; 4307 uint8_t ltk[16]; 4308 4309 // IRK complete? 4310 switch (sm_conn->sm_irk_lookup_state){ 4311 case IRK_LOOKUP_FAILED: 4312 // start pairing 4313 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 4314 break; 4315 case IRK_LOOKUP_SUCCEEDED: 4316 le_device_db_encryption_get(sm_conn->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL, NULL); 4317 have_ltk = !sm_is_null_key(ltk); 4318 log_info("central: security request - have_ltk %u, encryption %u", have_ltk, sm_conn->sm_connection_encrypted); 4319 if (have_ltk && (sm_conn->sm_connection_encrypted == 0)){ 4320 // start re-encrypt if we have LTK and the connection is not already encrypted 4321 sm_conn->sm_engine_state = SM_INITIATOR_PH4_HAS_LTK; 4322 } else { 4323 // start pairing 4324 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 4325 } 4326 break; 4327 default: 4328 // otherwise, store security request 4329 sm_conn->sm_security_request_received = true; 4330 break; 4331 } 4332 } 4333 #endif 4334 4335 static uint8_t sm_pdu_validate_and_get_opcode(uint8_t packet_type, const uint8_t *packet, uint16_t size){ 4336 4337 // size of complete sm_pdu used to validate input 4338 static const uint8_t sm_pdu_size[] = { 4339 0, // 0x00 invalid opcode 4340 7, // 0x01 pairing request 4341 7, // 0x02 pairing response 4342 17, // 0x03 pairing confirm 4343 17, // 0x04 pairing random 4344 2, // 0x05 pairing failed 4345 17, // 0x06 encryption information 4346 11, // 0x07 master identification 4347 17, // 0x08 identification information 4348 8, // 0x09 identify address information 4349 17, // 0x0a signing information 4350 2, // 0x0b security request 4351 65, // 0x0c pairing public key 4352 17, // 0x0d pairing dhk check 4353 2, // 0x0e keypress notification 4354 }; 4355 4356 if (packet_type != SM_DATA_PACKET) return 0; 4357 if (size == 0u) return 0; 4358 4359 uint8_t sm_pdu_code = packet[0]; 4360 4361 // validate pdu size 4362 if (sm_pdu_code >= sizeof(sm_pdu_size)) return 0; 4363 if (sm_pdu_size[sm_pdu_code] != size) return 0; 4364 4365 return sm_pdu_code; 4366 } 4367 4368 static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uint8_t *packet, uint16_t size){ 4369 4370 if ((packet_type == HCI_EVENT_PACKET) && (packet[0] == L2CAP_EVENT_CAN_SEND_NOW)){ 4371 sm_run(); 4372 } 4373 4374 uint8_t sm_pdu_code = sm_pdu_validate_and_get_opcode(packet_type, packet, size); 4375 if (sm_pdu_code == 0) return; 4376 4377 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 4378 if (!sm_conn) return; 4379 4380 if (sm_pdu_code == SM_CODE_PAIRING_FAILED){ 4381 sm_reencryption_complete(sm_conn, ERROR_CODE_AUTHENTICATION_FAILURE); 4382 sm_pairing_complete(sm_conn, ERROR_CODE_AUTHENTICATION_FAILURE, packet[1]); 4383 sm_done_for_handle(con_handle); 4384 sm_conn->sm_engine_state = sm_conn->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED; 4385 return; 4386 } 4387 4388 log_debug("sm_pdu_handler: state %u, pdu 0x%02x", sm_conn->sm_engine_state, sm_pdu_code); 4389 4390 int err; 4391 uint8_t max_encryption_key_size; 4392 UNUSED(err); 4393 4394 if (sm_pdu_code == SM_CODE_KEYPRESS_NOTIFICATION){ 4395 uint8_t buffer[5]; 4396 buffer[0] = SM_EVENT_KEYPRESS_NOTIFICATION; 4397 buffer[1] = 3; 4398 little_endian_store_16(buffer, 2, con_handle); 4399 buffer[4] = packet[1]; 4400 sm_dispatch_event(HCI_EVENT_PACKET, 0, buffer, sizeof(buffer)); 4401 return; 4402 } 4403 4404 switch (sm_conn->sm_engine_state){ 4405 4406 // a sm timeout requires a new physical connection 4407 case SM_GENERAL_TIMEOUT: 4408 return; 4409 4410 #ifdef ENABLE_LE_CENTRAL 4411 4412 // Initiator 4413 case SM_INITIATOR_CONNECTED: 4414 if ((sm_pdu_code != SM_CODE_SECURITY_REQUEST) || (sm_conn->sm_role)){ 4415 sm_pdu_received_in_wrong_state(sm_conn); 4416 break; 4417 } 4418 sm_initiator_connected_handle_security_request(sm_conn, packet); 4419 break; 4420 4421 case SM_INITIATOR_PH1_W4_PAIRING_RESPONSE: 4422 // Core 5, Vol 3, Part H, 2.4.6: 4423 // "The master shall ignore the slave’s Security Request if the master has sent a Pairing Request 4424 // without receiving a Pairing Response from the slave or if the master has initiated encryption mode setup." 4425 if (sm_pdu_code == SM_CODE_SECURITY_REQUEST){ 4426 log_info("Ignoring Security Request"); 4427 break; 4428 } 4429 4430 // all other pdus are incorrect 4431 if (sm_pdu_code != SM_CODE_PAIRING_RESPONSE){ 4432 sm_pdu_received_in_wrong_state(sm_conn); 4433 break; 4434 } 4435 4436 // store pairing request 4437 (void)memcpy(&setup->sm_s_pres, packet, 4438 sizeof(sm_pairing_packet_t)); 4439 4440 // validate encryption key size 4441 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(setup->sm_s_pres); 4442 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4443 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4444 break; 4445 } 4446 4447 err = sm_stk_generation_init(sm_conn); 4448 4449 #ifdef ENABLE_TESTING_SUPPORT 4450 if (0 < test_pairing_failure && test_pairing_failure < SM_REASON_DHKEY_CHECK_FAILED){ 4451 log_info("testing_support: abort with pairing failure %u", test_pairing_failure); 4452 err = test_pairing_failure; 4453 } 4454 #endif 4455 4456 if (err != 0){ 4457 sm_pairing_error(sm_conn, err); 4458 break; 4459 } 4460 4461 // generate random number first, if we need to show passkey 4462 if (setup->sm_stk_generation_method == PK_RESP_INPUT){ 4463 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); 4464 break; 4465 } 4466 4467 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4468 if (setup->sm_use_secure_connections){ 4469 // SC Numeric Comparison will trigger user response after public keys & nonces have been exchanged 4470 if (setup->sm_stk_generation_method == JUST_WORKS){ 4471 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 4472 sm_trigger_user_response(sm_conn); 4473 if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){ 4474 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 4475 } 4476 } else { 4477 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 4478 } 4479 break; 4480 } 4481 #endif 4482 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 4483 sm_trigger_user_response(sm_conn); 4484 // response_idle == nothing <--> sm_trigger_user_response() did not require response 4485 if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){ 4486 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); 4487 } 4488 break; 4489 4490 case SM_INITIATOR_PH2_W4_PAIRING_CONFIRM: 4491 if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){ 4492 sm_pdu_received_in_wrong_state(sm_conn); 4493 break; 4494 } 4495 4496 // store s_confirm 4497 reverse_128(&packet[1], setup->sm_peer_confirm); 4498 4499 // abort if s_confirm matches m_confirm 4500 if (memcmp(setup->sm_local_confirm, setup->sm_peer_confirm, 16) == 0){ 4501 sm_pdu_received_in_wrong_state(sm_conn); 4502 break; 4503 } 4504 4505 #ifdef ENABLE_TESTING_SUPPORT 4506 if (test_pairing_failure == SM_REASON_CONFIRM_VALUE_FAILED){ 4507 log_info("testing_support: reset confirm value"); 4508 memset(setup->sm_peer_confirm, 0, 16); 4509 } 4510 #endif 4511 sm_conn->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM; 4512 break; 4513 4514 case SM_INITIATOR_PH2_W4_PAIRING_RANDOM: 4515 if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){ 4516 sm_pdu_received_in_wrong_state(sm_conn); 4517 break;; 4518 } 4519 4520 // received random value 4521 reverse_128(&packet[1], setup->sm_peer_random); 4522 sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C; 4523 break; 4524 4525 case SM_INITIATOR_PH4_HAS_LTK: 4526 case SM_PH4_W4_CONNECTION_ENCRYPTED: 4527 // ignore Security Request, see SM_INITIATOR_PH1_W4_PAIRING_RESPONSE above 4528 if (sm_pdu_code != SM_CODE_SECURITY_REQUEST){ 4529 sm_pdu_received_in_wrong_state(sm_conn); 4530 } 4531 break; 4532 #endif 4533 4534 #ifdef ENABLE_LE_PERIPHERAL 4535 // Responder 4536 case SM_RESPONDER_IDLE: 4537 case SM_RESPONDER_SEND_SECURITY_REQUEST: 4538 case SM_RESPONDER_PH1_W4_PAIRING_REQUEST: 4539 if (sm_pdu_code != SM_CODE_PAIRING_REQUEST){ 4540 sm_pdu_received_in_wrong_state(sm_conn); 4541 break;; 4542 } 4543 4544 // store pairing request 4545 (void)memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t)); 4546 4547 // validation encryption key size 4548 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(sm_conn->sm_m_preq); 4549 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4550 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4551 break; 4552 } 4553 4554 // check if IRK completed 4555 switch (sm_conn->sm_irk_lookup_state){ 4556 case IRK_LOOKUP_SUCCEEDED: 4557 case IRK_LOOKUP_FAILED: 4558 sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED; 4559 break; 4560 default: 4561 sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK; 4562 break; 4563 } 4564 break; 4565 #endif 4566 4567 #ifdef ENABLE_LE_SECURE_CONNECTIONS 4568 case SM_SC_W4_PUBLIC_KEY_COMMAND: 4569 if (sm_pdu_code != SM_CODE_PAIRING_PUBLIC_KEY){ 4570 sm_pdu_received_in_wrong_state(sm_conn); 4571 break; 4572 } 4573 4574 // store public key for DH Key calculation 4575 reverse_256(&packet[01], &setup->sm_peer_q[0]); 4576 reverse_256(&packet[33], &setup->sm_peer_q[32]); 4577 4578 // CVE-2020-26558: abort pairing if remote uses the same public key 4579 if (memcmp(&setup->sm_peer_q, ec_q, 64) == 0){ 4580 log_info("Remote PK matches ours"); 4581 sm_pairing_error(sm_conn, SM_REASON_DHKEY_CHECK_FAILED); 4582 break; 4583 } 4584 4585 // validate public key 4586 err = btstack_crypto_ecc_p256_validate_public_key(setup->sm_peer_q); 4587 if (err != 0){ 4588 log_info("sm: peer public key invalid %x", err); 4589 sm_pairing_error(sm_conn, SM_REASON_DHKEY_CHECK_FAILED); 4590 break; 4591 } 4592 4593 // start calculating dhkey 4594 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); 4595 4596 4597 log_info("public key received, generation method %u", setup->sm_stk_generation_method); 4598 if (IS_RESPONDER(sm_conn->sm_role)){ 4599 // responder 4600 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 4601 } else { 4602 // initiator 4603 // stk generation method 4604 // passkey entry: notify app to show passkey or to request passkey 4605 switch (setup->sm_stk_generation_method){ 4606 case JUST_WORKS: 4607 case NUMERIC_COMPARISON: 4608 sm_conn->sm_engine_state = SM_SC_W4_CONFIRMATION; 4609 break; 4610 case PK_RESP_INPUT: 4611 sm_sc_start_calculating_local_confirm(sm_conn); 4612 break; 4613 case PK_INIT_INPUT: 4614 case PK_BOTH_INPUT: 4615 if (setup->sm_user_response != SM_USER_RESPONSE_PASSKEY){ 4616 sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE; 4617 break; 4618 } 4619 sm_sc_start_calculating_local_confirm(sm_conn); 4620 break; 4621 case OOB: 4622 // generate Nx 4623 log_info("Generate Na"); 4624 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); 4625 break; 4626 default: 4627 btstack_assert(false); 4628 break; 4629 } 4630 } 4631 break; 4632 4633 case SM_SC_W4_CONFIRMATION: 4634 if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){ 4635 sm_pdu_received_in_wrong_state(sm_conn); 4636 break; 4637 } 4638 // received confirm value 4639 reverse_128(&packet[1], setup->sm_peer_confirm); 4640 4641 #ifdef ENABLE_TESTING_SUPPORT 4642 if (test_pairing_failure == SM_REASON_CONFIRM_VALUE_FAILED){ 4643 log_info("testing_support: reset confirm value"); 4644 memset(setup->sm_peer_confirm, 0, 16); 4645 } 4646 #endif 4647 if (IS_RESPONDER(sm_conn->sm_role)){ 4648 // responder 4649 if (sm_passkey_used(setup->sm_stk_generation_method)){ 4650 if (setup->sm_user_response != SM_USER_RESPONSE_PASSKEY){ 4651 // still waiting for passkey 4652 sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE; 4653 break; 4654 } 4655 } 4656 sm_sc_start_calculating_local_confirm(sm_conn); 4657 } else { 4658 // initiator 4659 if (sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method)){ 4660 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); 4661 } else { 4662 sm_conn->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM; 4663 } 4664 } 4665 break; 4666 4667 case SM_SC_W4_PAIRING_RANDOM: 4668 if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){ 4669 sm_pdu_received_in_wrong_state(sm_conn); 4670 break; 4671 } 4672 4673 // received random value 4674 reverse_128(&packet[1], setup->sm_peer_nonce); 4675 4676 // validate confirm value if Cb = f4(Pkb, Pka, Nb, z) 4677 // only check for JUST WORK/NC in initiator role OR passkey entry 4678 log_info("SM_SC_W4_PAIRING_RANDOM, responder: %u, just works: %u, passkey used %u, passkey entry %u", 4679 IS_RESPONDER(sm_conn->sm_role), sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method), 4680 sm_passkey_used(setup->sm_stk_generation_method), sm_passkey_entry(setup->sm_stk_generation_method)); 4681 if ( (!IS_RESPONDER(sm_conn->sm_role) && sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method)) 4682 || (sm_passkey_entry(setup->sm_stk_generation_method)) ) { 4683 sm_conn->sm_engine_state = SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION; 4684 break; 4685 } 4686 4687 // OOB 4688 if (setup->sm_stk_generation_method == OOB){ 4689 4690 // setup local random, set to zero if remote did not receive our data 4691 log_info("Received nonce, setup local random ra/rb for dhkey check"); 4692 if (IS_RESPONDER(sm_conn->sm_role)){ 4693 if (sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq) == 0u){ 4694 log_info("Reset rb as A does not have OOB data"); 4695 memset(setup->sm_rb, 0, 16); 4696 } else { 4697 (void)memcpy(setup->sm_rb, sm_sc_oob_random, 16); 4698 log_info("Use stored rb"); 4699 log_info_hexdump(setup->sm_rb, 16); 4700 } 4701 } else { 4702 if (sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres) == 0u){ 4703 log_info("Reset ra as B does not have OOB data"); 4704 memset(setup->sm_ra, 0, 16); 4705 } else { 4706 (void)memcpy(setup->sm_ra, sm_sc_oob_random, 16); 4707 log_info("Use stored ra"); 4708 log_info_hexdump(setup->sm_ra, 16); 4709 } 4710 } 4711 4712 // validate confirm value if Cb = f4(PKb, Pkb, rb, 0) for OOB if data received 4713 if (setup->sm_have_oob_data){ 4714 sm_conn->sm_engine_state = SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION; 4715 break; 4716 } 4717 } 4718 4719 // TODO: we only get here for Responder role with JW/NC 4720 sm_sc_state_after_receiving_random(sm_conn); 4721 break; 4722 4723 case SM_SC_W2_CALCULATE_G2: 4724 case SM_SC_W4_CALCULATE_G2: 4725 case SM_SC_W4_CALCULATE_DHKEY: 4726 case SM_SC_W2_CALCULATE_F5_SALT: 4727 case SM_SC_W4_CALCULATE_F5_SALT: 4728 case SM_SC_W2_CALCULATE_F5_MACKEY: 4729 case SM_SC_W4_CALCULATE_F5_MACKEY: 4730 case SM_SC_W2_CALCULATE_F5_LTK: 4731 case SM_SC_W4_CALCULATE_F5_LTK: 4732 case SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK: 4733 case SM_SC_W4_DHKEY_CHECK_COMMAND: 4734 case SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK: 4735 case SM_SC_W4_USER_RESPONSE: 4736 if (sm_pdu_code != SM_CODE_PAIRING_DHKEY_CHECK){ 4737 sm_pdu_received_in_wrong_state(sm_conn); 4738 break; 4739 } 4740 // store DHKey Check 4741 setup->sm_state_vars |= SM_STATE_VAR_DHKEY_COMMAND_RECEIVED; 4742 reverse_128(&packet[01], setup->sm_peer_dhkey_check); 4743 4744 // have we been only waiting for dhkey check command? 4745 if (sm_conn->sm_engine_state == SM_SC_W4_DHKEY_CHECK_COMMAND){ 4746 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK; 4747 } 4748 break; 4749 #endif 4750 4751 #ifdef ENABLE_LE_PERIPHERAL 4752 case SM_RESPONDER_PH1_W4_PAIRING_CONFIRM: 4753 if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){ 4754 sm_pdu_received_in_wrong_state(sm_conn); 4755 break; 4756 } 4757 4758 // received confirm value 4759 reverse_128(&packet[1], setup->sm_peer_confirm); 4760 4761 #ifdef ENABLE_TESTING_SUPPORT 4762 if (test_pairing_failure == SM_REASON_CONFIRM_VALUE_FAILED){ 4763 log_info("testing_support: reset confirm value"); 4764 memset(setup->sm_peer_confirm, 0, 16); 4765 } 4766 #endif 4767 // notify client to hide shown passkey 4768 if (setup->sm_stk_generation_method == PK_INIT_INPUT){ 4769 sm_notify_client_base(SM_EVENT_PASSKEY_DISPLAY_CANCEL, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address); 4770 } 4771 4772 // handle user cancel pairing? 4773 if (setup->sm_user_response == SM_USER_RESPONSE_DECLINE){ 4774 sm_pairing_error(sm_conn, SM_REASON_PASSKEY_ENTRY_FAILED); 4775 break; 4776 } 4777 4778 // wait for user action? 4779 if (setup->sm_user_response == SM_USER_RESPONSE_PENDING){ 4780 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE; 4781 break; 4782 } 4783 4784 // calculate and send local_confirm 4785 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); 4786 break; 4787 4788 case SM_RESPONDER_PH2_W4_PAIRING_RANDOM: 4789 if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){ 4790 sm_pdu_received_in_wrong_state(sm_conn); 4791 break;; 4792 } 4793 4794 // received random value 4795 reverse_128(&packet[1], setup->sm_peer_random); 4796 sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C; 4797 break; 4798 #endif 4799 4800 case SM_PH2_W4_CONNECTION_ENCRYPTED: 4801 case SM_PH3_RECEIVE_KEYS: 4802 switch(sm_pdu_code){ 4803 case SM_CODE_ENCRYPTION_INFORMATION: 4804 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION; 4805 reverse_128(&packet[1], setup->sm_peer_ltk); 4806 break; 4807 4808 case SM_CODE_MASTER_IDENTIFICATION: 4809 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION; 4810 setup->sm_peer_ediv = little_endian_read_16(packet, 1); 4811 reverse_64(&packet[3], setup->sm_peer_rand); 4812 break; 4813 4814 case SM_CODE_IDENTITY_INFORMATION: 4815 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION; 4816 reverse_128(&packet[1], setup->sm_peer_irk); 4817 break; 4818 4819 case SM_CODE_IDENTITY_ADDRESS_INFORMATION: 4820 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION; 4821 setup->sm_peer_addr_type = packet[1]; 4822 reverse_bd_addr(&packet[2], setup->sm_peer_address); 4823 break; 4824 4825 case SM_CODE_SIGNING_INFORMATION: 4826 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION; 4827 reverse_128(&packet[1], setup->sm_peer_csrk); 4828 break; 4829 default: 4830 // Unexpected PDU 4831 log_info("Unexpected PDU %u in SM_PH3_RECEIVE_KEYS", packet[0]); 4832 break; 4833 } 4834 // done with key distribution? 4835 if (sm_key_distribution_all_received()){ 4836 4837 sm_key_distribution_handle_all_received(sm_conn); 4838 4839 if (IS_RESPONDER(sm_conn->sm_role)){ 4840 sm_key_distribution_complete_responder(sm_conn); 4841 } else { 4842 if (setup->sm_use_secure_connections){ 4843 sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 4844 } else { 4845 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); 4846 } 4847 } 4848 } 4849 break; 4850 4851 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 4852 4853 case SM_BR_EDR_W4_ENCRYPTION_COMPLETE: 4854 // GAP/DM/LEP/BI-02-C - reject CTKD if P-192 encryption is used 4855 if (sm_pdu_code == SM_CODE_PAIRING_REQUEST){ 4856 sm_pairing_error(sm_conn, SM_REASON_CROSS_TRANSPORT_KEY_DERIVATION_NOT_ALLOWED); 4857 } 4858 break; 4859 4860 case SM_BR_EDR_INITIATOR_W4_PAIRING_RESPONSE: 4861 4862 // dedicated bonding complete 4863 hci_dedicated_bonding_defer_disconnect(sm_conn->sm_handle, false); 4864 4865 if (sm_pdu_code != SM_CODE_PAIRING_RESPONSE){ 4866 sm_pdu_received_in_wrong_state(sm_conn); 4867 break; 4868 } 4869 // store pairing response 4870 (void)memcpy(&setup->sm_s_pres, packet, sizeof(sm_pairing_packet_t)); 4871 4872 // validate encryption key size 4873 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(setup->sm_s_pres); 4874 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4875 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4876 break; 4877 } 4878 sm_conn->sm_actual_encryption_key_size = sm_calc_actual_encryption_key_size(max_encryption_key_size); 4879 // SC Only mandates 128 bit key size 4880 if (sm_sc_only_mode && (sm_conn->sm_actual_encryption_key_size < 16)) { 4881 sm_conn->sm_actual_encryption_key_size = 0; 4882 } 4883 if (sm_conn->sm_actual_encryption_key_size == 0){ 4884 sm_pairing_error(sm_conn, SM_REASON_ENCRYPTION_KEY_SIZE); 4885 break; 4886 } 4887 4888 // prepare key exchange, LTK is derived locally 4889 sm_setup_key_distribution(sm_pairing_packet_get_initiator_key_distribution(setup->sm_s_pres) & ~SM_KEYDIST_ENC_KEY, 4890 sm_pairing_packet_get_responder_key_distribution(setup->sm_s_pres) & ~SM_KEYDIST_ENC_KEY); 4891 4892 // skip receive if there are none 4893 if (sm_key_distribution_all_received()){ 4894 // distribute keys in run handles 'no keys to send' 4895 sm_conn->sm_engine_state = SM_BR_EDR_DISTRIBUTE_KEYS; 4896 } else { 4897 sm_conn->sm_engine_state = SM_BR_EDR_RECEIVE_KEYS; 4898 } 4899 break; 4900 4901 case SM_BR_EDR_RESPONDER_W4_PAIRING_REQUEST: 4902 if (sm_pdu_code != SM_CODE_PAIRING_REQUEST){ 4903 sm_pdu_received_in_wrong_state(sm_conn); 4904 break; 4905 } 4906 4907 // store pairing request 4908 (void)memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t)); 4909 4910 // validate encryption key size 4911 max_encryption_key_size = sm_pairing_packet_get_max_encryption_key_size(setup->sm_m_preq); 4912 if ((max_encryption_key_size < 7) || (max_encryption_key_size > 16)){ 4913 sm_pairing_error(sm_conn, SM_REASON_INVALID_PARAMETERS); 4914 break; 4915 } 4916 sm_conn->sm_actual_encryption_key_size = sm_calc_actual_encryption_key_size(max_encryption_key_size); 4917 // SC Only mandates 128 bit key size 4918 if (sm_sc_only_mode && (sm_conn->sm_actual_encryption_key_size < 16)) { 4919 sm_conn->sm_actual_encryption_key_size = 0; 4920 } 4921 if (sm_conn->sm_actual_encryption_key_size == 0){ 4922 sm_pairing_error(sm_conn, SM_REASON_ENCRYPTION_KEY_SIZE); 4923 break; 4924 } 4925 // trigger response 4926 if (sm_ctkd_from_classic(sm_conn)){ 4927 sm_conn->sm_engine_state = SM_BR_EDR_RESPONDER_PAIRING_REQUEST_RECEIVED; 4928 } else { 4929 sm_pairing_error(sm_conn, SM_REASON_CROSS_TRANSPORT_KEY_DERIVATION_NOT_ALLOWED); 4930 } 4931 break; 4932 4933 case SM_BR_EDR_RECEIVE_KEYS: 4934 switch(sm_pdu_code){ 4935 case SM_CODE_IDENTITY_INFORMATION: 4936 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION; 4937 reverse_128(&packet[1], setup->sm_peer_irk); 4938 break; 4939 case SM_CODE_IDENTITY_ADDRESS_INFORMATION: 4940 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION; 4941 setup->sm_peer_addr_type = packet[1]; 4942 reverse_bd_addr(&packet[2], setup->sm_peer_address); 4943 break; 4944 case SM_CODE_SIGNING_INFORMATION: 4945 setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION; 4946 reverse_128(&packet[1], setup->sm_peer_csrk); 4947 break; 4948 default: 4949 // Unexpected PDU 4950 log_info("Unexpected PDU %u in SM_PH3_RECEIVE_KEYS", packet[0]); 4951 break; 4952 } 4953 4954 // all keys received 4955 if (sm_key_distribution_all_received()){ 4956 if (IS_RESPONDER(sm_conn->sm_role)){ 4957 // responder -> keys exchanged, derive LE LTK 4958 sm_ctkd_start_from_br_edr(sm_conn); 4959 } else { 4960 // initiator -> send our keys if any 4961 sm_conn->sm_engine_state = SM_BR_EDR_DISTRIBUTE_KEYS; 4962 } 4963 } 4964 break; 4965 #endif 4966 4967 default: 4968 // Unexpected PDU 4969 log_info("Unexpected PDU %u in state %u", packet[0], sm_conn->sm_engine_state); 4970 sm_pdu_received_in_wrong_state(sm_conn); 4971 break; 4972 } 4973 4974 // try to send next pdu 4975 sm_trigger_run(); 4976 } 4977 4978 // Security Manager Client API 4979 void sm_register_oob_data_callback( int (*get_oob_data_callback)(uint8_t address_type, bd_addr_t addr, uint8_t * oob_data)){ 4980 sm_get_oob_data = get_oob_data_callback; 4981 } 4982 4983 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)){ 4984 sm_get_sc_oob_data = get_sc_oob_data_callback; 4985 } 4986 4987 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)){ 4988 sm_get_ltk_callback = get_ltk_callback; 4989 } 4990 4991 void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler){ 4992 btstack_linked_list_add_tail(&sm_event_handlers, (btstack_linked_item_t*) callback_handler); 4993 } 4994 4995 void sm_remove_event_handler(btstack_packet_callback_registration_t * callback_handler){ 4996 btstack_linked_list_remove(&sm_event_handlers, (btstack_linked_item_t*) callback_handler); 4997 } 4998 4999 void sm_set_accepted_stk_generation_methods(uint8_t accepted_stk_generation_methods){ 5000 sm_accepted_stk_generation_methods = accepted_stk_generation_methods; 5001 } 5002 5003 void sm_set_encryption_key_size_range(uint8_t min_size, uint8_t max_size){ 5004 sm_min_encryption_key_size = min_size; 5005 sm_max_encryption_key_size = max_size; 5006 } 5007 5008 void sm_set_authentication_requirements(uint8_t auth_req){ 5009 #ifndef ENABLE_LE_SECURE_CONNECTIONS 5010 if (auth_req & SM_AUTHREQ_SECURE_CONNECTION){ 5011 log_error("ENABLE_LE_SECURE_CONNECTIONS not defined, but requested by app. Dropping SC flag"); 5012 auth_req &= ~SM_AUTHREQ_SECURE_CONNECTION; 5013 } 5014 #endif 5015 sm_auth_req = auth_req; 5016 } 5017 5018 void sm_set_io_capabilities(io_capability_t io_capability){ 5019 sm_io_capabilities = io_capability; 5020 } 5021 5022 #ifdef ENABLE_LE_PERIPHERAL 5023 void sm_set_request_security(bool enable){ 5024 sm_slave_request_security = enable; 5025 } 5026 #endif 5027 5028 void sm_set_er(sm_key_t er){ 5029 (void)memcpy(sm_persistent_er, er, 16); 5030 } 5031 5032 void sm_set_ir(sm_key_t ir){ 5033 (void)memcpy(sm_persistent_ir, ir, 16); 5034 } 5035 5036 // Testing support only 5037 void sm_test_set_irk(sm_key_t irk){ 5038 (void)memcpy(sm_persistent_irk, irk, 16); 5039 dkg_state = DKG_CALC_DHK; 5040 test_use_fixed_local_irk = true; 5041 } 5042 5043 void sm_test_use_fixed_local_csrk(void){ 5044 test_use_fixed_local_csrk = true; 5045 } 5046 5047 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5048 static void sm_ec_generated(void * arg){ 5049 UNUSED(arg); 5050 ec_key_generation_state = EC_KEY_GENERATION_DONE; 5051 // trigger pairing if pending for ec key 5052 sm_trigger_run(); 5053 } 5054 static void sm_ec_generate_new_key(void) { 5055 log_info("sm: generate new ec key"); 5056 #ifdef ENABLE_LE_SECURE_CONNECTIONS_DEBUG_KEY 5057 // LE Secure Connections Debug Key 5058 const uint8_t debug_key_public[64] = { 5059 0x20, 0xb0, 0x03, 0xd2, 0xf2, 0x97, 0xbe, 0x2c, 0x5e, 0x2c, 0x83, 0xa7, 0xe9, 0xf9, 0xa5, 0xb9, 5060 0xef, 0xf4, 0x91, 0x11, 0xac, 0xf4, 0xfd, 0xdb, 0xcc, 0x03, 0x01, 0x48, 0x0e, 0x35, 0x9d, 0xe6, 5061 0xdc, 0x80, 0x9c, 0x49, 0x65, 0x2a, 0xeb, 0x6d, 0x63, 0x32, 0x9a, 0xbf, 0x5a, 0x52, 0x15, 0x5c, 5062 0x76, 0x63, 0x45, 0xc2, 0x8f, 0xed, 0x30, 0x24, 0x74, 0x1c, 0x8e, 0xd0, 0x15, 0x89, 0xd2, 0x8b 5063 }; 5064 const uint8_t debug_key_private[32] = { 5065 0x3f, 0x49, 0xf6, 0xd4, 0xa3, 0xc5, 0x5f, 0x38, 0x74, 0xc9, 0xb3, 0xe3, 0xd2, 0x10, 0x3f, 0x50, 5066 0x4a, 0xff, 0x60, 0x7b, 0xeb, 0x40, 0xb7, 0x99, 0x58, 0x99, 0xb8, 0xa6, 0xcd, 0x3c, 0x1a, 0xbd 5067 }; 5068 if (sm_sc_debug_keys_enabled) { 5069 memcpy(ec_q, debug_key_public, 64); 5070 btstack_crypto_ecc_p256_set_key(debug_key_public, debug_key_private); 5071 ec_key_generation_state = EC_KEY_GENERATION_DONE; 5072 } else 5073 #endif 5074 { 5075 ec_key_generation_state = EC_KEY_GENERATION_ACTIVE; 5076 btstack_crypto_ecc_p256_generate_key(&sm_crypto_ecc_p256_request, ec_q, &sm_ec_generated, NULL); 5077 } 5078 } 5079 #endif 5080 5081 #ifdef ENABLE_TESTING_SUPPORT 5082 void sm_test_set_pairing_failure(int reason){ 5083 test_pairing_failure = reason; 5084 } 5085 #endif 5086 5087 static void sm_state_reset(void) { 5088 #ifdef USE_CMAC_ENGINE 5089 sm_cmac_active = 0; 5090 #endif 5091 dkg_state = DKG_W4_WORKING; 5092 rau_state = RAU_IDLE; 5093 sm_aes128_state = SM_AES128_IDLE; 5094 sm_address_resolution_test = -1; // no private address to resolve yet 5095 sm_address_resolution_mode = ADDRESS_RESOLUTION_IDLE; 5096 sm_address_resolution_general_queue = NULL; 5097 sm_active_connection_handle = HCI_CON_HANDLE_INVALID; 5098 sm_persistent_keys_random_active = false; 5099 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5100 ec_key_generation_state = EC_KEY_GENERATION_IDLE; 5101 #endif 5102 } 5103 5104 void sm_init(void){ 5105 5106 if (sm_initialized) return; 5107 5108 // set default ER and IR values (should be unique - set by app or sm later using TLV) 5109 sm_er_ir_set_default(); 5110 5111 // defaults 5112 sm_accepted_stk_generation_methods = SM_STK_GENERATION_METHOD_JUST_WORKS 5113 | SM_STK_GENERATION_METHOD_OOB 5114 | SM_STK_GENERATION_METHOD_PASSKEY 5115 | SM_STK_GENERATION_METHOD_NUMERIC_COMPARISON; 5116 5117 sm_max_encryption_key_size = 16; 5118 sm_min_encryption_key_size = 7; 5119 5120 sm_fixed_passkey_in_display_role = 0xffffffffU; 5121 sm_reconstruct_ltk_without_le_device_db_entry = true; 5122 5123 gap_random_adress_update_period = 15 * 60 * 1000L; 5124 5125 test_use_fixed_local_csrk = false; 5126 5127 // other 5128 btstack_run_loop_set_timer_handler(&sm_run_timer, &sm_run_timer_handler); 5129 5130 // register for HCI Events 5131 hci_event_callback_registration.callback = &sm_event_packet_handler; 5132 hci_add_event_handler(&hci_event_callback_registration); 5133 5134 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 5135 // register for L2CAP events 5136 l2cap_event_callback_registration.callback = &sm_event_packet_handler; 5137 l2cap_add_event_handler(&l2cap_event_callback_registration); 5138 #endif 5139 5140 // 5141 btstack_crypto_init(); 5142 5143 // init le_device_db 5144 le_device_db_init(); 5145 5146 // and L2CAP PDUs + L2CAP_EVENT_CAN_SEND_NOW 5147 l2cap_register_fixed_channel(sm_pdu_handler, L2CAP_CID_SECURITY_MANAGER_PROTOCOL); 5148 #ifdef ENABLE_CLASSIC 5149 l2cap_register_fixed_channel(sm_pdu_handler, L2CAP_CID_BR_EDR_SECURITY_MANAGER); 5150 #endif 5151 5152 // state 5153 sm_state_reset(); 5154 5155 sm_initialized = true; 5156 } 5157 5158 void sm_deinit(void){ 5159 sm_initialized = false; 5160 btstack_run_loop_remove_timer(&sm_run_timer); 5161 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && defined (ENABLE_LE_SECURE_CONNECTION_DEBUG_KEY) 5162 sm_sc_debug_keys_enabled = false; 5163 #endif 5164 } 5165 5166 void sm_use_fixed_passkey_in_display_role(uint32_t passkey){ 5167 sm_fixed_passkey_in_display_role = passkey; 5168 } 5169 5170 void sm_allow_ltk_reconstruction_without_le_device_db_entry(int allow){ 5171 sm_reconstruct_ltk_without_le_device_db_entry = allow != 0; 5172 } 5173 5174 static sm_connection_t * sm_get_connection_for_handle(hci_con_handle_t con_handle){ 5175 hci_connection_t * hci_con = hci_connection_for_handle(con_handle); 5176 if (!hci_con) return NULL; 5177 return &hci_con->sm_connection; 5178 } 5179 5180 static void sm_cache_ltk(sm_connection_t * connection, const sm_key_t ltk){ 5181 hci_connection_t * hci_con = hci_connection_for_handle(connection->sm_handle); 5182 btstack_assert(hci_con != NULL); 5183 memcpy(hci_con->link_key, ltk, 16); 5184 hci_con->link_key_type = COMBINATION_KEY; 5185 } 5186 5187 #ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION 5188 static sm_connection_t * sm_get_connection_for_bd_addr_and_type(bd_addr_t address, bd_addr_type_t addr_type){ 5189 hci_connection_t * hci_con = hci_connection_for_bd_addr_and_type(address, addr_type); 5190 if (!hci_con) return NULL; 5191 return &hci_con->sm_connection; 5192 } 5193 #endif 5194 5195 // @deprecated: map onto sm_request_pairing 5196 void sm_send_security_request(hci_con_handle_t con_handle){ 5197 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5198 if (!sm_conn) return; 5199 if (!IS_RESPONDER(sm_conn->sm_role)) return; 5200 sm_request_pairing(con_handle); 5201 } 5202 5203 // request pairing 5204 void sm_request_pairing(hci_con_handle_t con_handle){ 5205 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5206 if (!sm_conn) return; // wrong connection 5207 5208 bool have_ltk; 5209 uint8_t ltk[16]; 5210 bool auth_required; 5211 int authenticated; 5212 bool trigger_reencryption; 5213 log_info("sm_request_pairing in role %u, state %u", sm_conn->sm_role, sm_conn->sm_engine_state); 5214 if (IS_RESPONDER(sm_conn->sm_role)){ 5215 switch (sm_conn->sm_engine_state){ 5216 case SM_GENERAL_IDLE: 5217 case SM_RESPONDER_IDLE: 5218 switch (sm_conn->sm_irk_lookup_state){ 5219 case IRK_LOOKUP_SUCCEEDED: 5220 le_device_db_encryption_get(sm_conn->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL, NULL); 5221 have_ltk = !sm_is_null_key(ltk); 5222 log_info("have ltk %u", have_ltk); 5223 if (have_ltk){ 5224 sm_conn->sm_pairing_requested = true; 5225 sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST; 5226 sm_reencryption_started(sm_conn); 5227 break; 5228 } 5229 /* fall through */ 5230 5231 case IRK_LOOKUP_FAILED: 5232 sm_conn->sm_pairing_requested = true; 5233 sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST; 5234 sm_pairing_started(sm_conn); 5235 break; 5236 default: 5237 log_info("irk lookup pending"); 5238 sm_conn->sm_pairing_requested = true; 5239 break; 5240 } 5241 break; 5242 default: 5243 break; 5244 } 5245 } else { 5246 // used as a trigger to start central/master/initiator security procedures 5247 switch (sm_conn->sm_engine_state){ 5248 case SM_INITIATOR_CONNECTED: 5249 switch (sm_conn->sm_irk_lookup_state){ 5250 case IRK_LOOKUP_SUCCEEDED: 5251 le_device_db_encryption_get(sm_conn->sm_le_db_index, NULL, NULL, ltk, NULL, &authenticated, NULL, NULL); 5252 have_ltk = !sm_is_null_key(ltk); 5253 auth_required = sm_auth_req & SM_AUTHREQ_MITM_PROTECTION; 5254 // re-encrypt is sufficient if we have ltk and that is either already authenticated or we don't require authentication 5255 trigger_reencryption = have_ltk && ((authenticated != 0) || (auth_required == false)); 5256 log_info("have ltk %u, authenticated %u, auth required %u => reencrypt %u", have_ltk, authenticated, auth_required, trigger_reencryption); 5257 if (trigger_reencryption){ 5258 sm_conn->sm_pairing_requested = true; 5259 sm_conn->sm_engine_state = SM_INITIATOR_PH4_HAS_LTK; 5260 break; 5261 } 5262 /* fall through */ 5263 5264 case IRK_LOOKUP_FAILED: 5265 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 5266 break; 5267 default: 5268 log_info("irk lookup pending"); 5269 sm_conn->sm_pairing_requested = true; 5270 break; 5271 } 5272 break; 5273 case SM_GENERAL_REENCRYPTION_FAILED: 5274 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST; 5275 break; 5276 case SM_GENERAL_IDLE: 5277 sm_conn->sm_pairing_requested = true; 5278 break; 5279 default: 5280 break; 5281 } 5282 } 5283 sm_trigger_run(); 5284 } 5285 5286 // called by client app on authorization request 5287 void sm_authorization_decline(hci_con_handle_t con_handle){ 5288 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5289 if (!sm_conn) return; // wrong connection 5290 sm_conn->sm_connection_authorization_state = AUTHORIZATION_DECLINED; 5291 sm_notify_client_status(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 0); 5292 } 5293 5294 void sm_authorization_grant(hci_con_handle_t con_handle){ 5295 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5296 if (!sm_conn) return; // wrong connection 5297 sm_conn->sm_connection_authorization_state = AUTHORIZATION_GRANTED; 5298 sm_notify_client_status(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 1); 5299 } 5300 5301 // GAP Bonding API 5302 5303 void sm_bonding_decline(hci_con_handle_t con_handle){ 5304 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5305 if (!sm_conn) return; // wrong connection 5306 setup->sm_user_response = SM_USER_RESPONSE_DECLINE; 5307 log_info("decline, state %u", sm_conn->sm_engine_state); 5308 switch(sm_conn->sm_engine_state){ 5309 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5310 case SM_SC_W4_USER_RESPONSE: 5311 case SM_SC_W4_CONFIRMATION: 5312 case SM_SC_W4_PUBLIC_KEY_COMMAND: 5313 #endif 5314 case SM_PH1_W4_USER_RESPONSE: 5315 switch (setup->sm_stk_generation_method){ 5316 case PK_RESP_INPUT: 5317 case PK_INIT_INPUT: 5318 case PK_BOTH_INPUT: 5319 sm_pairing_error(sm_conn, SM_REASON_PASSKEY_ENTRY_FAILED); 5320 break; 5321 case NUMERIC_COMPARISON: 5322 sm_pairing_error(sm_conn, SM_REASON_NUMERIC_COMPARISON_FAILED); 5323 break; 5324 case JUST_WORKS: 5325 case OOB: 5326 sm_pairing_error(sm_conn, SM_REASON_UNSPECIFIED_REASON); 5327 break; 5328 default: 5329 btstack_assert(false); 5330 break; 5331 } 5332 break; 5333 default: 5334 break; 5335 } 5336 sm_trigger_run(); 5337 } 5338 5339 void sm_just_works_confirm(hci_con_handle_t con_handle){ 5340 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5341 if (!sm_conn) return; // wrong connection 5342 setup->sm_user_response = SM_USER_RESPONSE_CONFIRM; 5343 if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){ 5344 if (setup->sm_use_secure_connections){ 5345 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND; 5346 } else { 5347 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); 5348 } 5349 } 5350 5351 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5352 if (sm_conn->sm_engine_state == SM_SC_W4_USER_RESPONSE){ 5353 sm_sc_prepare_dhkey_check(sm_conn); 5354 } 5355 #endif 5356 5357 sm_trigger_run(); 5358 } 5359 5360 void sm_numeric_comparison_confirm(hci_con_handle_t con_handle){ 5361 // for now, it's the same 5362 sm_just_works_confirm(con_handle); 5363 } 5364 5365 void sm_passkey_input(hci_con_handle_t con_handle, uint32_t passkey){ 5366 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5367 if (!sm_conn) return; // wrong connection 5368 sm_reset_tk(); 5369 big_endian_store_32(setup->sm_tk, 12, passkey); 5370 setup->sm_user_response = SM_USER_RESPONSE_PASSKEY; 5371 if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){ 5372 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); 5373 } 5374 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5375 (void)memcpy(setup->sm_ra, setup->sm_tk, 16); 5376 (void)memcpy(setup->sm_rb, setup->sm_tk, 16); 5377 if (sm_conn->sm_engine_state == SM_SC_W4_USER_RESPONSE){ 5378 sm_sc_start_calculating_local_confirm(sm_conn); 5379 } 5380 #endif 5381 sm_trigger_run(); 5382 } 5383 5384 void sm_keypress_notification(hci_con_handle_t con_handle, uint8_t action){ 5385 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5386 if (!sm_conn) return; // wrong connection 5387 if (action > SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED) return; 5388 uint8_t num_actions = setup->sm_keypress_notification >> 5; 5389 uint8_t flags = setup->sm_keypress_notification & 0x1fu; 5390 switch (action){ 5391 case SM_KEYPRESS_PASSKEY_ENTRY_STARTED: 5392 case SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED: 5393 flags |= (1u << action); 5394 break; 5395 case SM_KEYPRESS_PASSKEY_CLEARED: 5396 // clear counter, keypress & erased flags + set passkey cleared 5397 flags = (flags & 0x19u) | (1u << SM_KEYPRESS_PASSKEY_CLEARED); 5398 break; 5399 case SM_KEYPRESS_PASSKEY_DIGIT_ENTERED: 5400 if ((flags & (1u << SM_KEYPRESS_PASSKEY_DIGIT_ERASED)) != 0u){ 5401 // erase actions queued 5402 num_actions--; 5403 if (num_actions == 0u){ 5404 // clear counter, keypress & erased flags 5405 flags &= 0x19u; 5406 } 5407 break; 5408 } 5409 num_actions++; 5410 flags |= (1u << SM_KEYPRESS_PASSKEY_DIGIT_ENTERED); 5411 break; 5412 case SM_KEYPRESS_PASSKEY_DIGIT_ERASED: 5413 if ((flags & (1u << SM_KEYPRESS_PASSKEY_DIGIT_ENTERED)) != 0u){ 5414 // enter actions queued 5415 num_actions--; 5416 if (num_actions == 0u){ 5417 // clear counter, keypress & erased flags 5418 flags &= 0x19u; 5419 } 5420 break; 5421 } 5422 num_actions++; 5423 flags |= (1u << SM_KEYPRESS_PASSKEY_DIGIT_ERASED); 5424 break; 5425 default: 5426 break; 5427 } 5428 setup->sm_keypress_notification = (num_actions << 5) | flags; 5429 sm_trigger_run(); 5430 } 5431 5432 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5433 static void sm_handle_random_result_oob(void * arg){ 5434 UNUSED(arg); 5435 sm_sc_oob_state = SM_SC_OOB_W2_CALC_CONFIRM; 5436 sm_trigger_run(); 5437 } 5438 uint8_t sm_generate_sc_oob_data(void (*callback)(const uint8_t * confirm_value, const uint8_t * random_value)){ 5439 5440 static btstack_crypto_random_t sm_crypto_random_oob_request; 5441 5442 if (sm_sc_oob_state != SM_SC_OOB_IDLE) return ERROR_CODE_COMMAND_DISALLOWED; 5443 sm_sc_oob_callback = callback; 5444 sm_sc_oob_state = SM_SC_OOB_W4_RANDOM; 5445 btstack_crypto_random_generate(&sm_crypto_random_oob_request, sm_sc_oob_random, 16, &sm_handle_random_result_oob, NULL); 5446 return 0; 5447 } 5448 #endif 5449 5450 /** 5451 * @brief Get Identity Resolving state 5452 * @param con_handle 5453 * @return irk_lookup_state_t 5454 */ 5455 irk_lookup_state_t sm_identity_resolving_state(hci_con_handle_t con_handle){ 5456 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5457 if (!sm_conn) return IRK_LOOKUP_IDLE; 5458 return sm_conn->sm_irk_lookup_state; 5459 } 5460 5461 /** 5462 * @brief Identify device in LE Device DB 5463 * @param handle 5464 * @return index from le_device_db or -1 if not found/identified 5465 */ 5466 int sm_le_device_index(hci_con_handle_t con_handle ){ 5467 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5468 if (!sm_conn) return -1; 5469 return sm_conn->sm_le_db_index; 5470 } 5471 5472 uint8_t sm_get_ltk(hci_con_handle_t con_handle, sm_key_t ltk){ 5473 hci_connection_t * hci_connection = hci_connection_for_handle(con_handle); 5474 if (hci_connection == NULL){ 5475 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; 5476 } 5477 if (hci_connection->link_key_type == INVALID_LINK_KEY){ 5478 return ERROR_CODE_PIN_OR_KEY_MISSING; 5479 } 5480 memcpy(ltk, hci_connection->link_key, 16); 5481 return ERROR_CODE_SUCCESS; 5482 } 5483 5484 static int gap_random_address_type_requires_updates(void){ 5485 switch (gap_random_adress_type){ 5486 case GAP_RANDOM_ADDRESS_TYPE_OFF: 5487 case GAP_RANDOM_ADDRESS_TYPE_STATIC: 5488 return 0; 5489 default: 5490 return 1; 5491 } 5492 } 5493 5494 static uint8_t own_address_type(void){ 5495 switch (gap_random_adress_type){ 5496 case GAP_RANDOM_ADDRESS_TYPE_OFF: 5497 return BD_ADDR_TYPE_LE_PUBLIC; 5498 default: 5499 return BD_ADDR_TYPE_LE_RANDOM; 5500 } 5501 } 5502 5503 // GAP LE API 5504 void gap_random_address_set_mode(gap_random_address_type_t random_address_type){ 5505 gap_random_address_update_stop(); 5506 gap_random_adress_type = random_address_type; 5507 hci_le_set_own_address_type(own_address_type()); 5508 if (!gap_random_address_type_requires_updates()) return; 5509 gap_random_address_update_start(); 5510 gap_random_address_trigger(); 5511 } 5512 5513 gap_random_address_type_t gap_random_address_get_mode(void){ 5514 return gap_random_adress_type; 5515 } 5516 5517 void gap_random_address_set_update_period(int period_ms){ 5518 gap_random_adress_update_period = period_ms; 5519 if (!gap_random_address_type_requires_updates()) return; 5520 gap_random_address_update_stop(); 5521 gap_random_address_update_start(); 5522 } 5523 5524 void gap_random_address_set(const bd_addr_t addr){ 5525 gap_random_address_set_mode(GAP_RANDOM_ADDRESS_TYPE_STATIC); 5526 (void)memcpy(sm_random_address, addr, 6); 5527 // assert msb bits are set to '11' 5528 sm_random_address[0] |= 0xc0; 5529 hci_le_random_address_set(sm_random_address); 5530 } 5531 5532 #ifdef ENABLE_LE_PERIPHERAL 5533 /* 5534 * @brief Set Advertisement Paramters 5535 * @param adv_int_min 5536 * @param adv_int_max 5537 * @param adv_type 5538 * @param direct_address_type 5539 * @param direct_address 5540 * @param channel_map 5541 * @param filter_policy 5542 * 5543 * @note own_address_type is used from gap_random_address_set_mode 5544 */ 5545 void gap_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type, 5546 uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy){ 5547 hci_le_advertisements_set_params(adv_int_min, adv_int_max, adv_type, 5548 direct_address_typ, direct_address, channel_map, filter_policy); 5549 } 5550 #endif 5551 5552 bool gap_reconnect_security_setup_active(hci_con_handle_t con_handle){ 5553 sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle); 5554 // wrong connection 5555 if (!sm_conn) return false; 5556 // already encrypted 5557 if (sm_conn->sm_connection_encrypted) return false; 5558 // irk status? 5559 switch(sm_conn->sm_irk_lookup_state){ 5560 case IRK_LOOKUP_FAILED: 5561 // done, cannot setup encryption 5562 return false; 5563 case IRK_LOOKUP_SUCCEEDED: 5564 break; 5565 default: 5566 // IR Lookup pending 5567 return true; 5568 } 5569 // IRK Lookup Succeeded, re-encryption should be initiated. When done, state gets reset or indicates failure 5570 if (sm_conn->sm_engine_state == SM_GENERAL_REENCRYPTION_FAILED) return false; 5571 if (sm_conn->sm_role != 0){ 5572 return sm_conn->sm_engine_state != SM_RESPONDER_IDLE; 5573 } else { 5574 return sm_conn->sm_engine_state != SM_INITIATOR_CONNECTED; 5575 } 5576 } 5577 5578 void sm_set_secure_connections_only_mode(bool enable){ 5579 #ifdef ENABLE_LE_SECURE_CONNECTIONS 5580 sm_sc_only_mode = enable; 5581 #else 5582 // SC Only mode not possible without support for SC 5583 btstack_assert(enable == false); 5584 #endif 5585 } 5586 5587 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && defined (ENABLE_LE_SECURE_CONNECTION_DEBUG_KEY) 5588 void sm_test_enable_secure_connections_debug_keys(void) { 5589 log_info("Enable LE Secure Connection Debug Keys for testing"); 5590 sm_sc_debug_keys_enabled = true; 5591 // set debug key 5592 sm_ec_generate_new_key(); 5593 } 5594 #endif 5595 5596 const uint8_t * gap_get_persistent_irk(void){ 5597 return sm_persistent_irk; 5598 } 5599 5600 void gap_delete_bonding(bd_addr_type_t address_type, bd_addr_t address){ 5601 int index = sm_le_device_db_index_lookup(address_type, address); 5602 if (index >= 0){ 5603 sm_remove_le_device_db_entry(index); 5604 } 5605 } 5606