if (size != 18)
return true;
- b_res = mesh_net_add_key(net, opcode == OP_NETKEY_UPDATE,
- l_get_le16(pkt), pkt + 2);
+ net_idx = l_get_le16(pkt);
+
+ if (opcode == OP_NETKEY_ADD)
+ b_res = mesh_net_add_key(net, net_idx, pkt + 2);
+ else
+ b_res = mesh_net_update_key(net, net_idx, pkt + 2);
l_debug("NetKey Add/Update %s",
(b_res == MESH_STATUS_SUCCESS) ? "success" : "fail");
return MESH_STATUS_SUCCESS;
}
-int mesh_net_add_key(struct mesh_net *net, bool update, uint16_t idx,
- const void *value)
+int mesh_net_add_key(struct mesh_net *net, uint16_t idx, const uint8_t *value)
{
- int status;
struct mesh_subnet *subnet;
subnet = l_queue_find(net->subnets, match_key_index,
L_UINT_TO_PTR(idx));
- if (update) {
- if (subnet && subnet->kr_phase == KEY_REFRESH_PHASE_NONE) {
- l_info("Start key refresh");
- status = mesh_net_kr_phase_one(net, idx, value);
- if (status == MESH_STATUS_SUCCESS &&
- !storage_net_key_add(net, idx,
- value, KEY_REFRESH_PHASE_ONE))
- return MESH_STATUS_STORAGE_FAIL;
- } else
- return MESH_STATUS_CANNOT_UPDATE;
- }
-
if (subnet) {
if (net_key_confirm(subnet->net_key_cur, value))
return MESH_STATUS_SUCCESS;
return MESH_STATUS_SUCCESS;
}
-int mesh_net_kr_phase_one(struct mesh_net *net, uint16_t idx,
+int mesh_net_update_key(struct mesh_net *net, uint16_t idx,
const uint8_t *value)
{
struct mesh_subnet *subnet;
subnet = l_queue_find(net->subnets, match_key_index,
L_UINT_TO_PTR(idx));
+
if (!subnet)
return MESH_STATUS_CANNOT_UPDATE;
+ /* Check if the key has been already successfully updated */
+ if (subnet->kr_phase == KEY_REFRESH_PHASE_ONE &&
+ net_key_confirm(subnet->net_key_upd, value))
+ return MESH_STATUS_SUCCESS;
+
if (subnet->net_key_upd) {
net_key_unref(subnet->net_key_upd);
l_info("Warning: overwriting new keys");
l_info("key refresh phase 1: Key ID %d", subnet->net_key_upd);
+ if (!storage_net_key_add(net, idx, value, KEY_REFRESH_PHASE_ONE))
+ return MESH_STATUS_STORAGE_FAIL;
+
subnet->kr_phase = KEY_REFRESH_PHASE_ONE;
return MESH_STATUS_SUCCESS;
uint8_t interval);
bool mesh_net_set_friend_mode(struct mesh_net *net, bool enable);
int mesh_net_del_key(struct mesh_net *net, uint16_t net_idx);
-int mesh_net_add_key(struct mesh_net *net, bool update,
- uint16_t net_idx, const void *key);
+int mesh_net_add_key(struct mesh_net *net, uint16_t net_idx,
+ const uint8_t *key);
+int mesh_net_update_key(struct mesh_net *net, uint16_t net_idx,
+ const uint8_t *key);
uint32_t mesh_net_get_iv_index(struct mesh_net *net);
void mesh_net_get_snb_state(struct mesh_net *net,
uint8_t *flags, uint32_t *iv_index);
uint8_t transition);
uint8_t mesh_net_key_refresh_phase_get(struct mesh_net *net, uint16_t net_idx,
uint8_t *phase);
-int mesh_net_kr_phase_one(struct mesh_net *net, uint16_t net_idx,
- const uint8_t *key);
int mesh_net_key_refresh_phase_two(struct mesh_net *net, uint16_t net_idx);
int mesh_net_key_refresh_finish(struct mesh_net *net, uint16_t net_idx);
void mesh_net_send_seg(struct mesh_net *net, uint32_t key_id,
if (!mesh_db_write_device_key(node->jconfig, info->device_key))
return false;
- if (mesh_net_add_key(node->net, kr, info->net_index,
- info->net_key) != MESH_STATUS_SUCCESS)
+ if (mesh_net_add_key(node->net, info->net_index, info->net_key) !=
+ MESH_STATUS_SUCCESS)
return false;
if (!storage_net_key_add(node->net, info->net_index, info->net_key,
if (!net)
return false;
- if (mesh_net_add_key(net, false, idx, key) != MESH_STATUS_SUCCESS)
+ if (mesh_net_add_key(net, idx, key) != MESH_STATUS_SUCCESS)
return false;
/* TODO: handle restoring key refresh phase and new keys */