diff --git a/mesh/appkey.c b/mesh/appkey.c
index 286a77e..6c65454 100644
--- a/mesh/appkey.c
+++ b/mesh/appkey.c
uint16_t net_idx;
uint16_t app_idx;
uint8_t key[16];
- uint8_t key_id;
+ uint8_t key_aid;
uint8_t new_key[16];
- uint8_t new_key_id;
+ uint8_t new_key_aid;
};
struct mesh_msg {
uint16_t idx;
uint16_t size;
uint16_t virt_size;
- uint8_t key_id;
+ uint8_t key_aid;
bool szmict;
bool decrypted;
};
if (dec->decrypted)
return;
- if (key->key_id != dec->key_id &&
- key->new_key_id != dec->key_id)
+ if (key->key_aid != dec->key_aid &&
+ key->new_key_aid != dec->key_aid)
return;
dec->key = key;
- if (key->key_id == dec->key_id) {
+ if (key->key_aid == dec->key_aid) {
dec->decrypted = mesh_crypto_payload_decrypt(dec->virt,
dec->virt_size, dec->data, dec->size,
- dec->szmict, dec->src, dec->dst, dec->key_id,
+ dec->szmict, dec->src, dec->dst, dec->key_aid,
dec->seq, dec->iv_idx, dec->out, key->key);
if (dec->decrypted)
print_packet("Used App Key", dec->key->key, 16);
print_packet("Failed with App Key", dec->key->key, 16);
}
- if (!dec->decrypted && key->new_key_id == dec->key_id) {
+ if (!dec->decrypted && key->new_key_aid == dec->key_aid) {
dec->decrypted = mesh_crypto_payload_decrypt(dec->virt,
dec->virt_size, dec->data, dec->size,
- dec->szmict, dec->src, dec->dst, dec->key_id,
+ dec->szmict, dec->src, dec->dst, dec->key_aid,
dec->seq, dec->iv_idx, dec->out, key->new_key);
if (dec->decrypted)
print_packet("Used App Key", dec->key->new_key, 16);
int appkey_packet_decrypt(struct mesh_net *net, bool szmict, uint32_t seq,
uint32_t iv_index, uint16_t src,
uint16_t dst, uint8_t *virt, uint16_t virt_size,
- uint8_t key_id, const uint8_t *data,
+ uint8_t key_aid, const uint8_t *data,
uint16_t data_size, uint8_t *out)
{
struct l_queue *app_keys;
.data = data,
.out = out,
.size = data_size,
- .key_id = key_id,
+ .key_aid = key_aid,
.iv_idx = iv_index,
.virt = virt,
.virt_size = virt_size,
{
struct mesh_app_key *key = l_new(struct mesh_app_key, 1);
- key->new_key_id = 0xFF;
+ key->new_key_aid = 0xFF;
key->replay_cache = l_queue_new();
return key;
}
static bool set_key(struct mesh_app_key *key, uint16_t app_idx,
const uint8_t *key_value, bool is_new)
{
- uint8_t key_id;
+ uint8_t key_aid;
- if (!mesh_crypto_k4(key_value, &key_id))
+ if (!mesh_crypto_k4(key_value, &key_aid))
return false;
- key_id = KEY_ID_AKF | (key_id << KEY_AID_SHIFT);
+ key_aid = KEY_ID_AKF | (key_aid << KEY_AID_SHIFT);
if (!is_new)
- key->key_id = key_id;
+ key->key_aid = key_aid;
else
- key->new_key_id = key_id;
+ key->new_key_aid = key_aid;
memcpy(is_new ? key->new_key : key->key, key_value, 16);
}
const uint8_t *appkey_get_key(struct mesh_net *net, uint16_t app_idx,
- uint8_t *key_id)
+ uint8_t *key_aid)
{
struct mesh_app_key *app_key;
uint8_t phase;
return NULL;
if (phase != KEY_REFRESH_PHASE_TWO) {
- *key_id = app_key->key_id;
+ *key_aid = app_key->key_aid;
return app_key->key;
}
- if (app_key->new_key_id == NET_NID_INVALID)
+ if (app_key->new_key_aid == NET_NID_INVALID)
return NULL;
- *key_id = app_key->new_key_id;
+ *key_aid = app_key->new_key_aid;
return app_key->new_key;
}
return true;
}
+uint16_t appkey_net_idx(struct mesh_net *net, uint16_t app_idx)
+{
+ struct mesh_app_key *key;
+ struct l_queue *app_keys;
+
+ app_keys = mesh_net_get_app_keys(net);
+ if (!app_keys)
+ return NET_IDX_INVALID;
+
+ key = l_queue_find(app_keys, match_key_index, L_UINT_TO_PTR(app_idx));
+
+ if (!key)
+ return NET_IDX_INVALID;
+ else
+ return key->net_idx;
+}
+
int appkey_key_update(struct mesh_net *net, uint16_t net_idx, uint16_t app_idx,
const uint8_t *new_key)
{
diff --git a/mesh/appkey.h b/mesh/appkey.h
index 1c22e80..4c13558 100644
--- a/mesh/appkey.h
+++ b/mesh/appkey.h
const uint8_t *appkey_get_key(struct mesh_net *net, uint16_t app_idx,
uint8_t *key_id);
bool appkey_have_key(struct mesh_net *net, uint16_t app_idx);
+uint16_t appkey_net_idx(struct mesh_net *net, uint16_t app_idx);
int appkey_key_add(struct mesh_net *net, uint16_t net_idx, uint16_t app_idx,
const uint8_t *new_key);
int appkey_key_update(struct mesh_net *net, uint16_t net_idx, uint16_t app_idx,