xref: /btstack/src/ble/sm.c (revision 16a1a3e5b41ad858f46da26d8a513349639e60f5)
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 MATTHIAS
24  * RINGWALD 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 <stdio.h>
41 #include <string.h>
42 #include <inttypes.h>
43 
44 #include "ble/le_device_db.h"
45 #include "ble/core.h"
46 #include "ble/sm.h"
47 #include "bluetooth_company_id.h"
48 #include "btstack_debug.h"
49 #include "btstack_event.h"
50 #include "btstack_linked_list.h"
51 #include "btstack_memory.h"
52 #include "gap.h"
53 #include "hci.h"
54 #include "hci_dump.h"
55 #include "l2cap.h"
56 
57 #if !defined(ENABLE_LE_PERIPHERAL) && !defined(ENABLE_LE_CENTRAL)
58 #error "LE Security Manager used, but neither ENABLE_LE_PERIPHERAL nor ENABLE_LE_CENTRAL defined. Please add at least one to btstack_config.h."
59 #endif
60 
61 #if defined(ENABLE_LE_PERIPHERAL) && defined(ENABLE_LE_CENTRAL)
62 #define IS_RESPONDER(role) (role)
63 #else
64 #ifdef ENABLE_LE_CENTRAL
65 // only central - never responder (avoid 'unused variable' warnings)
66 #define IS_RESPONDER(role) (0 && role)
67 #else
68 // only peripheral - always responder (avoid 'unused variable' warnings)
69 #define IS_RESPONDER(role) (1 || role)
70 #endif
71 #endif
72 
73 #ifdef ENABLE_LE_SECURE_CONNECTIONS
74 // assert SM Public Key can be sent/received
75 #if HCI_ACL_PAYLOAD_SIZE < 69
76 #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"
77 #endif
78 
79 // configure ECC implementations
80 #ifdef ENABLE_LE_SECURE_CONNECTIONS
81 #if defined(ENABLE_MICRO_ECC_FOR_LE_SECURE_CONNECTIONS) && defined(HAVE_MBEDTLS_ECC_P256)
82 #error "If you already have mbedTLS (HAVE_MBEDTLS_ECC_P256), please disable uECC (USE_MICRO_ECC_FOR_ECDH) in bstack_config.h"
83 #endif
84 #ifdef ENABLE_MICRO_ECC_FOR_LE_SECURE_CONNECTIONS
85 #define USE_SOFTWARE_ECDH_IMPLEMENTATION
86 #define USE_MICRO_ECC_FOR_ECDH
87 #endif
88 #ifdef HAVE_MBEDTLS_ECC_P256
89 #define USE_SOFTWARE_ECDH_IMPLEMENTATION
90 #define USE_MBEDTLS_FOR_ECDH
91 #endif
92 #endif /* ENABLE_LE_SECURE_CONNECTIONS */
93 
94 // Software ECDH implementation provided by micro-ecc
95 #ifdef USE_MICRO_ECC_FOR_ECDH
96 #include "uECC.h"
97 #endif
98 #endif
99 
100 // Software ECDH implementation provided by mbedTLS
101 #ifdef USE_MBEDTLS_FOR_ECDH
102 #include "mbedtls/config.h"
103 #include "mbedtls/platform.h"
104 #include "mbedtls/ecp.h"
105 #endif
106 
107 #if defined(ENABLE_LE_SIGNED_WRITE) || defined(ENABLE_LE_SECURE_CONNECTIONS)
108 #define ENABLE_CMAC_ENGINE
109 #endif
110 
111 //
112 // SM internal types and globals
113 //
114 
115 typedef enum {
116     DKG_W4_WORKING,
117     DKG_CALC_IRK,
118     DKG_W4_IRK,
119     DKG_CALC_DHK,
120     DKG_W4_DHK,
121     DKG_READY
122 } derived_key_generation_t;
123 
124 typedef enum {
125     RAU_W4_WORKING,
126     RAU_IDLE,
127     RAU_GET_RANDOM,
128     RAU_W4_RANDOM,
129     RAU_GET_ENC,
130     RAU_W4_ENC,
131     RAU_SET_ADDRESS,
132 } random_address_update_t;
133 
134 typedef enum {
135     CMAC_IDLE,
136     CMAC_CALC_SUBKEYS,
137     CMAC_W4_SUBKEYS,
138     CMAC_CALC_MI,
139     CMAC_W4_MI,
140     CMAC_CALC_MLAST,
141     CMAC_W4_MLAST
142 } cmac_state_t;
143 
144 typedef enum {
145     JUST_WORKS,
146     PK_RESP_INPUT,  // Initiator displays PK, responder inputs PK
147     PK_INIT_INPUT,  // Responder displays PK, initiator inputs PK
148     OK_BOTH_INPUT,  // Only input on both, both input PK
149     NK_BOTH_INPUT,  // Only numerical compparison (yes/no) on on both sides
150     OOB             // OOB available on both sides
151 } stk_generation_method_t;
152 
153 typedef enum {
154     SM_USER_RESPONSE_IDLE,
155     SM_USER_RESPONSE_PENDING,
156     SM_USER_RESPONSE_CONFIRM,
157     SM_USER_RESPONSE_PASSKEY,
158     SM_USER_RESPONSE_DECLINE
159 } sm_user_response_t;
160 
161 typedef enum {
162     SM_AES128_IDLE,
163     SM_AES128_ACTIVE
164 } sm_aes128_state_t;
165 
166 typedef enum {
167     ADDRESS_RESOLUTION_IDLE,
168     ADDRESS_RESOLUTION_GENERAL,
169     ADDRESS_RESOLUTION_FOR_CONNECTION,
170 } address_resolution_mode_t;
171 
172 typedef enum {
173     ADDRESS_RESOLUTION_SUCEEDED,
174     ADDRESS_RESOLUTION_FAILED,
175 } address_resolution_event_t;
176 
177 typedef enum {
178     EC_KEY_GENERATION_IDLE,
179     EC_KEY_GENERATION_ACTIVE,
180     EC_KEY_GENERATION_W4_KEY,
181     EC_KEY_GENERATION_DONE,
182 } ec_key_generation_state_t;
183 
184 typedef enum {
185     SM_STATE_VAR_DHKEY_NEEDED = 1 << 0,
186     SM_STATE_VAR_DHKEY_CALCULATED = 1 << 1,
187     SM_STATE_VAR_DHKEY_COMMAND_RECEIVED = 1 << 2,
188 } sm_state_var_t;
189 
190 typedef uint8_t sm_key24_t[3];
191 typedef uint8_t sm_key56_t[7];
192 typedef uint8_t sm_key256_t[32];
193 
194 //
195 // GLOBAL DATA
196 //
197 
198 static uint8_t test_use_fixed_local_csrk;
199 
200 // configuration
201 static uint8_t sm_accepted_stk_generation_methods;
202 static uint8_t sm_max_encryption_key_size;
203 static uint8_t sm_min_encryption_key_size;
204 static uint8_t sm_auth_req = 0;
205 static uint8_t sm_io_capabilities = IO_CAPABILITY_NO_INPUT_NO_OUTPUT;
206 static uint8_t sm_slave_request_security;
207 static uint32_t sm_fixed_passkey_in_display_role;
208 static uint8_t sm_reconstruct_ltk_without_le_device_db_entry;
209 #ifdef ENABLE_LE_SECURE_CONNECTIONS
210 static uint8_t sm_have_ec_keypair;
211 #endif
212 
213 // Security Manager Master Keys, please use sm_set_er(er) and sm_set_ir(ir) with your own 128 bit random values
214 static sm_key_t sm_persistent_er;
215 static sm_key_t sm_persistent_ir;
216 
217 // derived from sm_persistent_ir
218 static sm_key_t sm_persistent_dhk;
219 static sm_key_t sm_persistent_irk;
220 static uint8_t  sm_persistent_irk_ready = 0;    // used for testing
221 static derived_key_generation_t dkg_state;
222 
223 // derived from sm_persistent_er
224 // ..
225 
226 // random address update
227 static random_address_update_t rau_state;
228 static bd_addr_t sm_random_address;
229 
230 // CMAC Calculation: General
231 #ifdef ENABLE_CMAC_ENGINE
232 static cmac_state_t sm_cmac_state;
233 static uint16_t     sm_cmac_message_len;
234 static sm_key_t     sm_cmac_k;
235 static sm_key_t     sm_cmac_x;
236 static sm_key_t     sm_cmac_m_last;
237 static uint8_t      sm_cmac_block_current;
238 static uint8_t      sm_cmac_block_count;
239 static uint8_t      (*sm_cmac_get_byte)(uint16_t offset);
240 static void         (*sm_cmac_done_handler)(uint8_t * hash);
241 #endif
242 
243 // CMAC for ATT Signed Writes
244 #ifdef ENABLE_LE_SIGNED_WRITE
245 static uint8_t      sm_cmac_header[3];
246 static const uint8_t * sm_cmac_message;
247 static uint8_t      sm_cmac_sign_counter[4];
248 #endif
249 
250 // CMAC for Secure Connection functions
251 #ifdef ENABLE_LE_SECURE_CONNECTIONS
252 static sm_connection_t * sm_cmac_connection;
253 static uint8_t           sm_cmac_sc_buffer[80];
254 #endif
255 
256 // resolvable private address lookup / CSRK calculation
257 static int       sm_address_resolution_test;
258 static int       sm_address_resolution_ah_calculation_active;
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. store current sm_connection_t in sm_aes128_context
266 static sm_aes128_state_t  sm_aes128_state;
267 static void *             sm_aes128_context;
268 
269 // use aes128 provided by MCU - not needed usually
270 #ifdef HAVE_AES128
271 static uint8_t                aes128_result_flipped[16];
272 static btstack_timer_source_t aes128_timer;
273 void btstack_aes128_calc(uint8_t * key, uint8_t * plaintext, uint8_t * result);
274 #endif
275 
276 // random engine. store context (ususally sm_connection_t)
277 static void * sm_random_context;
278 
279 // to receive hci events
280 static btstack_packet_callback_registration_t hci_event_callback_registration;
281 
282 /* to dispatch sm event */
283 static btstack_linked_list_t sm_event_handlers;
284 
285 // LE Secure Connections
286 #ifdef ENABLE_LE_SECURE_CONNECTIONS
287 static ec_key_generation_state_t ec_key_generation_state;
288 static uint8_t ec_d[32];
289 static uint8_t ec_q[64];
290 #endif
291 
292 // Software ECDH implementation provided by mbedtls
293 #ifdef USE_MBEDTLS_FOR_ECDH
294 static mbedtls_ecp_group   mbedtls_ec_group;
295 #endif
296 
297 //
298 // Volume 3, Part H, Chapter 24
299 // "Security shall be initiated by the Security Manager in the device in the master role.
300 // The device in the slave role shall be the responding device."
301 // -> master := initiator, slave := responder
302 //
303 
304 // data needed for security setup
305 typedef struct sm_setup_context {
306 
307     btstack_timer_source_t sm_timeout;
308 
309     // used in all phases
310     uint8_t   sm_pairing_failed_reason;
311 
312     // user response, (Phase 1 and/or 2)
313     uint8_t   sm_user_response;
314     uint8_t   sm_keypress_notification;
315 
316     // defines which keys will be send after connection is encrypted - calculated during Phase 1, used Phase 3
317     int       sm_key_distribution_send_set;
318     int       sm_key_distribution_received_set;
319 
320     // Phase 2 (Pairing over SMP)
321     stk_generation_method_t sm_stk_generation_method;
322     sm_key_t  sm_tk;
323     uint8_t   sm_use_secure_connections;
324 
325     sm_key_t  sm_c1_t3_value;   // c1 calculation
326     sm_pairing_packet_t sm_m_preq; // pairing request - needed only for c1
327     sm_pairing_packet_t sm_s_pres; // pairing response - needed only for c1
328     sm_key_t  sm_local_random;
329     sm_key_t  sm_local_confirm;
330     sm_key_t  sm_peer_random;
331     sm_key_t  sm_peer_confirm;
332     uint8_t   sm_m_addr_type;   // address and type can be removed
333     uint8_t   sm_s_addr_type;   //  ''
334     bd_addr_t sm_m_address;     //  ''
335     bd_addr_t sm_s_address;     //  ''
336     sm_key_t  sm_ltk;
337 
338     uint8_t   sm_state_vars;
339 #ifdef ENABLE_LE_SECURE_CONNECTIONS
340     uint8_t   sm_peer_q[64];    // also stores random for EC key generation during init
341     sm_key_t  sm_peer_nonce;    // might be combined with sm_peer_random
342     sm_key_t  sm_local_nonce;   // might be combined with sm_local_random
343     sm_key_t  sm_dhkey;
344     sm_key_t  sm_peer_dhkey_check;
345     sm_key_t  sm_local_dhkey_check;
346     sm_key_t  sm_ra;
347     sm_key_t  sm_rb;
348     sm_key_t  sm_t;             // used for f5 and h6
349     sm_key_t  sm_mackey;
350     uint8_t   sm_passkey_bit;   // also stores number of generated random bytes for EC key generation
351 #endif
352 
353     // Phase 3
354 
355     // key distribution, we generate
356     uint16_t  sm_local_y;
357     uint16_t  sm_local_div;
358     uint16_t  sm_local_ediv;
359     uint8_t   sm_local_rand[8];
360     sm_key_t  sm_local_ltk;
361     sm_key_t  sm_local_csrk;
362     sm_key_t  sm_local_irk;
363     // sm_local_address/addr_type not needed
364 
365     // key distribution, received from peer
366     uint16_t  sm_peer_y;
367     uint16_t  sm_peer_div;
368     uint16_t  sm_peer_ediv;
369     uint8_t   sm_peer_rand[8];
370     sm_key_t  sm_peer_ltk;
371     sm_key_t  sm_peer_irk;
372     sm_key_t  sm_peer_csrk;
373     uint8_t   sm_peer_addr_type;
374     bd_addr_t sm_peer_address;
375 
376 } sm_setup_context_t;
377 
378 //
379 static sm_setup_context_t the_setup;
380 static sm_setup_context_t * setup = &the_setup;
381 
382 // active connection - the one for which the_setup is used for
383 static uint16_t sm_active_connection_handle = HCI_CON_HANDLE_INVALID;
384 
385 // @returns 1 if oob data is available
386 // stores oob data in provided 16 byte buffer if not null
387 static int (*sm_get_oob_data)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_data) = NULL;
388 
389 // horizontal: initiator capabilities
390 // vertial:    responder capabilities
391 static const stk_generation_method_t stk_generation_method [5] [5] = {
392     { JUST_WORKS,      JUST_WORKS,       PK_INIT_INPUT,   JUST_WORKS,    PK_INIT_INPUT },
393     { JUST_WORKS,      JUST_WORKS,       PK_INIT_INPUT,   JUST_WORKS,    PK_INIT_INPUT },
394     { PK_RESP_INPUT,   PK_RESP_INPUT,    OK_BOTH_INPUT,   JUST_WORKS,    PK_RESP_INPUT },
395     { JUST_WORKS,      JUST_WORKS,       JUST_WORKS,      JUST_WORKS,    JUST_WORKS    },
396     { PK_RESP_INPUT,   PK_RESP_INPUT,    PK_INIT_INPUT,   JUST_WORKS,    PK_RESP_INPUT },
397 };
398 
399 // uses numeric comparison if one side has DisplayYesNo and KeyboardDisplay combinations
400 #ifdef ENABLE_LE_SECURE_CONNECTIONS
401 static const stk_generation_method_t stk_generation_method_with_secure_connection[5][5] = {
402     { JUST_WORKS,      JUST_WORKS,       PK_INIT_INPUT,   JUST_WORKS,    PK_INIT_INPUT },
403     { JUST_WORKS,      NK_BOTH_INPUT,    PK_INIT_INPUT,   JUST_WORKS,    NK_BOTH_INPUT },
404     { PK_RESP_INPUT,   PK_RESP_INPUT,    OK_BOTH_INPUT,   JUST_WORKS,    PK_RESP_INPUT },
405     { JUST_WORKS,      JUST_WORKS,       JUST_WORKS,      JUST_WORKS,    JUST_WORKS    },
406     { PK_RESP_INPUT,   NK_BOTH_INPUT,    PK_INIT_INPUT,   JUST_WORKS,    NK_BOTH_INPUT },
407 };
408 #endif
409 
410 static void sm_run(void);
411 static void sm_done_for_handle(hci_con_handle_t con_handle);
412 static sm_connection_t * sm_get_connection_for_handle(hci_con_handle_t con_handle);
413 static inline int sm_calc_actual_encryption_key_size(int other);
414 static int sm_validate_stk_generation_method(void);
415 static void sm_handle_encryption_result(uint8_t * data);
416 
417 static void log_info_hex16(const char * name, uint16_t value){
418     log_info("%-6s 0x%04x", name, value);
419 }
420 
421 // static inline uint8_t sm_pairing_packet_get_code(sm_pairing_packet_t packet){
422 //     return packet[0];
423 // }
424 static inline uint8_t sm_pairing_packet_get_io_capability(sm_pairing_packet_t packet){
425     return packet[1];
426 }
427 static inline uint8_t sm_pairing_packet_get_oob_data_flag(sm_pairing_packet_t packet){
428     return packet[2];
429 }
430 static inline uint8_t sm_pairing_packet_get_auth_req(sm_pairing_packet_t packet){
431     return packet[3];
432 }
433 static inline uint8_t sm_pairing_packet_get_max_encryption_key_size(sm_pairing_packet_t packet){
434     return packet[4];
435 }
436 static inline uint8_t sm_pairing_packet_get_initiator_key_distribution(sm_pairing_packet_t packet){
437     return packet[5];
438 }
439 static inline uint8_t sm_pairing_packet_get_responder_key_distribution(sm_pairing_packet_t packet){
440     return packet[6];
441 }
442 
443 static inline void sm_pairing_packet_set_code(sm_pairing_packet_t packet, uint8_t code){
444     packet[0] = code;
445 }
446 static inline void sm_pairing_packet_set_io_capability(sm_pairing_packet_t packet, uint8_t io_capability){
447     packet[1] = io_capability;
448 }
449 static inline void sm_pairing_packet_set_oob_data_flag(sm_pairing_packet_t packet, uint8_t oob_data_flag){
450     packet[2] = oob_data_flag;
451 }
452 static inline void sm_pairing_packet_set_auth_req(sm_pairing_packet_t packet, uint8_t auth_req){
453     packet[3] = auth_req;
454 }
455 static inline void sm_pairing_packet_set_max_encryption_key_size(sm_pairing_packet_t packet, uint8_t max_encryption_key_size){
456     packet[4] = max_encryption_key_size;
457 }
458 static inline void sm_pairing_packet_set_initiator_key_distribution(sm_pairing_packet_t packet, uint8_t initiator_key_distribution){
459     packet[5] = initiator_key_distribution;
460 }
461 static inline void sm_pairing_packet_set_responder_key_distribution(sm_pairing_packet_t packet, uint8_t responder_key_distribution){
462     packet[6] = responder_key_distribution;
463 }
464 
465 // @returns 1 if all bytes are 0
466 static int sm_is_null(uint8_t * data, int size){
467     int i;
468     for (i=0; i < size ; i++){
469         if (data[i]) return 0;
470     }
471     return 1;
472 }
473 
474 static int sm_is_null_random(uint8_t random[8]){
475     return sm_is_null(random, 8);
476 }
477 
478 static int sm_is_null_key(uint8_t * key){
479     return sm_is_null(key, 16);
480 }
481 
482 // Key utils
483 static void sm_reset_tk(void){
484     int i;
485     for (i=0;i<16;i++){
486         setup->sm_tk[i] = 0;
487     }
488 }
489 
490 // "For example, if a 128-bit encryption key is 0x123456789ABCDEF0123456789ABCDEF0
491 // and it is reduced to 7 octets (56 bits), then the resulting key is 0x0000000000000000003456789ABCDEF0.""
492 static void sm_truncate_key(sm_key_t key, int max_encryption_size){
493     int i;
494     for (i = max_encryption_size ; i < 16 ; i++){
495         key[15-i] = 0;
496     }
497 }
498 
499 // SMP Timeout implementation
500 
501 // Upon transmission of the Pairing Request command or reception of the Pairing Request command,
502 // the Security Manager Timer shall be reset and started.
503 //
504 // The Security Manager Timer shall be reset when an L2CAP SMP command is queued for transmission.
505 //
506 // If the Security Manager Timer reaches 30 seconds, the procedure shall be considered to have failed,
507 // and the local higher layer shall be notified. No further SMP commands shall be sent over the L2CAP
508 // Security Manager Channel. A new SM procedure shall only be performed when a new physical link has been
509 // established.
510 
511 static void sm_timeout_handler(btstack_timer_source_t * timer){
512     log_info("SM timeout");
513     sm_connection_t * sm_conn = (sm_connection_t*) btstack_run_loop_get_timer_context(timer);
514     sm_conn->sm_engine_state = SM_GENERAL_TIMEOUT;
515     sm_done_for_handle(sm_conn->sm_handle);
516 
517     // trigger handling of next ready connection
518     sm_run();
519 }
520 static void sm_timeout_start(sm_connection_t * sm_conn){
521     btstack_run_loop_remove_timer(&setup->sm_timeout);
522     btstack_run_loop_set_timer_context(&setup->sm_timeout, sm_conn);
523     btstack_run_loop_set_timer_handler(&setup->sm_timeout, sm_timeout_handler);
524     btstack_run_loop_set_timer(&setup->sm_timeout, 30000); // 30 seconds sm timeout
525     btstack_run_loop_add_timer(&setup->sm_timeout);
526 }
527 static void sm_timeout_stop(void){
528     btstack_run_loop_remove_timer(&setup->sm_timeout);
529 }
530 static void sm_timeout_reset(sm_connection_t * sm_conn){
531     sm_timeout_stop();
532     sm_timeout_start(sm_conn);
533 }
534 
535 // end of sm timeout
536 
537 // GAP Random Address updates
538 static gap_random_address_type_t gap_random_adress_type;
539 static btstack_timer_source_t gap_random_address_update_timer;
540 static uint32_t gap_random_adress_update_period;
541 
542 static void gap_random_address_trigger(void){
543     if (rau_state != RAU_IDLE) return;
544     log_info("gap_random_address_trigger");
545     rau_state = RAU_GET_RANDOM;
546     sm_run();
547 }
548 
549 static void gap_random_address_update_handler(btstack_timer_source_t * timer){
550     UNUSED(timer);
551 
552     log_info("GAP Random Address Update due");
553     btstack_run_loop_set_timer(&gap_random_address_update_timer, gap_random_adress_update_period);
554     btstack_run_loop_add_timer(&gap_random_address_update_timer);
555     gap_random_address_trigger();
556 }
557 
558 static void gap_random_address_update_start(void){
559     btstack_run_loop_set_timer_handler(&gap_random_address_update_timer, gap_random_address_update_handler);
560     btstack_run_loop_set_timer(&gap_random_address_update_timer, gap_random_adress_update_period);
561     btstack_run_loop_add_timer(&gap_random_address_update_timer);
562 }
563 
564 static void gap_random_address_update_stop(void){
565     btstack_run_loop_remove_timer(&gap_random_address_update_timer);
566 }
567 
568 
569 static void sm_random_start(void * context){
570     sm_random_context = context;
571     hci_send_cmd(&hci_le_rand);
572 }
573 
574 #ifdef HAVE_AES128
575 static void aes128_completed(btstack_timer_source_t * ts){
576     UNUSED(ts);
577     sm_handle_encryption_result(&aes128_result_flipped[0]);
578     sm_run();
579 }
580 #endif
581 
582 // pre: sm_aes128_state != SM_AES128_ACTIVE, hci_can_send_command == 1
583 // context is made availabe to aes128 result handler by this
584 static void sm_aes128_start(sm_key_t key, sm_key_t plaintext, void * context){
585     sm_aes128_state = SM_AES128_ACTIVE;
586     sm_aes128_context = context;
587 
588 #ifdef HAVE_AES128
589     // calc result directly
590     sm_key_t result;
591     btstack_aes128_calc(key, plaintext, result);
592 
593     // log
594     log_info_key("key", key);
595     log_info_key("txt", plaintext);
596     log_info_key("res", result);
597 
598     // flip
599     reverse_128(&result[0], &aes128_result_flipped[0]);
600 
601     // deliver via timer
602     btstack_run_loop_set_timer_handler(&aes128_timer, &aes128_completed);
603     btstack_run_loop_set_timer(&aes128_timer, 0);    // no delay
604     btstack_run_loop_add_timer(&aes128_timer);
605 #else
606     sm_key_t key_flipped, plaintext_flipped;
607     reverse_128(key, key_flipped);
608     reverse_128(plaintext, plaintext_flipped);
609     hci_send_cmd(&hci_le_encrypt, key_flipped, plaintext_flipped);
610 #endif
611 }
612 
613 // ah(k,r) helper
614 // r = padding || r
615 // r - 24 bit value
616 static void sm_ah_r_prime(uint8_t r[3], uint8_t * r_prime){
617     // r'= padding || r
618     memset(r_prime, 0, 16);
619     memcpy(&r_prime[13], r, 3);
620 }
621 
622 // d1 helper
623 // d' = padding || r || d
624 // d,r - 16 bit values
625 static void sm_d1_d_prime(uint16_t d, uint16_t r, uint8_t * d1_prime){
626     // d'= padding || r || d
627     memset(d1_prime, 0, 16);
628     big_endian_store_16(d1_prime, 12, r);
629     big_endian_store_16(d1_prime, 14, d);
630 }
631 
632 // dm helper
633 // r’ = padding || r
634 // r - 64 bit value
635 static void sm_dm_r_prime(uint8_t r[8], uint8_t * r_prime){
636     memset(r_prime, 0, 16);
637     memcpy(&r_prime[8], r, 8);
638 }
639 
640 // calculate arguments for first AES128 operation in C1 function
641 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){
642 
643     // p1 = pres || preq || rat’ || iat’
644     // "The octet of iat’ becomes the least significant octet of p1 and the most signifi-
645     // cant octet of pres becomes the most significant octet of p1.
646     // For example, if the 8-bit iat’ is 0x01, the 8-bit rat’ is 0x00, the 56-bit preq
647     // is 0x07071000000101 and the 56 bit pres is 0x05000800000302 then
648     // p1 is 0x05000800000302070710000001010001."
649 
650     sm_key_t p1;
651     reverse_56(pres, &p1[0]);
652     reverse_56(preq, &p1[7]);
653     p1[14] = rat;
654     p1[15] = iat;
655     log_info_key("p1", p1);
656     log_info_key("r", r);
657 
658     // t1 = r xor p1
659     int i;
660     for (i=0;i<16;i++){
661         t1[i] = r[i] ^ p1[i];
662     }
663     log_info_key("t1", t1);
664 }
665 
666 // calculate arguments for second AES128 operation in C1 function
667 static void sm_c1_t3(sm_key_t t2, bd_addr_t ia, bd_addr_t ra, uint8_t * t3){
668      // p2 = padding || ia || ra
669     // "The least significant octet of ra becomes the least significant octet of p2 and
670     // the most significant octet of padding becomes the most significant octet of p2.
671     // For example, if 48-bit ia is 0xA1A2A3A4A5A6 and the 48-bit ra is
672     // 0xB1B2B3B4B5B6 then p2 is 0x00000000A1A2A3A4A5A6B1B2B3B4B5B6.
673 
674     sm_key_t p2;
675     memset(p2, 0, 16);
676     memcpy(&p2[4],  ia, 6);
677     memcpy(&p2[10], ra, 6);
678     log_info_key("p2", p2);
679 
680     // c1 = e(k, t2_xor_p2)
681     int i;
682     for (i=0;i<16;i++){
683         t3[i] = t2[i] ^ p2[i];
684     }
685     log_info_key("t3", t3);
686 }
687 
688 static void sm_s1_r_prime(sm_key_t r1, sm_key_t r2, uint8_t * r_prime){
689     log_info_key("r1", r1);
690     log_info_key("r2", r2);
691     memcpy(&r_prime[8], &r2[8], 8);
692     memcpy(&r_prime[0], &r1[8], 8);
693 }
694 
695 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){
696     event[0] = type;
697     event[1] = event_size - 2;
698     little_endian_store_16(event, 2, con_handle);
699     event[4] = addr_type;
700     reverse_bd_addr(address, &event[5]);
701 }
702 
703 static void sm_dispatch_event(uint8_t packet_type, uint16_t channel, uint8_t * packet, uint16_t size){
704     UNUSED(channel);
705 
706     // log event
707     hci_dump_packet(packet_type, 1, packet, size);
708     // dispatch to all event handlers
709     btstack_linked_list_iterator_t it;
710     btstack_linked_list_iterator_init(&it, &sm_event_handlers);
711     while (btstack_linked_list_iterator_has_next(&it)){
712         btstack_packet_callback_registration_t * entry = (btstack_packet_callback_registration_t*) btstack_linked_list_iterator_next(&it);
713         entry->callback(packet_type, 0, packet, size);
714     }
715 }
716 
717 static void sm_notify_client_base(uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address){
718     uint8_t event[11];
719     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
720     sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event));
721 }
722 
723 static void sm_notify_client_passkey(uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address, uint32_t passkey){
724     uint8_t event[15];
725     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
726     little_endian_store_32(event, 11, passkey);
727     sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event));
728 }
729 
730 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){
731     // fetch addr and addr type from db
732     bd_addr_t identity_address;
733     int identity_address_type;
734     le_device_db_info(index, &identity_address_type, identity_address, NULL);
735 
736     uint8_t event[19];
737     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
738     event[11] = identity_address_type;
739     reverse_bd_addr(identity_address, &event[12]);
740     event[18] = index;
741     sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event));
742 }
743 
744 static void sm_notify_client_authorization(uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address, uint8_t result){
745 
746     uint8_t event[18];
747     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
748     event[11] = result;
749     sm_dispatch_event(HCI_EVENT_PACKET, 0, (uint8_t*) &event, sizeof(event));
750 }
751 
752 // decide on stk generation based on
753 // - pairing request
754 // - io capabilities
755 // - OOB data availability
756 static void sm_setup_tk(void){
757 
758     // default: just works
759     setup->sm_stk_generation_method = JUST_WORKS;
760 
761 #ifdef ENABLE_LE_SECURE_CONNECTIONS
762     setup->sm_use_secure_connections = ( sm_pairing_packet_get_auth_req(setup->sm_m_preq)
763                                        & sm_pairing_packet_get_auth_req(setup->sm_s_pres)
764                                        & SM_AUTHREQ_SECURE_CONNECTION ) != 0;
765     memset(setup->sm_ra, 0, 16);
766     memset(setup->sm_rb, 0, 16);
767 #else
768     setup->sm_use_secure_connections = 0;
769 #endif
770     log_info("Secure pairing: %u", setup->sm_use_secure_connections);
771 
772     // If both devices have not set the MITM option in the Authentication Requirements
773     // Flags, then the IO capabilities shall be ignored and the Just Works association
774     // model shall be used.
775     if (((sm_pairing_packet_get_auth_req(setup->sm_m_preq) & SM_AUTHREQ_MITM_PROTECTION) == 0)
776     &&  ((sm_pairing_packet_get_auth_req(setup->sm_s_pres) & SM_AUTHREQ_MITM_PROTECTION) == 0)){
777         log_info("SM: MITM not required by both -> JUST WORKS");
778         return;
779     }
780 
781     // TODO: with LE SC, OOB is used to transfer data OOB during pairing, single device with OOB is sufficient
782 
783     // If both devices have out of band authentication data, then the Authentication
784     // Requirements Flags shall be ignored when selecting the pairing method and the
785     // Out of Band pairing method shall be used.
786     if (sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq)
787     &&  sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres)){
788         log_info("SM: have OOB data");
789         log_info_key("OOB", setup->sm_tk);
790         setup->sm_stk_generation_method = OOB;
791         return;
792     }
793 
794     // Reset TK as it has been setup in sm_init_setup
795     sm_reset_tk();
796 
797     // Also use just works if unknown io capabilites
798     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)){
799         return;
800     }
801 
802     // Otherwise the IO capabilities of the devices shall be used to determine the
803     // pairing method as defined in Table 2.4.
804     // see http://stackoverflow.com/a/1052837/393697 for how to specify pointer to 2-dimensional array
805     const stk_generation_method_t (*generation_method)[5] = stk_generation_method;
806 
807 #ifdef ENABLE_LE_SECURE_CONNECTIONS
808     // table not define by default
809     if (setup->sm_use_secure_connections){
810         generation_method = stk_generation_method_with_secure_connection;
811     }
812 #endif
813     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)];
814 
815     log_info("sm_setup_tk: master io cap: %u, slave io cap: %u -> method %u",
816         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);
817 }
818 
819 static int sm_key_distribution_flags_for_set(uint8_t key_set){
820     int flags = 0;
821     if (key_set & SM_KEYDIST_ENC_KEY){
822         flags |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION;
823         flags |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION;
824     }
825     if (key_set & SM_KEYDIST_ID_KEY){
826         flags |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION;
827         flags |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION;
828     }
829     if (key_set & SM_KEYDIST_SIGN){
830         flags |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION;
831     }
832     return flags;
833 }
834 
835 static void sm_setup_key_distribution(uint8_t key_set){
836     setup->sm_key_distribution_received_set = 0;
837     setup->sm_key_distribution_send_set = sm_key_distribution_flags_for_set(key_set);
838 }
839 
840 // CSRK Key Lookup
841 
842 
843 static int sm_address_resolution_idle(void){
844     return sm_address_resolution_mode == ADDRESS_RESOLUTION_IDLE;
845 }
846 
847 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){
848     memcpy(sm_address_resolution_address, addr, 6);
849     sm_address_resolution_addr_type = addr_type;
850     sm_address_resolution_test = 0;
851     sm_address_resolution_mode = mode;
852     sm_address_resolution_context = context;
853     sm_notify_client_base(SM_EVENT_IDENTITY_RESOLVING_STARTED, con_handle, addr_type, addr);
854 }
855 
856 int sm_address_resolution_lookup(uint8_t address_type, bd_addr_t address){
857     // check if already in list
858     btstack_linked_list_iterator_t it;
859     sm_lookup_entry_t * entry;
860     btstack_linked_list_iterator_init(&it, &sm_address_resolution_general_queue);
861     while(btstack_linked_list_iterator_has_next(&it)){
862         entry = (sm_lookup_entry_t *) btstack_linked_list_iterator_next(&it);
863         if (entry->address_type != address_type) continue;
864         if (memcmp(entry->address, address, 6))  continue;
865         // already in list
866         return BTSTACK_BUSY;
867     }
868     entry = btstack_memory_sm_lookup_entry_get();
869     if (!entry) return BTSTACK_MEMORY_ALLOC_FAILED;
870     entry->address_type = (bd_addr_type_t) address_type;
871     memcpy(entry->address, address, 6);
872     btstack_linked_list_add(&sm_address_resolution_general_queue, (btstack_linked_item_t *) entry);
873     sm_run();
874     return 0;
875 }
876 
877 // while x_state++ for an enum is possible in C, it isn't in C++. we use this helpers to avoid compile errors for now
878 static inline void sm_next_responding_state(sm_connection_t * sm_conn){
879     sm_conn->sm_engine_state = (security_manager_state_t) (((int)sm_conn->sm_engine_state) + 1);
880 }
881 static inline void dkg_next_state(void){
882     dkg_state = (derived_key_generation_t) (((int)dkg_state) + 1);
883 }
884 static inline void rau_next_state(void){
885     rau_state = (random_address_update_t) (((int)rau_state) + 1);
886 }
887 
888 // CMAC calculation using AES Engine
889 #ifdef ENABLE_CMAC_ENGINE
890 
891 static inline void sm_cmac_next_state(void){
892     sm_cmac_state = (cmac_state_t) (((int)sm_cmac_state) + 1);
893 }
894 
895 static int sm_cmac_last_block_complete(void){
896     if (sm_cmac_message_len == 0) return 0;
897     return (sm_cmac_message_len & 0x0f) == 0;
898 }
899 
900 int sm_cmac_ready(void){
901     return sm_cmac_state == CMAC_IDLE;
902 }
903 
904 // generic cmac calculation
905 void sm_cmac_general_start(const sm_key_t key, uint16_t message_len, uint8_t (*get_byte_callback)(uint16_t offset), void (*done_callback)(uint8_t hash[8])){
906     // Generalized CMAC
907     memcpy(sm_cmac_k, key, 16);
908     memset(sm_cmac_x, 0, 16);
909     sm_cmac_block_current = 0;
910     sm_cmac_message_len  = message_len;
911     sm_cmac_done_handler = done_callback;
912     sm_cmac_get_byte     = get_byte_callback;
913 
914     // step 2: n := ceil(len/const_Bsize);
915     sm_cmac_block_count = (sm_cmac_message_len + 15) / 16;
916 
917     // step 3: ..
918     if (sm_cmac_block_count==0){
919         sm_cmac_block_count = 1;
920     }
921     log_info("sm_cmac_general_start: len %u, block count %u", sm_cmac_message_len, sm_cmac_block_count);
922 
923     // first, we need to compute l for k1, k2, and m_last
924     sm_cmac_state = CMAC_CALC_SUBKEYS;
925 
926     // let's go
927     sm_run();
928 }
929 #endif
930 
931 // cmac for ATT Message signing
932 #ifdef ENABLE_LE_SIGNED_WRITE
933 static uint8_t sm_cmac_signed_write_message_get_byte(uint16_t offset){
934     if (offset >= sm_cmac_message_len) {
935         log_error("sm_cmac_signed_write_message_get_byte. out of bounds, access %u, len %u", offset, sm_cmac_message_len);
936         return 0;
937     }
938 
939     offset = sm_cmac_message_len - 1 - offset;
940 
941     // sm_cmac_header[3] | message[] | sm_cmac_sign_counter[4]
942     if (offset < 3){
943         return sm_cmac_header[offset];
944     }
945     int actual_message_len_incl_header = sm_cmac_message_len - 4;
946     if (offset <  actual_message_len_incl_header){
947         return sm_cmac_message[offset - 3];
948     }
949     return sm_cmac_sign_counter[offset - actual_message_len_incl_header];
950 }
951 
952 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)){
953     // ATT Message Signing
954     sm_cmac_header[0] = opcode;
955     little_endian_store_16(sm_cmac_header, 1, con_handle);
956     little_endian_store_32(sm_cmac_sign_counter, 0, sign_counter);
957     uint16_t total_message_len = 3 + message_len + 4;  // incl. virtually prepended att opcode, handle and appended sign_counter in LE
958     sm_cmac_message = message;
959     sm_cmac_general_start(k, total_message_len, &sm_cmac_signed_write_message_get_byte, done_handler);
960 }
961 #endif
962 
963 #ifdef ENABLE_CMAC_ENGINE
964 static void sm_cmac_handle_aes_engine_ready(void){
965     switch (sm_cmac_state){
966         case CMAC_CALC_SUBKEYS: {
967             sm_key_t const_zero;
968             memset(const_zero, 0, 16);
969             sm_cmac_next_state();
970             sm_aes128_start(sm_cmac_k, const_zero, NULL);
971             break;
972         }
973         case CMAC_CALC_MI: {
974             int j;
975             sm_key_t y;
976             for (j=0;j<16;j++){
977                 y[j] = sm_cmac_x[j] ^ sm_cmac_get_byte(sm_cmac_block_current*16 + j);
978             }
979             sm_cmac_block_current++;
980             sm_cmac_next_state();
981             sm_aes128_start(sm_cmac_k, y, NULL);
982             break;
983         }
984         case CMAC_CALC_MLAST: {
985             int i;
986             sm_key_t y;
987             for (i=0;i<16;i++){
988                 y[i] = sm_cmac_x[i] ^ sm_cmac_m_last[i];
989             }
990             log_info_key("Y", y);
991             sm_cmac_block_current++;
992             sm_cmac_next_state();
993             sm_aes128_start(sm_cmac_k, y, NULL);
994             break;
995         }
996         default:
997             log_info("sm_cmac_handle_aes_engine_ready called in state %u", sm_cmac_state);
998             break;
999     }
1000 }
1001 
1002 // CMAC Implementation using AES128 engine
1003 static void sm_shift_left_by_one_bit_inplace(int len, uint8_t * data){
1004     int i;
1005     int carry = 0;
1006     for (i=len-1; i >= 0 ; i--){
1007         int new_carry = data[i] >> 7;
1008         data[i] = data[i] << 1 | carry;
1009         carry = new_carry;
1010     }
1011 }
1012 
1013 static void sm_cmac_handle_encryption_result(sm_key_t data){
1014     switch (sm_cmac_state){
1015         case CMAC_W4_SUBKEYS: {
1016             sm_key_t k1;
1017             memcpy(k1, data, 16);
1018             sm_shift_left_by_one_bit_inplace(16, k1);
1019             if (data[0] & 0x80){
1020                 k1[15] ^= 0x87;
1021             }
1022             sm_key_t k2;
1023             memcpy(k2, k1, 16);
1024             sm_shift_left_by_one_bit_inplace(16, k2);
1025             if (k1[0] & 0x80){
1026                 k2[15] ^= 0x87;
1027             }
1028 
1029             log_info_key("k", sm_cmac_k);
1030             log_info_key("k1", k1);
1031             log_info_key("k2", k2);
1032 
1033             // step 4: set m_last
1034             int i;
1035             if (sm_cmac_last_block_complete()){
1036                 for (i=0;i<16;i++){
1037                     sm_cmac_m_last[i] = sm_cmac_get_byte(sm_cmac_message_len - 16 + i) ^ k1[i];
1038                 }
1039             } else {
1040                 int valid_octets_in_last_block = sm_cmac_message_len & 0x0f;
1041                 for (i=0;i<16;i++){
1042                     if (i < valid_octets_in_last_block){
1043                         sm_cmac_m_last[i] = sm_cmac_get_byte((sm_cmac_message_len & 0xfff0) + i) ^ k2[i];
1044                         continue;
1045                     }
1046                     if (i == valid_octets_in_last_block){
1047                         sm_cmac_m_last[i] = 0x80 ^ k2[i];
1048                         continue;
1049                     }
1050                     sm_cmac_m_last[i] = k2[i];
1051                 }
1052             }
1053 
1054             // next
1055             sm_cmac_state = sm_cmac_block_current < sm_cmac_block_count - 1 ? CMAC_CALC_MI : CMAC_CALC_MLAST;
1056             break;
1057         }
1058         case CMAC_W4_MI:
1059             memcpy(sm_cmac_x, data, 16);
1060             sm_cmac_state = sm_cmac_block_current < sm_cmac_block_count - 1 ? CMAC_CALC_MI : CMAC_CALC_MLAST;
1061             break;
1062         case CMAC_W4_MLAST:
1063             // done
1064             log_info("Setting CMAC Engine to IDLE");
1065             sm_cmac_state = CMAC_IDLE;
1066             log_info_key("CMAC", data);
1067             sm_cmac_done_handler(data);
1068             break;
1069         default:
1070             log_info("sm_cmac_handle_encryption_result called in state %u", sm_cmac_state);
1071             break;
1072     }
1073 }
1074 #endif
1075 
1076 static void sm_trigger_user_response(sm_connection_t * sm_conn){
1077     // notify client for: JUST WORKS confirm, Numeric comparison confirm, PASSKEY display or input
1078     setup->sm_user_response = SM_USER_RESPONSE_IDLE;
1079     switch (setup->sm_stk_generation_method){
1080         case PK_RESP_INPUT:
1081             if (IS_RESPONDER(sm_conn->sm_role)){
1082                 setup->sm_user_response = SM_USER_RESPONSE_PENDING;
1083                 sm_notify_client_base(SM_EVENT_PASSKEY_INPUT_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
1084             } else {
1085                 sm_notify_client_passkey(SM_EVENT_PASSKEY_DISPLAY_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, big_endian_read_32(setup->sm_tk, 12));
1086             }
1087             break;
1088         case PK_INIT_INPUT:
1089             if (IS_RESPONDER(sm_conn->sm_role)){
1090                 sm_notify_client_passkey(SM_EVENT_PASSKEY_DISPLAY_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, big_endian_read_32(setup->sm_tk, 12));
1091             } else {
1092                 setup->sm_user_response = SM_USER_RESPONSE_PENDING;
1093                 sm_notify_client_base(SM_EVENT_PASSKEY_INPUT_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
1094             }
1095             break;
1096         case OK_BOTH_INPUT:
1097             setup->sm_user_response = SM_USER_RESPONSE_PENDING;
1098             sm_notify_client_base(SM_EVENT_PASSKEY_INPUT_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
1099             break;
1100         case NK_BOTH_INPUT:
1101             setup->sm_user_response = SM_USER_RESPONSE_PENDING;
1102             sm_notify_client_passkey(SM_EVENT_NUMERIC_COMPARISON_REQUEST, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, big_endian_read_32(setup->sm_tk, 12));
1103             break;
1104         case JUST_WORKS:
1105             setup->sm_user_response = SM_USER_RESPONSE_PENDING;
1106             sm_notify_client_base(SM_EVENT_JUST_WORKS_REQUEST, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
1107             break;
1108         case OOB:
1109             // client already provided OOB data, let's skip notification.
1110             break;
1111     }
1112 }
1113 
1114 static int sm_key_distribution_all_received(sm_connection_t * sm_conn){
1115     int recv_flags;
1116     if (IS_RESPONDER(sm_conn->sm_role)){
1117         // slave / responder
1118         recv_flags = sm_key_distribution_flags_for_set(sm_pairing_packet_get_initiator_key_distribution(setup->sm_s_pres));
1119     } else {
1120         // master / initiator
1121         recv_flags = sm_key_distribution_flags_for_set(sm_pairing_packet_get_responder_key_distribution(setup->sm_s_pres));
1122     }
1123     log_debug("sm_key_distribution_all_received: received 0x%02x, expecting 0x%02x", setup->sm_key_distribution_received_set, recv_flags);
1124     return recv_flags == setup->sm_key_distribution_received_set;
1125 }
1126 
1127 static void sm_done_for_handle(hci_con_handle_t con_handle){
1128     if (sm_active_connection_handle == con_handle){
1129         sm_timeout_stop();
1130         sm_active_connection_handle = HCI_CON_HANDLE_INVALID;
1131         log_info("sm: connection 0x%x released setup context", con_handle);
1132     }
1133 }
1134 
1135 static int sm_key_distribution_flags_for_auth_req(void){
1136     int flags = SM_KEYDIST_ID_KEY | SM_KEYDIST_SIGN;
1137     if (sm_auth_req & SM_AUTHREQ_BONDING){
1138         // encryption information only if bonding requested
1139         flags |= SM_KEYDIST_ENC_KEY;
1140     }
1141     return flags;
1142 }
1143 
1144 static void sm_reset_setup(void){
1145     // fill in sm setup
1146     setup->sm_state_vars = 0;
1147     setup->sm_keypress_notification = 0xff;
1148     sm_reset_tk();
1149 }
1150 
1151 static void sm_init_setup(sm_connection_t * sm_conn){
1152 
1153     // fill in sm setup
1154     setup->sm_peer_addr_type = sm_conn->sm_peer_addr_type;
1155     memcpy(setup->sm_peer_address, sm_conn->sm_peer_address, 6);
1156 
1157     // query client for OOB data
1158     int have_oob_data = 0;
1159     if (sm_get_oob_data) {
1160         have_oob_data = (*sm_get_oob_data)(sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, setup->sm_tk);
1161     }
1162 
1163     sm_pairing_packet_t * local_packet;
1164     if (IS_RESPONDER(sm_conn->sm_role)){
1165         // slave
1166         local_packet = &setup->sm_s_pres;
1167         gap_le_get_own_address(&setup->sm_s_addr_type, setup->sm_s_address);
1168         setup->sm_m_addr_type = sm_conn->sm_peer_addr_type;
1169         memcpy(setup->sm_m_address, sm_conn->sm_peer_address, 6);
1170     } else {
1171         // master
1172         local_packet = &setup->sm_m_preq;
1173         gap_le_get_own_address(&setup->sm_m_addr_type, setup->sm_m_address);
1174         setup->sm_s_addr_type = sm_conn->sm_peer_addr_type;
1175         memcpy(setup->sm_s_address, sm_conn->sm_peer_address, 6);
1176 
1177         int key_distribution_flags = sm_key_distribution_flags_for_auth_req();
1178         sm_pairing_packet_set_initiator_key_distribution(setup->sm_m_preq, key_distribution_flags);
1179         sm_pairing_packet_set_responder_key_distribution(setup->sm_m_preq, key_distribution_flags);
1180     }
1181 
1182     uint8_t auth_req = sm_auth_req;
1183     sm_pairing_packet_set_io_capability(*local_packet, sm_io_capabilities);
1184     sm_pairing_packet_set_oob_data_flag(*local_packet, have_oob_data);
1185     sm_pairing_packet_set_auth_req(*local_packet, auth_req);
1186     sm_pairing_packet_set_max_encryption_key_size(*local_packet, sm_max_encryption_key_size);
1187 }
1188 
1189 static int sm_stk_generation_init(sm_connection_t * sm_conn){
1190 
1191     sm_pairing_packet_t * remote_packet;
1192     int                   remote_key_request;
1193     if (IS_RESPONDER(sm_conn->sm_role)){
1194         // slave / responder
1195         remote_packet      = &setup->sm_m_preq;
1196         remote_key_request = sm_pairing_packet_get_responder_key_distribution(setup->sm_m_preq);
1197     } else {
1198         // master / initiator
1199         remote_packet      = &setup->sm_s_pres;
1200         remote_key_request = sm_pairing_packet_get_initiator_key_distribution(setup->sm_s_pres);
1201     }
1202 
1203     // check key size
1204     sm_conn->sm_actual_encryption_key_size = sm_calc_actual_encryption_key_size(sm_pairing_packet_get_max_encryption_key_size(*remote_packet));
1205     if (sm_conn->sm_actual_encryption_key_size == 0) return SM_REASON_ENCRYPTION_KEY_SIZE;
1206 
1207     // decide on STK generation method
1208     sm_setup_tk();
1209     log_info("SMP: generation method %u", setup->sm_stk_generation_method);
1210 
1211     // check if STK generation method is acceptable by client
1212     if (!sm_validate_stk_generation_method()) return SM_REASON_AUTHENTHICATION_REQUIREMENTS;
1213 
1214     // identical to responder
1215     sm_setup_key_distribution(remote_key_request);
1216 
1217     // JUST WORKS doens't provide authentication
1218     sm_conn->sm_connection_authenticated = setup->sm_stk_generation_method == JUST_WORKS ? 0 : 1;
1219 
1220     return 0;
1221 }
1222 
1223 static void sm_address_resolution_handle_event(address_resolution_event_t event){
1224 
1225     // cache and reset context
1226     int matched_device_id = sm_address_resolution_test;
1227     address_resolution_mode_t mode = sm_address_resolution_mode;
1228     void * context = sm_address_resolution_context;
1229 
1230     // reset context
1231     sm_address_resolution_mode = ADDRESS_RESOLUTION_IDLE;
1232     sm_address_resolution_context = NULL;
1233     sm_address_resolution_test = -1;
1234     hci_con_handle_t con_handle = 0;
1235 
1236     sm_connection_t * sm_connection;
1237 #ifdef ENABLE_LE_CENTRAL
1238     sm_key_t ltk;
1239 #endif
1240     switch (mode){
1241         case ADDRESS_RESOLUTION_GENERAL:
1242             break;
1243         case ADDRESS_RESOLUTION_FOR_CONNECTION:
1244             sm_connection = (sm_connection_t *) context;
1245             con_handle = sm_connection->sm_handle;
1246             switch (event){
1247                 case ADDRESS_RESOLUTION_SUCEEDED:
1248                     sm_connection->sm_irk_lookup_state = IRK_LOOKUP_SUCCEEDED;
1249                     sm_connection->sm_le_db_index = matched_device_id;
1250                     log_info("ADDRESS_RESOLUTION_SUCEEDED, index %d", sm_connection->sm_le_db_index);
1251                     if (sm_connection->sm_role) {
1252                         // LTK request received before, IRK required -> start LTK calculation
1253                         if (sm_connection->sm_engine_state == SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK){
1254                             sm_connection->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST;
1255                         }
1256                         break;
1257                     }
1258 #ifdef ENABLE_LE_CENTRAL
1259                     if (!sm_connection->sm_bonding_requested && !sm_connection->sm_security_request_received) break;
1260                     sm_connection->sm_security_request_received = 0;
1261                     sm_connection->sm_bonding_requested = 0;
1262                     le_device_db_encryption_get(sm_connection->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL);
1263                     if (!sm_is_null_key(ltk)){
1264                         sm_connection->sm_engine_state = SM_INITIATOR_PH0_HAS_LTK;
1265                     } else {
1266                         sm_connection->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
1267                     }
1268 #endif
1269                     break;
1270                 case ADDRESS_RESOLUTION_FAILED:
1271                     sm_connection->sm_irk_lookup_state = IRK_LOOKUP_FAILED;
1272                     if (sm_connection->sm_role) {
1273                         // LTK request received before, IRK required -> negative LTK reply
1274                         if (sm_connection->sm_engine_state == SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK){
1275                             sm_connection->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY;
1276                         }
1277                         break;
1278                     }
1279 #ifdef ENABLE_LE_CENTRAL
1280                     if (!sm_connection->sm_bonding_requested && !sm_connection->sm_security_request_received) break;
1281                     sm_connection->sm_security_request_received = 0;
1282                     sm_connection->sm_bonding_requested = 0;
1283                     sm_connection->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
1284 #endif
1285                     break;
1286             }
1287             break;
1288         default:
1289             break;
1290     }
1291 
1292     switch (event){
1293         case ADDRESS_RESOLUTION_SUCEEDED:
1294             sm_notify_client_index(SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED, con_handle, sm_address_resolution_addr_type, sm_address_resolution_address, matched_device_id);
1295             break;
1296         case ADDRESS_RESOLUTION_FAILED:
1297             sm_notify_client_base(SM_EVENT_IDENTITY_RESOLVING_FAILED, con_handle, sm_address_resolution_addr_type, sm_address_resolution_address);
1298             break;
1299     }
1300 }
1301 
1302 static void sm_key_distribution_handle_all_received(sm_connection_t * sm_conn){
1303 
1304     int le_db_index = -1;
1305 
1306     // lookup device based on IRK
1307     if (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_IDENTITY_INFORMATION){
1308         int i;
1309         for (i=0; i < le_device_db_count(); i++){
1310             sm_key_t irk;
1311             bd_addr_t address;
1312             int address_type;
1313             le_device_db_info(i, &address_type, address, irk);
1314             if (memcmp(irk, setup->sm_peer_irk, 16) == 0){
1315                 log_info("sm: device found for IRK, updating");
1316                 le_db_index = i;
1317                 break;
1318             }
1319         }
1320     }
1321 
1322     // if not found, lookup via public address if possible
1323     log_info("sm peer addr type %u, peer addres %s", setup->sm_peer_addr_type, bd_addr_to_str(setup->sm_peer_address));
1324     if (le_db_index < 0 && setup->sm_peer_addr_type == BD_ADDR_TYPE_LE_PUBLIC){
1325         int i;
1326         for (i=0; i < le_device_db_count(); i++){
1327             bd_addr_t address;
1328             int address_type;
1329             le_device_db_info(i, &address_type, address, NULL);
1330             log_info("device %u, sm peer addr type %u, peer addres %s", i, address_type, bd_addr_to_str(address));
1331             if (address_type == BD_ADDR_TYPE_LE_PUBLIC && memcmp(address, setup->sm_peer_address, 6) == 0){
1332                 log_info("sm: device found for public address, updating");
1333                 le_db_index = i;
1334                 break;
1335             }
1336         }
1337     }
1338 
1339     // if not found, add to db
1340     if (le_db_index < 0) {
1341         le_db_index = le_device_db_add(setup->sm_peer_addr_type, setup->sm_peer_address, setup->sm_peer_irk);
1342     }
1343 
1344     if (le_db_index >= 0){
1345 
1346         sm_notify_client_index(SM_EVENT_IDENTITY_CREATED, sm_conn->sm_handle, setup->sm_peer_addr_type, setup->sm_peer_address, le_db_index);
1347 
1348 #ifdef ENABLE_LE_SIGNED_WRITE
1349         // store local CSRK
1350         if (setup->sm_key_distribution_send_set & SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){
1351             log_info("sm: store local CSRK");
1352             le_device_db_local_csrk_set(le_db_index, setup->sm_local_csrk);
1353             le_device_db_local_counter_set(le_db_index, 0);
1354         }
1355 
1356         // store remote CSRK
1357         if (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){
1358             log_info("sm: store remote CSRK");
1359             le_device_db_remote_csrk_set(le_db_index, setup->sm_peer_csrk);
1360             le_device_db_remote_counter_set(le_db_index, 0);
1361         }
1362 #endif
1363         // store encryption information for secure connections: LTK generated by ECDH
1364         if (setup->sm_use_secure_connections){
1365             log_info("sm: store SC LTK (key size %u, authenticated %u)", sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated);
1366             uint8_t zero_rand[8];
1367             memset(zero_rand, 0, 8);
1368             le_device_db_encryption_set(le_db_index, 0, zero_rand, setup->sm_ltk, sm_conn->sm_actual_encryption_key_size,
1369                 sm_conn->sm_connection_authenticated, sm_conn->sm_connection_authorization_state == AUTHORIZATION_GRANTED);
1370         }
1371 
1372         // store encryption information for legacy pairing: peer LTK, EDIV, RAND
1373         else if ( (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION)
1374                && (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_MASTER_IDENTIFICATION )){
1375             log_info("sm: set encryption information (key size %u, authenticated %u)", sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated);
1376             le_device_db_encryption_set(le_db_index, setup->sm_peer_ediv, setup->sm_peer_rand, setup->sm_peer_ltk,
1377                 sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated, sm_conn->sm_connection_authorization_state == AUTHORIZATION_GRANTED);
1378 
1379         }
1380     }
1381 
1382     // keep le_db_index
1383     sm_conn->sm_le_db_index = le_db_index;
1384 }
1385 
1386 static void sm_pairing_error(sm_connection_t * sm_conn, uint8_t reason){
1387     setup->sm_pairing_failed_reason = reason;
1388     sm_conn->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
1389 }
1390 
1391 static inline void sm_pdu_received_in_wrong_state(sm_connection_t * sm_conn){
1392     sm_pairing_error(sm_conn, SM_REASON_UNSPECIFIED_REASON);
1393 }
1394 
1395 #ifdef ENABLE_LE_SECURE_CONNECTIONS
1396 
1397 static void sm_sc_prepare_dhkey_check(sm_connection_t * sm_conn);
1398 static int sm_passkey_used(stk_generation_method_t method);
1399 static int sm_just_works_or_numeric_comparison(stk_generation_method_t method);
1400 
1401 static void sm_log_ec_keypair(void){
1402     log_info("Elliptic curve: X");
1403     log_info_hexdump(&ec_q[0],32);
1404     log_info("Elliptic curve: Y");
1405     log_info_hexdump(&ec_q[32],32);
1406 }
1407 
1408 static void sm_sc_start_calculating_local_confirm(sm_connection_t * sm_conn){
1409     if (sm_passkey_used(setup->sm_stk_generation_method)){
1410         sm_conn->sm_engine_state = SM_SC_W2_GET_RANDOM_A;
1411     } else {
1412         sm_conn->sm_engine_state = SM_SC_W2_CMAC_FOR_CONFIRMATION;
1413     }
1414 }
1415 
1416 static void sm_sc_state_after_receiving_random(sm_connection_t * sm_conn){
1417     if (IS_RESPONDER(sm_conn->sm_role)){
1418         // Responder
1419         sm_conn->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM;
1420     } else {
1421         // Initiator role
1422         switch (setup->sm_stk_generation_method){
1423             case JUST_WORKS:
1424                 sm_sc_prepare_dhkey_check(sm_conn);
1425                 break;
1426 
1427             case NK_BOTH_INPUT:
1428                 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_G2;
1429                 break;
1430             case PK_INIT_INPUT:
1431             case PK_RESP_INPUT:
1432             case OK_BOTH_INPUT:
1433                 if (setup->sm_passkey_bit < 20) {
1434                     sm_sc_start_calculating_local_confirm(sm_conn);
1435                 } else {
1436                     sm_sc_prepare_dhkey_check(sm_conn);
1437                 }
1438                 break;
1439             case OOB:
1440                 // TODO: implement SC OOB
1441                 break;
1442         }
1443     }
1444 }
1445 
1446 static uint8_t sm_sc_cmac_get_byte(uint16_t offset){
1447     return sm_cmac_sc_buffer[offset];
1448 }
1449 
1450 static void sm_sc_cmac_done(uint8_t * hash){
1451     log_info("sm_sc_cmac_done: ");
1452     log_info_hexdump(hash, 16);
1453 
1454     sm_connection_t * sm_conn = sm_cmac_connection;
1455     sm_cmac_connection = NULL;
1456 #ifdef ENABLE_CLASSIC
1457     link_key_type_t link_key_type;
1458 #endif
1459 
1460     switch (sm_conn->sm_engine_state){
1461         case SM_SC_W4_CMAC_FOR_CONFIRMATION:
1462             memcpy(setup->sm_local_confirm, hash, 16);
1463             sm_conn->sm_engine_state = SM_SC_SEND_CONFIRMATION;
1464             break;
1465         case SM_SC_W4_CMAC_FOR_CHECK_CONFIRMATION:
1466             // check
1467             if (0 != memcmp(hash, setup->sm_peer_confirm, 16)){
1468                 sm_pairing_error(sm_conn, SM_REASON_CONFIRM_VALUE_FAILED);
1469                 break;
1470             }
1471             sm_sc_state_after_receiving_random(sm_conn);
1472             break;
1473         case SM_SC_W4_CALCULATE_G2: {
1474             uint32_t vab = big_endian_read_32(hash, 12) % 1000000;
1475             big_endian_store_32(setup->sm_tk, 12, vab);
1476             sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE;
1477             sm_trigger_user_response(sm_conn);
1478             break;
1479         }
1480         case SM_SC_W4_CALCULATE_F5_SALT:
1481             memcpy(setup->sm_t, hash, 16);
1482             sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_MACKEY;
1483             break;
1484         case SM_SC_W4_CALCULATE_F5_MACKEY:
1485             memcpy(setup->sm_mackey, hash, 16);
1486             sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_LTK;
1487             break;
1488         case SM_SC_W4_CALCULATE_F5_LTK:
1489             // truncate sm_ltk, but keep full LTK for cross-transport key derivation in sm_local_ltk
1490             // Errata Service Release to the Bluetooth Specification: ESR09
1491             //   E6405 – Cross transport key derivation from a key of size less than 128 bits
1492             //   Note: When the BR/EDR link key is being derived from the LTK, the derivation is done before the LTK gets masked."
1493             memcpy(setup->sm_ltk, hash, 16);
1494             memcpy(setup->sm_local_ltk, hash, 16);
1495             sm_truncate_key(setup->sm_ltk, sm_conn->sm_actual_encryption_key_size);
1496             sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK;
1497             break;
1498         case SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK:
1499             memcpy(setup->sm_local_dhkey_check, hash, 16);
1500             if (IS_RESPONDER(sm_conn->sm_role)){
1501                 // responder
1502                 if (setup->sm_state_vars & SM_STATE_VAR_DHKEY_COMMAND_RECEIVED){
1503                     sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK;
1504                 } else {
1505                     sm_conn->sm_engine_state = SM_SC_W4_DHKEY_CHECK_COMMAND;
1506                 }
1507             } else {
1508                 sm_conn->sm_engine_state = SM_SC_SEND_DHKEY_CHECK_COMMAND;
1509             }
1510             break;
1511         case SM_SC_W4_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK:
1512             if (0 != memcmp(hash, setup->sm_peer_dhkey_check, 16) ){
1513                 sm_pairing_error(sm_conn, SM_REASON_DHKEY_CHECK_FAILED);
1514                 break;
1515             }
1516             if (IS_RESPONDER(sm_conn->sm_role)){
1517                 // responder
1518                 sm_conn->sm_engine_state = SM_SC_SEND_DHKEY_CHECK_COMMAND;
1519             } else {
1520                 // initiator
1521                 sm_conn->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION;
1522             }
1523             break;
1524         case SM_SC_W4_CALCULATE_H6_ILK:
1525             memcpy(setup->sm_t, hash, 16);
1526             sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_H6_BR_EDR_LINK_KEY;
1527             break;
1528         case SM_SC_W4_CALCULATE_H6_BR_EDR_LINK_KEY:
1529 #ifdef ENABLE_CLASSIC
1530             reverse_128(hash, setup->sm_t);
1531             link_key_type = sm_conn->sm_connection_authenticated ?
1532                 AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256 : UNAUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256;
1533             log_info("Derived classic link key from LE using h6, type %u", (int) link_key_type);
1534             if (IS_RESPONDER(sm_conn->sm_role)){
1535                 gap_store_link_key_for_bd_addr(setup->sm_m_address, setup->sm_t, link_key_type);
1536             } else {
1537                 gap_store_link_key_for_bd_addr(setup->sm_s_address, setup->sm_t, link_key_type);
1538             }
1539 #endif
1540             if (IS_RESPONDER(sm_conn->sm_role)){
1541                 sm_conn->sm_engine_state = SM_RESPONDER_IDLE;
1542             } else {
1543                 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED;
1544             }
1545             sm_done_for_handle(sm_conn->sm_handle);
1546             break;
1547         default:
1548             log_error("sm_sc_cmac_done in state %u", sm_conn->sm_engine_state);
1549             break;
1550     }
1551     sm_run();
1552 }
1553 
1554 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){
1555     const uint16_t message_len = 65;
1556     sm_cmac_connection = sm_conn;
1557     memcpy(sm_cmac_sc_buffer, u, 32);
1558     memcpy(sm_cmac_sc_buffer+32, v, 32);
1559     sm_cmac_sc_buffer[64] = z;
1560     log_info("f4 key");
1561     log_info_hexdump(x, 16);
1562     log_info("f4 message");
1563     log_info_hexdump(sm_cmac_sc_buffer, message_len);
1564     sm_cmac_general_start(x, message_len, &sm_sc_cmac_get_byte, &sm_sc_cmac_done);
1565 }
1566 
1567 static const sm_key_t f5_salt = { 0x6C ,0x88, 0x83, 0x91, 0xAA, 0xF5, 0xA5, 0x38, 0x60, 0x37, 0x0B, 0xDB, 0x5A, 0x60, 0x83, 0xBE};
1568 static const uint8_t f5_key_id[] = { 0x62, 0x74, 0x6c, 0x65 };
1569 static const uint8_t f5_length[] = { 0x01, 0x00};
1570 
1571 #ifdef USE_SOFTWARE_ECDH_IMPLEMENTATION
1572 
1573 static void sm_sc_calculate_dhkey(sm_key256_t dhkey){
1574     memset(dhkey, 0, 32);
1575 
1576 #ifdef USE_MICRO_ECC_FOR_ECDH
1577 #if uECC_SUPPORTS_secp256r1
1578     // standard version
1579     uECC_shared_secret(setup->sm_peer_q, ec_d, dhkey, uECC_secp256r1());
1580 #else
1581     // static version
1582     uECC_shared_secret(setup->sm_peer_q, ec_d, dhkey);
1583 #endif
1584 #endif
1585 
1586 #ifdef USE_MBEDTLS_FOR_ECDH
1587     // da * Pb
1588     mbedtls_mpi d;
1589     mbedtls_ecp_point Q;
1590     mbedtls_ecp_point DH;
1591     mbedtls_mpi_init(&d);
1592     mbedtls_ecp_point_init(&Q);
1593     mbedtls_ecp_point_init(&DH);
1594     mbedtls_mpi_read_binary(&d, ec_d, 32);
1595     mbedtls_mpi_read_binary(&Q.X, &setup->sm_peer_q[0] , 32);
1596     mbedtls_mpi_read_binary(&Q.Y, &setup->sm_peer_q[32], 32);
1597     mbedtls_mpi_lset(&Q.Z, 1);
1598     mbedtls_ecp_mul(&mbedtls_ec_group, &DH, &d, &Q, NULL, NULL);
1599     mbedtls_mpi_write_binary(&DH.X, dhkey, 32);
1600     mbedtls_ecp_point_free(&DH);
1601     mbedtls_mpi_free(&d);
1602     mbedtls_ecp_point_free(&Q);
1603 #endif
1604 
1605     log_info("dhkey");
1606     log_info_hexdump(dhkey, 32);
1607 }
1608 #endif
1609 
1610 static void f5_calculate_salt(sm_connection_t * sm_conn){
1611     // calculate salt for f5
1612     const uint16_t message_len = 32;
1613     sm_cmac_connection = sm_conn;
1614     memcpy(sm_cmac_sc_buffer, setup->sm_dhkey, message_len);
1615     sm_cmac_general_start(f5_salt, message_len, &sm_sc_cmac_get_byte, &sm_sc_cmac_done);
1616 }
1617 
1618 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){
1619     const uint16_t message_len = 53;
1620     sm_cmac_connection = sm_conn;
1621 
1622     // f5(W, N1, N2, A1, A2) = AES-CMACT (Counter = 0 || keyID || N1 || N2|| A1|| A2 || Length = 256) -- this is the MacKey
1623     sm_cmac_sc_buffer[0] = 0;
1624     memcpy(sm_cmac_sc_buffer+01, f5_key_id, 4);
1625     memcpy(sm_cmac_sc_buffer+05, n1, 16);
1626     memcpy(sm_cmac_sc_buffer+21, n2, 16);
1627     memcpy(sm_cmac_sc_buffer+37, a1, 7);
1628     memcpy(sm_cmac_sc_buffer+44, a2, 7);
1629     memcpy(sm_cmac_sc_buffer+51, f5_length, 2);
1630     log_info("f5 key");
1631     log_info_hexdump(t, 16);
1632     log_info("f5 message for MacKey");
1633     log_info_hexdump(sm_cmac_sc_buffer, message_len);
1634     sm_cmac_general_start(t, message_len, &sm_sc_cmac_get_byte, &sm_sc_cmac_done);
1635 }
1636 
1637 static void f5_calculate_mackey(sm_connection_t * sm_conn){
1638     sm_key56_t bd_addr_master, bd_addr_slave;
1639     bd_addr_master[0] =  setup->sm_m_addr_type;
1640     bd_addr_slave[0]  =  setup->sm_s_addr_type;
1641     memcpy(&bd_addr_master[1], setup->sm_m_address, 6);
1642     memcpy(&bd_addr_slave[1],  setup->sm_s_address, 6);
1643     if (IS_RESPONDER(sm_conn->sm_role)){
1644         // responder
1645         f5_mackkey(sm_conn, setup->sm_t, setup->sm_peer_nonce, setup->sm_local_nonce, bd_addr_master, bd_addr_slave);
1646     } else {
1647         // initiator
1648         f5_mackkey(sm_conn, setup->sm_t, setup->sm_local_nonce, setup->sm_peer_nonce, bd_addr_master, bd_addr_slave);
1649     }
1650 }
1651 
1652 // note: must be called right after f5_mackey, as sm_cmac_buffer[1..52] will be reused
1653 static inline void f5_ltk(sm_connection_t * sm_conn, sm_key_t t){
1654     const uint16_t message_len = 53;
1655     sm_cmac_connection = sm_conn;
1656     sm_cmac_sc_buffer[0] = 1;
1657     // 1..52 setup before
1658     log_info("f5 key");
1659     log_info_hexdump(t, 16);
1660     log_info("f5 message for LTK");
1661     log_info_hexdump(sm_cmac_sc_buffer, message_len);
1662     sm_cmac_general_start(t, message_len, &sm_sc_cmac_get_byte, &sm_sc_cmac_done);
1663 }
1664 
1665 static void f5_calculate_ltk(sm_connection_t * sm_conn){
1666     f5_ltk(sm_conn, setup->sm_t);
1667 }
1668 
1669 static void f6_engine(sm_connection_t * sm_conn, const sm_key_t w, 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){
1670     const uint16_t message_len = 65;
1671     sm_cmac_connection = sm_conn;
1672     memcpy(sm_cmac_sc_buffer, n1, 16);
1673     memcpy(sm_cmac_sc_buffer+16, n2, 16);
1674     memcpy(sm_cmac_sc_buffer+32, r, 16);
1675     memcpy(sm_cmac_sc_buffer+48, io_cap, 3);
1676     memcpy(sm_cmac_sc_buffer+51, a1, 7);
1677     memcpy(sm_cmac_sc_buffer+58, a2, 7);
1678     log_info("f6 key");
1679     log_info_hexdump(w, 16);
1680     log_info("f6 message");
1681     log_info_hexdump(sm_cmac_sc_buffer, message_len);
1682     sm_cmac_general_start(w, 65, &sm_sc_cmac_get_byte, &sm_sc_cmac_done);
1683 }
1684 
1685 // g2(U, V, X, Y) = AES-CMACX(U || V || Y) mod 2^32
1686 // - U is 256 bits
1687 // - V is 256 bits
1688 // - X is 128 bits
1689 // - Y is 128 bits
1690 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){
1691     const uint16_t message_len = 80;
1692     sm_cmac_connection = sm_conn;
1693     memcpy(sm_cmac_sc_buffer, u, 32);
1694     memcpy(sm_cmac_sc_buffer+32, v, 32);
1695     memcpy(sm_cmac_sc_buffer+64, y, 16);
1696     log_info("g2 key");
1697     log_info_hexdump(x, 16);
1698     log_info("g2 message");
1699     log_info_hexdump(sm_cmac_sc_buffer, message_len);
1700     sm_cmac_general_start(x, message_len, &sm_sc_cmac_get_byte, &sm_sc_cmac_done);
1701 }
1702 
1703 static void g2_calculate(sm_connection_t * sm_conn) {
1704     // calc Va if numeric comparison
1705     if (IS_RESPONDER(sm_conn->sm_role)){
1706         // responder
1707         g2_engine(sm_conn, setup->sm_peer_q, ec_q, setup->sm_peer_nonce, setup->sm_local_nonce);;
1708     } else {
1709         // initiator
1710         g2_engine(sm_conn, ec_q, setup->sm_peer_q, setup->sm_local_nonce, setup->sm_peer_nonce);
1711     }
1712 }
1713 
1714 static void sm_sc_calculate_local_confirm(sm_connection_t * sm_conn){
1715     uint8_t z = 0;
1716     if (setup->sm_stk_generation_method != JUST_WORKS && setup->sm_stk_generation_method != NK_BOTH_INPUT){
1717         // some form of passkey
1718         uint32_t pk = big_endian_read_32(setup->sm_tk, 12);
1719         z = 0x80 | ((pk >> setup->sm_passkey_bit) & 1);
1720         setup->sm_passkey_bit++;
1721     }
1722     f4_engine(sm_conn, ec_q, setup->sm_peer_q, setup->sm_local_nonce, z);
1723 }
1724 
1725 static void sm_sc_calculate_remote_confirm(sm_connection_t * sm_conn){
1726     uint8_t z = 0;
1727     if (setup->sm_stk_generation_method != JUST_WORKS && setup->sm_stk_generation_method != NK_BOTH_INPUT){
1728         // some form of passkey
1729         uint32_t pk = big_endian_read_32(setup->sm_tk, 12);
1730         // sm_passkey_bit was increased before sending confirm value
1731         z = 0x80 | ((pk >> (setup->sm_passkey_bit-1)) & 1);
1732     }
1733     f4_engine(sm_conn, setup->sm_peer_q, ec_q, setup->sm_peer_nonce, z);
1734 }
1735 
1736 static void sm_sc_prepare_dhkey_check(sm_connection_t * sm_conn){
1737 
1738 #ifdef USE_SOFTWARE_ECDH_IMPLEMENTATION
1739     // calculate DHKEY
1740     sm_sc_calculate_dhkey(setup->sm_dhkey);
1741     setup->sm_state_vars |= SM_STATE_VAR_DHKEY_CALCULATED;
1742 #endif
1743 
1744     if (setup->sm_state_vars & SM_STATE_VAR_DHKEY_CALCULATED){
1745         sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_SALT;
1746         return;
1747     } else {
1748         sm_conn->sm_engine_state = SM_SC_W4_CALCULATE_DHKEY;
1749     }
1750 
1751 }
1752 
1753 static void sm_sc_calculate_f6_for_dhkey_check(sm_connection_t * sm_conn){
1754     // calculate DHKCheck
1755     sm_key56_t bd_addr_master, bd_addr_slave;
1756     bd_addr_master[0] =  setup->sm_m_addr_type;
1757     bd_addr_slave[0]  =  setup->sm_s_addr_type;
1758     memcpy(&bd_addr_master[1], setup->sm_m_address, 6);
1759     memcpy(&bd_addr_slave[1],  setup->sm_s_address, 6);
1760     uint8_t iocap_a[3];
1761     iocap_a[0] = sm_pairing_packet_get_auth_req(setup->sm_m_preq);
1762     iocap_a[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq);
1763     iocap_a[2] = sm_pairing_packet_get_io_capability(setup->sm_m_preq);
1764     uint8_t iocap_b[3];
1765     iocap_b[0] = sm_pairing_packet_get_auth_req(setup->sm_s_pres);
1766     iocap_b[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres);
1767     iocap_b[2] = sm_pairing_packet_get_io_capability(setup->sm_s_pres);
1768     if (IS_RESPONDER(sm_conn->sm_role)){
1769         // responder
1770         f6_engine(sm_conn, setup->sm_mackey, setup->sm_local_nonce, setup->sm_peer_nonce, setup->sm_ra, iocap_b, bd_addr_slave, bd_addr_master);
1771     } else {
1772         // initiator
1773         f6_engine(sm_conn, setup->sm_mackey, setup->sm_local_nonce, setup->sm_peer_nonce, setup->sm_rb, iocap_a, bd_addr_master, bd_addr_slave);
1774     }
1775 }
1776 
1777 static void sm_sc_calculate_f6_to_verify_dhkey_check(sm_connection_t * sm_conn){
1778     // validate E = f6()
1779     sm_key56_t bd_addr_master, bd_addr_slave;
1780     bd_addr_master[0] =  setup->sm_m_addr_type;
1781     bd_addr_slave[0]  =  setup->sm_s_addr_type;
1782     memcpy(&bd_addr_master[1], setup->sm_m_address, 6);
1783     memcpy(&bd_addr_slave[1],  setup->sm_s_address, 6);
1784 
1785     uint8_t iocap_a[3];
1786     iocap_a[0] = sm_pairing_packet_get_auth_req(setup->sm_m_preq);
1787     iocap_a[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_m_preq);
1788     iocap_a[2] = sm_pairing_packet_get_io_capability(setup->sm_m_preq);
1789     uint8_t iocap_b[3];
1790     iocap_b[0] = sm_pairing_packet_get_auth_req(setup->sm_s_pres);
1791     iocap_b[1] = sm_pairing_packet_get_oob_data_flag(setup->sm_s_pres);
1792     iocap_b[2] = sm_pairing_packet_get_io_capability(setup->sm_s_pres);
1793     if (IS_RESPONDER(sm_conn->sm_role)){
1794         // responder
1795         f6_engine(sm_conn, setup->sm_mackey, setup->sm_peer_nonce, setup->sm_local_nonce, setup->sm_rb, iocap_a, bd_addr_master, bd_addr_slave);
1796     } else {
1797         // initiator
1798         f6_engine(sm_conn, setup->sm_mackey, setup->sm_peer_nonce, setup->sm_local_nonce, setup->sm_ra, iocap_b, bd_addr_slave, bd_addr_master);
1799     }
1800 }
1801 
1802 
1803 //
1804 // Link Key Conversion Function h6
1805 //
1806 // h6(W, keyID) = AES-CMACW(keyID)
1807 // - W is 128 bits
1808 // - keyID is 32 bits
1809 static void h6_engine(sm_connection_t * sm_conn, const sm_key_t w, const uint32_t key_id){
1810     const uint16_t message_len = 4;
1811     sm_cmac_connection = sm_conn;
1812     big_endian_store_32(sm_cmac_sc_buffer, 0, key_id);
1813     log_info("h6 key");
1814     log_info_hexdump(w, 16);
1815     log_info("h6 message");
1816     log_info_hexdump(sm_cmac_sc_buffer, message_len);
1817     sm_cmac_general_start(w, message_len, &sm_sc_cmac_get_byte, &sm_sc_cmac_done);
1818 }
1819 
1820 // For SC, setup->sm_local_ltk holds full LTK (sm_ltk is already truncated)
1821 // Errata Service Release to the Bluetooth Specification: ESR09
1822 //   E6405 – Cross transport key derivation from a key of size less than 128 bits
1823 //   "Note: When the BR/EDR link key is being derived from the LTK, the derivation is done before the LTK gets masked."
1824 static void h6_calculate_ilk(sm_connection_t * sm_conn){
1825     h6_engine(sm_conn, setup->sm_local_ltk, 0x746D7031);    // "tmp1"
1826 }
1827 
1828 static void h6_calculate_br_edr_link_key(sm_connection_t * sm_conn){
1829     h6_engine(sm_conn, setup->sm_t, 0x6c656272);    // "lebr"
1830 }
1831 
1832 #endif
1833 
1834 // key management legacy connections:
1835 // - potentially two different LTKs based on direction. each device stores LTK provided by peer
1836 // - master stores LTK, EDIV, RAND. responder optionally stored master LTK (only if it needs to reconnect)
1837 // - initiators reconnects: initiator uses stored LTK, EDIV, RAND generated by responder
1838 // - responder  reconnects: responder uses LTK receveived from master
1839 
1840 // key management secure connections:
1841 // - both devices store same LTK from ECDH key exchange.
1842 
1843 #if defined(ENABLE_LE_SECURE_CONNECTIONS) || defined(ENABLE_LE_CENTRAL)
1844 static void sm_load_security_info(sm_connection_t * sm_connection){
1845     int encryption_key_size;
1846     int authenticated;
1847     int authorized;
1848 
1849     // fetch data from device db - incl. authenticated/authorized/key size. Note all sm_connection_X require encryption enabled
1850     le_device_db_encryption_get(sm_connection->sm_le_db_index, &setup->sm_peer_ediv, setup->sm_peer_rand, setup->sm_peer_ltk,
1851                                 &encryption_key_size, &authenticated, &authorized);
1852     log_info("db index %u, key size %u, authenticated %u, authorized %u", sm_connection->sm_le_db_index, encryption_key_size, authenticated, authorized);
1853     sm_connection->sm_actual_encryption_key_size = encryption_key_size;
1854     sm_connection->sm_connection_authenticated = authenticated;
1855     sm_connection->sm_connection_authorization_state = authorized ? AUTHORIZATION_GRANTED : AUTHORIZATION_UNKNOWN;
1856 }
1857 #endif
1858 
1859 #ifdef ENABLE_LE_PERIPHERAL
1860 static void sm_start_calculating_ltk_from_ediv_and_rand(sm_connection_t * sm_connection){
1861     memcpy(setup->sm_local_rand, sm_connection->sm_local_rand, 8);
1862     setup->sm_local_ediv = sm_connection->sm_local_ediv;
1863     // re-establish used key encryption size
1864     // no db for encryption size hack: encryption size is stored in lowest nibble of setup->sm_local_rand
1865     sm_connection->sm_actual_encryption_key_size = (setup->sm_local_rand[7] & 0x0f) + 1;
1866     // no db for authenticated flag hack: flag is stored in bit 4 of LSB
1867     sm_connection->sm_connection_authenticated = (setup->sm_local_rand[7] & 0x10) >> 4;
1868     log_info("sm: received ltk request with key size %u, authenticated %u",
1869             sm_connection->sm_actual_encryption_key_size, sm_connection->sm_connection_authenticated);
1870     sm_connection->sm_engine_state = SM_RESPONDER_PH4_Y_GET_ENC;
1871 }
1872 #endif
1873 
1874 static void sm_run(void){
1875 
1876     btstack_linked_list_iterator_t it;
1877 
1878     // assert that stack has already bootet
1879     if (hci_get_state() != HCI_STATE_WORKING) return;
1880 
1881     // assert that we can send at least commands
1882     if (!hci_can_send_command_packet_now()) return;
1883 
1884     //
1885     // non-connection related behaviour
1886     //
1887 
1888     // distributed key generation
1889     switch (dkg_state){
1890         case DKG_CALC_IRK:
1891             // already busy?
1892             if (sm_aes128_state == SM_AES128_IDLE) {
1893                 // IRK = d1(IR, 1, 0)
1894                 sm_key_t d1_prime;
1895                 sm_d1_d_prime(1, 0, d1_prime);  // plaintext
1896                 dkg_next_state();
1897                 sm_aes128_start(sm_persistent_ir, d1_prime, NULL);
1898                 return;
1899             }
1900             break;
1901         case DKG_CALC_DHK:
1902             // already busy?
1903             if (sm_aes128_state == SM_AES128_IDLE) {
1904                 // DHK = d1(IR, 3, 0)
1905                 sm_key_t d1_prime;
1906                 sm_d1_d_prime(3, 0, d1_prime);  // plaintext
1907                 dkg_next_state();
1908                 sm_aes128_start(sm_persistent_ir, d1_prime, NULL);
1909                 return;
1910             }
1911             break;
1912         default:
1913             break;
1914     }
1915 
1916 #ifdef ENABLE_LE_SECURE_CONNECTIONS
1917     if (ec_key_generation_state == EC_KEY_GENERATION_ACTIVE){
1918 #ifdef USE_SOFTWARE_ECDH_IMPLEMENTATION
1919         sm_random_start(NULL);
1920 #else
1921         ec_key_generation_state = EC_KEY_GENERATION_W4_KEY;
1922         hci_send_cmd(&hci_le_read_local_p256_public_key);
1923 #endif
1924         return;
1925     }
1926 #endif
1927 
1928     // random address updates
1929     switch (rau_state){
1930         case RAU_GET_RANDOM:
1931             rau_next_state();
1932             sm_random_start(NULL);
1933             return;
1934         case RAU_GET_ENC:
1935             // already busy?
1936             if (sm_aes128_state == SM_AES128_IDLE) {
1937                 sm_key_t r_prime;
1938                 sm_ah_r_prime(sm_random_address, r_prime);
1939                 rau_next_state();
1940                 sm_aes128_start(sm_persistent_irk, r_prime, NULL);
1941                 return;
1942             }
1943             break;
1944         case RAU_SET_ADDRESS:
1945             log_info("New random address: %s", bd_addr_to_str(sm_random_address));
1946             rau_state = RAU_IDLE;
1947             hci_send_cmd(&hci_le_set_random_address, sm_random_address);
1948             return;
1949         default:
1950             break;
1951     }
1952 
1953 #ifdef ENABLE_CMAC_ENGINE
1954     // CMAC
1955     switch (sm_cmac_state){
1956         case CMAC_CALC_SUBKEYS:
1957         case CMAC_CALC_MI:
1958         case CMAC_CALC_MLAST:
1959             // already busy?
1960             if (sm_aes128_state == SM_AES128_ACTIVE) break;
1961             sm_cmac_handle_aes_engine_ready();
1962             return;
1963         default:
1964             break;
1965     }
1966 #endif
1967 
1968     // CSRK Lookup
1969     // -- if csrk lookup ready, find connection that require csrk lookup
1970     if (sm_address_resolution_idle()){
1971         hci_connections_get_iterator(&it);
1972         while(btstack_linked_list_iterator_has_next(&it)){
1973             hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
1974             sm_connection_t  * sm_connection  = &hci_connection->sm_connection;
1975             if (sm_connection->sm_irk_lookup_state == IRK_LOOKUP_W4_READY){
1976                 // and start lookup
1977                 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);
1978                 sm_connection->sm_irk_lookup_state = IRK_LOOKUP_STARTED;
1979                 break;
1980             }
1981         }
1982     }
1983 
1984     // -- if csrk lookup ready, resolved addresses for received addresses
1985     if (sm_address_resolution_idle()) {
1986         if (!btstack_linked_list_empty(&sm_address_resolution_general_queue)){
1987             sm_lookup_entry_t * entry = (sm_lookup_entry_t *) sm_address_resolution_general_queue;
1988             btstack_linked_list_remove(&sm_address_resolution_general_queue, (btstack_linked_item_t *) entry);
1989             sm_address_resolution_start_lookup(entry->address_type, 0, entry->address, ADDRESS_RESOLUTION_GENERAL, NULL);
1990             btstack_memory_sm_lookup_entry_free(entry);
1991         }
1992     }
1993 
1994     // -- Continue with CSRK device lookup by public or resolvable private address
1995     if (!sm_address_resolution_idle()){
1996         log_info("LE Device Lookup: device %u/%u", sm_address_resolution_test, le_device_db_count());
1997         while (sm_address_resolution_test < le_device_db_count()){
1998             int addr_type;
1999             bd_addr_t addr;
2000             sm_key_t irk;
2001             le_device_db_info(sm_address_resolution_test, &addr_type, addr, irk);
2002             log_info("device type %u, addr: %s", addr_type, bd_addr_to_str(addr));
2003 
2004             if (sm_address_resolution_addr_type == addr_type && memcmp(addr, sm_address_resolution_address, 6) == 0){
2005                 log_info("LE Device Lookup: found CSRK by { addr_type, address} ");
2006                 sm_address_resolution_handle_event(ADDRESS_RESOLUTION_SUCEEDED);
2007                 break;
2008             }
2009 
2010             if (sm_address_resolution_addr_type == 0){
2011                 sm_address_resolution_test++;
2012                 continue;
2013             }
2014 
2015             if (sm_aes128_state == SM_AES128_ACTIVE) break;
2016 
2017             log_info("LE Device Lookup: calculate AH");
2018             log_info_key("IRK", irk);
2019 
2020             sm_key_t r_prime;
2021             sm_ah_r_prime(sm_address_resolution_address, r_prime);
2022             sm_address_resolution_ah_calculation_active = 1;
2023             sm_aes128_start(irk, r_prime, sm_address_resolution_context);   // keep context
2024             return;
2025         }
2026 
2027         if (sm_address_resolution_test >= le_device_db_count()){
2028             log_info("LE Device Lookup: not found");
2029             sm_address_resolution_handle_event(ADDRESS_RESOLUTION_FAILED);
2030         }
2031     }
2032 
2033     // handle basic actions that don't requires the full context
2034     hci_connections_get_iterator(&it);
2035     while((sm_active_connection_handle == HCI_CON_HANDLE_INVALID) && btstack_linked_list_iterator_has_next(&it)){
2036         hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
2037         sm_connection_t  * sm_connection = &hci_connection->sm_connection;
2038         switch(sm_connection->sm_engine_state){
2039             // responder side
2040             case SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY:
2041                 sm_connection->sm_engine_state = SM_RESPONDER_IDLE;
2042                 hci_send_cmd(&hci_le_long_term_key_negative_reply, sm_connection->sm_handle);
2043                 return;
2044 
2045 #ifdef ENABLE_LE_SECURE_CONNECTIONS
2046             case SM_SC_RECEIVED_LTK_REQUEST:
2047                 switch (sm_connection->sm_irk_lookup_state){
2048                     case IRK_LOOKUP_FAILED:
2049                         log_info("LTK Request: ediv & random are empty, but no stored LTK (IRK Lookup Failed)");
2050                         sm_connection->sm_engine_state = SM_RESPONDER_IDLE;
2051                         hci_send_cmd(&hci_le_long_term_key_negative_reply, sm_connection->sm_handle);
2052                         return;
2053                     default:
2054                         break;
2055                 }
2056                 break;
2057 #endif
2058             default:
2059                 break;
2060         }
2061     }
2062 
2063     //
2064     // active connection handling
2065     // -- use loop to handle next connection if lock on setup context is released
2066 
2067     while (1) {
2068 
2069         // Find connections that requires setup context and make active if no other is locked
2070         hci_connections_get_iterator(&it);
2071         while((sm_active_connection_handle == HCI_CON_HANDLE_INVALID) && btstack_linked_list_iterator_has_next(&it)){
2072             hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
2073             sm_connection_t  * sm_connection = &hci_connection->sm_connection;
2074             // - if no connection locked and we're ready/waiting for setup context, fetch it and start
2075             int done = 1;
2076             int err;
2077             UNUSED(err);
2078             switch (sm_connection->sm_engine_state) {
2079 #ifdef ENABLE_LE_PERIPHERAL
2080                 case SM_RESPONDER_SEND_SECURITY_REQUEST:
2081                     // send packet if possible,
2082                     if (l2cap_can_send_fixed_channel_packet_now(sm_connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL)){
2083                         const uint8_t buffer[2] = { SM_CODE_SECURITY_REQUEST, SM_AUTHREQ_BONDING};
2084                         sm_connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_REQUEST;
2085                         l2cap_send_connectionless(sm_connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2086                     } else {
2087                         l2cap_request_can_send_fix_channel_now_event(sm_connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
2088                     }
2089                     // don't lock sxetup context yet
2090                     done = 0;
2091                     break;
2092                 case SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED:
2093                     sm_reset_setup();
2094                     sm_init_setup(sm_connection);
2095                     // recover pairing request
2096                     memcpy(&setup->sm_m_preq, &sm_connection->sm_m_preq, sizeof(sm_pairing_packet_t));
2097                     err = sm_stk_generation_init(sm_connection);
2098                     if (err){
2099                         setup->sm_pairing_failed_reason = err;
2100                         sm_connection->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
2101                         break;
2102                     }
2103                     sm_timeout_start(sm_connection);
2104                     // generate random number first, if we need to show passkey
2105                     if (setup->sm_stk_generation_method == PK_INIT_INPUT){
2106                         sm_connection->sm_engine_state = SM_PH2_GET_RANDOM_TK;
2107                         break;
2108                     }
2109                     sm_connection->sm_engine_state = SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE;
2110                     break;
2111                 case SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST:
2112                     sm_reset_setup();
2113                     sm_start_calculating_ltk_from_ediv_and_rand(sm_connection);
2114                     break;
2115 #endif
2116 #ifdef ENABLE_LE_CENTRAL
2117                 case SM_INITIATOR_PH0_HAS_LTK:
2118                     sm_reset_setup();
2119                     sm_load_security_info(sm_connection);
2120                     sm_connection->sm_engine_state = SM_INITIATOR_PH0_SEND_START_ENCRYPTION;
2121                     break;
2122                 case SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST:
2123                     sm_reset_setup();
2124                     sm_init_setup(sm_connection);
2125                     sm_timeout_start(sm_connection);
2126                     sm_connection->sm_engine_state = SM_INITIATOR_PH1_SEND_PAIRING_REQUEST;
2127                     break;
2128 #endif
2129 
2130 #ifdef ENABLE_LE_SECURE_CONNECTIONS
2131                 case SM_SC_RECEIVED_LTK_REQUEST:
2132                     switch (sm_connection->sm_irk_lookup_state){
2133                         case IRK_LOOKUP_SUCCEEDED:
2134                             // assuming Secure Connection, we have a stored LTK and the EDIV/RAND are null
2135                             // start using context by loading security info
2136                             sm_reset_setup();
2137                             sm_load_security_info(sm_connection);
2138                             if (setup->sm_peer_ediv == 0 && sm_is_null_random(setup->sm_peer_rand) && !sm_is_null_key(setup->sm_peer_ltk)){
2139                                 memcpy(setup->sm_ltk, setup->sm_peer_ltk, 16);
2140                                 sm_connection->sm_engine_state = SM_RESPONDER_PH4_SEND_LTK_REPLY;
2141                                 break;
2142                             }
2143                             log_info("LTK Request: ediv & random are empty, but no stored LTK (IRK Lookup Succeeded)");
2144                             sm_connection->sm_engine_state = SM_RESPONDER_IDLE;
2145                             hci_send_cmd(&hci_le_long_term_key_negative_reply, sm_connection->sm_handle);
2146                             // don't lock setup context yet
2147                             return;
2148                         default:
2149                             // just wait until IRK lookup is completed
2150                             // don't lock setup context yet
2151                             done = 0;
2152                             break;
2153                     }
2154                     break;
2155 #endif
2156                 default:
2157                     done = 0;
2158                     break;
2159             }
2160             if (done){
2161                 sm_active_connection_handle = sm_connection->sm_handle;
2162                 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);
2163             }
2164         }
2165 
2166         //
2167         // active connection handling
2168         //
2169 
2170         if (sm_active_connection_handle == HCI_CON_HANDLE_INVALID) return;
2171 
2172         sm_connection_t * connection = sm_get_connection_for_handle(sm_active_connection_handle);
2173         if (!connection) {
2174             log_info("no connection for handle 0x%04x", sm_active_connection_handle);
2175             return;
2176         }
2177 
2178 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && !defined(USE_SOFTWARE_ECDH_IMPLEMENTATION)
2179         if (setup->sm_state_vars & SM_STATE_VAR_DHKEY_NEEDED){
2180             setup->sm_state_vars &= ~SM_STATE_VAR_DHKEY_NEEDED;
2181             hci_send_cmd(&hci_le_generate_dhkey, &setup->sm_peer_q[0], &setup->sm_peer_q[32]);
2182             return;
2183         }
2184 #endif
2185 
2186         // assert that we could send a SM PDU - not needed for all of the following
2187         if (!l2cap_can_send_fixed_channel_packet_now(sm_active_connection_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL)) {
2188             log_info("cannot send now, requesting can send now event");
2189             l2cap_request_can_send_fix_channel_now_event(sm_active_connection_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
2190             return;
2191         }
2192 
2193         // send keypress notifications
2194         if (setup->sm_keypress_notification != 0xff){
2195             uint8_t buffer[2];
2196             buffer[0] = SM_CODE_KEYPRESS_NOTIFICATION;
2197             buffer[1] = setup->sm_keypress_notification;
2198             setup->sm_keypress_notification = 0xff;
2199             l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2200             return;
2201         }
2202 
2203         sm_key_t plaintext;
2204         int key_distribution_flags;
2205         UNUSED(key_distribution_flags);
2206 
2207         log_info("sm_run: state %u", connection->sm_engine_state);
2208 
2209         switch (connection->sm_engine_state){
2210 
2211             // general
2212             case SM_GENERAL_SEND_PAIRING_FAILED: {
2213                 uint8_t buffer[2];
2214                 buffer[0] = SM_CODE_PAIRING_FAILED;
2215                 buffer[1] = setup->sm_pairing_failed_reason;
2216                 connection->sm_engine_state = connection->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED;
2217                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2218                 sm_done_for_handle(connection->sm_handle);
2219                 break;
2220             }
2221 
2222             // responding state
2223 #ifdef ENABLE_LE_SECURE_CONNECTIONS
2224             case SM_SC_W2_GET_RANDOM_A:
2225                 sm_random_start(connection);
2226                 connection->sm_engine_state = SM_SC_W4_GET_RANDOM_A;
2227                 break;
2228             case SM_SC_W2_GET_RANDOM_B:
2229                 sm_random_start(connection);
2230                 connection->sm_engine_state = SM_SC_W4_GET_RANDOM_B;
2231                 break;
2232             case SM_SC_W2_CMAC_FOR_CONFIRMATION:
2233                 if (!sm_cmac_ready()) break;
2234                 connection->sm_engine_state = SM_SC_W4_CMAC_FOR_CONFIRMATION;
2235                 sm_sc_calculate_local_confirm(connection);
2236                 break;
2237             case SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION:
2238                 if (!sm_cmac_ready()) break;
2239                 connection->sm_engine_state = SM_SC_W4_CMAC_FOR_CHECK_CONFIRMATION;
2240                 sm_sc_calculate_remote_confirm(connection);
2241                 break;
2242             case SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK:
2243                 if (!sm_cmac_ready()) break;
2244                 connection->sm_engine_state = SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK;
2245                 sm_sc_calculate_f6_for_dhkey_check(connection);
2246                 break;
2247             case SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK:
2248                 if (!sm_cmac_ready()) break;
2249                 connection->sm_engine_state = SM_SC_W4_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK;
2250                 sm_sc_calculate_f6_to_verify_dhkey_check(connection);
2251                 break;
2252             case SM_SC_W2_CALCULATE_F5_SALT:
2253                 if (!sm_cmac_ready()) break;
2254                 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_SALT;
2255                 f5_calculate_salt(connection);
2256                 break;
2257             case SM_SC_W2_CALCULATE_F5_MACKEY:
2258                 if (!sm_cmac_ready()) break;
2259                 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_MACKEY;
2260                 f5_calculate_mackey(connection);
2261                 break;
2262             case SM_SC_W2_CALCULATE_F5_LTK:
2263                 if (!sm_cmac_ready()) break;
2264                 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_LTK;
2265                 f5_calculate_ltk(connection);
2266                 break;
2267             case SM_SC_W2_CALCULATE_G2:
2268                 if (!sm_cmac_ready()) break;
2269                 connection->sm_engine_state = SM_SC_W4_CALCULATE_G2;
2270                 g2_calculate(connection);
2271                 break;
2272             case SM_SC_W2_CALCULATE_H6_ILK:
2273                 if (!sm_cmac_ready()) break;
2274                 connection->sm_engine_state = SM_SC_W4_CALCULATE_H6_ILK;
2275                 h6_calculate_ilk(connection);
2276                 break;
2277             case SM_SC_W2_CALCULATE_H6_BR_EDR_LINK_KEY:
2278                 if (!sm_cmac_ready()) break;
2279                 connection->sm_engine_state = SM_SC_W4_CALCULATE_H6_BR_EDR_LINK_KEY;
2280                 h6_calculate_br_edr_link_key(connection);
2281                 break;
2282 #endif
2283 
2284 #ifdef ENABLE_LE_CENTRAL
2285             // initiator side
2286             case SM_INITIATOR_PH0_SEND_START_ENCRYPTION: {
2287                 sm_key_t peer_ltk_flipped;
2288                 reverse_128(setup->sm_peer_ltk, peer_ltk_flipped);
2289                 connection->sm_engine_state = SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED;
2290                 log_info("sm: hci_le_start_encryption ediv 0x%04x", setup->sm_peer_ediv);
2291                 uint32_t rand_high = big_endian_read_32(setup->sm_peer_rand, 0);
2292                 uint32_t rand_low  = big_endian_read_32(setup->sm_peer_rand, 4);
2293                 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle,rand_low, rand_high, setup->sm_peer_ediv, peer_ltk_flipped);
2294                 return;
2295             }
2296 
2297             case SM_INITIATOR_PH1_SEND_PAIRING_REQUEST:
2298                 sm_pairing_packet_set_code(setup->sm_m_preq, SM_CODE_PAIRING_REQUEST);
2299                 connection->sm_engine_state = SM_INITIATOR_PH1_W4_PAIRING_RESPONSE;
2300                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) &setup->sm_m_preq, sizeof(sm_pairing_packet_t));
2301                 sm_timeout_reset(connection);
2302                 break;
2303 #endif
2304 
2305 #ifdef ENABLE_LE_SECURE_CONNECTIONS
2306 
2307             case SM_SC_SEND_PUBLIC_KEY_COMMAND: {
2308                 uint8_t buffer[65];
2309                 buffer[0] = SM_CODE_PAIRING_PUBLIC_KEY;
2310                 //
2311                 reverse_256(&ec_q[0],  &buffer[1]);
2312                 reverse_256(&ec_q[32], &buffer[33]);
2313 
2314                 // stk generation method
2315                 // passkey entry: notify app to show passkey or to request passkey
2316                 switch (setup->sm_stk_generation_method){
2317                     case JUST_WORKS:
2318                     case NK_BOTH_INPUT:
2319                         if (IS_RESPONDER(connection->sm_role)){
2320                             // responder
2321                             sm_sc_start_calculating_local_confirm(connection);
2322                         } else {
2323                             // initiator
2324                             connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND;
2325                         }
2326                         break;
2327                     case PK_INIT_INPUT:
2328                     case PK_RESP_INPUT:
2329                     case OK_BOTH_INPUT:
2330                         // use random TK for display
2331                         memcpy(setup->sm_ra, setup->sm_tk, 16);
2332                         memcpy(setup->sm_rb, setup->sm_tk, 16);
2333                         setup->sm_passkey_bit = 0;
2334 
2335                         if (IS_RESPONDER(connection->sm_role)){
2336                             // responder
2337                             connection->sm_engine_state = SM_SC_W4_CONFIRMATION;
2338                         } else {
2339                             // initiator
2340                             connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND;
2341                         }
2342                         sm_trigger_user_response(connection);
2343                         break;
2344                     case OOB:
2345                         // TODO: implement SC OOB
2346                         break;
2347                 }
2348 
2349                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2350                 sm_timeout_reset(connection);
2351                 break;
2352             }
2353             case SM_SC_SEND_CONFIRMATION: {
2354                 uint8_t buffer[17];
2355                 buffer[0] = SM_CODE_PAIRING_CONFIRM;
2356                 reverse_128(setup->sm_local_confirm, &buffer[1]);
2357                 if (IS_RESPONDER(connection->sm_role)){
2358                     connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM;
2359                 } else {
2360                     connection->sm_engine_state = SM_SC_W4_CONFIRMATION;
2361                 }
2362                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2363                 sm_timeout_reset(connection);
2364                 break;
2365             }
2366             case SM_SC_SEND_PAIRING_RANDOM: {
2367                 uint8_t buffer[17];
2368                 buffer[0] = SM_CODE_PAIRING_RANDOM;
2369                 reverse_128(setup->sm_local_nonce, &buffer[1]);
2370                 if (setup->sm_stk_generation_method != JUST_WORKS && setup->sm_stk_generation_method != NK_BOTH_INPUT && setup->sm_passkey_bit < 20){
2371                     if (IS_RESPONDER(connection->sm_role)){
2372                         // responder
2373                         connection->sm_engine_state = SM_SC_W4_CONFIRMATION;
2374                     } else {
2375                         // initiator
2376                         connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM;
2377                     }
2378                 } else {
2379                     if (IS_RESPONDER(connection->sm_role)){
2380                         // responder
2381                         if (setup->sm_stk_generation_method == NK_BOTH_INPUT){
2382                             connection->sm_engine_state = SM_SC_W2_CALCULATE_G2;
2383                         } else {
2384                             sm_sc_prepare_dhkey_check(connection);
2385                         }
2386                     } else {
2387                         // initiator
2388                         connection->sm_engine_state = SM_SC_W4_PAIRING_RANDOM;
2389                     }
2390                 }
2391                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2392                 sm_timeout_reset(connection);
2393                 break;
2394             }
2395             case SM_SC_SEND_DHKEY_CHECK_COMMAND: {
2396                 uint8_t buffer[17];
2397                 buffer[0] = SM_CODE_PAIRING_DHKEY_CHECK;
2398                 reverse_128(setup->sm_local_dhkey_check, &buffer[1]);
2399 
2400                 if (IS_RESPONDER(connection->sm_role)){
2401                     connection->sm_engine_state = SM_SC_W4_LTK_REQUEST_SC;
2402                 } else {
2403                     connection->sm_engine_state = SM_SC_W4_DHKEY_CHECK_COMMAND;
2404                 }
2405 
2406                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2407                 sm_timeout_reset(connection);
2408                 break;
2409             }
2410 
2411 #endif
2412 
2413 #ifdef ENABLE_LE_PERIPHERAL
2414             case SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE:
2415                 // echo initiator for now
2416                 sm_pairing_packet_set_code(setup->sm_s_pres,SM_CODE_PAIRING_RESPONSE);
2417                 key_distribution_flags = sm_key_distribution_flags_for_auth_req();
2418 
2419                 if (setup->sm_use_secure_connections){
2420                     connection->sm_engine_state = SM_SC_W4_PUBLIC_KEY_COMMAND;
2421                     // skip LTK/EDIV for SC
2422                     log_info("sm: dropping encryption information flag");
2423                     key_distribution_flags &= ~SM_KEYDIST_ENC_KEY;
2424                 } else {
2425                     connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_CONFIRM;
2426                 }
2427 
2428                 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);
2429                 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);
2430                 // update key distribution after ENC was dropped
2431                 sm_setup_key_distribution(sm_pairing_packet_get_responder_key_distribution(setup->sm_s_pres));
2432 
2433                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) &setup->sm_s_pres, sizeof(sm_pairing_packet_t));
2434                 sm_timeout_reset(connection);
2435                 // SC Numeric Comparison will trigger user response after public keys & nonces have been exchanged
2436                 if (!setup->sm_use_secure_connections || setup->sm_stk_generation_method == JUST_WORKS){
2437                     sm_trigger_user_response(connection);
2438                 }
2439                 return;
2440 #endif
2441 
2442             case SM_PH2_SEND_PAIRING_RANDOM: {
2443                 uint8_t buffer[17];
2444                 buffer[0] = SM_CODE_PAIRING_RANDOM;
2445                 reverse_128(setup->sm_local_random, &buffer[1]);
2446                 if (IS_RESPONDER(connection->sm_role)){
2447                     connection->sm_engine_state = SM_RESPONDER_PH2_W4_LTK_REQUEST;
2448                 } else {
2449                     connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_RANDOM;
2450                 }
2451                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2452                 sm_timeout_reset(connection);
2453                 break;
2454             }
2455 
2456             case SM_PH2_GET_RANDOM_TK:
2457             case SM_PH2_C1_GET_RANDOM_A:
2458             case SM_PH2_C1_GET_RANDOM_B:
2459             case SM_PH3_GET_RANDOM:
2460             case SM_PH3_GET_DIV:
2461                 sm_next_responding_state(connection);
2462                 sm_random_start(connection);
2463                 return;
2464 
2465             case SM_PH2_C1_GET_ENC_B:
2466             case SM_PH2_C1_GET_ENC_D:
2467                 // already busy?
2468                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
2469                 sm_next_responding_state(connection);
2470                 sm_aes128_start(setup->sm_tk, setup->sm_c1_t3_value, connection);
2471                 return;
2472 
2473             case SM_PH3_LTK_GET_ENC:
2474             case SM_RESPONDER_PH4_LTK_GET_ENC:
2475                 // already busy?
2476                 if (sm_aes128_state == SM_AES128_IDLE) {
2477                     sm_key_t d_prime;
2478                     sm_d1_d_prime(setup->sm_local_div, 0, d_prime);
2479                     sm_next_responding_state(connection);
2480                     sm_aes128_start(sm_persistent_er, d_prime, connection);
2481                     return;
2482                 }
2483                 break;
2484 
2485             case SM_PH3_CSRK_GET_ENC:
2486                 // already busy?
2487                 if (sm_aes128_state == SM_AES128_IDLE) {
2488                     sm_key_t d_prime;
2489                     sm_d1_d_prime(setup->sm_local_div, 1, d_prime);
2490                     sm_next_responding_state(connection);
2491                     sm_aes128_start(sm_persistent_er, d_prime, connection);
2492                     return;
2493                 }
2494                 break;
2495 
2496             case SM_PH2_C1_GET_ENC_C:
2497                 // already busy?
2498                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
2499                 // calculate m_confirm using aes128 engine - step 1
2500                 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, plaintext);
2501                 sm_next_responding_state(connection);
2502                 sm_aes128_start(setup->sm_tk, plaintext, connection);
2503                 break;
2504             case SM_PH2_C1_GET_ENC_A:
2505                 // already busy?
2506                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
2507                 // calculate confirm using aes128 engine - step 1
2508                 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, plaintext);
2509                 sm_next_responding_state(connection);
2510                 sm_aes128_start(setup->sm_tk, plaintext, connection);
2511                 break;
2512             case SM_PH2_CALC_STK:
2513                 // already busy?
2514                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
2515                 // calculate STK
2516                 if (IS_RESPONDER(connection->sm_role)){
2517                     sm_s1_r_prime(setup->sm_local_random, setup->sm_peer_random, plaintext);
2518                 } else {
2519                     sm_s1_r_prime(setup->sm_peer_random, setup->sm_local_random, plaintext);
2520                 }
2521                 sm_next_responding_state(connection);
2522                 sm_aes128_start(setup->sm_tk, plaintext, connection);
2523                 break;
2524             case SM_PH3_Y_GET_ENC:
2525                 // already busy?
2526                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
2527                 // PH3B2 - calculate Y from      - enc
2528                 // Y = dm(DHK, Rand)
2529                 sm_dm_r_prime(setup->sm_local_rand, plaintext);
2530                 sm_next_responding_state(connection);
2531                 sm_aes128_start(sm_persistent_dhk, plaintext, connection);
2532                 return;
2533             case SM_PH2_C1_SEND_PAIRING_CONFIRM: {
2534                 uint8_t buffer[17];
2535                 buffer[0] = SM_CODE_PAIRING_CONFIRM;
2536                 reverse_128(setup->sm_local_confirm, &buffer[1]);
2537                 if (IS_RESPONDER(connection->sm_role)){
2538                     connection->sm_engine_state = SM_RESPONDER_PH2_W4_PAIRING_RANDOM;
2539                 } else {
2540                     connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_CONFIRM;
2541                 }
2542                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2543                 sm_timeout_reset(connection);
2544                 return;
2545             }
2546 #ifdef ENABLE_LE_PERIPHERAL
2547             case SM_RESPONDER_PH2_SEND_LTK_REPLY: {
2548                 sm_key_t stk_flipped;
2549                 reverse_128(setup->sm_ltk, stk_flipped);
2550                 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED;
2551                 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, stk_flipped);
2552                 return;
2553             }
2554             case SM_RESPONDER_PH4_SEND_LTK_REPLY: {
2555                 sm_key_t ltk_flipped;
2556                 reverse_128(setup->sm_ltk, ltk_flipped);
2557                 connection->sm_engine_state = SM_RESPONDER_IDLE;
2558                 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, ltk_flipped);
2559                 sm_done_for_handle(connection->sm_handle);
2560                 return;
2561             }
2562             case SM_RESPONDER_PH4_Y_GET_ENC:
2563                 // already busy?
2564                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
2565                 log_info("LTK Request: recalculating with ediv 0x%04x", setup->sm_local_ediv);
2566                 // Y = dm(DHK, Rand)
2567                 sm_dm_r_prime(setup->sm_local_rand, plaintext);
2568                 sm_next_responding_state(connection);
2569                 sm_aes128_start(sm_persistent_dhk, plaintext, connection);
2570                 return;
2571 #endif
2572 #ifdef ENABLE_LE_CENTRAL
2573             case SM_INITIATOR_PH3_SEND_START_ENCRYPTION: {
2574                 sm_key_t stk_flipped;
2575                 reverse_128(setup->sm_ltk, stk_flipped);
2576                 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED;
2577                 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle, 0, 0, 0, stk_flipped);
2578                 return;
2579             }
2580 #endif
2581 
2582             case SM_PH3_DISTRIBUTE_KEYS:
2583                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION){
2584                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION;
2585                     uint8_t buffer[17];
2586                     buffer[0] = SM_CODE_ENCRYPTION_INFORMATION;
2587                     reverse_128(setup->sm_ltk, &buffer[1]);
2588                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2589                     sm_timeout_reset(connection);
2590                     return;
2591                 }
2592                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_MASTER_IDENTIFICATION){
2593                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_MASTER_IDENTIFICATION;
2594                     uint8_t buffer[11];
2595                     buffer[0] = SM_CODE_MASTER_IDENTIFICATION;
2596                     little_endian_store_16(buffer, 1, setup->sm_local_ediv);
2597                     reverse_64(setup->sm_local_rand, &buffer[3]);
2598                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2599                     sm_timeout_reset(connection);
2600                     return;
2601                 }
2602                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_IDENTITY_INFORMATION){
2603                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_IDENTITY_INFORMATION;
2604                     uint8_t buffer[17];
2605                     buffer[0] = SM_CODE_IDENTITY_INFORMATION;
2606                     reverse_128(sm_persistent_irk, &buffer[1]);
2607                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2608                     sm_timeout_reset(connection);
2609                     return;
2610                 }
2611                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION){
2612                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION;
2613                     bd_addr_t local_address;
2614                     uint8_t buffer[8];
2615                     buffer[0] = SM_CODE_IDENTITY_ADDRESS_INFORMATION;
2616                     switch (gap_random_address_get_mode()){
2617                         case GAP_RANDOM_ADDRESS_TYPE_OFF:
2618                         case GAP_RANDOM_ADDRESS_TYPE_STATIC:
2619                             // public or static random
2620                             gap_le_get_own_address(&buffer[1], local_address);
2621                             break;
2622                         case GAP_RANDOM_ADDRESS_NON_RESOLVABLE:
2623                         case GAP_RANDOM_ADDRESS_RESOLVABLE:
2624                             // fallback to public
2625                             gap_local_bd_addr(local_address);
2626                             buffer[1] = 0;
2627                             break;
2628                     }
2629                     reverse_bd_addr(local_address, &buffer[2]);
2630                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2631                     sm_timeout_reset(connection);
2632                     return;
2633                 }
2634                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){
2635                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION;
2636 
2637                     // hack to reproduce test runs
2638                     if (test_use_fixed_local_csrk){
2639                         memset(setup->sm_local_csrk, 0xcc, 16);
2640                     }
2641 
2642                     uint8_t buffer[17];
2643                     buffer[0] = SM_CODE_SIGNING_INFORMATION;
2644                     reverse_128(setup->sm_local_csrk, &buffer[1]);
2645                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
2646                     sm_timeout_reset(connection);
2647                     return;
2648                 }
2649 
2650                 // keys are sent
2651                 if (IS_RESPONDER(connection->sm_role)){
2652                     // slave -> receive master keys if any
2653                     if (sm_key_distribution_all_received(connection)){
2654                         sm_key_distribution_handle_all_received(connection);
2655                         connection->sm_engine_state = SM_RESPONDER_IDLE;
2656                         sm_done_for_handle(connection->sm_handle);
2657                     } else {
2658                         connection->sm_engine_state = SM_PH3_RECEIVE_KEYS;
2659                     }
2660                 } else {
2661                     // master -> all done
2662                     connection->sm_engine_state = SM_INITIATOR_CONNECTED;
2663                     sm_done_for_handle(connection->sm_handle);
2664                 }
2665                 break;
2666 
2667             default:
2668                 break;
2669         }
2670 
2671         // check again if active connection was released
2672         if (sm_active_connection_handle != HCI_CON_HANDLE_INVALID) break;
2673     }
2674 }
2675 
2676 // note: aes engine is ready as we just got the aes result
2677 static void sm_handle_encryption_result(uint8_t * data){
2678 
2679     sm_aes128_state = SM_AES128_IDLE;
2680 
2681     if (sm_address_resolution_ah_calculation_active){
2682         sm_address_resolution_ah_calculation_active = 0;
2683         // compare calulated address against connecting device
2684         uint8_t hash[3];
2685         reverse_24(data, hash);
2686         if (memcmp(&sm_address_resolution_address[3], hash, 3) == 0){
2687             log_info("LE Device Lookup: matched resolvable private address");
2688             sm_address_resolution_handle_event(ADDRESS_RESOLUTION_SUCEEDED);
2689             return;
2690         }
2691         // no match, try next
2692         sm_address_resolution_test++;
2693         return;
2694     }
2695 
2696     switch (dkg_state){
2697         case DKG_W4_IRK:
2698             reverse_128(data, sm_persistent_irk);
2699             log_info_key("irk", sm_persistent_irk);
2700             dkg_next_state();
2701             return;
2702         case DKG_W4_DHK:
2703             reverse_128(data, sm_persistent_dhk);
2704             log_info_key("dhk", sm_persistent_dhk);
2705             dkg_next_state();
2706             // SM Init Finished
2707             return;
2708         default:
2709             break;
2710     }
2711 
2712     switch (rau_state){
2713         case RAU_W4_ENC:
2714             reverse_24(data, &sm_random_address[3]);
2715             rau_next_state();
2716             return;
2717         default:
2718             break;
2719     }
2720 
2721 #ifdef ENABLE_CMAC_ENGINE
2722     switch (sm_cmac_state){
2723         case CMAC_W4_SUBKEYS:
2724         case CMAC_W4_MI:
2725         case CMAC_W4_MLAST:
2726             {
2727             sm_key_t t;
2728             reverse_128(data, t);
2729             sm_cmac_handle_encryption_result(t);
2730             }
2731             return;
2732         default:
2733             break;
2734     }
2735 #endif
2736 
2737     // retrieve sm_connection provided to sm_aes128_start_encryption
2738     sm_connection_t * connection = (sm_connection_t*) sm_aes128_context;
2739     if (!connection) return;
2740     switch (connection->sm_engine_state){
2741         case SM_PH2_C1_W4_ENC_A:
2742         case SM_PH2_C1_W4_ENC_C:
2743             {
2744             sm_key_t t2;
2745             reverse_128(data, t2);
2746             sm_c1_t3(t2, setup->sm_m_address, setup->sm_s_address, setup->sm_c1_t3_value);
2747             }
2748             sm_next_responding_state(connection);
2749             return;
2750         case SM_PH2_C1_W4_ENC_B:
2751             reverse_128(data, setup->sm_local_confirm);
2752             log_info_key("c1!", setup->sm_local_confirm);
2753             connection->sm_engine_state = SM_PH2_C1_SEND_PAIRING_CONFIRM;
2754             return;
2755         case SM_PH2_C1_W4_ENC_D:
2756             {
2757             sm_key_t peer_confirm_test;
2758             reverse_128(data, peer_confirm_test);
2759             log_info_key("c1!", peer_confirm_test);
2760             if (memcmp(setup->sm_peer_confirm, peer_confirm_test, 16) != 0){
2761                 setup->sm_pairing_failed_reason = SM_REASON_CONFIRM_VALUE_FAILED;
2762                 connection->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
2763                 return;
2764             }
2765             if (IS_RESPONDER(connection->sm_role)){
2766                 connection->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM;
2767             } else {
2768                 connection->sm_engine_state = SM_PH2_CALC_STK;
2769             }
2770             }
2771             return;
2772         case SM_PH2_W4_STK:
2773             reverse_128(data, setup->sm_ltk);
2774             sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size);
2775             log_info_key("stk", setup->sm_ltk);
2776             if (IS_RESPONDER(connection->sm_role)){
2777                 connection->sm_engine_state = SM_RESPONDER_PH2_SEND_LTK_REPLY;
2778             } else {
2779                 connection->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION;
2780             }
2781             return;
2782         case SM_PH3_Y_W4_ENC:{
2783             sm_key_t y128;
2784             reverse_128(data, y128);
2785             setup->sm_local_y = big_endian_read_16(y128, 14);
2786             log_info_hex16("y", setup->sm_local_y);
2787             // PH3B3 - calculate EDIV
2788             setup->sm_local_ediv = setup->sm_local_y ^ setup->sm_local_div;
2789             log_info_hex16("ediv", setup->sm_local_ediv);
2790             // PH3B4 - calculate LTK         - enc
2791             // LTK = d1(ER, DIV, 0))
2792             connection->sm_engine_state = SM_PH3_LTK_GET_ENC;
2793             return;
2794         }
2795         case SM_RESPONDER_PH4_Y_W4_ENC:{
2796             sm_key_t y128;
2797             reverse_128(data, y128);
2798             setup->sm_local_y = big_endian_read_16(y128, 14);
2799             log_info_hex16("y", setup->sm_local_y);
2800 
2801             // PH3B3 - calculate DIV
2802             setup->sm_local_div = setup->sm_local_y ^ setup->sm_local_ediv;
2803             log_info_hex16("ediv", setup->sm_local_ediv);
2804             // PH3B4 - calculate LTK         - enc
2805             // LTK = d1(ER, DIV, 0))
2806             connection->sm_engine_state = SM_RESPONDER_PH4_LTK_GET_ENC;
2807             return;
2808         }
2809         case SM_PH3_LTK_W4_ENC:
2810             reverse_128(data, setup->sm_ltk);
2811             log_info_key("ltk", setup->sm_ltk);
2812             // calc CSRK next
2813             connection->sm_engine_state = SM_PH3_CSRK_GET_ENC;
2814             return;
2815         case SM_PH3_CSRK_W4_ENC:
2816             reverse_128(data, setup->sm_local_csrk);
2817             log_info_key("csrk", setup->sm_local_csrk);
2818             if (setup->sm_key_distribution_send_set){
2819                 connection->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS;
2820             } else {
2821                 // no keys to send, just continue
2822                 if (IS_RESPONDER(connection->sm_role)){
2823                     // slave -> receive master keys
2824                     connection->sm_engine_state = SM_PH3_RECEIVE_KEYS;
2825                 } else {
2826                     if (setup->sm_use_secure_connections && (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION)){
2827                         connection->sm_engine_state = SM_SC_W2_CALCULATE_H6_ILK;
2828                     } else {
2829                         // master -> all done
2830                         connection->sm_engine_state = SM_INITIATOR_CONNECTED;
2831                         sm_done_for_handle(connection->sm_handle);
2832                     }
2833                 }
2834             }
2835             return;
2836 #ifdef ENABLE_LE_PERIPHERAL
2837         case SM_RESPONDER_PH4_LTK_W4_ENC:
2838             reverse_128(data, setup->sm_ltk);
2839             sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size);
2840             log_info_key("ltk", setup->sm_ltk);
2841             connection->sm_engine_state = SM_RESPONDER_PH4_SEND_LTK_REPLY;
2842             return;
2843 #endif
2844         default:
2845             break;
2846     }
2847 }
2848 
2849 #ifdef ENABLE_LE_SECURE_CONNECTIONS
2850 
2851 #if (defined(USE_MICRO_ECC_FOR_ECDH) && !defined(WICED_VERSION)) || defined(USE_MBEDTLS_FOR_ECDH)
2852 // @return OK
2853 static int sm_generate_f_rng(unsigned char * buffer, unsigned size){
2854     if (ec_key_generation_state != EC_KEY_GENERATION_ACTIVE) return 0;
2855     int offset = setup->sm_passkey_bit;
2856     log_info("sm_generate_f_rng: size %u - offset %u", (int) size, offset);
2857     while (size) {
2858         *buffer++ = setup->sm_peer_q[offset++];
2859         size--;
2860     }
2861     setup->sm_passkey_bit = offset;
2862     return 1;
2863 }
2864 #endif
2865 #ifdef USE_MBEDTLS_FOR_ECDH
2866 // @return error - just wrap sm_generate_f_rng
2867 static int sm_generate_f_rng_mbedtls(void * context, unsigned char * buffer, size_t size){
2868     UNUSED(context);
2869     return sm_generate_f_rng(buffer, size) == 0;
2870 }
2871 #endif /* USE_MBEDTLS_FOR_ECDH */
2872 #endif /* ENABLE_LE_SECURE_CONNECTIONS */
2873 
2874 // note: random generator is ready. this doesn NOT imply that aes engine is unused!
2875 static void sm_handle_random_result(uint8_t * data){
2876 
2877 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && defined(USE_SOFTWARE_ECDH_IMPLEMENTATION)
2878 
2879     if (ec_key_generation_state == EC_KEY_GENERATION_ACTIVE){
2880         int num_bytes = setup->sm_passkey_bit;
2881         memcpy(&setup->sm_peer_q[num_bytes], data, 8);
2882         num_bytes += 8;
2883         setup->sm_passkey_bit = num_bytes;
2884 
2885         if (num_bytes >= 64){
2886 
2887             // init pre-generated random data from sm_peer_q
2888             setup->sm_passkey_bit = 0;
2889 
2890             // generate EC key
2891 #ifdef USE_MICRO_ECC_FOR_ECDH
2892 
2893 #ifndef WICED_VERSION
2894             log_info("set uECC RNG for initial key generation with 64 random bytes");
2895             // micro-ecc from WICED SDK uses its wiced_crypto_get_random by default - no need to set it
2896             uECC_set_rng(&sm_generate_f_rng);
2897 #endif /* WICED_VERSION */
2898 
2899 #if uECC_SUPPORTS_secp256r1
2900             // standard version
2901             uECC_make_key(ec_q, ec_d, uECC_secp256r1());
2902 
2903             // disable RNG again, as returning no randmon data lets shared key generation fail
2904             log_info("disable uECC RNG in standard version after key generation");
2905             uECC_set_rng(NULL);
2906 #else
2907             // static version
2908             uECC_make_key(ec_q, ec_d);
2909 #endif
2910 #endif /* USE_MICRO_ECC_FOR_ECDH */
2911 
2912 #ifdef USE_MBEDTLS_FOR_ECDH
2913             mbedtls_mpi d;
2914             mbedtls_ecp_point P;
2915             mbedtls_mpi_init(&d);
2916             mbedtls_ecp_point_init(&P);
2917             int res = mbedtls_ecp_gen_keypair(&mbedtls_ec_group, &d, &P, &sm_generate_f_rng_mbedtls, NULL);
2918             log_info("gen keypair %x", res);
2919             mbedtls_mpi_write_binary(&P.X, &ec_q[0],  32);
2920             mbedtls_mpi_write_binary(&P.Y, &ec_q[32], 32);
2921             mbedtls_mpi_write_binary(&d, ec_d, 32);
2922             mbedtls_ecp_point_free(&P);
2923             mbedtls_mpi_free(&d);
2924 #endif  /* USE_MBEDTLS_FOR_ECDH */
2925 
2926             ec_key_generation_state = EC_KEY_GENERATION_DONE;
2927             log_info("Elliptic curve: d");
2928             log_info_hexdump(ec_d,32);
2929             sm_log_ec_keypair();
2930         }
2931     }
2932 #endif
2933 
2934     switch (rau_state){
2935         case RAU_W4_RANDOM:
2936             // non-resolvable vs. resolvable
2937             switch (gap_random_adress_type){
2938                 case GAP_RANDOM_ADDRESS_RESOLVABLE:
2939                     // resolvable: use random as prand and calc address hash
2940                     // "The two most significant bits of prand shall be equal to ‘0’ and ‘1"
2941                     memcpy(sm_random_address, data, 3);
2942                     sm_random_address[0] &= 0x3f;
2943                     sm_random_address[0] |= 0x40;
2944                     rau_state = RAU_GET_ENC;
2945                     break;
2946                 case GAP_RANDOM_ADDRESS_NON_RESOLVABLE:
2947                 default:
2948                     // "The two most significant bits of the address shall be equal to ‘0’""
2949                     memcpy(sm_random_address, data, 6);
2950                     sm_random_address[0] &= 0x3f;
2951                     rau_state = RAU_SET_ADDRESS;
2952                     break;
2953             }
2954             return;
2955         default:
2956             break;
2957     }
2958 
2959     // retrieve sm_connection provided to sm_random_start
2960     sm_connection_t * connection = (sm_connection_t *) sm_random_context;
2961     if (!connection) return;
2962     switch (connection->sm_engine_state){
2963 #ifdef ENABLE_LE_SECURE_CONNECTIONS
2964         case SM_SC_W4_GET_RANDOM_A:
2965             memcpy(&setup->sm_local_nonce[0], data, 8);
2966             connection->sm_engine_state = SM_SC_W2_GET_RANDOM_B;
2967             break;
2968         case SM_SC_W4_GET_RANDOM_B:
2969             memcpy(&setup->sm_local_nonce[8], data, 8);
2970             // initiator & jw/nc -> send pairing random
2971             if (connection->sm_role == 0 && sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method)){
2972                 connection->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM;
2973                 break;
2974             } else {
2975                 connection->sm_engine_state = SM_SC_W2_CMAC_FOR_CONFIRMATION;
2976             }
2977             break;
2978 #endif
2979 
2980         case SM_PH2_W4_RANDOM_TK:
2981         {
2982             sm_reset_tk();
2983             uint32_t tk;
2984             if (sm_fixed_passkey_in_display_role == 0xffffffff){
2985                 // map random to 0-999999 without speding much cycles on a modulus operation
2986                 tk = little_endian_read_32(data,0);
2987                 tk = tk & 0xfffff;  // 1048575
2988                 if (tk >= 999999){
2989                     tk = tk - 999999;
2990                 }
2991             } else {
2992                 // override with pre-defined passkey
2993                 tk = sm_fixed_passkey_in_display_role;
2994             }
2995             big_endian_store_32(setup->sm_tk, 12, tk);
2996             if (IS_RESPONDER(connection->sm_role)){
2997                 connection->sm_engine_state = SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE;
2998             } else {
2999                 if (setup->sm_use_secure_connections){
3000                     connection->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND;
3001                 } else {
3002                     connection->sm_engine_state = SM_PH1_W4_USER_RESPONSE;
3003                     sm_trigger_user_response(connection);
3004                     // response_idle == nothing <--> sm_trigger_user_response() did not require response
3005                     if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){
3006                         connection->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
3007                     }
3008                 }
3009             }
3010             return;
3011         }
3012         case SM_PH2_C1_W4_RANDOM_A:
3013             memcpy(&setup->sm_local_random[0], data, 8); // random endinaness
3014             connection->sm_engine_state = SM_PH2_C1_GET_RANDOM_B;
3015             return;
3016         case SM_PH2_C1_W4_RANDOM_B:
3017             memcpy(&setup->sm_local_random[8], data, 8); // random endinaness
3018             connection->sm_engine_state = SM_PH2_C1_GET_ENC_A;
3019             return;
3020         case SM_PH3_W4_RANDOM:
3021             reverse_64(data, setup->sm_local_rand);
3022             // no db for encryption size hack: encryption size is stored in lowest nibble of setup->sm_local_rand
3023             setup->sm_local_rand[7] = (setup->sm_local_rand[7] & 0xf0) + (connection->sm_actual_encryption_key_size - 1);
3024             // no db for authenticated flag hack: store flag in bit 4 of LSB
3025             setup->sm_local_rand[7] = (setup->sm_local_rand[7] & 0xef) + (connection->sm_connection_authenticated << 4);
3026             connection->sm_engine_state = SM_PH3_GET_DIV;
3027             return;
3028         case SM_PH3_W4_DIV:
3029             // use 16 bit from random value as div
3030             setup->sm_local_div = big_endian_read_16(data, 0);
3031             log_info_hex16("div", setup->sm_local_div);
3032             connection->sm_engine_state = SM_PH3_Y_GET_ENC;
3033             return;
3034         default:
3035             break;
3036     }
3037 }
3038 
3039 static void sm_event_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
3040 
3041     UNUSED(channel);    // ok: there is no channel
3042     UNUSED(size);       // ok: fixed format HCI events
3043 
3044     sm_connection_t  * sm_conn;
3045     hci_con_handle_t con_handle;
3046 
3047     switch (packet_type) {
3048 
3049 		case HCI_EVENT_PACKET:
3050 			switch (hci_event_packet_get_type(packet)) {
3051 
3052                 case BTSTACK_EVENT_STATE:
3053 					// bt stack activated, get started
3054 					if (btstack_event_state_get_state(packet) == HCI_STATE_WORKING){
3055                         log_info("HCI Working!");
3056 
3057 
3058                         dkg_state = sm_persistent_irk_ready ? DKG_CALC_DHK : DKG_CALC_IRK;
3059 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3060                         if (!sm_have_ec_keypair){
3061                             setup->sm_passkey_bit = 0;
3062                             ec_key_generation_state = EC_KEY_GENERATION_ACTIVE;
3063                         }
3064 #endif
3065                         // trigger Random Address generation if requested before
3066                         switch (gap_random_adress_type){
3067                             case GAP_RANDOM_ADDRESS_TYPE_OFF:
3068                                 rau_state = RAU_IDLE;
3069                                 break;
3070                             case GAP_RANDOM_ADDRESS_TYPE_STATIC:
3071                                 rau_state = RAU_SET_ADDRESS;
3072                                 break;
3073                             default:
3074                                 rau_state = RAU_GET_RANDOM;
3075                                 break;
3076                         }
3077                         sm_run();
3078 					}
3079 					break;
3080 
3081                 case HCI_EVENT_LE_META:
3082                     switch (packet[2]) {
3083                         case HCI_SUBEVENT_LE_CONNECTION_COMPLETE:
3084 
3085                             log_info("sm: connected");
3086 
3087                             if (packet[3]) return; // connection failed
3088 
3089                             con_handle = little_endian_read_16(packet, 4);
3090                             sm_conn = sm_get_connection_for_handle(con_handle);
3091                             if (!sm_conn) break;
3092 
3093                             sm_conn->sm_handle = con_handle;
3094                             sm_conn->sm_role = packet[6];
3095                             sm_conn->sm_peer_addr_type = packet[7];
3096                             reverse_bd_addr(&packet[8], sm_conn->sm_peer_address);
3097 
3098                             log_info("New sm_conn, role %s", sm_conn->sm_role ? "slave" : "master");
3099 
3100                             // reset security properties
3101                             sm_conn->sm_connection_encrypted = 0;
3102                             sm_conn->sm_connection_authenticated = 0;
3103                             sm_conn->sm_connection_authorization_state = AUTHORIZATION_UNKNOWN;
3104                             sm_conn->sm_le_db_index = -1;
3105 
3106                             // prepare CSRK lookup (does not involve setup)
3107                             sm_conn->sm_irk_lookup_state = IRK_LOOKUP_W4_READY;
3108 
3109                             // just connected -> everything else happens in sm_run()
3110                             if (IS_RESPONDER(sm_conn->sm_role)){
3111                                 // slave - state already could be SM_RESPONDER_SEND_SECURITY_REQUEST instead
3112                                 if (sm_conn->sm_engine_state == SM_GENERAL_IDLE){
3113                                     if (sm_slave_request_security) {
3114                                         // request security if requested by app
3115                                         sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST;
3116                                     } else {
3117                                         // otherwise, wait for pairing request
3118                                         sm_conn->sm_engine_state = SM_RESPONDER_IDLE;
3119                                     }
3120                                 }
3121                                 break;
3122                             } else {
3123                                 // master
3124                                 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED;
3125                             }
3126                             break;
3127 
3128                         case HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST:
3129                             con_handle = little_endian_read_16(packet, 3);
3130                             sm_conn = sm_get_connection_for_handle(con_handle);
3131                             if (!sm_conn) break;
3132 
3133                             log_info("LTK Request: state %u", sm_conn->sm_engine_state);
3134                             if (sm_conn->sm_engine_state == SM_RESPONDER_PH2_W4_LTK_REQUEST){
3135                                 sm_conn->sm_engine_state = SM_PH2_CALC_STK;
3136                                 break;
3137                             }
3138                             if (sm_conn->sm_engine_state == SM_SC_W4_LTK_REQUEST_SC){
3139                                 // PH2 SEND LTK as we need to exchange keys in PH3
3140                                 sm_conn->sm_engine_state = SM_RESPONDER_PH2_SEND_LTK_REPLY;
3141                                 break;
3142                             }
3143 
3144                             // store rand and ediv
3145                             reverse_64(&packet[5], sm_conn->sm_local_rand);
3146                             sm_conn->sm_local_ediv = little_endian_read_16(packet, 13);
3147 
3148                             // For Legacy Pairing (<=> EDIV != 0 || RAND != NULL), we need to recalculated our LTK as a
3149                             // potentially stored LTK is from the master
3150                             if (sm_conn->sm_local_ediv != 0 || !sm_is_null_random(sm_conn->sm_local_rand)){
3151                                 if (sm_reconstruct_ltk_without_le_device_db_entry){
3152                                     sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST;
3153                                     break;
3154                                 }
3155                                 // additionally check if remote is in LE Device DB if requested
3156                                 switch(sm_conn->sm_irk_lookup_state){
3157                                     case IRK_LOOKUP_FAILED:
3158                                         log_info("LTK Request: device not in device db");
3159                                         sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY;
3160                                         break;
3161                                     case IRK_LOOKUP_SUCCEEDED:
3162                                         sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST;
3163                                         break;
3164                                     default:
3165                                         // wait for irk look doen
3166                                         sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK;
3167                                         break;
3168                                 }
3169                                 break;
3170                             }
3171 
3172 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3173                             sm_conn->sm_engine_state = SM_SC_RECEIVED_LTK_REQUEST;
3174 #else
3175                             log_info("LTK Request: ediv & random are empty, but LE Secure Connections not supported");
3176                             sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY;
3177 #endif
3178                             break;
3179 
3180 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && !defined(USE_SOFTWARE_ECDH_IMPLEMENTATION)
3181                         case HCI_SUBEVENT_LE_READ_LOCAL_P256_PUBLIC_KEY_COMPLETE:
3182                             if (hci_subevent_le_read_local_p256_public_key_complete_get_status(packet)){
3183                                 log_error("Read Local P256 Public Key failed");
3184                                 break;
3185                             }
3186 
3187                             hci_subevent_le_read_local_p256_public_key_complete_get_dhkey_x(packet, &ec_q[0]);
3188                             hci_subevent_le_read_local_p256_public_key_complete_get_dhkey_y(packet, &ec_q[32]);
3189 
3190                             ec_key_generation_state = EC_KEY_GENERATION_DONE;
3191                             sm_log_ec_keypair();
3192                             break;
3193                         case HCI_SUBEVENT_LE_GENERATE_DHKEY_COMPLETE:
3194                             sm_conn = sm_get_connection_for_handle(sm_active_connection_handle);
3195                             if (hci_subevent_le_generate_dhkey_complete_get_status(packet)){
3196                                 log_error("Generate DHKEY failed -> abort");
3197                                 // abort pairing with 'unspecified reason'
3198                                 sm_pdu_received_in_wrong_state(sm_conn);
3199                                 break;
3200                             }
3201 
3202                             hci_subevent_le_generate_dhkey_complete_get_dhkey(packet, &setup->sm_dhkey[0]);
3203                             setup->sm_state_vars |= SM_STATE_VAR_DHKEY_CALCULATED;
3204                             log_info("dhkey");
3205                             log_info_hexdump(&setup->sm_dhkey[0], 32);
3206 
3207                             // trigger next step
3208                             if (sm_conn->sm_engine_state == SM_SC_W4_CALCULATE_DHKEY){
3209                                 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F5_SALT;
3210                             }
3211                             break;
3212 #endif
3213                         default:
3214                             break;
3215                     }
3216                     break;
3217 
3218                 case HCI_EVENT_ENCRYPTION_CHANGE:
3219                     con_handle = little_endian_read_16(packet, 3);
3220                     sm_conn = sm_get_connection_for_handle(con_handle);
3221                     if (!sm_conn) break;
3222 
3223                     sm_conn->sm_connection_encrypted = packet[5];
3224                     log_info("Encryption state change: %u, key size %u", sm_conn->sm_connection_encrypted,
3225                         sm_conn->sm_actual_encryption_key_size);
3226                     log_info("event handler, state %u", sm_conn->sm_engine_state);
3227                     if (!sm_conn->sm_connection_encrypted) break;
3228                     // continue if part of initial pairing
3229                     switch (sm_conn->sm_engine_state){
3230                         case SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED:
3231                             sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED;
3232                             sm_done_for_handle(sm_conn->sm_handle);
3233                             break;
3234                         case SM_PH2_W4_CONNECTION_ENCRYPTED:
3235                             if (IS_RESPONDER(sm_conn->sm_role)){
3236                                 // slave
3237                                 if (setup->sm_use_secure_connections){
3238                                     sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS;
3239                                 } else {
3240                                     sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
3241                                 }
3242                             } else {
3243                                 // master
3244                                 if (sm_key_distribution_all_received(sm_conn)){
3245                                     // skip receiving keys as there are none
3246                                     sm_key_distribution_handle_all_received(sm_conn);
3247                                     sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
3248                                 } else {
3249                                     sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS;
3250                                 }
3251                             }
3252                             break;
3253                         default:
3254                             break;
3255                     }
3256                     break;
3257 
3258                 case HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE:
3259                     con_handle = little_endian_read_16(packet, 3);
3260                     sm_conn = sm_get_connection_for_handle(con_handle);
3261                     if (!sm_conn) break;
3262 
3263                     log_info("Encryption key refresh complete, key size %u", sm_conn->sm_actual_encryption_key_size);
3264                     log_info("event handler, state %u", sm_conn->sm_engine_state);
3265                     // continue if part of initial pairing
3266                     switch (sm_conn->sm_engine_state){
3267                         case SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED:
3268                             sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED;
3269                             sm_done_for_handle(sm_conn->sm_handle);
3270                             break;
3271                         case SM_PH2_W4_CONNECTION_ENCRYPTED:
3272                             if (IS_RESPONDER(sm_conn->sm_role)){
3273                                 // slave
3274                                 sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
3275                             } else {
3276                                 // master
3277                                 sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS;
3278                             }
3279                             break;
3280                         default:
3281                             break;
3282                     }
3283                     break;
3284 
3285 
3286                 case HCI_EVENT_DISCONNECTION_COMPLETE:
3287                     con_handle = little_endian_read_16(packet, 3);
3288                     sm_done_for_handle(con_handle);
3289                     sm_conn = sm_get_connection_for_handle(con_handle);
3290                     if (!sm_conn) break;
3291 
3292                     // delete stored bonding on disconnect with authentication failure in ph0
3293                     if (sm_conn->sm_role == 0
3294                         && sm_conn->sm_engine_state == SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED
3295                         && packet[2] == ERROR_CODE_AUTHENTICATION_FAILURE){
3296                         le_device_db_remove(sm_conn->sm_le_db_index);
3297                     }
3298 
3299                     sm_conn->sm_engine_state = SM_GENERAL_IDLE;
3300                     sm_conn->sm_handle = 0;
3301                     break;
3302 
3303 				case HCI_EVENT_COMMAND_COMPLETE:
3304                     if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_le_encrypt)){
3305                         sm_handle_encryption_result(&packet[6]);
3306                         break;
3307                     }
3308                     if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_le_rand)){
3309                         sm_handle_random_result(&packet[6]);
3310                         break;
3311                     }
3312                     if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_read_bd_addr)){
3313                         // set local addr for le device db
3314                         bd_addr_t addr;
3315                         reverse_bd_addr(&packet[OFFSET_OF_DATA_IN_COMMAND_COMPLETE + 1], addr);
3316                         le_device_db_set_local_bd_addr(addr);
3317                     }
3318                     if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_read_local_supported_commands)){
3319 #if defined(ENABLE_LE_SECURE_CONNECTIONS) && !defined(USE_SOFTWARE_ECDH_IMPLEMENTATION)
3320                         if ((packet[OFFSET_OF_DATA_IN_COMMAND_COMPLETE+1+34] & 0x06) != 0x06){
3321                             // mbedTLS can also be used if already available (and malloc is supported)
3322                             log_error("LE Secure Connections enabled, but HCI Controller doesn't support it. Please add USE_MICRO_ECC_FOR_ECDH to btstack_config.h");
3323                         }
3324 #endif
3325                     }
3326                     break;
3327                 default:
3328                     break;
3329 			}
3330             break;
3331         default:
3332             break;
3333 	}
3334 
3335     sm_run();
3336 }
3337 
3338 static inline int sm_calc_actual_encryption_key_size(int other){
3339     if (other < sm_min_encryption_key_size) return 0;
3340     if (other < sm_max_encryption_key_size) return other;
3341     return sm_max_encryption_key_size;
3342 }
3343 
3344 
3345 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3346 static int sm_just_works_or_numeric_comparison(stk_generation_method_t method){
3347     switch (method){
3348         case JUST_WORKS:
3349         case NK_BOTH_INPUT:
3350             return 1;
3351         default:
3352             return 0;
3353     }
3354 }
3355 // responder
3356 
3357 static int sm_passkey_used(stk_generation_method_t method){
3358     switch (method){
3359         case PK_RESP_INPUT:
3360             return 1;
3361         default:
3362             return 0;
3363     }
3364 }
3365 #endif
3366 
3367 /**
3368  * @return ok
3369  */
3370 static int sm_validate_stk_generation_method(void){
3371     // check if STK generation method is acceptable by client
3372     switch (setup->sm_stk_generation_method){
3373         case JUST_WORKS:
3374             return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_JUST_WORKS) != 0;
3375         case PK_RESP_INPUT:
3376         case PK_INIT_INPUT:
3377         case OK_BOTH_INPUT:
3378             return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_PASSKEY) != 0;
3379         case OOB:
3380             return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_OOB) != 0;
3381         case NK_BOTH_INPUT:
3382             return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_NUMERIC_COMPARISON) != 0;
3383             return 1;
3384         default:
3385             return 0;
3386     }
3387 }
3388 
3389 // size of complete sm_pdu used to validate input
3390 static const uint8_t sm_pdu_size[] = {
3391     0,  // 0x00 invalid opcode
3392     7,  // 0x01 pairing request
3393     7,  // 0x02 pairing response
3394     17, // 0x03 pairing confirm
3395     17, // 0x04 pairing random
3396     2,  // 0x05 pairing failed
3397     17, // 0x06 encryption information
3398     11, // 0x07 master identification
3399     17, // 0x08 identification information
3400     8,  // 0x09 identify address information
3401     17, // 0x0a signing information
3402     2,  // 0x0b security request
3403     65, // 0x0c pairing public key
3404     17, // 0x0d pairing dhk check
3405     2,  // 0x0e keypress notification
3406 };
3407 
3408 static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uint8_t *packet, uint16_t size){
3409 
3410     if (packet_type == HCI_EVENT_PACKET && packet[0] == L2CAP_EVENT_CAN_SEND_NOW){
3411         sm_run();
3412     }
3413 
3414     if (packet_type != SM_DATA_PACKET) return;
3415     if (size == 0) return;
3416 
3417     uint8_t sm_pdu_code = packet[0];
3418 
3419     // validate pdu size
3420     if (sm_pdu_code >= sizeof(sm_pdu_size)) return;
3421     if (sm_pdu_size[sm_pdu_code] != size)   return;
3422 
3423     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
3424     if (!sm_conn) return;
3425 
3426     if (sm_pdu_code == SM_CODE_PAIRING_FAILED){
3427         sm_conn->sm_engine_state = sm_conn->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED;
3428         return;
3429     }
3430 
3431     log_debug("sm_pdu_handler: state %u, pdu 0x%02x", sm_conn->sm_engine_state, sm_pdu_code);
3432 
3433     int err;
3434     UNUSED(err);
3435 
3436     if (sm_pdu_code == SM_CODE_KEYPRESS_NOTIFICATION){
3437         uint8_t buffer[5];
3438         buffer[0] = SM_EVENT_KEYPRESS_NOTIFICATION;
3439         buffer[1] = 3;
3440         little_endian_store_16(buffer, 2, con_handle);
3441         buffer[4] = packet[1];
3442         sm_dispatch_event(HCI_EVENT_PACKET, 0, buffer, sizeof(buffer));
3443         return;
3444     }
3445 
3446     switch (sm_conn->sm_engine_state){
3447 
3448         // a sm timeout requries a new physical connection
3449         case SM_GENERAL_TIMEOUT:
3450             return;
3451 
3452 #ifdef ENABLE_LE_CENTRAL
3453 
3454         // Initiator
3455         case SM_INITIATOR_CONNECTED:
3456             if ((sm_pdu_code != SM_CODE_SECURITY_REQUEST) || (sm_conn->sm_role)){
3457                 sm_pdu_received_in_wrong_state(sm_conn);
3458                 break;
3459             }
3460             if (sm_conn->sm_irk_lookup_state == IRK_LOOKUP_FAILED){
3461                 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
3462                 break;
3463             }
3464             if (sm_conn->sm_irk_lookup_state == IRK_LOOKUP_SUCCEEDED){
3465                 sm_key_t ltk;
3466                 le_device_db_encryption_get(sm_conn->sm_le_db_index, NULL, NULL, ltk, NULL, NULL, NULL);
3467                 if (!sm_is_null_key(ltk)){
3468                     log_info("sm: Setting up previous ltk/ediv/rand for device index %u", sm_conn->sm_le_db_index);
3469                     sm_conn->sm_engine_state = SM_INITIATOR_PH0_HAS_LTK;
3470                 } else {
3471                     sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
3472                 }
3473                 break;
3474             }
3475             // otherwise, store security request
3476             sm_conn->sm_security_request_received = 1;
3477             break;
3478 
3479         case SM_INITIATOR_PH1_W4_PAIRING_RESPONSE:
3480             if (sm_pdu_code != SM_CODE_PAIRING_RESPONSE){
3481                 sm_pdu_received_in_wrong_state(sm_conn);
3482                 break;
3483             }
3484             // store pairing request
3485             memcpy(&setup->sm_s_pres, packet, sizeof(sm_pairing_packet_t));
3486             err = sm_stk_generation_init(sm_conn);
3487             if (err){
3488                 setup->sm_pairing_failed_reason = err;
3489                 sm_conn->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
3490                 break;
3491             }
3492 
3493             // generate random number first, if we need to show passkey
3494             if (setup->sm_stk_generation_method == PK_RESP_INPUT){
3495                 sm_conn->sm_engine_state = SM_PH2_GET_RANDOM_TK;
3496                 break;
3497             }
3498 
3499 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3500             if (setup->sm_use_secure_connections){
3501                 // SC Numeric Comparison will trigger user response after public keys & nonces have been exchanged
3502                 if (setup->sm_stk_generation_method == JUST_WORKS){
3503                     sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE;
3504                     sm_trigger_user_response(sm_conn);
3505                     if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){
3506                         sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND;
3507                     }
3508                 } else {
3509                     sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND;
3510                 }
3511                 break;
3512             }
3513 #endif
3514             sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE;
3515             sm_trigger_user_response(sm_conn);
3516             // response_idle == nothing <--> sm_trigger_user_response() did not require response
3517             if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){
3518                 sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
3519             }
3520             break;
3521 
3522         case SM_INITIATOR_PH2_W4_PAIRING_CONFIRM:
3523             if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){
3524                 sm_pdu_received_in_wrong_state(sm_conn);
3525                 break;
3526             }
3527 
3528             // store s_confirm
3529             reverse_128(&packet[1], setup->sm_peer_confirm);
3530             sm_conn->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM;
3531             break;
3532 
3533         case SM_INITIATOR_PH2_W4_PAIRING_RANDOM:
3534             if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){
3535                 sm_pdu_received_in_wrong_state(sm_conn);
3536                 break;;
3537             }
3538 
3539             // received random value
3540             reverse_128(&packet[1], setup->sm_peer_random);
3541             sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C;
3542             break;
3543 #endif
3544 
3545 #ifdef ENABLE_LE_PERIPHERAL
3546         // Responder
3547         case SM_RESPONDER_IDLE:
3548         case SM_RESPONDER_SEND_SECURITY_REQUEST:
3549         case SM_RESPONDER_PH1_W4_PAIRING_REQUEST:
3550             if (sm_pdu_code != SM_CODE_PAIRING_REQUEST){
3551                 sm_pdu_received_in_wrong_state(sm_conn);
3552                 break;;
3553             }
3554 
3555             // store pairing request
3556             memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t));
3557             sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
3558             break;
3559 #endif
3560 
3561 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3562         case SM_SC_W4_PUBLIC_KEY_COMMAND:
3563             if (sm_pdu_code != SM_CODE_PAIRING_PUBLIC_KEY){
3564                 sm_pdu_received_in_wrong_state(sm_conn);
3565                 break;
3566             }
3567 
3568             // store public key for DH Key calculation
3569             reverse_256(&packet[01], &setup->sm_peer_q[0]);
3570             reverse_256(&packet[33], &setup->sm_peer_q[32]);
3571 
3572             // validate public key using micro-ecc
3573             err = 0;
3574 
3575 #ifdef USE_MICRO_ECC_FOR_ECDH
3576 #if uECC_SUPPORTS_secp256r1
3577             // standard version
3578             err = uECC_valid_public_key(setup->sm_peer_q, uECC_secp256r1()) == 0;
3579 #else
3580             // static version
3581             err = uECC_valid_public_key(setup->sm_peer_q) == 0;
3582 #endif
3583 #endif
3584 
3585 #ifdef USE_MBEDTLS_FOR_ECDH
3586             mbedtls_ecp_point Q;
3587             mbedtls_ecp_point_init( &Q );
3588             mbedtls_mpi_read_binary(&Q.X, &setup->sm_peer_q[0], 32);
3589             mbedtls_mpi_read_binary(&Q.Y, &setup->sm_peer_q[32], 32);
3590             mbedtls_mpi_lset(&Q.Z, 1);
3591             err = mbedtls_ecp_check_pubkey(&mbedtls_ec_group, &Q);
3592             mbedtls_ecp_point_free( & Q);
3593 #endif
3594 
3595             if (err){
3596                 log_error("sm: peer public key invalid %x", err);
3597                 // uses "unspecified reason", there is no "public key invalid" error code
3598                 sm_pdu_received_in_wrong_state(sm_conn);
3599                 break;
3600             }
3601 
3602 #ifndef USE_SOFTWARE_ECDH_IMPLEMENTATION
3603             // ask controller to calculate dhkey
3604             setup->sm_state_vars |= SM_STATE_VAR_DHKEY_NEEDED;
3605 #endif
3606 
3607             if (IS_RESPONDER(sm_conn->sm_role)){
3608                 // responder
3609                 sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND;
3610             } else {
3611                 // initiator
3612                 // stk generation method
3613                 // passkey entry: notify app to show passkey or to request passkey
3614                 switch (setup->sm_stk_generation_method){
3615                     case JUST_WORKS:
3616                     case NK_BOTH_INPUT:
3617                         sm_conn->sm_engine_state = SM_SC_W4_CONFIRMATION;
3618                         break;
3619                     case PK_RESP_INPUT:
3620                         sm_sc_start_calculating_local_confirm(sm_conn);
3621                         break;
3622                     case PK_INIT_INPUT:
3623                     case OK_BOTH_INPUT:
3624                         if (setup->sm_user_response != SM_USER_RESPONSE_PASSKEY){
3625                             sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE;
3626                             break;
3627                         }
3628                         sm_sc_start_calculating_local_confirm(sm_conn);
3629                         break;
3630                     case OOB:
3631                         // TODO: implement SC OOB
3632                         break;
3633                 }
3634             }
3635             break;
3636 
3637         case SM_SC_W4_CONFIRMATION:
3638             if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){
3639                 sm_pdu_received_in_wrong_state(sm_conn);
3640                 break;
3641             }
3642             // received confirm value
3643             reverse_128(&packet[1], setup->sm_peer_confirm);
3644 
3645             if (IS_RESPONDER(sm_conn->sm_role)){
3646                 // responder
3647                 if (sm_passkey_used(setup->sm_stk_generation_method)){
3648                     if (setup->sm_user_response != SM_USER_RESPONSE_PASSKEY){
3649                         // still waiting for passkey
3650                         sm_conn->sm_engine_state = SM_SC_W4_USER_RESPONSE;
3651                         break;
3652                     }
3653                 }
3654                 sm_sc_start_calculating_local_confirm(sm_conn);
3655             } else {
3656                 // initiator
3657                 if (sm_just_works_or_numeric_comparison(setup->sm_stk_generation_method)){
3658                     sm_conn->sm_engine_state = SM_SC_W2_GET_RANDOM_A;
3659                 } else {
3660                     sm_conn->sm_engine_state = SM_SC_SEND_PAIRING_RANDOM;
3661                 }
3662             }
3663             break;
3664 
3665         case SM_SC_W4_PAIRING_RANDOM:
3666             if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){
3667                 sm_pdu_received_in_wrong_state(sm_conn);
3668                 break;
3669             }
3670 
3671             // received random value
3672             reverse_128(&packet[1], setup->sm_peer_nonce);
3673 
3674             // validate confirm value if Cb = f4(Pkb, Pka, Nb, z)
3675             // only check for JUST WORK/NC in initiator role AND passkey entry
3676             if (sm_conn->sm_role || sm_passkey_used(setup->sm_stk_generation_method)) {
3677                  sm_conn->sm_engine_state = SM_SC_W2_CMAC_FOR_CHECK_CONFIRMATION;
3678             }
3679 
3680             sm_sc_state_after_receiving_random(sm_conn);
3681             break;
3682 
3683         case SM_SC_W2_CALCULATE_G2:
3684         case SM_SC_W4_CALCULATE_G2:
3685         case SM_SC_W4_CALCULATE_DHKEY:
3686         case SM_SC_W2_CALCULATE_F5_SALT:
3687         case SM_SC_W4_CALCULATE_F5_SALT:
3688         case SM_SC_W2_CALCULATE_F5_MACKEY:
3689         case SM_SC_W4_CALCULATE_F5_MACKEY:
3690         case SM_SC_W2_CALCULATE_F5_LTK:
3691         case SM_SC_W4_CALCULATE_F5_LTK:
3692         case SM_SC_W2_CALCULATE_F6_FOR_DHKEY_CHECK:
3693         case SM_SC_W4_DHKEY_CHECK_COMMAND:
3694         case SM_SC_W4_CALCULATE_F6_FOR_DHKEY_CHECK:
3695             if (sm_pdu_code != SM_CODE_PAIRING_DHKEY_CHECK){
3696                 sm_pdu_received_in_wrong_state(sm_conn);
3697                 break;
3698             }
3699             // store DHKey Check
3700             setup->sm_state_vars |= SM_STATE_VAR_DHKEY_COMMAND_RECEIVED;
3701             reverse_128(&packet[01], setup->sm_peer_dhkey_check);
3702 
3703             // have we been only waiting for dhkey check command?
3704             if (sm_conn->sm_engine_state == SM_SC_W4_DHKEY_CHECK_COMMAND){
3705                 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_F6_TO_VERIFY_DHKEY_CHECK;
3706             }
3707             break;
3708 #endif
3709 
3710 #ifdef ENABLE_LE_PERIPHERAL
3711         case SM_RESPONDER_PH1_W4_PAIRING_CONFIRM:
3712             if (sm_pdu_code != SM_CODE_PAIRING_CONFIRM){
3713                 sm_pdu_received_in_wrong_state(sm_conn);
3714                 break;
3715             }
3716 
3717             // received confirm value
3718             reverse_128(&packet[1], setup->sm_peer_confirm);
3719 
3720             // notify client to hide shown passkey
3721             if (setup->sm_stk_generation_method == PK_INIT_INPUT){
3722                 sm_notify_client_base(SM_EVENT_PASSKEY_DISPLAY_CANCEL, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
3723             }
3724 
3725             // handle user cancel pairing?
3726             if (setup->sm_user_response == SM_USER_RESPONSE_DECLINE){
3727                 setup->sm_pairing_failed_reason = SM_REASON_PASSKEY_ENTRY_FAILED;
3728                 sm_conn->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
3729                 break;
3730             }
3731 
3732             // wait for user action?
3733             if (setup->sm_user_response == SM_USER_RESPONSE_PENDING){
3734                 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE;
3735                 break;
3736             }
3737 
3738             // calculate and send local_confirm
3739             sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
3740             break;
3741 
3742         case SM_RESPONDER_PH2_W4_PAIRING_RANDOM:
3743             if (sm_pdu_code != SM_CODE_PAIRING_RANDOM){
3744                 sm_pdu_received_in_wrong_state(sm_conn);
3745                 break;;
3746             }
3747 
3748             // received random value
3749             reverse_128(&packet[1], setup->sm_peer_random);
3750             sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C;
3751             break;
3752 #endif
3753 
3754         case SM_PH3_RECEIVE_KEYS:
3755             switch(sm_pdu_code){
3756                 case SM_CODE_ENCRYPTION_INFORMATION:
3757                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION;
3758                     reverse_128(&packet[1], setup->sm_peer_ltk);
3759                     break;
3760 
3761                 case SM_CODE_MASTER_IDENTIFICATION:
3762                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION;
3763                     setup->sm_peer_ediv = little_endian_read_16(packet, 1);
3764                     reverse_64(&packet[3], setup->sm_peer_rand);
3765                     break;
3766 
3767                 case SM_CODE_IDENTITY_INFORMATION:
3768                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION;
3769                     reverse_128(&packet[1], setup->sm_peer_irk);
3770                     break;
3771 
3772                 case SM_CODE_IDENTITY_ADDRESS_INFORMATION:
3773                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION;
3774                     setup->sm_peer_addr_type = packet[1];
3775                     reverse_bd_addr(&packet[2], setup->sm_peer_address);
3776                     break;
3777 
3778                 case SM_CODE_SIGNING_INFORMATION:
3779                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION;
3780                     reverse_128(&packet[1], setup->sm_peer_csrk);
3781                     break;
3782                 default:
3783                     // Unexpected PDU
3784                     log_info("Unexpected PDU %u in SM_PH3_RECEIVE_KEYS", packet[0]);
3785                     break;
3786             }
3787             // done with key distribution?
3788             if (sm_key_distribution_all_received(sm_conn)){
3789 
3790                 sm_key_distribution_handle_all_received(sm_conn);
3791 
3792                 if (IS_RESPONDER(sm_conn->sm_role)){
3793                     if (setup->sm_use_secure_connections && (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION)){
3794                         sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_H6_ILK;
3795                     } else {
3796                         sm_conn->sm_engine_state = SM_RESPONDER_IDLE;
3797                         sm_done_for_handle(sm_conn->sm_handle);
3798                     }
3799                 } else {
3800                     if (setup->sm_use_secure_connections){
3801                         sm_conn->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS;
3802                     } else {
3803                         sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
3804                     }
3805                 }
3806             }
3807             break;
3808         default:
3809             // Unexpected PDU
3810             log_info("Unexpected PDU %u in state %u", packet[0], sm_conn->sm_engine_state);
3811             break;
3812     }
3813 
3814     // try to send preparared packet
3815     sm_run();
3816 }
3817 
3818 // Security Manager Client API
3819 void sm_register_oob_data_callback( int (*get_oob_data_callback)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_data)){
3820     sm_get_oob_data = get_oob_data_callback;
3821 }
3822 
3823 void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
3824     btstack_linked_list_add_tail(&sm_event_handlers, (btstack_linked_item_t*) callback_handler);
3825 }
3826 
3827 void sm_set_accepted_stk_generation_methods(uint8_t accepted_stk_generation_methods){
3828     sm_accepted_stk_generation_methods = accepted_stk_generation_methods;
3829 }
3830 
3831 void sm_set_encryption_key_size_range(uint8_t min_size, uint8_t max_size){
3832 	sm_min_encryption_key_size = min_size;
3833 	sm_max_encryption_key_size = max_size;
3834 }
3835 
3836 void sm_set_authentication_requirements(uint8_t auth_req){
3837 #ifndef ENABLE_LE_SECURE_CONNECTIONS
3838     if (auth_req & SM_AUTHREQ_SECURE_CONNECTION){
3839         log_error("ENABLE_LE_SECURE_CONNECTIONS not defined, but requested by app. Dropping SC flag");
3840         auth_req &= ~SM_AUTHREQ_SECURE_CONNECTION;
3841     }
3842 #endif
3843     sm_auth_req = auth_req;
3844 }
3845 
3846 void sm_set_io_capabilities(io_capability_t io_capability){
3847     sm_io_capabilities = io_capability;
3848 }
3849 
3850 #ifdef ENABLE_LE_PERIPHERAL
3851 void sm_set_request_security(int enable){
3852     sm_slave_request_security = enable;
3853 }
3854 #endif
3855 
3856 void sm_set_er(sm_key_t er){
3857     memcpy(sm_persistent_er, er, 16);
3858 }
3859 
3860 void sm_set_ir(sm_key_t ir){
3861     memcpy(sm_persistent_ir, ir, 16);
3862 }
3863 
3864 // Testing support only
3865 void sm_test_set_irk(sm_key_t irk){
3866     memcpy(sm_persistent_irk, irk, 16);
3867     sm_persistent_irk_ready = 1;
3868 }
3869 
3870 void sm_test_use_fixed_local_csrk(void){
3871     test_use_fixed_local_csrk = 1;
3872 }
3873 
3874 void sm_init(void){
3875     // set some (BTstack default) ER and IR
3876     int i;
3877     sm_key_t er;
3878     sm_key_t ir;
3879     for (i=0;i<16;i++){
3880         er[i] = 0x30 + i;
3881         ir[i] = 0x90 + i;
3882     }
3883     sm_set_er(er);
3884     sm_set_ir(ir);
3885     // defaults
3886     sm_accepted_stk_generation_methods = SM_STK_GENERATION_METHOD_JUST_WORKS
3887                                        | SM_STK_GENERATION_METHOD_OOB
3888                                        | SM_STK_GENERATION_METHOD_PASSKEY
3889                                        | SM_STK_GENERATION_METHOD_NUMERIC_COMPARISON;
3890 
3891     sm_max_encryption_key_size = 16;
3892     sm_min_encryption_key_size = 7;
3893 
3894     sm_fixed_passkey_in_display_role = 0xffffffff;
3895     sm_reconstruct_ltk_without_le_device_db_entry = 1;
3896 
3897 #ifdef ENABLE_CMAC_ENGINE
3898     sm_cmac_state  = CMAC_IDLE;
3899 #endif
3900     dkg_state = DKG_W4_WORKING;
3901     rau_state = RAU_W4_WORKING;
3902     sm_aes128_state = SM_AES128_IDLE;
3903     sm_address_resolution_test = -1;    // no private address to resolve yet
3904     sm_address_resolution_ah_calculation_active = 0;
3905     sm_address_resolution_mode = ADDRESS_RESOLUTION_IDLE;
3906     sm_address_resolution_general_queue = NULL;
3907 
3908     gap_random_adress_update_period = 15 * 60 * 1000L;
3909     sm_active_connection_handle = HCI_CON_HANDLE_INVALID;
3910 
3911     test_use_fixed_local_csrk = 0;
3912 
3913     // register for HCI Events from HCI
3914     hci_event_callback_registration.callback = &sm_event_packet_handler;
3915     hci_add_event_handler(&hci_event_callback_registration);
3916 
3917     // and L2CAP PDUs + L2CAP_EVENT_CAN_SEND_NOW
3918     l2cap_register_fixed_channel(sm_pdu_handler, L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
3919 
3920 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3921     ec_key_generation_state = EC_KEY_GENERATION_IDLE;
3922 #endif
3923 
3924 #ifdef USE_MBEDTLS_FOR_ECDH
3925     mbedtls_ecp_group_init(&mbedtls_ec_group);
3926     mbedtls_ecp_group_load(&mbedtls_ec_group, MBEDTLS_ECP_DP_SECP256R1);
3927 #endif
3928 }
3929 
3930 void sm_use_fixed_ec_keypair(uint8_t * qx, uint8_t * qy, uint8_t * d){
3931 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3932     memcpy(&ec_q[0],  qx, 32);
3933     memcpy(&ec_q[32], qy, 32);
3934     memcpy(ec_d, d, 32);
3935     sm_have_ec_keypair = 1;
3936     ec_key_generation_state = EC_KEY_GENERATION_DONE;
3937 #else
3938     UNUSED(qx);
3939     UNUSED(qy);
3940     UNUSED(d);
3941 #endif
3942 }
3943 
3944 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3945 static void parse_hex(uint8_t * buffer, const char * hex_string){
3946     while (*hex_string){
3947         int high_nibble = nibble_for_char(*hex_string++);
3948         int low_nibble  = nibble_for_char(*hex_string++);
3949         *buffer++       = (high_nibble << 4) | low_nibble;
3950     }
3951 }
3952 #endif
3953 
3954 void sm_test_use_fixed_ec_keypair(void){
3955 #ifdef ENABLE_LE_SECURE_CONNECTIONS
3956     const char * ec_d_string =  "3f49f6d4a3c55f3874c9b3e3d2103f504aff607beb40b7995899b8a6cd3c1abd";
3957     const char * ec_qx_string = "20b003d2f297be2c5e2c83a7e9f9a5b9eff49111acf4fddbcc0301480e359de6";
3958     const char * ec_qy_string = "dc809c49652aeb6d63329abf5a52155c766345c28fed3024741c8ed01589d28b";
3959     parse_hex(ec_d, ec_d_string);
3960     parse_hex(&ec_q[0],  ec_qx_string);
3961     parse_hex(&ec_q[32], ec_qy_string);
3962     sm_have_ec_keypair = 1;
3963     ec_key_generation_state = EC_KEY_GENERATION_DONE;
3964 #endif
3965 }
3966 
3967 void sm_use_fixed_passkey_in_display_role(uint32_t passkey){
3968     sm_fixed_passkey_in_display_role = passkey;
3969 }
3970 
3971 void sm_allow_ltk_reconstruction_without_le_device_db_entry(int allow){
3972     sm_reconstruct_ltk_without_le_device_db_entry = allow;
3973 }
3974 
3975 static sm_connection_t * sm_get_connection_for_handle(hci_con_handle_t con_handle){
3976     hci_connection_t * hci_con = hci_connection_for_handle(con_handle);
3977     if (!hci_con) return NULL;
3978     return &hci_con->sm_connection;
3979 }
3980 
3981 static void sm_send_security_request_for_connection(sm_connection_t * sm_conn){
3982     switch (sm_conn->sm_engine_state){
3983         case SM_GENERAL_IDLE:
3984         case SM_RESPONDER_IDLE:
3985             sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST;
3986             sm_run();
3987             break;
3988         default:
3989             break;
3990     }
3991 }
3992 
3993 /**
3994  * @brief Trigger Security Request
3995  */
3996 void sm_send_security_request(hci_con_handle_t con_handle){
3997     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
3998     if (!sm_conn) return;
3999     sm_send_security_request_for_connection(sm_conn);
4000 }
4001 
4002 // request pairing
4003 void sm_request_pairing(hci_con_handle_t con_handle){
4004     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4005     if (!sm_conn) return;     // wrong connection
4006 
4007     log_info("sm_request_pairing in role %u, state %u", sm_conn->sm_role, sm_conn->sm_engine_state);
4008     if (IS_RESPONDER(sm_conn->sm_role)){
4009         sm_send_security_request_for_connection(sm_conn);
4010     } else {
4011         // used as a trigger to start central/master/initiator security procedures
4012         uint16_t ediv;
4013         sm_key_t ltk;
4014         if (sm_conn->sm_engine_state == SM_INITIATOR_CONNECTED){
4015             switch (sm_conn->sm_irk_lookup_state){
4016                 case IRK_LOOKUP_FAILED:
4017                     sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
4018                     break;
4019                 case IRK_LOOKUP_SUCCEEDED:
4020                         le_device_db_encryption_get(sm_conn->sm_le_db_index, &ediv, NULL, ltk, NULL, NULL, NULL);
4021                         if (!sm_is_null_key(ltk) || ediv){
4022                             log_info("sm: Setting up previous ltk/ediv/rand for device index %u", sm_conn->sm_le_db_index);
4023                             sm_conn->sm_engine_state = SM_INITIATOR_PH0_HAS_LTK;
4024                         } else {
4025                             sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
4026                         }
4027                         break;
4028                 default:
4029                     sm_conn->sm_bonding_requested = 1;
4030                     break;
4031             }
4032         } else if (sm_conn->sm_engine_state == SM_GENERAL_IDLE){
4033             sm_conn->sm_bonding_requested = 1;
4034         }
4035     }
4036     sm_run();
4037 }
4038 
4039 // called by client app on authorization request
4040 void sm_authorization_decline(hci_con_handle_t con_handle){
4041     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4042     if (!sm_conn) return;     // wrong connection
4043     sm_conn->sm_connection_authorization_state = AUTHORIZATION_DECLINED;
4044     sm_notify_client_authorization(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 0);
4045 }
4046 
4047 void sm_authorization_grant(hci_con_handle_t con_handle){
4048     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4049     if (!sm_conn) return;     // wrong connection
4050     sm_conn->sm_connection_authorization_state = AUTHORIZATION_GRANTED;
4051     sm_notify_client_authorization(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 1);
4052 }
4053 
4054 // GAP Bonding API
4055 
4056 void sm_bonding_decline(hci_con_handle_t con_handle){
4057     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4058     if (!sm_conn) return;     // wrong connection
4059     setup->sm_user_response = SM_USER_RESPONSE_DECLINE;
4060 
4061     if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){
4062         switch (setup->sm_stk_generation_method){
4063             case PK_RESP_INPUT:
4064             case PK_INIT_INPUT:
4065             case OK_BOTH_INPUT:
4066                 sm_pairing_error(sm_conn, SM_GENERAL_SEND_PAIRING_FAILED);
4067                 break;
4068             case NK_BOTH_INPUT:
4069                 sm_pairing_error(sm_conn, SM_REASON_NUMERIC_COMPARISON_FAILED);
4070                 break;
4071             case JUST_WORKS:
4072             case OOB:
4073                 sm_pairing_error(sm_conn, SM_REASON_UNSPECIFIED_REASON);
4074                 break;
4075         }
4076     }
4077     sm_run();
4078 }
4079 
4080 void sm_just_works_confirm(hci_con_handle_t con_handle){
4081     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4082     if (!sm_conn) return;     // wrong connection
4083     setup->sm_user_response = SM_USER_RESPONSE_CONFIRM;
4084     if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){
4085         if (setup->sm_use_secure_connections){
4086             sm_conn->sm_engine_state = SM_SC_SEND_PUBLIC_KEY_COMMAND;
4087         } else {
4088             sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
4089         }
4090     }
4091 
4092 #ifdef ENABLE_LE_SECURE_CONNECTIONS
4093     if (sm_conn->sm_engine_state == SM_SC_W4_USER_RESPONSE){
4094         sm_sc_prepare_dhkey_check(sm_conn);
4095     }
4096 #endif
4097 
4098     sm_run();
4099 }
4100 
4101 void sm_numeric_comparison_confirm(hci_con_handle_t con_handle){
4102     // for now, it's the same
4103     sm_just_works_confirm(con_handle);
4104 }
4105 
4106 void sm_passkey_input(hci_con_handle_t con_handle, uint32_t passkey){
4107     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4108     if (!sm_conn) return;     // wrong connection
4109     sm_reset_tk();
4110     big_endian_store_32(setup->sm_tk, 12, passkey);
4111     setup->sm_user_response = SM_USER_RESPONSE_PASSKEY;
4112     if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){
4113         sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
4114     }
4115 #ifdef ENABLE_LE_SECURE_CONNECTIONS
4116     memcpy(setup->sm_ra, setup->sm_tk, 16);
4117     memcpy(setup->sm_rb, setup->sm_tk, 16);
4118     if (sm_conn->sm_engine_state == SM_SC_W4_USER_RESPONSE){
4119         sm_sc_start_calculating_local_confirm(sm_conn);
4120     }
4121 #endif
4122     sm_run();
4123 }
4124 
4125 void sm_keypress_notification(hci_con_handle_t con_handle, uint8_t action){
4126     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4127     if (!sm_conn) return;     // wrong connection
4128     if (action > SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED) return;
4129     setup->sm_keypress_notification = action;
4130     sm_run();
4131 }
4132 
4133 /**
4134  * @brief Identify device in LE Device DB
4135  * @param handle
4136  * @returns index from le_device_db or -1 if not found/identified
4137  */
4138 int sm_le_device_index(hci_con_handle_t con_handle ){
4139     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
4140     if (!sm_conn) return -1;
4141     return sm_conn->sm_le_db_index;
4142 }
4143 
4144 static int gap_random_address_type_requires_updates(void){
4145     if (gap_random_adress_type == GAP_RANDOM_ADDRESS_TYPE_OFF) return 0;
4146     if (gap_random_adress_type == GAP_RANDOM_ADDRESS_TYPE_OFF) return 0;
4147     return 1;
4148 }
4149 
4150 static uint8_t own_address_type(void){
4151     switch (gap_random_adress_type){
4152         case GAP_RANDOM_ADDRESS_TYPE_OFF:
4153             return BD_ADDR_TYPE_LE_PUBLIC;
4154         default:
4155             return BD_ADDR_TYPE_LE_RANDOM;
4156     }
4157 }
4158 
4159 // GAP LE API
4160 void gap_random_address_set_mode(gap_random_address_type_t random_address_type){
4161     gap_random_address_update_stop();
4162     gap_random_adress_type = random_address_type;
4163     hci_le_set_own_address_type(own_address_type());
4164     if (!gap_random_address_type_requires_updates()) return;
4165     gap_random_address_update_start();
4166     gap_random_address_trigger();
4167 }
4168 
4169 gap_random_address_type_t gap_random_address_get_mode(void){
4170     return gap_random_adress_type;
4171 }
4172 
4173 void gap_random_address_set_update_period(int period_ms){
4174     gap_random_adress_update_period = period_ms;
4175     if (!gap_random_address_type_requires_updates()) return;
4176     gap_random_address_update_stop();
4177     gap_random_address_update_start();
4178 }
4179 
4180 void gap_random_address_set(bd_addr_t addr){
4181     gap_random_address_set_mode(GAP_RANDOM_ADDRESS_TYPE_STATIC);
4182     memcpy(sm_random_address, addr, 6);
4183     if (rau_state == RAU_W4_WORKING) return;
4184     rau_state = RAU_SET_ADDRESS;
4185     sm_run();
4186 }
4187 
4188 #ifdef ENABLE_LE_PERIPHERAL
4189 /*
4190  * @brief Set Advertisement Paramters
4191  * @param adv_int_min
4192  * @param adv_int_max
4193  * @param adv_type
4194  * @param direct_address_type
4195  * @param direct_address
4196  * @param channel_map
4197  * @param filter_policy
4198  *
4199  * @note own_address_type is used from gap_random_address_set_mode
4200  */
4201 void gap_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type,
4202     uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy){
4203     hci_le_advertisements_set_params(adv_int_min, adv_int_max, adv_type,
4204         direct_address_typ, direct_address, channel_map, filter_policy);
4205 }
4206 #endif
4207