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