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