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