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