mesh: send using previous iv index if iv update active

This commit is contained in:
Matthias Ringwald 2019-07-05 16:43:23 +02:00
parent a42685b6ad
commit d075c32206
3 changed files with 19 additions and 7 deletions

View File

@ -287,7 +287,7 @@ static void mesh_network_send_c(void *arg){
static void mesh_network_send_b(void *arg){
mesh_network_pdu_t * network_pdu = (mesh_network_pdu_t *) arg;
uint32_t iv_index = global_iv_index;
uint32_t iv_index = mesh_get_iv_index_for_tx();
// store NetMIC
uint8_t net_mic[8];
@ -314,6 +314,8 @@ static void mesh_network_send_a(mesh_network_pdu_t * network_pdu){
mesh_crypto_active = 1;
uint32_t iv_index = mesh_get_iv_index_for_tx();
// lookup subnet by netkey_index
mesh_subnet_t * subnet = mesh_subnet_get_by_netkey_index(network_pdu->netkey_index);
if (!subnet) {
@ -330,13 +332,13 @@ static void mesh_network_send_a(mesh_network_pdu_t * network_pdu){
// get network nonce
if (network_pdu->flags & MESH_NETWORK_PDU_FLAGS_PROXY_CONFIGURATION){
mesh_proxy_create_nonce(network_nonce, network_pdu, global_iv_index);
mesh_proxy_create_nonce(network_nonce, network_pdu, iv_index);
#ifdef LOG_NETWORK
printf("TX-ProxyNonce: ");
printf_hexdump(network_nonce, 13);
#endif
} else {
mesh_network_create_nonce(network_nonce, network_pdu, global_iv_index);
mesh_network_create_nonce(network_nonce, network_pdu, iv_index);
#ifdef LOG_NETWORK
printf("TX-NetworkNonce: ");
printf_hexdump(network_nonce, 13);
@ -931,7 +933,7 @@ void mesh_network_setup_pdu(mesh_network_pdu_t * network_pdu, uint16_t netkey_in
// set netkey_index
network_pdu->netkey_index = netkey_index;
// setup header
network_pdu->data[network_pdu->len++] = (global_iv_index << 7) | nid;
network_pdu->data[network_pdu->len++] = (mesh_get_iv_index_for_tx() << 7) | nid;
uint8_t ctl_ttl = (ctl << 7) | (ttl & 0x7f);
network_pdu->data[network_pdu->len++] = ctl_ttl;
big_endian_store_24(network_pdu->data, 2, seq);
@ -956,7 +958,7 @@ void mesh_network_setup_pdu_header(mesh_network_pdu_t * network_pdu, uint16_t ne
// set netkey_index
network_pdu->netkey_index = netkey_index;
// setup header
network_pdu->data[0] = (global_iv_index << 7) | nid;
network_pdu->data[0] = (mesh_get_iv_index_for_tx() << 7) | nid;
uint8_t ctl_ttl = (ctl << 7) | (ttl & 0x7f);
network_pdu->data[1] = ctl_ttl;
big_endian_store_24(network_pdu->data, 2, seq);
@ -972,6 +974,14 @@ uint32_t mesh_get_iv_index(void){
return global_iv_index;
}
uint32_t mesh_get_iv_index_for_tx(void){
if (global_iv_update_active){
return global_iv_index - 1;
} else {
return global_iv_index;
}
}
int mesh_iv_update_active(void){
return global_iv_update_active;
}

View File

@ -375,6 +375,8 @@ uint8_t mesh_network_pdu_len(mesh_network_pdu_t * network_pdu);
void mesh_set_iv_index(uint32_t iv_index);
uint32_t mesh_get_iv_index(void);
uint32_t mesh_get_iv_index_for_tx(void);
int mesh_iv_update_active(void);
void mesh_trigger_iv_update(void);

View File

@ -651,7 +651,7 @@ static uint8_t mesh_upper_transport_setup_segmented_access_pdu_header(mesh_trans
uint32_t seq = mesh_lower_transport_peek_seq();
printf("[+] Upper transport, setup segmented Access PDU - seq %06x, szmic %u, iv_index %08x\n", seq, szmic,
mesh_get_iv_index());
mesh_get_iv_index_for_tx());
mesh_print_hex("Access Payload", transport_pdu->data, transport_pdu->len);
// get app or device key
@ -674,7 +674,7 @@ static uint8_t mesh_upper_transport_setup_segmented_access_pdu_header(mesh_trans
transport_pdu->netkey_index = netkey_index;
transport_pdu->appkey_index = appkey_index;
transport_pdu->akf_aid = akf_aid;
mesh_transport_set_nid_ivi(transport_pdu, network_key->nid | ((mesh_get_iv_index() & 1) << 7));
mesh_transport_set_nid_ivi(transport_pdu, network_key->nid | ((mesh_get_iv_index_for_tx() & 1) << 7));
mesh_transport_set_seq(transport_pdu, seq);
mesh_transport_set_src(transport_pdu, src);
mesh_transport_set_dest(transport_pdu, dest);