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 --- |