uint32_t net_key_decrypt(uint32_t iv_index, const uint8_t *pkt, size_t len,
uint8_t **plain, size_t *plain_len)
{
- bool iv_flag = !!(iv_index & 1);
- bool iv_pkt = !!(pkt[0] & 0x80);
-
- if (iv_pkt != iv_flag)
- iv_index--;
-
/* If we already successfully decrypted this packet, use cached data */
if (cache_id && cache_len == len && !memcmp(pkt, cache_pkt, len)) {
/* IV Index must match what was used to decrypt */
size_t out_size;
uint32_t key_id;
int8_t rssi = 0;
+ bool ivi_net = !!(net->iv_index & 1);
+ bool ivi_pkt = !!(data->data[0] & 0x80);
- key_id = net_key_decrypt(net->iv_index, data->data, data->len,
+ /* if IVI flag differs, use previous IV Index */
+ uint32_t iv_index = net->iv_index - (ivi_pkt ^ ivi_net);
+
+ key_id = net_key_decrypt(iv_index, data->data, data->len,
&out, &out_size);
if (!key_id)
rssi = data->info->rssi;
}
- relay_advice = packet_received(net, key_id, net->iv_index,
+ relay_advice = packet_received(net, key_id, iv_index,
out, out_size, rssi);
if (relay_advice > data->relay_advice) {
- bool iv_flag = !!(net->iv_index & 1);
- bool iv_pkt = !!(data->data[0] & 0x80);
-
- data->iv_index = net->iv_index;
- if (iv_pkt != iv_flag)
- data->iv_index--;
-
+ data->iv_index = iv_index;
data->relay_advice = relay_advice;
data->key_id = key_id;
data->net = net;