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