mesh: store appkey_index in message

This commit is contained in:
Matthias Ringwald 2018-11-09 11:45:15 +01:00
parent 898500f031
commit 14eb258619

View File

@ -279,27 +279,35 @@ typedef struct {
btstack_linked_item_t item; btstack_linked_item_t item;
// index into shared global key list // index into shared global key list
uint16_t appkey_index; uint16_t index;
// random net_key // app_key
uint8_t application_key[16]; uint8_t key[16];
uint8_t aid; uint8_t aid;
} mesh_application_key_t; } mesh_application_key_t;
static uint8_t test_application_key[16]; static mesh_application_key_t test_application_key;
static uint16_t test_application_key_index; static mesh_application_key_t mesh_transport_device_key;
static const uint8_t * mesh_application_key_list_get(uint16_t appkey_index){ void mesh_application_key_set(uint16_t appkey_index, uint8_t aid, const uint8_t * application_key){
if (appkey_index != test_application_key_index) return NULL; test_application_key.index = appkey_index;
return test_application_key; test_application_key.aid = aid;
memcpy(test_application_key.key, application_key, 16);
} }
void mesh_application_key_set(uint16_t appkey_index, const uint8_t * application_key){ static void mesh_transport_set_device_key(const uint8_t * device_key){
test_application_key_index = appkey_index; mesh_transport_device_key.index = MESH_DEVICE_KEY_INDEX;
memcpy(test_application_key, application_key, 16); mesh_transport_device_key.aid = 0;
memcpy(mesh_transport_device_key.key, device_key, 16);
} }
static const mesh_application_key_t * mesh_application_key_list_get(uint16_t appkey_index){
if (appkey_index != test_application_key.index) return NULL;
return &test_application_key;
}
// mesh network key iterator // mesh network key iterator
static void mesh_application_key_iterator_init(mesh_application_key_iterator_t * it, uint8_t aid){ static void mesh_application_key_iterator_init(mesh_application_key_iterator_t * it, uint8_t aid){
it->aid = aid; it->aid = aid;
@ -307,12 +315,12 @@ static void mesh_application_key_iterator_init(mesh_application_key_iterator_t *
} }
static int mesh_application_key_iterator_has_more(mesh_application_key_iterator_t * it){ static int mesh_application_key_iterator_has_more(mesh_application_key_iterator_t * it){
return it->first && it->aid == test_application_key_index; return it->first && it->aid == test_application_key.aid;
} }
static const uint8_t * mesh_application_key_iterator_get_next(mesh_application_key_iterator_t * it){ static const mesh_application_key_t * mesh_application_key_iterator_get_next(mesh_application_key_iterator_t * it){
it->first = 0; it->first = 0;
return test_application_key; return &test_application_key;
} }
@ -322,7 +330,6 @@ static void mesh_lower_transport_run(void);
static void mesh_upper_transport_validate_message(mesh_network_pdu_t * network_pdu); static void mesh_upper_transport_validate_message(mesh_network_pdu_t * network_pdu);
static uint8_t application_nonce[13]; static uint8_t application_nonce[13];
static uint8_t mesh_transport_device_key[16];
static btstack_crypto_ccm_t ccm; static btstack_crypto_ccm_t ccm;
static btstack_linked_list_t lower_transport_incoming; static btstack_linked_list_t lower_transport_incoming;
static int mesh_transport_crypto_active; static int mesh_transport_crypto_active;
@ -396,7 +403,7 @@ static void mesh_upper_transport_validate_message(mesh_network_pdu_t * network_p
} else { } else {
// unsegmented access message // unsegmented access message
const uint8_t * message_key; const mesh_application_key_t * message_key;
uint8_t afk = lower_transport_pdu[0] & 0x40; uint8_t afk = lower_transport_pdu[0] & 0x40;
if (afk){ if (afk){
@ -410,9 +417,12 @@ static void mesh_upper_transport_validate_message(mesh_network_pdu_t * network_p
} }
} else { } else {
// device key // device key
message_key = mesh_transport_device_key; message_key = &mesh_transport_device_key;
} }
// store application / device key index
network_pdu->appkey_index = message_key->index;
// TODO: transmic hard coded to 4, could be 8 // TODO: transmic hard coded to 4, could be 8
uint8_t trans_mic_len = 4; uint8_t trans_mic_len = 4;
uint8_t * upper_transport_pdu_data = &network_pdu->data[10]; uint8_t * upper_transport_pdu_data = &network_pdu->data[10];
@ -422,7 +432,7 @@ static void mesh_upper_transport_validate_message(mesh_network_pdu_t * network_p
// application key nonce // application key nonce
transport_setup_application_nonce(application_nonce, network_pdu); transport_setup_application_nonce(application_nonce, network_pdu);
btstack_crypo_ccm_init(&ccm, message_key, application_nonce, upper_transport_pdu_len, 4); btstack_crypo_ccm_init(&ccm, message_key->key, application_nonce, upper_transport_pdu_len, 4);
btstack_crypto_ccm_decrypt_block(&ccm, upper_transport_pdu_len, upper_transport_pdu_data, upper_transport_pdu_data, &mesh_upper_transport_validate_message_ccm, network_pdu); btstack_crypto_ccm_decrypt_block(&ccm, upper_transport_pdu_len, upper_transport_pdu_data, upper_transport_pdu_data, &mesh_upper_transport_validate_message_ccm, network_pdu);
return; return;
@ -499,10 +509,6 @@ static void mesh_transport_received_mesage(mesh_network_pdu_t * network_pdu){
mesh_lower_transport_run(); mesh_lower_transport_run();
} }
static void mesh_transport_set_device_key(const uint8_t * device_key){
memcpy(mesh_transport_device_key, device_key, 16);
}
// #define TEST_MESSAGE_1 // #define TEST_MESSAGE_1
// #define TEST_MESSAGE_24 // #define TEST_MESSAGE_24
@ -519,7 +525,7 @@ static void load_provisioning_data_test_message(void){
uint8_t application_key[16]; uint8_t application_key[16];
btstack_parse_hex("63964771734fbd76e3b40519d1d94a48", 16, application_key); btstack_parse_hex("63964771734fbd76e3b40519d1d94a48", 16, application_key);
mesh_application_key_set( 0x26, application_key); mesh_application_key_set( 0, 0x26, application_key);
} }
static void receive_test_message(void){ static void receive_test_message(void){
@ -774,7 +780,7 @@ int btstack_main(void)
uint8_t application_key[16]; uint8_t application_key[16];
const char * application_key_string = "3216D1509884B533248541792B877F98"; const char * application_key_string = "3216D1509884B533248541792B877F98";
btstack_parse_hex(application_key_string, 16, application_key); btstack_parse_hex(application_key_string, 16, application_key);
mesh_application_key_set(0x38, application_key); mesh_application_key_set(0, 0x38, application_key);
printf("Application Key: "); printf("Application Key: ");
printf_hexdump(application_key, 16); printf_hexdump(application_key, 16);