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