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