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