sm.c (b892db1cf577494f4388886f8a5c7edb70261b44) sm.c (e91ddb40755e32b7f518eeedb40e9a37edf017f9)
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

--- 93 unchanged lines hidden (view full) ---

102} derived_key_generation_t;
103
104typedef enum {
105 RAU_IDLE,
106 RAU_GET_RANDOM,
107 RAU_W4_RANDOM,
108 RAU_GET_ENC,
109 RAU_W4_ENC,
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

--- 93 unchanged lines hidden (view full) ---

102} derived_key_generation_t;
103
104typedef enum {
105 RAU_IDLE,
106 RAU_GET_RANDOM,
107 RAU_W4_RANDOM,
108 RAU_GET_ENC,
109 RAU_W4_ENC,
110 RAU_SET_ADDRESS,
111} random_address_update_t;
112
113typedef enum {
114 CMAC_IDLE,
115 CMAC_CALC_SUBKEYS,
116 CMAC_W4_SUBKEYS,
117 CMAC_CALC_MI,
118 CMAC_W4_MI,

--- 1999 unchanged lines hidden (view full) ---

2118 // already busy?
2119 if (sm_aes128_state == SM_AES128_IDLE) {
2120 sm_ah_r_prime(sm_random_address, sm_aes128_plaintext);
2121 sm_aes128_state = SM_AES128_ACTIVE;
2122 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_irk, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_rau, NULL);
2123 return true;
2124 }
2125 break;
110} random_address_update_t;
111
112typedef enum {
113 CMAC_IDLE,
114 CMAC_CALC_SUBKEYS,
115 CMAC_W4_SUBKEYS,
116 CMAC_CALC_MI,
117 CMAC_W4_MI,

--- 1999 unchanged lines hidden (view full) ---

2117 // already busy?
2118 if (sm_aes128_state == SM_AES128_IDLE) {
2119 sm_ah_r_prime(sm_random_address, sm_aes128_plaintext);
2120 sm_aes128_state = SM_AES128_ACTIVE;
2121 btstack_crypto_aes128_encrypt(&sm_crypto_aes128_request, sm_persistent_irk, sm_aes128_plaintext, sm_aes128_ciphertext, sm_handle_encryption_result_rau, NULL);
2122 return true;
2123 }
2124 break;
2126 case RAU_SET_ADDRESS:
2127 log_info("New random address: %s", bd_addr_to_str(sm_random_address));
2128 rau_state = RAU_IDLE;
2129 hci_send_cmd(&hci_le_set_random_address, sm_random_address);
2130 return true;
2131 default:
2132 break;
2133 }
2134 return false;
2135}
2136
2137// CSRK Lookup
2138static bool sm_run_csrk(void){

--- 1285 unchanged lines hidden (view full) ---

3424 sm_trigger_run();
3425}
3426
3427static void sm_handle_encryption_result_rau(void *arg){
3428 UNUSED(arg);
3429 sm_aes128_state = SM_AES128_IDLE;
3430
3431 (void)memcpy(&sm_random_address[3], &sm_aes128_ciphertext[13], 3);
2125 default:
2126 break;
2127 }
2128 return false;
2129}
2130
2131// CSRK Lookup
2132static bool sm_run_csrk(void){

--- 1285 unchanged lines hidden (view full) ---

3418 sm_trigger_run();
3419}
3420
3421static void sm_handle_encryption_result_rau(void *arg){
3422 UNUSED(arg);
3423 sm_aes128_state = SM_AES128_IDLE;
3424
3425 (void)memcpy(&sm_random_address[3], &sm_aes128_ciphertext[13], 3);
3432 rau_state = RAU_SET_ADDRESS;
3426 rau_state = RAU_IDLE;
3427 hci_le_random_address_set(sm_random_address);
3428
3433 sm_trigger_run();
3434}
3435
3436static void sm_handle_random_result_rau(void * arg){
3437 UNUSED(arg);
3438 // non-resolvable vs. resolvable
3439 switch (gap_random_adress_type){
3440 case GAP_RANDOM_ADDRESS_RESOLVABLE:
3441 // resolvable: use random as prand and calc address hash
3442 // "The two most significant bits of prand shall be equal to ‘0’ and ‘1"
3443 sm_random_address[0u] &= 0x3fu;
3444 sm_random_address[0u] |= 0x40u;
3445 rau_state = RAU_GET_ENC;
3446 break;
3447 case GAP_RANDOM_ADDRESS_NON_RESOLVABLE:
3448 default:
3449 // "The two most significant bits of the address shall be equal to ‘0’""
3450 sm_random_address[0u] &= 0x3fu;
3429 sm_trigger_run();
3430}
3431
3432static void sm_handle_random_result_rau(void * arg){
3433 UNUSED(arg);
3434 // non-resolvable vs. resolvable
3435 switch (gap_random_adress_type){
3436 case GAP_RANDOM_ADDRESS_RESOLVABLE:
3437 // resolvable: use random as prand and calc address hash
3438 // "The two most significant bits of prand shall be equal to ‘0’ and ‘1"
3439 sm_random_address[0u] &= 0x3fu;
3440 sm_random_address[0u] |= 0x40u;
3441 rau_state = RAU_GET_ENC;
3442 break;
3443 case GAP_RANDOM_ADDRESS_NON_RESOLVABLE:
3444 default:
3445 // "The two most significant bits of the address shall be equal to ‘0’""
3446 sm_random_address[0u] &= 0x3fu;
3451 rau_state = RAU_SET_ADDRESS;
3447 hci_le_random_address_set(sm_random_address);
3452 break;
3453 }
3454 sm_trigger_run();
3455}
3456
3457#ifdef ENABLE_LE_SECURE_CONNECTIONS
3458static void sm_handle_random_result_sc_next_send_pairing_random(void * arg){
3459 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg;

--- 1642 unchanged lines hidden (view full) ---

5102 if (!gap_random_address_type_requires_updates()) return;
5103 gap_random_address_update_stop();
5104 gap_random_address_update_start();
5105}
5106
5107void gap_random_address_set(const bd_addr_t addr){
5108 gap_random_address_set_mode(GAP_RANDOM_ADDRESS_TYPE_STATIC);
5109 (void)memcpy(sm_random_address, addr, 6);
3448 break;
3449 }
3450 sm_trigger_run();
3451}
3452
3453#ifdef ENABLE_LE_SECURE_CONNECTIONS
3454static void sm_handle_random_result_sc_next_send_pairing_random(void * arg){
3455 hci_con_handle_t con_handle = (hci_con_handle_t) (uintptr_t) arg;

--- 1642 unchanged lines hidden (view full) ---

5098 if (!gap_random_address_type_requires_updates()) return;
5099 gap_random_address_update_stop();
5100 gap_random_address_update_start();
5101}
5102
5103void gap_random_address_set(const bd_addr_t addr){
5104 gap_random_address_set_mode(GAP_RANDOM_ADDRESS_TYPE_STATIC);
5105 (void)memcpy(sm_random_address, addr, 6);
5110 rau_state = RAU_SET_ADDRESS;
5111 sm_trigger_run();
5106 hci_le_random_address_set(addr);
5112}
5113
5114#ifdef ENABLE_LE_PERIPHERAL
5115/*
5116 * @brief Set Advertisement Paramters
5117 * @param adv_int_min
5118 * @param adv_int_max
5119 * @param adv_type

--- 70 unchanged lines hidden ---
5107}
5108
5109#ifdef ENABLE_LE_PERIPHERAL
5110/*
5111 * @brief Set Advertisement Paramters
5112 * @param adv_int_min
5113 * @param adv_int_max
5114 * @param adv_type

--- 70 unchanged lines hidden ---