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