xref: /btstack/src/ble/sm.c (revision 0e2df43f5cbae3fc71139523458b98f30307d21b)
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/sm.h"
44 #include "btstack_debug.h"
45 #include "btstack_event.h"
46 #include "btstack_linked_list.h"
47 #include "btstack_memory.h"
48 #include "gap.h"
49 #include "hci.h"
50 #include "l2cap.h"
51 
52 //
53 // SM internal types and globals
54 //
55 
56 typedef enum {
57     DKG_W4_WORKING,
58     DKG_CALC_IRK,
59     DKG_W4_IRK,
60     DKG_CALC_DHK,
61     DKG_W4_DHK,
62     DKG_READY
63 } derived_key_generation_t;
64 
65 typedef enum {
66     RAU_W4_WORKING,
67     RAU_IDLE,
68     RAU_GET_RANDOM,
69     RAU_W4_RANDOM,
70     RAU_GET_ENC,
71     RAU_W4_ENC,
72     RAU_SET_ADDRESS,
73 } random_address_update_t;
74 
75 typedef enum {
76     CMAC_IDLE,
77     CMAC_CALC_SUBKEYS,
78     CMAC_W4_SUBKEYS,
79     CMAC_CALC_MI,
80     CMAC_W4_MI,
81     CMAC_CALC_MLAST,
82     CMAC_W4_MLAST
83 } cmac_state_t;
84 
85 typedef enum {
86     JUST_WORKS,
87     PK_RESP_INPUT,  // Initiator displays PK, initiator inputs PK
88     PK_INIT_INPUT,  // Responder displays PK, responder inputs PK
89     OK_BOTH_INPUT,  // Only input on both, both input PK
90     OOB             // OOB available on both sides
91 } stk_generation_method_t;
92 
93 typedef enum {
94     SM_USER_RESPONSE_IDLE,
95     SM_USER_RESPONSE_PENDING,
96     SM_USER_RESPONSE_CONFIRM,
97     SM_USER_RESPONSE_PASSKEY,
98     SM_USER_RESPONSE_DECLINE
99 } sm_user_response_t;
100 
101 typedef enum {
102     SM_AES128_IDLE,
103     SM_AES128_ACTIVE
104 } sm_aes128_state_t;
105 
106 typedef enum {
107     ADDRESS_RESOLUTION_IDLE,
108     ADDRESS_RESOLUTION_GENERAL,
109     ADDRESS_RESOLUTION_FOR_CONNECTION,
110 } address_resolution_mode_t;
111 
112 typedef enum {
113     ADDRESS_RESOLUTION_SUCEEDED,
114     ADDRESS_RESOLUTION_FAILED,
115 } address_resolution_event_t;
116 //
117 // GLOBAL DATA
118 //
119 
120 static uint8_t test_use_fixed_local_csrk;
121 
122 // configuration
123 static uint8_t sm_accepted_stk_generation_methods;
124 static uint8_t sm_max_encryption_key_size;
125 static uint8_t sm_min_encryption_key_size;
126 static uint8_t sm_auth_req = 0;
127 static uint8_t sm_io_capabilities = IO_CAPABILITY_NO_INPUT_NO_OUTPUT;
128 static uint8_t sm_slave_request_security;
129 
130 // Security Manager Master Keys, please use sm_set_er(er) and sm_set_ir(ir) with your own 128 bit random values
131 static sm_key_t sm_persistent_er;
132 static sm_key_t sm_persistent_ir;
133 
134 // derived from sm_persistent_ir
135 static sm_key_t sm_persistent_dhk;
136 static sm_key_t sm_persistent_irk;
137 static uint8_t  sm_persistent_irk_ready = 0;    // used for testing
138 static derived_key_generation_t dkg_state;
139 
140 // derived from sm_persistent_er
141 // ..
142 
143 // random address update
144 static random_address_update_t rau_state;
145 static bd_addr_t sm_random_address;
146 
147 // CMAC calculation
148 static cmac_state_t sm_cmac_state;
149 static sm_key_t     sm_cmac_k;
150 static uint8_t      sm_cmac_header[3];
151 static uint16_t     sm_cmac_message_len;
152 static uint8_t *    sm_cmac_message;
153 static uint8_t      sm_cmac_sign_counter[4];
154 static sm_key_t     sm_cmac_m_last;
155 static sm_key_t     sm_cmac_x;
156 static uint8_t      sm_cmac_block_current;
157 static uint8_t      sm_cmac_block_count;
158 static void (*sm_cmac_done_handler)(uint8_t hash[8]);
159 
160 // resolvable private address lookup / CSRK calculation
161 static int       sm_address_resolution_test;
162 static int       sm_address_resolution_ah_calculation_active;
163 static uint8_t   sm_address_resolution_addr_type;
164 static bd_addr_t sm_address_resolution_address;
165 static void *    sm_address_resolution_context;
166 static address_resolution_mode_t sm_address_resolution_mode;
167 static btstack_linked_list_t sm_address_resolution_general_queue;
168 
169 // aes128 crypto engine. store current sm_connection_t in sm_aes128_context
170 static sm_aes128_state_t  sm_aes128_state;
171 static void *             sm_aes128_context;
172 
173 // random engine. store context (ususally sm_connection_t)
174 static void * sm_random_context;
175 
176 // to receive hci events
177 static btstack_packet_callback_registration_t hci_event_callback_registration;
178 
179 /* to dispatch sm event */
180 static btstack_linked_list_t sm_event_handlers;
181 
182 //
183 // Volume 3, Part H, Chapter 24
184 // "Security shall be initiated by the Security Manager in the device in the master role.
185 // The device in the slave role shall be the responding device."
186 // -> master := initiator, slave := responder
187 //
188 
189 // data needed for security setup
190 typedef struct sm_setup_context {
191 
192     btstack_timer_source_t sm_timeout;
193 
194     // used in all phases
195     uint8_t   sm_pairing_failed_reason;
196 
197     // user response, (Phase 1 and/or 2)
198     uint8_t   sm_user_response;
199 
200     // defines which keys will be send after connection is encrypted - calculated during Phase 1, used Phase 3
201     int       sm_key_distribution_send_set;
202     int       sm_key_distribution_received_set;
203 
204     // Phase 2 (Pairing over SMP)
205     stk_generation_method_t sm_stk_generation_method;
206     sm_key_t  sm_tk;
207 
208     sm_key_t  sm_c1_t3_value;   // c1 calculation
209     sm_pairing_packet_t sm_m_preq; // pairing request - needed only for c1
210     sm_pairing_packet_t sm_s_pres; // pairing response - needed only for c1
211     sm_key_t  sm_local_random;
212     sm_key_t  sm_local_confirm;
213     sm_key_t  sm_peer_random;
214     sm_key_t  sm_peer_confirm;
215     uint8_t   sm_m_addr_type;   // address and type can be removed
216     uint8_t   sm_s_addr_type;   //  ''
217     bd_addr_t sm_m_address;     //  ''
218     bd_addr_t sm_s_address;     //  ''
219     sm_key_t  sm_ltk;
220 
221     // Phase 3
222 
223     // key distribution, we generate
224     uint16_t  sm_local_y;
225     uint16_t  sm_local_div;
226     uint16_t  sm_local_ediv;
227     uint8_t   sm_local_rand[8];
228     sm_key_t  sm_local_ltk;
229     sm_key_t  sm_local_csrk;
230     sm_key_t  sm_local_irk;
231     // sm_local_address/addr_type not needed
232 
233     // key distribution, received from peer
234     uint16_t  sm_peer_y;
235     uint16_t  sm_peer_div;
236     uint16_t  sm_peer_ediv;
237     uint8_t   sm_peer_rand[8];
238     sm_key_t  sm_peer_ltk;
239     sm_key_t  sm_peer_irk;
240     sm_key_t  sm_peer_csrk;
241     uint8_t   sm_peer_addr_type;
242     bd_addr_t sm_peer_address;
243 
244 } sm_setup_context_t;
245 
246 //
247 static sm_setup_context_t the_setup;
248 static sm_setup_context_t * setup = &the_setup;
249 
250 // active connection - the one for which the_setup is used for
251 static uint16_t sm_active_connection = 0;
252 
253 // @returns 1 if oob data is available
254 // stores oob data in provided 16 byte buffer if not null
255 static int (*sm_get_oob_data)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_data) = NULL;
256 
257 // used to notify applicationss that user interaction is neccessary, see sm_notify_t below
258 static btstack_packet_handler_t sm_client_packet_handler = NULL;
259 
260 // horizontal: initiator capabilities
261 // vertial:    responder capabilities
262 static const stk_generation_method_t stk_generation_method[5][5] = {
263     { JUST_WORKS,      JUST_WORKS,       PK_INIT_INPUT,   JUST_WORKS,    PK_INIT_INPUT },
264     { JUST_WORKS,      JUST_WORKS,       PK_INIT_INPUT,   JUST_WORKS,    PK_INIT_INPUT },
265     { PK_RESP_INPUT,   PK_RESP_INPUT,    OK_BOTH_INPUT,   JUST_WORKS,    PK_RESP_INPUT },
266     { JUST_WORKS,      JUST_WORKS,       JUST_WORKS,      JUST_WORKS,    JUST_WORKS    },
267     { PK_RESP_INPUT,   PK_RESP_INPUT,    PK_INIT_INPUT,   JUST_WORKS,    PK_RESP_INPUT },
268 };
269 
270 static void sm_run(void);
271 static void sm_done_for_handle(hci_con_handle_t con_handle);
272 static sm_connection_t * sm_get_connection_for_handle(hci_con_handle_t con_handle);
273 static inline int sm_calc_actual_encryption_key_size(int other);
274 static int sm_validate_stk_generation_method(void);
275 
276 static void log_info_hex16(const char * name, uint16_t value){
277     log_info("%-6s 0x%04x", name, value);
278 }
279 
280 // @returns 1 if all bytes are 0
281 static int sm_is_null_random(uint8_t random[8]){
282     int i;
283     for (i=0; i < 8 ; i++){
284         if (random[i]) return 0;
285     }
286     return 1;
287 }
288 
289 // Key utils
290 static void sm_reset_tk(void){
291     int i;
292     for (i=0;i<16;i++){
293         setup->sm_tk[i] = 0;
294     }
295 }
296 
297 // "For example, if a 128-bit encryption key is 0x123456789ABCDEF0123456789ABCDEF0
298 // and it is reduced to 7 octets (56 bits), then the resulting key is 0x0000000000000000003456789ABCDEF0.""
299 static void sm_truncate_key(sm_key_t key, int max_encryption_size){
300     int i;
301     for (i = max_encryption_size ; i < 16 ; i++){
302         key[15-i] = 0;
303     }
304 }
305 
306 // SMP Timeout implementation
307 
308 // Upon transmission of the Pairing Request command or reception of the Pairing Request command,
309 // the Security Manager Timer shall be reset and started.
310 //
311 // The Security Manager Timer shall be reset when an L2CAP SMP command is queued for transmission.
312 //
313 // If the Security Manager Timer reaches 30 seconds, the procedure shall be considered to have failed,
314 // and the local higher layer shall be notified. No further SMP commands shall be sent over the L2CAP
315 // Security Manager Channel. A new SM procedure shall only be performed when a new physical link has been
316 // established.
317 
318 static void sm_timeout_handler(btstack_timer_source_t * timer){
319     log_info("SM timeout");
320     sm_connection_t * sm_conn = (sm_connection_t*) btstack_run_loop_get_timer_context(timer);
321     sm_conn->sm_engine_state = SM_GENERAL_TIMEOUT;
322     sm_done_for_handle(sm_conn->sm_handle);
323 
324     // trigger handling of next ready connection
325     sm_run();
326 }
327 static void sm_timeout_start(sm_connection_t * sm_conn){
328     btstack_run_loop_remove_timer(&setup->sm_timeout);
329     btstack_run_loop_set_timer_context(&setup->sm_timeout, sm_conn);
330     btstack_run_loop_set_timer_handler(&setup->sm_timeout, sm_timeout_handler);
331     btstack_run_loop_set_timer(&setup->sm_timeout, 30000); // 30 seconds sm timeout
332     btstack_run_loop_add_timer(&setup->sm_timeout);
333 }
334 static void sm_timeout_stop(void){
335     btstack_run_loop_remove_timer(&setup->sm_timeout);
336 }
337 static void sm_timeout_reset(sm_connection_t * sm_conn){
338     sm_timeout_stop();
339     sm_timeout_start(sm_conn);
340 }
341 
342 // end of sm timeout
343 
344 // GAP Random Address updates
345 static gap_random_address_type_t gap_random_adress_type;
346 static btstack_timer_source_t gap_random_address_update_timer;
347 static uint32_t gap_random_adress_update_period;
348 
349 static void gap_random_address_trigger(void){
350     if (rau_state != RAU_IDLE) return;
351     log_info("gap_random_address_trigger");
352     rau_state = RAU_GET_RANDOM;
353     sm_run();
354 }
355 
356 static void gap_random_address_update_handler(btstack_timer_source_t * timer){
357     log_info("GAP Random Address Update due");
358     btstack_run_loop_set_timer(&gap_random_address_update_timer, gap_random_adress_update_period);
359     btstack_run_loop_add_timer(&gap_random_address_update_timer);
360     gap_random_address_trigger();
361 }
362 
363 static void gap_random_address_update_start(void){
364     btstack_run_loop_set_timer_handler(&gap_random_address_update_timer, gap_random_address_update_handler);
365     btstack_run_loop_set_timer(&gap_random_address_update_timer, gap_random_adress_update_period);
366     btstack_run_loop_add_timer(&gap_random_address_update_timer);
367 }
368 
369 static void gap_random_address_update_stop(void){
370     btstack_run_loop_remove_timer(&gap_random_address_update_timer);
371 }
372 
373 
374 static void sm_random_start(void * context){
375     sm_random_context = context;
376     hci_send_cmd(&hci_le_rand);
377 }
378 
379 // pre: sm_aes128_state != SM_AES128_ACTIVE, hci_can_send_command == 1
380 // context is made availabe to aes128 result handler by this
381 static void sm_aes128_start(sm_key_t key, sm_key_t plaintext, void * context){
382     sm_aes128_state = SM_AES128_ACTIVE;
383     sm_key_t key_flipped, plaintext_flipped;
384     reverse_128(key, key_flipped);
385     reverse_128(plaintext, plaintext_flipped);
386     sm_aes128_context = context;
387     hci_send_cmd(&hci_le_encrypt, key_flipped, plaintext_flipped);
388 }
389 
390 // ah(k,r) helper
391 // r = padding || r
392 // r - 24 bit value
393 static void sm_ah_r_prime(uint8_t r[3], sm_key_t r_prime){
394     // r'= padding || r
395     memset(r_prime, 0, 16);
396     memcpy(&r_prime[13], r, 3);
397 }
398 
399 // d1 helper
400 // d' = padding || r || d
401 // d,r - 16 bit values
402 static void sm_d1_d_prime(uint16_t d, uint16_t r, sm_key_t d1_prime){
403     // d'= padding || r || d
404     memset(d1_prime, 0, 16);
405     big_endian_store_16(d1_prime, 12, r);
406     big_endian_store_16(d1_prime, 14, d);
407 }
408 
409 // dm helper
410 // r’ = padding || r
411 // r - 64 bit value
412 static void sm_dm_r_prime(uint8_t r[8], sm_key_t r_prime){
413     memset(r_prime, 0, 16);
414     memcpy(&r_prime[8], r, 8);
415 }
416 
417 // calculate arguments for first AES128 operation in C1 function
418 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){
419 
420     // p1 = pres || preq || rat’ || iat’
421     // "The octet of iat’ becomes the least significant octet of p1 and the most signifi-
422     // cant octet of pres becomes the most significant octet of p1.
423     // For example, if the 8-bit iat’ is 0x01, the 8-bit rat’ is 0x00, the 56-bit preq
424     // is 0x07071000000101 and the 56 bit pres is 0x05000800000302 then
425     // p1 is 0x05000800000302070710000001010001."
426 
427     sm_key_t p1;
428     reverse_56(pres, &p1[0]);
429     reverse_56(preq, &p1[7]);
430     p1[14] = rat;
431     p1[15] = iat;
432     log_info_key("p1", p1);
433     log_info_key("r", r);
434 
435     // t1 = r xor p1
436     int i;
437     for (i=0;i<16;i++){
438         t1[i] = r[i] ^ p1[i];
439     }
440     log_info_key("t1", t1);
441 }
442 
443 // calculate arguments for second AES128 operation in C1 function
444 static void sm_c1_t3(sm_key_t t2, bd_addr_t ia, bd_addr_t ra, sm_key_t t3){
445      // p2 = padding || ia || ra
446     // "The least significant octet of ra becomes the least significant octet of p2 and
447     // the most significant octet of padding becomes the most significant octet of p2.
448     // For example, if 48-bit ia is 0xA1A2A3A4A5A6 and the 48-bit ra is
449     // 0xB1B2B3B4B5B6 then p2 is 0x00000000A1A2A3A4A5A6B1B2B3B4B5B6.
450 
451     sm_key_t p2;
452     memset(p2, 0, 16);
453     memcpy(&p2[4],  ia, 6);
454     memcpy(&p2[10], ra, 6);
455     log_info_key("p2", p2);
456 
457     // c1 = e(k, t2_xor_p2)
458     int i;
459     for (i=0;i<16;i++){
460         t3[i] = t2[i] ^ p2[i];
461     }
462     log_info_key("t3", t3);
463 }
464 
465 static void sm_s1_r_prime(sm_key_t r1, sm_key_t r2, sm_key_t r_prime){
466     log_info_key("r1", r1);
467     log_info_key("r2", r2);
468     memcpy(&r_prime[8], &r2[8], 8);
469     memcpy(&r_prime[0], &r1[8], 8);
470 }
471 
472 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){
473     event[0] = type;
474     event[1] = event_size - 2;
475     little_endian_store_16(event, 2, con_handle);
476     event[4] = addr_type;
477     reverse_bd_addr(address, &event[5]);
478 }
479 
480 static void sm_dispatch_event(uint8_t packet_type, uint16_t channel, uint8_t * packet, uint16_t size){
481     if (sm_client_packet_handler) {
482         sm_client_packet_handler(HCI_EVENT_PACKET, 0, packet, size);
483     }
484     // dispatch to all event handlers
485     btstack_linked_list_iterator_t it;
486     btstack_linked_list_iterator_init(&it, &sm_event_handlers);
487     while (btstack_linked_list_iterator_has_next(&it)){
488         btstack_packet_callback_registration_t * entry = (btstack_packet_callback_registration_t*) btstack_linked_list_iterator_next(&it);
489         entry->callback(packet_type, 0, packet, size);
490     }
491 }
492 
493 static void sm_notify_client_base(uint8_t type, hci_con_handle_t con_handle, uint8_t addr_type, bd_addr_t address){
494     uint8_t event[11];
495     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
496     sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event));
497 }
498 
499 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){
500     uint8_t event[15];
501     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
502     little_endian_store_32(event, 11, passkey);
503     sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event));
504 }
505 
506 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){
507     uint8_t event[13];
508     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
509     little_endian_store_16(event, 11, index);
510     sm_dispatch_event(HCI_EVENT_PACKET, 0, event, sizeof(event));
511 }
512 
513 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){
514 
515     uint8_t event[18];
516     sm_setup_event_base(event, sizeof(event), type, con_handle, addr_type, address);
517     event[11] = result;
518     sm_dispatch_event(HCI_EVENT_PACKET, 0, (uint8_t*) &event, sizeof(event));
519 }
520 
521 // decide on stk generation based on
522 // - pairing request
523 // - io capabilities
524 // - OOB data availability
525 static void sm_setup_tk(void){
526 
527     // default: just works
528     setup->sm_stk_generation_method = JUST_WORKS;
529 
530     // If both devices have out of band authentication data, then the Authentication
531     // Requirements Flags shall be ignored when selecting the pairing method and the
532     // Out of Band pairing method shall be used.
533     if (setup->sm_m_preq.oob_data_flag && setup->sm_s_pres.oob_data_flag){
534         log_info("SM: have OOB data");
535         log_info_key("OOB", setup->sm_tk);
536         setup->sm_stk_generation_method = OOB;
537         return;
538     }
539 
540     // Reset TK as it has been setup in sm_init_setup
541     sm_reset_tk();
542 
543     // If both devices have not set the MITM option in the Authentication Requirements
544     // Flags, then the IO capabilities shall be ignored and the Just Works association
545     // model shall be used.
546     if ( ((setup->sm_m_preq.auth_req & SM_AUTHREQ_MITM_PROTECTION) == 0x00) && ((setup->sm_s_pres.auth_req & SM_AUTHREQ_MITM_PROTECTION) == 0)){
547         return;
548     }
549 
550     // Also use just works if unknown io capabilites
551     if ((setup->sm_m_preq.io_capability > IO_CAPABILITY_KEYBOARD_DISPLAY) || (setup->sm_m_preq.io_capability > IO_CAPABILITY_KEYBOARD_DISPLAY)){
552         return;
553     }
554 
555     // Otherwise the IO capabilities of the devices shall be used to determine the
556     // pairing method as defined in Table 2.4.
557     setup->sm_stk_generation_method = stk_generation_method[setup->sm_s_pres.io_capability][setup->sm_m_preq.io_capability];
558     log_info("sm_setup_tk: master io cap: %u, slave io cap: %u -> method %u",
559         setup->sm_m_preq.io_capability, setup->sm_s_pres.io_capability, setup->sm_stk_generation_method);
560 }
561 
562 static int sm_key_distribution_flags_for_set(uint8_t key_set){
563     int flags = 0;
564     if (key_set & SM_KEYDIST_ENC_KEY){
565         flags |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION;
566         flags |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION;
567     }
568     if (key_set & SM_KEYDIST_ID_KEY){
569         flags |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION;
570         flags |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION;
571     }
572     if (key_set & SM_KEYDIST_SIGN){
573         flags |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION;
574     }
575     return flags;
576 }
577 
578 static void sm_setup_key_distribution(uint8_t key_set){
579     setup->sm_key_distribution_received_set = 0;
580     setup->sm_key_distribution_send_set = sm_key_distribution_flags_for_set(key_set);
581 }
582 
583 // CSRK Key Lookup
584 
585 
586 static int sm_address_resolution_idle(void){
587     return sm_address_resolution_mode == ADDRESS_RESOLUTION_IDLE;
588 }
589 
590 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){
591     memcpy(sm_address_resolution_address, addr, 6);
592     sm_address_resolution_addr_type = addr_type;
593     sm_address_resolution_test = 0;
594     sm_address_resolution_mode = mode;
595     sm_address_resolution_context = context;
596     sm_notify_client_base(SM_EVENT_IDENTITY_RESOLVING_STARTED, con_handle, addr_type, addr);
597 }
598 
599 int sm_address_resolution_lookup(uint8_t address_type, bd_addr_t address){
600     // check if already in list
601     btstack_linked_list_iterator_t it;
602     sm_lookup_entry_t * entry;
603     btstack_linked_list_iterator_init(&it, &sm_address_resolution_general_queue);
604     while(btstack_linked_list_iterator_has_next(&it)){
605         entry = (sm_lookup_entry_t *) btstack_linked_list_iterator_next(&it);
606         if (entry->address_type != address_type) continue;
607         if (memcmp(entry->address, address, 6))  continue;
608         // already in list
609         return BTSTACK_BUSY;
610     }
611     entry = btstack_memory_sm_lookup_entry_get();
612     if (!entry) return BTSTACK_MEMORY_ALLOC_FAILED;
613     entry->address_type = (bd_addr_type_t) address_type;
614     memcpy(entry->address, address, 6);
615     btstack_linked_list_add(&sm_address_resolution_general_queue, (btstack_linked_item_t *) entry);
616     sm_run();
617     return 0;
618 }
619 
620 // CMAC Implementation using AES128 engine
621 static void sm_shift_left_by_one_bit_inplace(int len, uint8_t * data){
622     int i;
623     int carry = 0;
624     for (i=len-1; i >= 0 ; i--){
625         int new_carry = data[i] >> 7;
626         data[i] = data[i] << 1 | carry;
627         carry = new_carry;
628     }
629 }
630 
631 // 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
632 static inline void sm_next_responding_state(sm_connection_t * sm_conn){
633     sm_conn->sm_engine_state = (security_manager_state_t) (((int)sm_conn->sm_engine_state) + 1);
634 }
635 static inline void dkg_next_state(void){
636     dkg_state = (derived_key_generation_t) (((int)dkg_state) + 1);
637 }
638 static inline void rau_next_state(void){
639     rau_state = (random_address_update_t) (((int)rau_state) + 1);
640 }
641 static inline void sm_cmac_next_state(void){
642     sm_cmac_state = (cmac_state_t) (((int)sm_cmac_state) + 1);
643 }
644 static int sm_cmac_last_block_complete(void){
645     if (sm_cmac_message_len == 0) return 0;
646     return (sm_cmac_message_len & 0x0f) == 0;
647 }
648 static inline uint8_t sm_cmac_message_get_byte(int offset){
649     if (offset >= sm_cmac_message_len) {
650         log_error("sm_cmac_message_get_byte. out of bounds, access %u, len %u", offset, sm_cmac_message_len);
651         return 0;
652     }
653 
654     offset = sm_cmac_message_len - 1 - offset;
655 
656     // sm_cmac_header[3] | message[] | sm_cmac_sign_counter[4]
657     if (offset < 3){
658         return sm_cmac_header[offset];
659     }
660     int actual_message_len_incl_header = sm_cmac_message_len - 4;
661     if (offset <  actual_message_len_incl_header){
662         return sm_cmac_message[offset - 3];
663     }
664     return sm_cmac_sign_counter[offset - actual_message_len_incl_header];
665 }
666 
667 void sm_cmac_start(sm_key_t k, uint8_t opcode, hci_con_handle_t con_handle, uint16_t message_len, uint8_t * message, uint32_t sign_counter, void (*done_handler)(uint8_t hash[8])){
668     memcpy(sm_cmac_k, k, 16);
669     sm_cmac_header[0] = opcode;
670     little_endian_store_16(sm_cmac_header, 1, con_handle);
671     little_endian_store_32(sm_cmac_sign_counter, 0, sign_counter);
672     sm_cmac_message_len = 3 + message_len + 4;  // incl. virtually prepended att opcode, handle and appended sign_counter in LE
673     sm_cmac_message = message;
674     sm_cmac_done_handler = done_handler;
675     sm_cmac_block_current = 0;
676     memset(sm_cmac_x, 0, 16);
677 
678     // step 2: n := ceil(len/const_Bsize);
679     sm_cmac_block_count = (sm_cmac_message_len + 15) / 16;
680 
681     // step 3: ..
682     if (sm_cmac_block_count==0){
683         sm_cmac_block_count = 1;
684     }
685 
686     log_info("sm_cmac_start: len %u, block count %u", sm_cmac_message_len, sm_cmac_block_count);
687 
688     // first, we need to compute l for k1, k2, and m_last
689     sm_cmac_state = CMAC_CALC_SUBKEYS;
690 
691     // let's go
692     sm_run();
693 }
694 
695 int sm_cmac_ready(void){
696     return sm_cmac_state == CMAC_IDLE;
697 }
698 
699 static void sm_cmac_handle_aes_engine_ready(void){
700     switch (sm_cmac_state){
701         case CMAC_CALC_SUBKEYS: {
702             sm_key_t const_zero;
703             memset(const_zero, 0, 16);
704             sm_cmac_next_state();
705             sm_aes128_start(sm_cmac_k, const_zero, NULL);
706             break;
707         }
708         case CMAC_CALC_MI: {
709             int j;
710             sm_key_t y;
711             for (j=0;j<16;j++){
712                 y[j] = sm_cmac_x[j] ^ sm_cmac_message_get_byte(sm_cmac_block_current*16 + j);
713             }
714             sm_cmac_block_current++;
715             sm_cmac_next_state();
716             sm_aes128_start(sm_cmac_k, y, NULL);
717             break;
718         }
719         case CMAC_CALC_MLAST: {
720             int i;
721             sm_key_t y;
722             for (i=0;i<16;i++){
723                 y[i] = sm_cmac_x[i] ^ sm_cmac_m_last[i];
724             }
725             log_info_key("Y", y);
726             sm_cmac_block_current++;
727             sm_cmac_next_state();
728             sm_aes128_start(sm_cmac_k, y, NULL);
729             break;
730         }
731         default:
732             log_info("sm_cmac_handle_aes_engine_ready called in state %u", sm_cmac_state);
733             break;
734     }
735 }
736 
737 static void sm_cmac_handle_encryption_result(sm_key_t data){
738     switch (sm_cmac_state){
739         case CMAC_W4_SUBKEYS: {
740             sm_key_t k1;
741             memcpy(k1, data, 16);
742             sm_shift_left_by_one_bit_inplace(16, k1);
743             if (data[0] & 0x80){
744                 k1[15] ^= 0x87;
745             }
746             sm_key_t k2;
747             memcpy(k2, k1, 16);
748             sm_shift_left_by_one_bit_inplace(16, k2);
749             if (k1[0] & 0x80){
750                 k2[15] ^= 0x87;
751             }
752 
753             log_info_key("k", sm_cmac_k);
754             log_info_key("k1", k1);
755             log_info_key("k2", k2);
756 
757             // step 4: set m_last
758             int i;
759             if (sm_cmac_last_block_complete()){
760                 for (i=0;i<16;i++){
761                     sm_cmac_m_last[i] = sm_cmac_message_get_byte(sm_cmac_message_len - 16 + i) ^ k1[i];
762                 }
763             } else {
764                 int valid_octets_in_last_block = sm_cmac_message_len & 0x0f;
765                 for (i=0;i<16;i++){
766                     if (i < valid_octets_in_last_block){
767                         sm_cmac_m_last[i] = sm_cmac_message_get_byte((sm_cmac_message_len & 0xfff0) + i) ^ k2[i];
768                         continue;
769                     }
770                     if (i == valid_octets_in_last_block){
771                         sm_cmac_m_last[i] = 0x80 ^ k2[i];
772                         continue;
773                     }
774                     sm_cmac_m_last[i] = k2[i];
775                 }
776             }
777 
778             // next
779             sm_cmac_state = sm_cmac_block_current < sm_cmac_block_count - 1 ? CMAC_CALC_MI : CMAC_CALC_MLAST;
780             break;
781         }
782         case CMAC_W4_MI:
783             memcpy(sm_cmac_x, data, 16);
784             sm_cmac_state = sm_cmac_block_current < sm_cmac_block_count - 1 ? CMAC_CALC_MI : CMAC_CALC_MLAST;
785             break;
786         case CMAC_W4_MLAST:
787             // done
788             log_info_key("CMAC", data);
789             sm_cmac_done_handler(data);
790             sm_cmac_state = CMAC_IDLE;
791             break;
792         default:
793             log_info("sm_cmac_handle_encryption_result called in state %u", sm_cmac_state);
794             break;
795     }
796 }
797 
798 static void sm_trigger_user_response(sm_connection_t * sm_conn){
799     // notify client for: JUST WORKS confirm, PASSKEY display or input
800     setup->sm_user_response = SM_USER_RESPONSE_IDLE;
801     switch (setup->sm_stk_generation_method){
802         case PK_RESP_INPUT:
803             if (sm_conn->sm_role){
804                 setup->sm_user_response = SM_USER_RESPONSE_PENDING;
805                 sm_notify_client_base(SM_EVENT_PASSKEY_INPUT_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
806             } else {
807                 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));
808             }
809             break;
810         case PK_INIT_INPUT:
811             if (sm_conn->sm_role){
812                 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));
813             } else {
814                 setup->sm_user_response = SM_USER_RESPONSE_PENDING;
815                 sm_notify_client_base(SM_EVENT_PASSKEY_INPUT_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
816             }
817             break;
818         case OK_BOTH_INPUT:
819             setup->sm_user_response = SM_USER_RESPONSE_PENDING;
820             sm_notify_client_base(SM_EVENT_PASSKEY_INPUT_NUMBER, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
821             break;
822         case JUST_WORKS:
823             setup->sm_user_response = SM_USER_RESPONSE_PENDING;
824             sm_notify_client_base(SM_EVENT_JUST_WORKS_REQUEST, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
825             break;
826         case OOB:
827             // client already provided OOB data, let's skip notification.
828             break;
829     }
830 }
831 
832 static int sm_key_distribution_all_received(sm_connection_t * sm_conn){
833     int recv_flags;
834     if (sm_conn->sm_role){
835         // slave / responser
836         recv_flags = sm_key_distribution_flags_for_set(setup->sm_s_pres.initiator_key_distribution);
837     } else {
838         // master / initiator
839         recv_flags = sm_key_distribution_flags_for_set(setup->sm_s_pres.responder_key_distribution);
840     }
841     log_debug("sm_key_distribution_all_received: received 0x%02x, expecting 0x%02x", setup->sm_key_distribution_received_set, recv_flags);
842     return recv_flags == setup->sm_key_distribution_received_set;
843 }
844 
845 static void sm_done_for_handle(hci_con_handle_t con_handle){
846     if (sm_active_connection == con_handle){
847         sm_timeout_stop();
848         sm_active_connection = 0;
849         log_info("sm: connection 0x%x released setup context", con_handle);
850     }
851 }
852 
853 static int sm_key_distribution_flags_for_auth_req(void){
854     int flags = SM_KEYDIST_ID_KEY | SM_KEYDIST_SIGN;
855     if (sm_auth_req & SM_AUTHREQ_BONDING){
856         // encryption information only if bonding requested
857         flags |= SM_KEYDIST_ENC_KEY;
858     }
859     return flags;
860 }
861 
862 static void sm_init_setup(sm_connection_t * sm_conn){
863 
864     // fill in sm setup
865     sm_reset_tk();
866     setup->sm_peer_addr_type = sm_conn->sm_peer_addr_type;
867     memcpy(setup->sm_peer_address, sm_conn->sm_peer_address, 6);
868 
869     // query client for OOB data
870     int have_oob_data = 0;
871     if (sm_get_oob_data) {
872         have_oob_data = (*sm_get_oob_data)(sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, setup->sm_tk);
873     }
874 
875     sm_pairing_packet_t * local_packet;
876     if (sm_conn->sm_role){
877         // slave
878         local_packet = &setup->sm_s_pres;
879         gap_advertisements_get_address(&setup->sm_s_addr_type, setup->sm_s_address);
880         setup->sm_m_addr_type = sm_conn->sm_peer_addr_type;
881         memcpy(setup->sm_m_address, sm_conn->sm_peer_address, 6);
882     } else {
883         // master
884         local_packet = &setup->sm_m_preq;
885         gap_advertisements_get_address(&setup->sm_m_addr_type, setup->sm_m_address);
886         setup->sm_s_addr_type = sm_conn->sm_peer_addr_type;
887         memcpy(setup->sm_s_address, sm_conn->sm_peer_address, 6);
888 
889         int key_distribution_flags = sm_key_distribution_flags_for_auth_req();
890         setup->sm_m_preq.initiator_key_distribution = key_distribution_flags;
891         setup->sm_m_preq.responder_key_distribution = key_distribution_flags;
892     }
893 
894     local_packet->io_capability = sm_io_capabilities;
895     local_packet->oob_data_flag = have_oob_data;
896     local_packet->auth_req = sm_auth_req;
897     local_packet->max_encryption_key_size = sm_max_encryption_key_size;
898 }
899 
900 static int sm_stk_generation_init(sm_connection_t * sm_conn){
901 
902     sm_pairing_packet_t * remote_packet;
903     int                   remote_key_request;
904     if (sm_conn->sm_role){
905         // slave / responser
906         remote_packet      = &setup->sm_m_preq;
907         remote_key_request = setup->sm_m_preq.responder_key_distribution;
908     } else {
909         // master / initiator
910         remote_packet      = &setup->sm_s_pres;
911         remote_key_request = setup->sm_s_pres.initiator_key_distribution;
912     }
913 
914     // check key size
915     sm_conn->sm_actual_encryption_key_size = sm_calc_actual_encryption_key_size(remote_packet->max_encryption_key_size);
916     if (sm_conn->sm_actual_encryption_key_size == 0) return SM_REASON_ENCRYPTION_KEY_SIZE;
917 
918     // setup key distribution
919     sm_setup_key_distribution(remote_key_request);
920 
921     // identical to responder
922 
923     // decide on STK generation method
924     sm_setup_tk();
925     log_info("SMP: generation method %u", setup->sm_stk_generation_method);
926 
927     // check if STK generation method is acceptable by client
928     if (!sm_validate_stk_generation_method()) return SM_REASON_AUTHENTHICATION_REQUIREMENTS;
929 
930     // JUST WORKS doens't provide authentication
931     sm_conn->sm_connection_authenticated = setup->sm_stk_generation_method == JUST_WORKS ? 0 : 1;
932 
933     return 0;
934 }
935 
936 static void sm_address_resolution_handle_event(address_resolution_event_t event){
937 
938     // cache and reset context
939     int matched_device_id = sm_address_resolution_test;
940     address_resolution_mode_t mode = sm_address_resolution_mode;
941     void * context = sm_address_resolution_context;
942 
943     // reset context
944     sm_address_resolution_mode = ADDRESS_RESOLUTION_IDLE;
945     sm_address_resolution_context = NULL;
946     sm_address_resolution_test = -1;
947     hci_con_handle_t con_handle = 0;
948 
949     sm_connection_t * sm_connection;
950     uint16_t ediv;
951     switch (mode){
952         case ADDRESS_RESOLUTION_GENERAL:
953             break;
954         case ADDRESS_RESOLUTION_FOR_CONNECTION:
955             sm_connection = (sm_connection_t *) context;
956             con_handle = sm_connection->sm_handle;
957             switch (event){
958                 case ADDRESS_RESOLUTION_SUCEEDED:
959                     sm_connection->sm_irk_lookup_state = IRK_LOOKUP_SUCCEEDED;
960                     sm_connection->sm_le_db_index = matched_device_id;
961                     log_info("ADDRESS_RESOLUTION_SUCEEDED, index %d", sm_connection->sm_le_db_index);
962                     if (sm_connection->sm_role) break;
963                     if (!sm_connection->sm_bonding_requested && !sm_connection->sm_security_request_received) break;
964                     sm_connection->sm_security_request_received = 0;
965                     sm_connection->sm_bonding_requested = 0;
966                     le_device_db_encryption_get(sm_connection->sm_le_db_index, &ediv, NULL, NULL, NULL, NULL, NULL);
967                     if (ediv){
968                         sm_connection->sm_engine_state = SM_INITIATOR_PH0_HAS_LTK;
969                     } else {
970                         sm_connection->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
971                     }
972                     break;
973                 case ADDRESS_RESOLUTION_FAILED:
974                     sm_connection->sm_irk_lookup_state = IRK_LOOKUP_FAILED;
975                     if (sm_connection->sm_role) break;
976                     if (!sm_connection->sm_bonding_requested && !sm_connection->sm_security_request_received) break;
977                     sm_connection->sm_security_request_received = 0;
978                     sm_connection->sm_bonding_requested = 0;
979                     sm_connection->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
980                     break;
981             }
982             break;
983         default:
984             break;
985     }
986 
987     switch (event){
988         case ADDRESS_RESOLUTION_SUCEEDED:
989             sm_notify_client_index(SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED, con_handle, sm_address_resolution_addr_type, sm_address_resolution_address, matched_device_id);
990             break;
991         case ADDRESS_RESOLUTION_FAILED:
992             sm_notify_client_base(SM_EVENT_IDENTITY_RESOLVING_FAILED, con_handle, sm_address_resolution_addr_type, sm_address_resolution_address);
993             break;
994     }
995 }
996 
997 static void sm_key_distribution_handle_all_received(sm_connection_t * sm_conn){
998 
999     int le_db_index = -1;
1000 
1001     // lookup device based on IRK
1002     if (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_IDENTITY_INFORMATION){
1003         int i;
1004         for (i=0; i < le_device_db_count(); i++){
1005             sm_key_t irk;
1006             bd_addr_t address;
1007             int address_type;
1008             le_device_db_info(i, &address_type, address, irk);
1009             if (memcmp(irk, setup->sm_peer_irk, 16) == 0){
1010                 log_info("sm: device found for IRK, updating");
1011                 le_db_index = i;
1012                 break;
1013             }
1014         }
1015     }
1016 
1017     // if not found, lookup via public address if possible
1018     log_info("sm peer addr type %u, peer addres %s", setup->sm_peer_addr_type, bd_addr_to_str(setup->sm_peer_address));
1019     if (le_db_index < 0 && setup->sm_peer_addr_type == BD_ADDR_TYPE_LE_PUBLIC){
1020         int i;
1021         for (i=0; i < le_device_db_count(); i++){
1022             bd_addr_t address;
1023             int address_type;
1024             le_device_db_info(i, &address_type, address, NULL);
1025             log_info("device %u, sm peer addr type %u, peer addres %s", i, address_type, bd_addr_to_str(address));
1026             if (address_type == BD_ADDR_TYPE_LE_PUBLIC && memcmp(address, setup->sm_peer_address, 6) == 0){
1027                 log_info("sm: device found for public address, updating");
1028                 le_db_index = i;
1029                 break;
1030             }
1031         }
1032     }
1033 
1034     // if not found, add to db
1035     if (le_db_index < 0) {
1036         le_db_index = le_device_db_add(setup->sm_peer_addr_type, setup->sm_peer_address, setup->sm_peer_irk);
1037     }
1038 
1039     if (le_db_index >= 0){
1040         le_device_db_local_counter_set(le_db_index, 0);
1041 
1042         // store local CSRK
1043         if (setup->sm_key_distribution_send_set & SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){
1044             log_info("sm: store local CSRK");
1045             le_device_db_local_csrk_set(le_db_index, setup->sm_local_csrk);
1046             le_device_db_local_counter_set(le_db_index, 0);
1047         }
1048 
1049         // store remote CSRK
1050         if (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){
1051             log_info("sm: store remote CSRK");
1052             le_device_db_remote_csrk_set(le_db_index, setup->sm_peer_csrk);
1053             le_device_db_remote_counter_set(le_db_index, 0);
1054         }
1055 
1056         // store encryption information
1057         if (setup->sm_key_distribution_received_set & SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION
1058             && setup->sm_key_distribution_received_set &  SM_KEYDIST_FLAG_MASTER_IDENTIFICATION){
1059             log_info("sm: set encryption information (key size %u, authenticatd %u)", sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated);
1060             le_device_db_encryption_set(le_db_index, setup->sm_peer_ediv, setup->sm_peer_rand, setup->sm_peer_ltk,
1061                 sm_conn->sm_actual_encryption_key_size, sm_conn->sm_connection_authenticated, sm_conn->sm_connection_authorization_state == AUTHORIZATION_GRANTED);
1062         }
1063     }
1064 
1065     // keep le_db_index
1066     sm_conn->sm_le_db_index = le_db_index;
1067 }
1068 
1069 static void sm_run(void){
1070 
1071     btstack_linked_list_iterator_t it;
1072 
1073     // assert that we can send at least commands
1074     if (!hci_can_send_command_packet_now()) return;
1075 
1076     //
1077     // non-connection related behaviour
1078     //
1079 
1080     // distributed key generation
1081     switch (dkg_state){
1082         case DKG_CALC_IRK:
1083             // already busy?
1084             if (sm_aes128_state == SM_AES128_IDLE) {
1085                 // IRK = d1(IR, 1, 0)
1086                 sm_key_t d1_prime;
1087                 sm_d1_d_prime(1, 0, d1_prime);  // plaintext
1088                 dkg_next_state();
1089                 sm_aes128_start(sm_persistent_ir, d1_prime, NULL);
1090                 return;
1091             }
1092             break;
1093         case DKG_CALC_DHK:
1094             // already busy?
1095             if (sm_aes128_state == SM_AES128_IDLE) {
1096                 // DHK = d1(IR, 3, 0)
1097                 sm_key_t d1_prime;
1098                 sm_d1_d_prime(3, 0, d1_prime);  // plaintext
1099                 dkg_next_state();
1100                 sm_aes128_start(sm_persistent_ir, d1_prime, NULL);
1101                 return;
1102             }
1103             break;
1104         default:
1105             break;
1106     }
1107 
1108     // random address updates
1109     switch (rau_state){
1110         case RAU_GET_RANDOM:
1111             rau_next_state();
1112             sm_random_start(NULL);
1113             return;
1114         case RAU_GET_ENC:
1115             // already busy?
1116             if (sm_aes128_state == SM_AES128_IDLE) {
1117                 sm_key_t r_prime;
1118                 sm_ah_r_prime(sm_random_address, r_prime);
1119                 rau_next_state();
1120                 sm_aes128_start(sm_persistent_irk, r_prime, NULL);
1121                 return;
1122             }
1123             break;
1124         case RAU_SET_ADDRESS:
1125             log_info("New random address: %s", bd_addr_to_str(sm_random_address));
1126             rau_state = RAU_IDLE;
1127             hci_send_cmd(&hci_le_set_random_address, sm_random_address);
1128             return;
1129         default:
1130             break;
1131     }
1132 
1133     // CMAC
1134     switch (sm_cmac_state){
1135         case CMAC_CALC_SUBKEYS:
1136         case CMAC_CALC_MI:
1137         case CMAC_CALC_MLAST:
1138             // already busy?
1139             if (sm_aes128_state == SM_AES128_ACTIVE) break;
1140             sm_cmac_handle_aes_engine_ready();
1141             return;
1142         default:
1143             break;
1144     }
1145 
1146     // CSRK Lookup
1147     // -- if csrk lookup ready, find connection that require csrk lookup
1148     if (sm_address_resolution_idle()){
1149         hci_connections_get_iterator(&it);
1150         while(btstack_linked_list_iterator_has_next(&it)){
1151             hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
1152             sm_connection_t  * sm_connection  = &hci_connection->sm_connection;
1153             if (sm_connection->sm_irk_lookup_state == IRK_LOOKUP_W4_READY){
1154                 // and start lookup
1155                 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);
1156                 sm_connection->sm_irk_lookup_state = IRK_LOOKUP_STARTED;
1157                 break;
1158             }
1159         }
1160     }
1161 
1162     // -- if csrk lookup ready, resolved addresses for received addresses
1163     if (sm_address_resolution_idle()) {
1164         if (!btstack_linked_list_empty(&sm_address_resolution_general_queue)){
1165             sm_lookup_entry_t * entry = (sm_lookup_entry_t *) sm_address_resolution_general_queue;
1166             btstack_linked_list_remove(&sm_address_resolution_general_queue, (btstack_linked_item_t *) entry);
1167             sm_address_resolution_start_lookup(entry->address_type, 0, entry->address, ADDRESS_RESOLUTION_GENERAL, NULL);
1168             btstack_memory_sm_lookup_entry_free(entry);
1169         }
1170     }
1171 
1172     // -- Continue with CSRK device lookup by public or resolvable private address
1173     if (!sm_address_resolution_idle()){
1174         log_info("LE Device Lookup: device %u/%u", sm_address_resolution_test, le_device_db_count());
1175         while (sm_address_resolution_test < le_device_db_count()){
1176             int addr_type;
1177             bd_addr_t addr;
1178             sm_key_t irk;
1179             le_device_db_info(sm_address_resolution_test, &addr_type, addr, irk);
1180             log_info("device type %u, addr: %s", addr_type, bd_addr_to_str(addr));
1181 
1182             if (sm_address_resolution_addr_type == addr_type && memcmp(addr, sm_address_resolution_address, 6) == 0){
1183                 log_info("LE Device Lookup: found CSRK by { addr_type, address} ");
1184                 sm_address_resolution_handle_event(ADDRESS_RESOLUTION_SUCEEDED);
1185                 break;
1186             }
1187 
1188             if (sm_address_resolution_addr_type == 0){
1189                 sm_address_resolution_test++;
1190                 continue;
1191             }
1192 
1193             if (sm_aes128_state == SM_AES128_ACTIVE) break;
1194 
1195             log_info("LE Device Lookup: calculate AH");
1196             log_info_key("IRK", irk);
1197 
1198             sm_key_t r_prime;
1199             sm_ah_r_prime(sm_address_resolution_address, r_prime);
1200             sm_address_resolution_ah_calculation_active = 1;
1201             sm_aes128_start(irk, r_prime, sm_address_resolution_context);   // keep context
1202             return;
1203         }
1204 
1205         if (sm_address_resolution_test >= le_device_db_count()){
1206             log_info("LE Device Lookup: not found");
1207             sm_address_resolution_handle_event(ADDRESS_RESOLUTION_FAILED);
1208         }
1209     }
1210 
1211 
1212     //
1213     // active connection handling
1214     // -- use loop to handle next connection if lock on setup context is released
1215 
1216     while (1) {
1217 
1218         // Find connections that requires setup context and make active if no other is locked
1219         hci_connections_get_iterator(&it);
1220         while(!sm_active_connection && btstack_linked_list_iterator_has_next(&it)){
1221             hci_connection_t * hci_connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
1222             sm_connection_t  * sm_connection = &hci_connection->sm_connection;
1223             // - if no connection locked and we're ready/waiting for setup context, fetch it and start
1224             int done = 1;
1225             int err;
1226             int encryption_key_size;
1227             int authenticated;
1228             int authorized;
1229             switch (sm_connection->sm_engine_state) {
1230                 case SM_RESPONDER_SEND_SECURITY_REQUEST:
1231                     // send packet if possible,
1232                     if (l2cap_can_send_fixed_channel_packet_now(sm_connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL)){
1233                         uint8_t buffer[2];
1234                         buffer[0] = SM_CODE_SECURITY_REQUEST;
1235                         buffer[1] = SM_AUTHREQ_BONDING;
1236                         sm_connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_REQUEST;
1237                         l2cap_send_connectionless(sm_connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1238                     }
1239                     // don't lock setup context yet
1240                     done = 0;
1241                     break;
1242                 case SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED:
1243                     sm_init_setup(sm_connection);
1244                     // recover pairing request
1245                     memcpy(&setup->sm_m_preq, &sm_connection->sm_m_preq, sizeof(sm_pairing_packet_t));
1246                     err = sm_stk_generation_init(sm_connection);
1247                     if (err){
1248                         setup->sm_pairing_failed_reason = err;
1249                         sm_connection->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
1250                         break;
1251                     }
1252                     sm_timeout_start(sm_connection);
1253                     // generate random number first, if we need to show passkey
1254                     if (setup->sm_stk_generation_method == PK_INIT_INPUT){
1255                         sm_connection->sm_engine_state = SM_PH2_GET_RANDOM_TK;
1256                         break;
1257                     }
1258                     sm_connection->sm_engine_state = SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE;
1259                     break;
1260                 case SM_INITIATOR_PH0_HAS_LTK:
1261                     // fetch data from device db - incl. authenticated/authorized/key size. Note all sm_connection_X require encryption enabled
1262                     le_device_db_encryption_get(sm_connection->sm_le_db_index, &setup->sm_peer_ediv, setup->sm_peer_rand, setup->sm_peer_ltk,
1263                                                 &encryption_key_size, &authenticated, &authorized);
1264                     log_info("db index %u, key size %u, authenticated %u, authorized %u", sm_connection->sm_le_db_index, encryption_key_size, authenticated, authorized);
1265                     sm_connection->sm_actual_encryption_key_size = encryption_key_size;
1266                     sm_connection->sm_connection_authenticated = authenticated;
1267                     sm_connection->sm_connection_authorization_state = authorized ? AUTHORIZATION_GRANTED : AUTHORIZATION_UNKNOWN;
1268                     sm_connection->sm_engine_state = SM_INITIATOR_PH0_SEND_START_ENCRYPTION;
1269                     break;
1270                 case SM_RESPONDER_PH0_RECEIVED_LTK:
1271                     // re-establish previously used LTK using Rand and EDIV
1272                     memcpy(setup->sm_local_rand, sm_connection->sm_local_rand, 8);
1273                     setup->sm_local_ediv = sm_connection->sm_local_ediv;
1274                     // re-establish used key encryption size
1275                     // no db for encryption size hack: encryption size is stored in lowest nibble of setup->sm_local_rand
1276                     sm_connection->sm_actual_encryption_key_size = (setup->sm_local_rand[7] & 0x0f) + 1;
1277                     // no db for authenticated flag hack: flag is stored in bit 4 of LSB
1278                     sm_connection->sm_connection_authenticated = (setup->sm_local_rand[7] & 0x10) >> 4;
1279                     log_info("sm: received ltk request with key size %u, authenticated %u",
1280                             sm_connection->sm_actual_encryption_key_size, sm_connection->sm_connection_authenticated);
1281                     sm_connection->sm_engine_state = SM_RESPONDER_PH4_Y_GET_ENC;
1282                     break;
1283                 case SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST:
1284                     sm_init_setup(sm_connection);
1285                     sm_timeout_start(sm_connection);
1286                     sm_connection->sm_engine_state = SM_INITIATOR_PH1_SEND_PAIRING_REQUEST;
1287                     break;
1288                 default:
1289                     done = 0;
1290                     break;
1291             }
1292             if (done){
1293                 sm_active_connection = sm_connection->sm_handle;
1294                 log_info("sm: connection 0x%04x locked setup context as %s", sm_active_connection, sm_connection->sm_role ? "responder" : "initiator");
1295             }
1296         }
1297 
1298         //
1299         // active connection handling
1300         //
1301 
1302         if (sm_active_connection == 0) return;
1303 
1304         // assert that we could send a SM PDU - not needed for all of the following
1305         if (!l2cap_can_send_fixed_channel_packet_now(sm_active_connection, L2CAP_CID_SECURITY_MANAGER_PROTOCOL)) return;
1306 
1307         sm_connection_t * connection = sm_get_connection_for_handle(sm_active_connection);
1308         if (!connection) return;
1309 
1310         sm_key_t plaintext;
1311         int key_distribution_flags;
1312 
1313         log_info("sm_run: state %u", connection->sm_engine_state);
1314 
1315         // responding state
1316         switch (connection->sm_engine_state){
1317 
1318             // general
1319             case SM_GENERAL_SEND_PAIRING_FAILED: {
1320                 uint8_t buffer[2];
1321                 buffer[0] = SM_CODE_PAIRING_FAILED;
1322                 buffer[1] = setup->sm_pairing_failed_reason;
1323                 connection->sm_engine_state = connection->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED;
1324                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1325                 sm_done_for_handle(connection->sm_handle);
1326                 break;
1327             }
1328 
1329             // initiator side
1330             case SM_INITIATOR_PH0_SEND_START_ENCRYPTION: {
1331                 sm_key_t peer_ltk_flipped;
1332                 reverse_128(setup->sm_peer_ltk, peer_ltk_flipped);
1333                 connection->sm_engine_state = SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED;
1334                 log_info("sm: hci_le_start_encryption ediv 0x%04x", setup->sm_peer_ediv);
1335                 uint32_t rand_high = big_endian_read_32(setup->sm_peer_rand, 0);
1336                 uint32_t rand_low  = big_endian_read_32(setup->sm_peer_rand, 4);
1337                 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle,rand_low, rand_high, setup->sm_peer_ediv, peer_ltk_flipped);
1338                 return;
1339             }
1340 
1341             case SM_INITIATOR_PH1_SEND_PAIRING_REQUEST:
1342                 setup->sm_m_preq.code = SM_CODE_PAIRING_REQUEST;
1343                 connection->sm_engine_state = SM_INITIATOR_PH1_W4_PAIRING_RESPONSE;
1344                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) &setup->sm_m_preq, sizeof(sm_pairing_packet_t));
1345                 sm_timeout_reset(connection);
1346                 break;
1347 
1348             // responder side
1349             case SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY:
1350                 connection->sm_engine_state = SM_RESPONDER_IDLE;
1351                 hci_send_cmd(&hci_le_long_term_key_negative_reply, connection->sm_handle);
1352                 return;
1353 
1354             case SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE:
1355                 // echo initiator for now
1356                 setup->sm_s_pres.code = SM_CODE_PAIRING_RESPONSE;
1357                 key_distribution_flags = sm_key_distribution_flags_for_auth_req();
1358                 setup->sm_s_pres.initiator_key_distribution = setup->sm_m_preq.initiator_key_distribution & key_distribution_flags;
1359                 setup->sm_s_pres.responder_key_distribution = setup->sm_m_preq.responder_key_distribution & key_distribution_flags;
1360                 connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_CONFIRM;
1361                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) &setup->sm_s_pres, sizeof(sm_pairing_packet_t));
1362                 sm_timeout_reset(connection);
1363                 sm_trigger_user_response(connection);
1364                 return;
1365 
1366             case SM_PH2_SEND_PAIRING_RANDOM: {
1367                 uint8_t buffer[17];
1368                 buffer[0] = SM_CODE_PAIRING_RANDOM;
1369                 reverse_128(setup->sm_local_random, &buffer[1]);
1370                 if (connection->sm_role){
1371                     connection->sm_engine_state = SM_RESPONDER_PH2_W4_LTK_REQUEST;
1372                 } else {
1373                     connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_RANDOM;
1374                 }
1375                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1376                 sm_timeout_reset(connection);
1377                 break;
1378             }
1379 
1380             case SM_PH2_GET_RANDOM_TK:
1381             case SM_PH2_C1_GET_RANDOM_A:
1382             case SM_PH2_C1_GET_RANDOM_B:
1383             case SM_PH3_GET_RANDOM:
1384             case SM_PH3_GET_DIV:
1385                 sm_next_responding_state(connection);
1386                 sm_random_start(connection);
1387                 return;
1388 
1389             case SM_PH2_C1_GET_ENC_B:
1390             case SM_PH2_C1_GET_ENC_D:
1391                 // already busy?
1392                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
1393                 sm_next_responding_state(connection);
1394                 sm_aes128_start(setup->sm_tk, setup->sm_c1_t3_value, connection);
1395                 return;
1396 
1397             case SM_PH3_LTK_GET_ENC:
1398             case SM_RESPONDER_PH4_LTK_GET_ENC:
1399                 // already busy?
1400                 if (sm_aes128_state == SM_AES128_IDLE) {
1401                     sm_key_t d_prime;
1402                     sm_d1_d_prime(setup->sm_local_div, 0, d_prime);
1403                     sm_next_responding_state(connection);
1404                     sm_aes128_start(sm_persistent_er, d_prime, connection);
1405                     return;
1406                 }
1407                 break;
1408 
1409             case SM_PH3_CSRK_GET_ENC:
1410                 // already busy?
1411                 if (sm_aes128_state == SM_AES128_IDLE) {
1412                     sm_key_t d_prime;
1413                     sm_d1_d_prime(setup->sm_local_div, 1, d_prime);
1414                     sm_next_responding_state(connection);
1415                     sm_aes128_start(sm_persistent_er, d_prime, connection);
1416                     return;
1417                 }
1418                 break;
1419 
1420             case SM_PH2_C1_GET_ENC_C:
1421                 // already busy?
1422                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
1423                 // calculate m_confirm using aes128 engine - step 1
1424                 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);
1425                 sm_next_responding_state(connection);
1426                 sm_aes128_start(setup->sm_tk, plaintext, connection);
1427                 break;
1428             case SM_PH2_C1_GET_ENC_A:
1429                 // already busy?
1430                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
1431                 // calculate confirm using aes128 engine - step 1
1432                 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);
1433                 sm_next_responding_state(connection);
1434                 sm_aes128_start(setup->sm_tk, plaintext, connection);
1435                 break;
1436             case SM_PH2_CALC_STK:
1437                 // already busy?
1438                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
1439                 // calculate STK
1440                 if (connection->sm_role){
1441                     sm_s1_r_prime(setup->sm_local_random, setup->sm_peer_random, plaintext);
1442                 } else {
1443                     sm_s1_r_prime(setup->sm_peer_random, setup->sm_local_random, plaintext);
1444                 }
1445                 sm_next_responding_state(connection);
1446                 sm_aes128_start(setup->sm_tk, plaintext, connection);
1447                 break;
1448             case SM_PH3_Y_GET_ENC:
1449                 // already busy?
1450                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
1451                 // PH3B2 - calculate Y from      - enc
1452                 // Y = dm(DHK, Rand)
1453                 sm_dm_r_prime(setup->sm_local_rand, plaintext);
1454                 sm_next_responding_state(connection);
1455                 sm_aes128_start(sm_persistent_dhk, plaintext, connection);
1456                 return;
1457             case SM_PH2_C1_SEND_PAIRING_CONFIRM: {
1458                 uint8_t buffer[17];
1459                 buffer[0] = SM_CODE_PAIRING_CONFIRM;
1460                 reverse_128(setup->sm_local_confirm, &buffer[1]);
1461                 if (connection->sm_role){
1462                     connection->sm_engine_state = SM_RESPONDER_PH2_W4_PAIRING_RANDOM;
1463                 } else {
1464                     connection->sm_engine_state = SM_INITIATOR_PH2_W4_PAIRING_CONFIRM;
1465                 }
1466                 l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1467                 sm_timeout_reset(connection);
1468                 return;
1469             }
1470             case SM_RESPONDER_PH2_SEND_LTK_REPLY: {
1471                 sm_key_t stk_flipped;
1472                 reverse_128(setup->sm_ltk, stk_flipped);
1473                 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED;
1474                 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, stk_flipped);
1475                 return;
1476             }
1477             case SM_INITIATOR_PH3_SEND_START_ENCRYPTION: {
1478                 sm_key_t stk_flipped;
1479                 reverse_128(setup->sm_ltk, stk_flipped);
1480                 connection->sm_engine_state = SM_PH2_W4_CONNECTION_ENCRYPTED;
1481                 hci_send_cmd(&hci_le_start_encryption, connection->sm_handle, 0, 0, 0, stk_flipped);
1482                 return;
1483             }
1484             case SM_RESPONDER_PH4_SEND_LTK: {
1485                 sm_key_t ltk_flipped;
1486                 reverse_128(setup->sm_ltk, ltk_flipped);
1487                 connection->sm_engine_state = SM_RESPONDER_IDLE;
1488                 hci_send_cmd(&hci_le_long_term_key_request_reply, connection->sm_handle, ltk_flipped);
1489                 return;
1490             }
1491             case SM_RESPONDER_PH4_Y_GET_ENC:
1492                 // already busy?
1493                 if (sm_aes128_state == SM_AES128_ACTIVE) break;
1494                 log_info("LTK Request: recalculating with ediv 0x%04x", setup->sm_local_ediv);
1495                 // Y = dm(DHK, Rand)
1496                 sm_dm_r_prime(setup->sm_local_rand, plaintext);
1497                 sm_next_responding_state(connection);
1498                 sm_aes128_start(sm_persistent_dhk, plaintext, connection);
1499                 return;
1500 
1501             case SM_PH3_DISTRIBUTE_KEYS:
1502                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION){
1503                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION;
1504                     uint8_t buffer[17];
1505                     buffer[0] = SM_CODE_ENCRYPTION_INFORMATION;
1506                     reverse_128(setup->sm_ltk, &buffer[1]);
1507                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1508                     sm_timeout_reset(connection);
1509                     return;
1510                 }
1511                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_MASTER_IDENTIFICATION){
1512                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_MASTER_IDENTIFICATION;
1513                     uint8_t buffer[11];
1514                     buffer[0] = SM_CODE_MASTER_IDENTIFICATION;
1515                     little_endian_store_16(buffer, 1, setup->sm_local_ediv);
1516                     reverse_64(setup->sm_local_rand, &buffer[3]);
1517                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1518                     sm_timeout_reset(connection);
1519                     return;
1520                 }
1521                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_IDENTITY_INFORMATION){
1522                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_IDENTITY_INFORMATION;
1523                     uint8_t buffer[17];
1524                     buffer[0] = SM_CODE_IDENTITY_INFORMATION;
1525                     reverse_128(sm_persistent_irk, &buffer[1]);
1526                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1527                     sm_timeout_reset(connection);
1528                     return;
1529                 }
1530                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION){
1531                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION;
1532                     bd_addr_t local_address;
1533                     uint8_t buffer[8];
1534                     buffer[0] = SM_CODE_IDENTITY_ADDRESS_INFORMATION;
1535                     gap_advertisements_get_address(&buffer[1], local_address);
1536                     reverse_bd_addr(local_address, &buffer[2]);
1537                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1538                     sm_timeout_reset(connection);
1539                     return;
1540                 }
1541                 if (setup->sm_key_distribution_send_set &   SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION){
1542                     setup->sm_key_distribution_send_set &= ~SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION;
1543 
1544                     // hack to reproduce test runs
1545                     if (test_use_fixed_local_csrk){
1546                         memset(setup->sm_local_csrk, 0xcc, 16);
1547                     }
1548 
1549                     uint8_t buffer[17];
1550                     buffer[0] = SM_CODE_SIGNING_INFORMATION;
1551                     reverse_128(setup->sm_local_csrk, &buffer[1]);
1552                     l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer));
1553                     sm_timeout_reset(connection);
1554                     return;
1555                 }
1556 
1557                 // keys are sent
1558                 if (connection->sm_role){
1559                     // slave -> receive master keys if any
1560                     if (sm_key_distribution_all_received(connection)){
1561                         sm_key_distribution_handle_all_received(connection);
1562                         connection->sm_engine_state = SM_RESPONDER_IDLE;
1563                         sm_done_for_handle(connection->sm_handle);
1564                     } else {
1565                         connection->sm_engine_state = SM_PH3_RECEIVE_KEYS;
1566                     }
1567                 } else {
1568                     // master -> all done
1569                     connection->sm_engine_state = SM_INITIATOR_CONNECTED;
1570                     sm_done_for_handle(connection->sm_handle);
1571                 }
1572                 break;
1573 
1574             default:
1575                 break;
1576         }
1577 
1578         // check again if active connection was released
1579         if (sm_active_connection) break;
1580     }
1581 }
1582 
1583 // note: aes engine is ready as we just got the aes result
1584 static void sm_handle_encryption_result(uint8_t * data){
1585 
1586     sm_aes128_state = SM_AES128_IDLE;
1587 
1588     if (sm_address_resolution_ah_calculation_active){
1589         sm_address_resolution_ah_calculation_active = 0;
1590         // compare calulated address against connecting device
1591         uint8_t hash[3];
1592         reverse_24(data, hash);
1593         if (memcmp(&sm_address_resolution_address[3], hash, 3) == 0){
1594             log_info("LE Device Lookup: matched resolvable private address");
1595             sm_address_resolution_handle_event(ADDRESS_RESOLUTION_SUCEEDED);
1596             return;
1597         }
1598         // no match, try next
1599         sm_address_resolution_test++;
1600         return;
1601     }
1602 
1603     switch (dkg_state){
1604         case DKG_W4_IRK:
1605             reverse_128(data, sm_persistent_irk);
1606             log_info_key("irk", sm_persistent_irk);
1607             dkg_next_state();
1608             return;
1609         case DKG_W4_DHK:
1610             reverse_128(data, sm_persistent_dhk);
1611             log_info_key("dhk", sm_persistent_dhk);
1612             dkg_next_state();
1613             // SM Init Finished
1614             return;
1615         default:
1616             break;
1617     }
1618 
1619     switch (rau_state){
1620         case RAU_W4_ENC:
1621             reverse_24(data, &sm_random_address[3]);
1622             rau_next_state();
1623             return;
1624         default:
1625             break;
1626     }
1627 
1628     switch (sm_cmac_state){
1629         case CMAC_W4_SUBKEYS:
1630         case CMAC_W4_MI:
1631         case CMAC_W4_MLAST:
1632             {
1633             sm_key_t t;
1634             reverse_128(data, t);
1635             sm_cmac_handle_encryption_result(t);
1636             }
1637             return;
1638         default:
1639             break;
1640     }
1641 
1642     // retrieve sm_connection provided to sm_aes128_start_encryption
1643     sm_connection_t * connection = (sm_connection_t*) sm_aes128_context;
1644     if (!connection) return;
1645     switch (connection->sm_engine_state){
1646         case SM_PH2_C1_W4_ENC_A:
1647         case SM_PH2_C1_W4_ENC_C:
1648             {
1649             sm_key_t t2;
1650             reverse_128(data, t2);
1651             sm_c1_t3(t2, setup->sm_m_address, setup->sm_s_address, setup->sm_c1_t3_value);
1652             }
1653             sm_next_responding_state(connection);
1654             return;
1655         case SM_PH2_C1_W4_ENC_B:
1656             reverse_128(data, setup->sm_local_confirm);
1657             log_info_key("c1!", setup->sm_local_confirm);
1658             connection->sm_engine_state = SM_PH2_C1_SEND_PAIRING_CONFIRM;
1659             return;
1660         case SM_PH2_C1_W4_ENC_D:
1661             {
1662             sm_key_t peer_confirm_test;
1663             reverse_128(data, peer_confirm_test);
1664             log_info_key("c1!", peer_confirm_test);
1665             if (memcmp(setup->sm_peer_confirm, peer_confirm_test, 16) != 0){
1666                 setup->sm_pairing_failed_reason = SM_REASON_CONFIRM_VALUE_FAILED;
1667                 connection->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
1668                 return;
1669             }
1670             if (connection->sm_role){
1671                 connection->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM;
1672             } else {
1673                 connection->sm_engine_state = SM_PH2_CALC_STK;
1674             }
1675             }
1676             return;
1677         case SM_PH2_W4_STK:
1678             reverse_128(data, setup->sm_ltk);
1679             sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size);
1680             log_info_key("stk", setup->sm_ltk);
1681             if (connection->sm_role){
1682                 connection->sm_engine_state = SM_RESPONDER_PH2_SEND_LTK_REPLY;
1683             } else {
1684                 connection->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION;
1685             }
1686             return;
1687         case SM_PH3_Y_W4_ENC:{
1688             sm_key_t y128;
1689             reverse_128(data, y128);
1690             setup->sm_local_y = big_endian_read_16(y128, 14);
1691             log_info_hex16("y", setup->sm_local_y);
1692             // PH3B3 - calculate EDIV
1693             setup->sm_local_ediv = setup->sm_local_y ^ setup->sm_local_div;
1694             log_info_hex16("ediv", setup->sm_local_ediv);
1695             // PH3B4 - calculate LTK         - enc
1696             // LTK = d1(ER, DIV, 0))
1697             connection->sm_engine_state = SM_PH3_LTK_GET_ENC;
1698             return;
1699         }
1700         case SM_RESPONDER_PH4_Y_W4_ENC:{
1701             sm_key_t y128;
1702             reverse_128(data, y128);
1703             setup->sm_local_y = big_endian_read_16(y128, 14);
1704             log_info_hex16("y", setup->sm_local_y);
1705 
1706             // PH3B3 - calculate DIV
1707             setup->sm_local_div = setup->sm_local_y ^ setup->sm_local_ediv;
1708             log_info_hex16("ediv", setup->sm_local_ediv);
1709             // PH3B4 - calculate LTK         - enc
1710             // LTK = d1(ER, DIV, 0))
1711             connection->sm_engine_state = SM_RESPONDER_PH4_LTK_GET_ENC;
1712             return;
1713         }
1714         case SM_PH3_LTK_W4_ENC:
1715             reverse_128(data, setup->sm_ltk);
1716             log_info_key("ltk", setup->sm_ltk);
1717             // calc CSRK next
1718             connection->sm_engine_state = SM_PH3_CSRK_GET_ENC;
1719             return;
1720         case SM_PH3_CSRK_W4_ENC:
1721             reverse_128(data, setup->sm_local_csrk);
1722             log_info_key("csrk", setup->sm_local_csrk);
1723             if (setup->sm_key_distribution_send_set){
1724                 connection->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS;
1725             } else {
1726                 // no keys to send, just continue
1727                 if (connection->sm_role){
1728                     // slave -> receive master keys
1729                     connection->sm_engine_state = SM_PH3_RECEIVE_KEYS;
1730                 } else {
1731                     // master -> all done
1732                     connection->sm_engine_state = SM_INITIATOR_CONNECTED;
1733                     sm_done_for_handle(connection->sm_handle);
1734                 }
1735             }
1736             return;
1737         case SM_RESPONDER_PH4_LTK_W4_ENC:
1738             reverse_128(data, setup->sm_ltk);
1739             sm_truncate_key(setup->sm_ltk, connection->sm_actual_encryption_key_size);
1740             log_info_key("ltk", setup->sm_ltk);
1741             connection->sm_engine_state = SM_RESPONDER_PH4_SEND_LTK;
1742             return;
1743         default:
1744             break;
1745     }
1746 }
1747 
1748 // note: random generator is ready. this doesn NOT imply that aes engine is unused!
1749 static void sm_handle_random_result(uint8_t * data){
1750 
1751     switch (rau_state){
1752         case RAU_W4_RANDOM:
1753             // non-resolvable vs. resolvable
1754             switch (gap_random_adress_type){
1755                 case GAP_RANDOM_ADDRESS_RESOLVABLE:
1756                     // resolvable: use random as prand and calc address hash
1757                     // "The two most significant bits of prand shall be equal to ‘0’ and ‘1"
1758                     memcpy(sm_random_address, data, 3);
1759                     sm_random_address[0] &= 0x3f;
1760                     sm_random_address[0] |= 0x40;
1761                     rau_state = RAU_GET_ENC;
1762                     break;
1763                 case GAP_RANDOM_ADDRESS_NON_RESOLVABLE:
1764                 default:
1765                     // "The two most significant bits of the address shall be equal to ‘0’""
1766                     memcpy(sm_random_address, data, 6);
1767                     sm_random_address[0] &= 0x3f;
1768                     rau_state = RAU_SET_ADDRESS;
1769                     break;
1770             }
1771             return;
1772         default:
1773             break;
1774     }
1775 
1776     // retrieve sm_connection provided to sm_random_start
1777     sm_connection_t * connection = (sm_connection_t *) sm_random_context;
1778     if (!connection) return;
1779     switch (connection->sm_engine_state){
1780         case SM_PH2_W4_RANDOM_TK:
1781         {
1782             // map random to 0-999999 without speding much cycles on a modulus operation
1783             uint32_t tk = little_endian_read_32(data,0);
1784             tk = tk & 0xfffff;  // 1048575
1785             if (tk >= 999999){
1786                 tk = tk - 999999;
1787             }
1788             sm_reset_tk();
1789             big_endian_store_32(setup->sm_tk, 12, tk);
1790             if (connection->sm_role){
1791                 connection->sm_engine_state = SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE;
1792             } else {
1793                 connection->sm_engine_state = SM_PH1_W4_USER_RESPONSE;
1794                 sm_trigger_user_response(connection);
1795                 // response_idle == nothing <--> sm_trigger_user_response() did not require response
1796                 if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){
1797                     connection->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
1798                 }
1799             }
1800             return;
1801         }
1802         case SM_PH2_C1_W4_RANDOM_A:
1803             memcpy(&setup->sm_local_random[0], data, 8); // random endinaness
1804             connection->sm_engine_state = SM_PH2_C1_GET_RANDOM_B;
1805             return;
1806         case SM_PH2_C1_W4_RANDOM_B:
1807             memcpy(&setup->sm_local_random[8], data, 8); // random endinaness
1808             connection->sm_engine_state = SM_PH2_C1_GET_ENC_A;
1809             return;
1810         case SM_PH3_W4_RANDOM:
1811             reverse_64(data, setup->sm_local_rand);
1812             // no db for encryption size hack: encryption size is stored in lowest nibble of setup->sm_local_rand
1813             setup->sm_local_rand[7] = (setup->sm_local_rand[7] & 0xf0) + (connection->sm_actual_encryption_key_size - 1);
1814             // no db for authenticated flag hack: store flag in bit 4 of LSB
1815             setup->sm_local_rand[7] = (setup->sm_local_rand[7] & 0xef) + (connection->sm_connection_authenticated << 4);
1816             connection->sm_engine_state = SM_PH3_GET_DIV;
1817             return;
1818         case SM_PH3_W4_DIV:
1819             // use 16 bit from random value as div
1820             setup->sm_local_div = big_endian_read_16(data, 0);
1821             log_info_hex16("div", setup->sm_local_div);
1822             connection->sm_engine_state = SM_PH3_Y_GET_ENC;
1823             return;
1824         default:
1825             break;
1826     }
1827 }
1828 
1829 static void sm_event_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
1830 
1831     sm_connection_t  * sm_conn;
1832     hci_con_handle_t con_handle;
1833 
1834     switch (packet_type) {
1835 
1836 		case HCI_EVENT_PACKET:
1837 			switch (hci_event_packet_get_type(packet)) {
1838 
1839                 case BTSTACK_EVENT_STATE:
1840 					// bt stack activated, get started
1841 					if (packet[2] == HCI_STATE_WORKING) {
1842                         log_info("HCI Working!");
1843                         dkg_state = sm_persistent_irk_ready ? DKG_CALC_DHK : DKG_CALC_IRK;
1844                         rau_state = RAU_IDLE;
1845                         sm_run();
1846 					}
1847 					break;
1848 
1849                 case HCI_EVENT_LE_META:
1850                     switch (packet[2]) {
1851                         case HCI_SUBEVENT_LE_CONNECTION_COMPLETE:
1852 
1853                             log_info("sm: connected");
1854 
1855                             if (packet[3]) return; // connection failed
1856 
1857                             con_handle = little_endian_read_16(packet, 4);
1858                             sm_conn = sm_get_connection_for_handle(con_handle);
1859                             if (!sm_conn) break;
1860 
1861                             sm_conn->sm_handle = con_handle;
1862                             sm_conn->sm_role = packet[6];
1863                             sm_conn->sm_peer_addr_type = packet[7];
1864                             reverse_bd_addr(&packet[8],
1865                                             sm_conn->sm_peer_address);
1866 
1867                             log_info("New sm_conn, role %s", sm_conn->sm_role ? "slave" : "master");
1868 
1869                             // reset security properties
1870                             sm_conn->sm_connection_encrypted = 0;
1871                             sm_conn->sm_connection_authenticated = 0;
1872                             sm_conn->sm_connection_authorization_state = AUTHORIZATION_UNKNOWN;
1873                             sm_conn->sm_le_db_index = -1;
1874 
1875                             // prepare CSRK lookup (does not involve setup)
1876                             sm_conn->sm_irk_lookup_state = IRK_LOOKUP_W4_READY;
1877 
1878                             // just connected -> everything else happens in sm_run()
1879                             if (sm_conn->sm_role){
1880                                 // slave - state already could be SM_RESPONDER_SEND_SECURITY_REQUEST instead
1881                                 if (sm_conn->sm_engine_state == SM_GENERAL_IDLE){
1882                                     if (sm_slave_request_security) {
1883                                         // request security if requested by app
1884                                         sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST;
1885                                     } else {
1886                                         // otherwise, wait for pairing request
1887                                         sm_conn->sm_engine_state = SM_RESPONDER_IDLE;
1888                                     }
1889                                 }
1890                                 break;
1891                             } else {
1892                                 // master
1893                                 sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED;
1894                             }
1895                             break;
1896 
1897                         case HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST:
1898                             con_handle = little_endian_read_16(packet, 3);
1899                             sm_conn = sm_get_connection_for_handle(con_handle);
1900                             if (!sm_conn) break;
1901 
1902                             log_info("LTK Request: state %u", sm_conn->sm_engine_state);
1903                             if (sm_conn->sm_engine_state == SM_RESPONDER_PH2_W4_LTK_REQUEST){
1904                                 sm_conn->sm_engine_state = SM_PH2_CALC_STK;
1905                                 break;
1906                             }
1907 
1908                             // assume that we don't have a LTK for ediv == 0 and random == null
1909                             if (little_endian_read_16(packet, 13) == 0 && sm_is_null_random(&packet[5])){
1910                                 log_info("LTK Request: ediv & random are empty");
1911                                 sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY;
1912                                 break;
1913                             }
1914 
1915                             // store rand and ediv
1916                             reverse_64(&packet[5], sm_conn->sm_local_rand);
1917                             sm_conn->sm_local_ediv   = little_endian_read_16(packet, 13);
1918                             sm_conn->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK;
1919                             break;
1920 
1921                         default:
1922                             break;
1923                     }
1924                     break;
1925 
1926                 case HCI_EVENT_ENCRYPTION_CHANGE:
1927                     con_handle = little_endian_read_16(packet, 3);
1928                     sm_conn = sm_get_connection_for_handle(con_handle);
1929                     if (!sm_conn) break;
1930 
1931                     sm_conn->sm_connection_encrypted = packet[5];
1932                     log_info("Encryption state change: %u, key size %u", sm_conn->sm_connection_encrypted,
1933                         sm_conn->sm_actual_encryption_key_size);
1934                     log_info("event handler, state %u", sm_conn->sm_engine_state);
1935                     if (!sm_conn->sm_connection_encrypted) break;
1936                     // continue if part of initial pairing
1937                     switch (sm_conn->sm_engine_state){
1938                         case SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED:
1939                             sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED;
1940                             sm_done_for_handle(sm_conn->sm_handle);
1941                             break;
1942                         case SM_PH2_W4_CONNECTION_ENCRYPTED:
1943                             if (sm_conn->sm_role){
1944                                 // slave
1945                                 sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
1946                             } else {
1947                                 // master
1948                                 if (sm_key_distribution_all_received(sm_conn)){
1949                                     // skip receiving keys as there are none
1950                                     sm_key_distribution_handle_all_received(sm_conn);
1951                                     sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
1952                                 } else {
1953                                     sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS;
1954                                 }
1955                             }
1956                             break;
1957                         default:
1958                             break;
1959                     }
1960                     break;
1961 
1962                 case HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE:
1963                     con_handle = little_endian_read_16(packet, 3);
1964                     sm_conn = sm_get_connection_for_handle(con_handle);
1965                     if (!sm_conn) break;
1966 
1967                     log_info("Encryption key refresh complete, key size %u", sm_conn->sm_actual_encryption_key_size);
1968                     log_info("event handler, state %u", sm_conn->sm_engine_state);
1969                     // continue if part of initial pairing
1970                     switch (sm_conn->sm_engine_state){
1971                         case SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED:
1972                             sm_conn->sm_engine_state = SM_INITIATOR_CONNECTED;
1973                             sm_done_for_handle(sm_conn->sm_handle);
1974                             break;
1975                         case SM_PH2_W4_CONNECTION_ENCRYPTED:
1976                             if (sm_conn->sm_role){
1977                                 // slave
1978                                 sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
1979                             } else {
1980                                 // master
1981                                 sm_conn->sm_engine_state = SM_PH3_RECEIVE_KEYS;
1982                             }
1983                             break;
1984                         default:
1985                             break;
1986                     }
1987                     break;
1988 
1989 
1990                 case HCI_EVENT_DISCONNECTION_COMPLETE:
1991                     con_handle = little_endian_read_16(packet, 3);
1992                     sm_done_for_handle(con_handle);
1993                     sm_conn = sm_get_connection_for_handle(con_handle);
1994                     if (!sm_conn) break;
1995 
1996                     // delete stored bonding on disconnect with authentication failure in ph0
1997                     if (sm_conn->sm_role == 0
1998                         && sm_conn->sm_engine_state == SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED
1999                         && packet[2] == ERROR_CODE_AUTHENTICATION_FAILURE){
2000                         le_device_db_remove(sm_conn->sm_le_db_index);
2001                     }
2002 
2003                     sm_conn->sm_engine_state = SM_GENERAL_IDLE;
2004                     sm_conn->sm_handle = 0;
2005                     break;
2006 
2007 				case HCI_EVENT_COMMAND_COMPLETE:
2008                     if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_le_encrypt)){
2009                         sm_handle_encryption_result(&packet[6]);
2010                         break;
2011                     }
2012                     if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_le_rand)){
2013                         sm_handle_random_result(&packet[6]);
2014                         break;
2015                     }
2016                     break;
2017                 default:
2018                     break;
2019 			}
2020             break;
2021         default:
2022             break;
2023 	}
2024 
2025     sm_run();
2026 }
2027 
2028 static inline int sm_calc_actual_encryption_key_size(int other){
2029     if (other < sm_min_encryption_key_size) return 0;
2030     if (other < sm_max_encryption_key_size) return other;
2031     return sm_max_encryption_key_size;
2032 }
2033 
2034 /**
2035  * @return ok
2036  */
2037 static int sm_validate_stk_generation_method(void){
2038     // check if STK generation method is acceptable by client
2039     switch (setup->sm_stk_generation_method){
2040         case JUST_WORKS:
2041             return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_JUST_WORKS) != 0;
2042         case PK_RESP_INPUT:
2043         case PK_INIT_INPUT:
2044         case OK_BOTH_INPUT:
2045             return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_PASSKEY) != 0;
2046         case OOB:
2047             return (sm_accepted_stk_generation_methods & SM_STK_GENERATION_METHOD_OOB) != 0;
2048         default:
2049             return 0;
2050     }
2051 }
2052 
2053 // helper for sm_pdu_handler, calls sm_run on exit
2054 static void sm_pdu_received_in_wrong_state(sm_connection_t * sm_conn){
2055     setup->sm_pairing_failed_reason = SM_REASON_UNSPECIFIED_REASON;
2056     sm_conn->sm_engine_state = sm_conn->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED;
2057     sm_done_for_handle(sm_conn->sm_handle);
2058 }
2059 
2060 static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uint8_t *packet, uint16_t size){
2061 
2062     if (packet_type != SM_DATA_PACKET) return;
2063 
2064     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2065     if (!sm_conn) return;
2066 
2067     if (packet[0] == SM_CODE_PAIRING_FAILED){
2068         sm_conn->sm_engine_state = sm_conn->sm_role ? SM_RESPONDER_IDLE : SM_INITIATOR_CONNECTED;
2069         return;
2070     }
2071 
2072     log_debug("sm_pdu_handler: state %u, pdu 0x%02x", sm_conn->sm_engine_state, packet[0]);
2073 
2074     int err;
2075 
2076     switch (sm_conn->sm_engine_state){
2077 
2078         // a sm timeout requries a new physical connection
2079         case SM_GENERAL_TIMEOUT:
2080             return;
2081 
2082         // Initiator
2083         case SM_INITIATOR_CONNECTED:
2084             if ((packet[0] != SM_CODE_SECURITY_REQUEST) || (sm_conn->sm_role)){
2085                 sm_pdu_received_in_wrong_state(sm_conn);
2086                 break;
2087             }
2088             if (sm_conn->sm_irk_lookup_state == IRK_LOOKUP_FAILED){
2089                 sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
2090                 break;
2091             }
2092             if (sm_conn->sm_irk_lookup_state == IRK_LOOKUP_SUCCEEDED){
2093                 uint16_t ediv;
2094                 le_device_db_encryption_get(sm_conn->sm_le_db_index, &ediv, NULL, NULL, NULL, NULL, NULL);
2095                 if (ediv){
2096                     log_info("sm: Setting up previous ltk/ediv/rand for device index %u", sm_conn->sm_le_db_index);
2097                     sm_conn->sm_engine_state = SM_INITIATOR_PH0_HAS_LTK;
2098                 } else {
2099                     sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
2100                 }
2101                 break;
2102             }
2103             // otherwise, store security request
2104             sm_conn->sm_security_request_received = 1;
2105             break;
2106 
2107         case SM_INITIATOR_PH1_W4_PAIRING_RESPONSE:
2108             if (packet[0] != SM_CODE_PAIRING_RESPONSE){
2109                 sm_pdu_received_in_wrong_state(sm_conn);
2110                 break;
2111             }
2112             // store pairing request
2113             memcpy(&setup->sm_s_pres, packet, sizeof(sm_pairing_packet_t));
2114             err = sm_stk_generation_init(sm_conn);
2115             if (err){
2116                 setup->sm_pairing_failed_reason = err;
2117                 sm_conn->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
2118                 break;
2119             }
2120             // generate random number first, if we need to show passkey
2121             if (setup->sm_stk_generation_method == PK_RESP_INPUT){
2122                 sm_conn->sm_engine_state = SM_PH2_GET_RANDOM_TK;
2123                 break;
2124             }
2125             sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE;
2126             sm_trigger_user_response(sm_conn);
2127             // response_idle == nothing <--> sm_trigger_user_response() did not require response
2128             if (setup->sm_user_response == SM_USER_RESPONSE_IDLE){
2129                 sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
2130             }
2131             break;
2132 
2133         case SM_INITIATOR_PH2_W4_PAIRING_CONFIRM:
2134             if (packet[0] != SM_CODE_PAIRING_CONFIRM){
2135                 sm_pdu_received_in_wrong_state(sm_conn);
2136                 break;
2137             }
2138 
2139             // store s_confirm
2140             reverse_128(&packet[1], setup->sm_peer_confirm);
2141             sm_conn->sm_engine_state = SM_PH2_SEND_PAIRING_RANDOM;
2142             break;
2143 
2144         case SM_INITIATOR_PH2_W4_PAIRING_RANDOM:
2145             if (packet[0] != SM_CODE_PAIRING_RANDOM){
2146                 sm_pdu_received_in_wrong_state(sm_conn);
2147                 break;;
2148             }
2149 
2150             // received random value
2151             reverse_128(&packet[1], setup->sm_peer_random);
2152             sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C;
2153             break;
2154 
2155         // Responder
2156         case SM_RESPONDER_IDLE:
2157         case SM_RESPONDER_SEND_SECURITY_REQUEST:
2158         case SM_RESPONDER_PH1_W4_PAIRING_REQUEST:
2159             if (packet[0] != SM_CODE_PAIRING_REQUEST){
2160                 sm_pdu_received_in_wrong_state(sm_conn);
2161                 break;;
2162             }
2163 
2164             // store pairing request
2165             memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t));
2166             sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
2167             break;
2168 
2169         case SM_RESPONDER_PH1_W4_PAIRING_CONFIRM:
2170             if (packet[0] != SM_CODE_PAIRING_CONFIRM){
2171                 sm_pdu_received_in_wrong_state(sm_conn);
2172                 break;;
2173             }
2174 
2175             // received confirm value
2176             reverse_128(&packet[1], setup->sm_peer_confirm);
2177 
2178             // notify client to hide shown passkey
2179             if (setup->sm_stk_generation_method == PK_INIT_INPUT){
2180                 sm_notify_client_base(SM_EVENT_PASSKEY_DISPLAY_CANCEL, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address);
2181             }
2182 
2183             // handle user cancel pairing?
2184             if (setup->sm_user_response == SM_USER_RESPONSE_DECLINE){
2185                 setup->sm_pairing_failed_reason = SM_REASON_PASSKEYT_ENTRY_FAILED;
2186                 sm_conn->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
2187                 break;
2188             }
2189 
2190             // wait for user action?
2191             if (setup->sm_user_response == SM_USER_RESPONSE_PENDING){
2192                 sm_conn->sm_engine_state = SM_PH1_W4_USER_RESPONSE;
2193                 break;
2194             }
2195 
2196             // calculate and send local_confirm
2197             sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
2198             break;
2199 
2200         case SM_RESPONDER_PH2_W4_PAIRING_RANDOM:
2201             if (packet[0] != SM_CODE_PAIRING_RANDOM){
2202                 sm_pdu_received_in_wrong_state(sm_conn);
2203                 break;;
2204             }
2205 
2206             // received random value
2207             reverse_128(&packet[1], setup->sm_peer_random);
2208             sm_conn->sm_engine_state = SM_PH2_C1_GET_ENC_C;
2209             break;
2210 
2211         case SM_PH3_RECEIVE_KEYS:
2212             switch(packet[0]){
2213                 case SM_CODE_ENCRYPTION_INFORMATION:
2214                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION;
2215                     reverse_128(&packet[1], setup->sm_peer_ltk);
2216                     break;
2217 
2218                 case SM_CODE_MASTER_IDENTIFICATION:
2219                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_MASTER_IDENTIFICATION;
2220                     setup->sm_peer_ediv = little_endian_read_16(packet, 1);
2221                     reverse_64(&packet[3], setup->sm_peer_rand);
2222                     break;
2223 
2224                 case SM_CODE_IDENTITY_INFORMATION:
2225                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_INFORMATION;
2226                     reverse_128(&packet[1], setup->sm_peer_irk);
2227                     break;
2228 
2229                 case SM_CODE_IDENTITY_ADDRESS_INFORMATION:
2230                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION;
2231                     setup->sm_peer_addr_type = packet[1];
2232                     reverse_bd_addr(&packet[2], setup->sm_peer_address);
2233                     break;
2234 
2235                 case SM_CODE_SIGNING_INFORMATION:
2236                     setup->sm_key_distribution_received_set |= SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION;
2237                     reverse_128(&packet[1], setup->sm_peer_csrk);
2238                     break;
2239                 default:
2240                     // Unexpected PDU
2241                     log_info("Unexpected PDU %u in SM_PH3_RECEIVE_KEYS", packet[0]);
2242                     break;
2243             }
2244             // done with key distribution?
2245             if (sm_key_distribution_all_received(sm_conn)){
2246 
2247                 sm_key_distribution_handle_all_received(sm_conn);
2248 
2249                 if (sm_conn->sm_role){
2250                     sm_conn->sm_engine_state = SM_RESPONDER_IDLE;
2251                     sm_done_for_handle(sm_conn->sm_handle);
2252                 } else {
2253                     sm_conn->sm_engine_state = SM_PH3_GET_RANDOM;
2254                 }
2255             }
2256             break;
2257         default:
2258             // Unexpected PDU
2259             log_info("Unexpected PDU %u in state %u", packet[0], sm_conn->sm_engine_state);
2260             break;
2261     }
2262 
2263     // try to send preparared packet
2264     sm_run();
2265 }
2266 
2267 // Security Manager Client API
2268 void sm_register_oob_data_callback( int (*get_oob_data_callback)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_data)){
2269     sm_get_oob_data = get_oob_data_callback;
2270 }
2271 
2272 void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
2273     btstack_linked_list_add_tail(&sm_event_handlers, (btstack_linked_item_t*) callback_handler);
2274 }
2275 
2276 void sm_set_accepted_stk_generation_methods(uint8_t accepted_stk_generation_methods){
2277     sm_accepted_stk_generation_methods = accepted_stk_generation_methods;
2278 }
2279 
2280 void sm_set_encryption_key_size_range(uint8_t min_size, uint8_t max_size){
2281 	sm_min_encryption_key_size = min_size;
2282 	sm_max_encryption_key_size = max_size;
2283 }
2284 
2285 void sm_set_authentication_requirements(uint8_t auth_req){
2286     sm_auth_req = auth_req;
2287 }
2288 
2289 void sm_set_io_capabilities(io_capability_t io_capability){
2290     sm_io_capabilities = io_capability;
2291 }
2292 
2293 void sm_set_request_security(int enable){
2294     sm_slave_request_security = enable;
2295 }
2296 
2297 void sm_set_er(sm_key_t er){
2298     memcpy(sm_persistent_er, er, 16);
2299 }
2300 
2301 void sm_set_ir(sm_key_t ir){
2302     memcpy(sm_persistent_ir, ir, 16);
2303 }
2304 
2305 // Testing support only
2306 void sm_test_set_irk(sm_key_t irk){
2307     memcpy(sm_persistent_irk, irk, 16);
2308     sm_persistent_irk_ready = 1;
2309 }
2310 
2311 void sm_test_use_fixed_local_csrk(void){
2312     test_use_fixed_local_csrk = 1;
2313 }
2314 
2315 void sm_init(void){
2316     // set some (BTstack default) ER and IR
2317     int i;
2318     sm_key_t er;
2319     sm_key_t ir;
2320     for (i=0;i<16;i++){
2321         er[i] = 0x30 + i;
2322         ir[i] = 0x90 + i;
2323     }
2324     sm_set_er(er);
2325     sm_set_ir(ir);
2326     // defaults
2327     sm_accepted_stk_generation_methods = SM_STK_GENERATION_METHOD_JUST_WORKS
2328                                        | SM_STK_GENERATION_METHOD_OOB
2329                                        | SM_STK_GENERATION_METHOD_PASSKEY;
2330     sm_max_encryption_key_size = 16;
2331     sm_min_encryption_key_size = 7;
2332 
2333     sm_cmac_state  = CMAC_IDLE;
2334     dkg_state = DKG_W4_WORKING;
2335     rau_state = RAU_W4_WORKING;
2336     sm_aes128_state = SM_AES128_IDLE;
2337     sm_address_resolution_test = -1;    // no private address to resolve yet
2338     sm_address_resolution_ah_calculation_active = 0;
2339     sm_address_resolution_mode = ADDRESS_RESOLUTION_IDLE;
2340     sm_address_resolution_general_queue = NULL;
2341 
2342     gap_random_adress_update_period = 15 * 60 * 1000L;
2343 
2344     sm_active_connection = 0;
2345 
2346     test_use_fixed_local_csrk = 0;
2347 
2348     // register for HCI Events from HCI
2349     hci_event_callback_registration.callback = &sm_event_packet_handler;
2350     hci_add_event_handler(&hci_event_callback_registration);
2351 
2352     // and L2CAP PDUs
2353     l2cap_register_fixed_channel(sm_pdu_handler, L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
2354 }
2355 
2356 static sm_connection_t * sm_get_connection_for_handle(hci_con_handle_t con_handle){
2357     hci_connection_t * hci_con = hci_connection_for_handle(con_handle);
2358     if (!hci_con) return NULL;
2359     return &hci_con->sm_connection;
2360 }
2361 
2362 // @returns 0 if not encrypted, 7-16 otherwise
2363 int sm_encryption_key_size(hci_con_handle_t con_handle){
2364     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2365     if (!sm_conn) return 0;     // wrong connection
2366     if (!sm_conn->sm_connection_encrypted) return 0;
2367     return sm_conn->sm_actual_encryption_key_size;
2368 }
2369 
2370 int sm_authenticated(hci_con_handle_t con_handle){
2371     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2372     if (!sm_conn) return 0;     // wrong connection
2373     if (!sm_conn->sm_connection_encrypted) return 0; // unencrypted connection cannot be authenticated
2374     return sm_conn->sm_connection_authenticated;
2375 }
2376 
2377 authorization_state_t sm_authorization_state(hci_con_handle_t con_handle){
2378     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2379     if (!sm_conn) return AUTHORIZATION_UNKNOWN;     // wrong connection
2380     if (!sm_conn->sm_connection_encrypted)               return AUTHORIZATION_UNKNOWN; // unencrypted connection cannot be authorized
2381     if (!sm_conn->sm_connection_authenticated)           return AUTHORIZATION_UNKNOWN; // unauthenticatd connection cannot be authorized
2382     return sm_conn->sm_connection_authorization_state;
2383 }
2384 
2385 static void sm_send_security_request_for_connection(sm_connection_t * sm_conn){
2386     switch (sm_conn->sm_engine_state){
2387         case SM_GENERAL_IDLE:
2388         case SM_RESPONDER_IDLE:
2389             sm_conn->sm_engine_state = SM_RESPONDER_SEND_SECURITY_REQUEST;
2390             sm_run();
2391             break;
2392         default:
2393             break;
2394     }
2395 }
2396 
2397 /**
2398  * @brief Trigger Security Request
2399  */
2400 void sm_send_security_request(hci_con_handle_t con_handle){
2401     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2402     if (!sm_conn) return;
2403     sm_send_security_request_for_connection(sm_conn);
2404 }
2405 
2406 // request pairing
2407 void sm_request_pairing(hci_con_handle_t con_handle){
2408     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2409     if (!sm_conn) return;     // wrong connection
2410 
2411     log_info("sm_request_pairing in role %u, state %u", sm_conn->sm_role, sm_conn->sm_engine_state);
2412     if (sm_conn->sm_role){
2413         sm_send_security_request_for_connection(sm_conn);
2414     } else {
2415         // used as a trigger to start central/master/initiator security procedures
2416             uint16_t ediv;
2417             if (sm_conn->sm_engine_state == SM_INITIATOR_CONNECTED){
2418             switch (sm_conn->sm_irk_lookup_state){
2419                 case IRK_LOOKUP_FAILED:
2420                     sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
2421                     break;
2422                 case IRK_LOOKUP_SUCCEEDED:
2423                         le_device_db_encryption_get(sm_conn->sm_le_db_index, &ediv, NULL, NULL, NULL, NULL, NULL);
2424                         if (ediv){
2425                             log_info("sm: Setting up previous ltk/ediv/rand for device index %u", sm_conn->sm_le_db_index);
2426                             sm_conn->sm_engine_state = SM_INITIATOR_PH0_HAS_LTK;
2427                         } else {
2428                             sm_conn->sm_engine_state = SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST;
2429                         }
2430                         break;
2431                 default:
2432                     sm_conn->sm_bonding_requested = 1;
2433                     break;
2434             }
2435         }
2436     }
2437     sm_run();
2438 }
2439 
2440 // called by client app on authorization request
2441 void sm_authorization_decline(hci_con_handle_t con_handle){
2442     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2443     if (!sm_conn) return;     // wrong connection
2444     sm_conn->sm_connection_authorization_state = AUTHORIZATION_DECLINED;
2445     sm_notify_client_authorization(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 0);
2446 }
2447 
2448 void sm_authorization_grant(hci_con_handle_t con_handle){
2449     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2450     if (!sm_conn) return;     // wrong connection
2451     sm_conn->sm_connection_authorization_state = AUTHORIZATION_GRANTED;
2452     sm_notify_client_authorization(SM_EVENT_AUTHORIZATION_RESULT, sm_conn->sm_handle, sm_conn->sm_peer_addr_type, sm_conn->sm_peer_address, 1);
2453 }
2454 
2455 // GAP Bonding API
2456 
2457 void sm_bonding_decline(hci_con_handle_t con_handle){
2458     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2459     if (!sm_conn) return;     // wrong connection
2460     setup->sm_user_response = SM_USER_RESPONSE_DECLINE;
2461 
2462     if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){
2463         sm_done_for_handle(sm_conn->sm_handle);
2464         setup->sm_pairing_failed_reason = SM_REASON_PASSKEYT_ENTRY_FAILED;
2465         sm_conn->sm_engine_state = SM_GENERAL_SEND_PAIRING_FAILED;
2466     }
2467     sm_run();
2468 }
2469 
2470 void sm_just_works_confirm(hci_con_handle_t con_handle){
2471     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2472     if (!sm_conn) return;     // wrong connection
2473     setup->sm_user_response = SM_USER_RESPONSE_CONFIRM;
2474     if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){
2475         sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
2476     }
2477     sm_run();
2478 }
2479 
2480 void sm_passkey_input(hci_con_handle_t con_handle, uint32_t passkey){
2481     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2482     if (!sm_conn) return;     // wrong connection
2483     sm_reset_tk();
2484     big_endian_store_32(setup->sm_tk, 12, passkey);
2485     setup->sm_user_response = SM_USER_RESPONSE_PASSKEY;
2486     if (sm_conn->sm_engine_state == SM_PH1_W4_USER_RESPONSE){
2487         sm_conn->sm_engine_state = SM_PH2_C1_GET_RANDOM_A;
2488     }
2489     sm_run();
2490 }
2491 
2492 /**
2493  * @brief Identify device in LE Device DB
2494  * @param handle
2495  * @returns index from le_device_db or -1 if not found/identified
2496  */
2497 int sm_le_device_index(hci_con_handle_t con_handle ){
2498     sm_connection_t * sm_conn = sm_get_connection_for_handle(con_handle);
2499     if (!sm_conn) return -1;
2500     return sm_conn->sm_le_db_index;
2501 }
2502 
2503 // GAP LE API
2504 void gap_random_address_set_mode(gap_random_address_type_t random_address_type){
2505     gap_random_address_update_stop();
2506     gap_random_adress_type = random_address_type;
2507     if (random_address_type == GAP_RANDOM_ADDRESS_TYPE_OFF) return;
2508     gap_random_address_update_start();
2509     gap_random_address_trigger();
2510 }
2511 
2512 gap_random_address_type_t gap_random_address_get_mode(void){
2513     return gap_random_adress_type;
2514 }
2515 
2516 void gap_random_address_set_update_period(int period_ms){
2517     gap_random_adress_update_period = period_ms;
2518     if (gap_random_adress_type == GAP_RANDOM_ADDRESS_TYPE_OFF) return;
2519     gap_random_address_update_stop();
2520     gap_random_address_update_start();
2521 }
2522 
2523 void gap_random_address_set(bd_addr_t addr){
2524     gap_random_address_set_mode(GAP_RANDOM_ADDRESS_TYPE_OFF);
2525     memcpy(sm_random_address, addr, 6);
2526     rau_state = RAU_SET_ADDRESS;
2527     sm_run();
2528 }
2529 
2530 /*
2531  * @brief Set Advertisement Paramters
2532  * @param adv_int_min
2533  * @param adv_int_max
2534  * @param adv_type
2535  * @param direct_address_type
2536  * @param direct_address
2537  * @param channel_map
2538  * @param filter_policy
2539  *
2540  * @note own_address_type is used from gap_random_address_set_mode
2541  */
2542 void gap_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type,
2543     uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy){
2544     hci_le_advertisements_set_params(adv_int_min, adv_int_max, adv_type, gap_random_adress_type,
2545         direct_address_typ, direct_address, channel_map, filter_policy);
2546 }
2547 
2548