Skip to content

Commit 14a3d4d

Browse files
Jędrzej Ciupisnordicjm
authored andcommitted
[nrf fromtree] drivers: ieee802154: support Key Identifier Mode > 1
IEEE 802.15.4-2020 defines four possible values for Key Identifier Mode field of the Auxiliary Security Header. The current ieee802154 driver API only supports two of them: b00 and b01. This commit adds support for the two remaining Key Identifier Mode values. It's done by replacing a field that can only hold Key Index into a field that can holds a pointer to the entire Key Identifier field. See IEEE 802.15.4-2020, sections 9.4.2.3 and 9.4.4 for further reference. Signed-off-by: Jędrzej Ciupis <[email protected]> (cherry picked from commit 7afeb62)
1 parent 6e296fb commit 14a3d4d

File tree

3 files changed

+31
-29
lines changed

3 files changed

+31
-29
lines changed

drivers/ieee802154/ieee802154_nrf5.c

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -791,36 +791,24 @@ static void nrf5_iface_init(struct net_if *iface)
791791
#if defined(CONFIG_NRF_802154_ENCRYPTION)
792792
static void nrf5_config_mac_keys(struct ieee802154_key *mac_keys)
793793
{
794-
static nrf_802154_key_id_t stored_key_ids[NRF_802154_SECURITY_KEY_STORAGE_SIZE];
795-
static uint8_t stored_ids[NRF_802154_SECURITY_KEY_STORAGE_SIZE];
796-
uint8_t i;
794+
nrf_802154_security_key_remove_all();
797795

798-
for (i = 0; i < NRF_802154_SECURITY_KEY_STORAGE_SIZE && stored_key_ids[i].p_key_id; i++) {
799-
nrf_802154_security_key_remove(&stored_key_ids[i]);
800-
stored_key_ids[i].p_key_id = NULL;
801-
}
802-
803-
i = 0;
804-
for (struct ieee802154_key *keys = mac_keys; keys->key_value
805-
&& i < NRF_802154_SECURITY_KEY_STORAGE_SIZE; keys++, i++) {
796+
for (uint8_t i = 0; mac_keys->key_value
797+
&& i < NRF_802154_SECURITY_KEY_STORAGE_SIZE; mac_keys++, i++) {
806798
nrf_802154_key_t key = {
807-
.value.p_cleartext_key = keys->key_value,
808-
.id.mode = keys->key_id_mode,
809-
.id.p_key_id = &(keys->key_index),
799+
.value.p_cleartext_key = mac_keys->key_value,
800+
.id.mode = mac_keys->key_id_mode,
801+
.id.p_key_id = mac_keys->key_id,
810802
.type = NRF_802154_KEY_CLEARTEXT,
811803
.frame_counter = 0,
812-
.use_global_frame_counter = !(keys->frame_counter_per_key),
804+
.use_global_frame_counter = !(mac_keys->frame_counter_per_key),
813805
};
814806

815807
__ASSERT_EVAL((void)nrf_802154_security_key_store(&key),
816808
nrf_802154_security_error_t err = nrf_802154_security_key_store(&key),
817809
err == NRF_802154_SECURITY_ERROR_NONE ||
818810
err == NRF_802154_SECURITY_ERROR_ALREADY_PRESENT,
819811
"Storing key failed, err: %d", err);
820-
821-
stored_ids[i] = *key.id.p_key_id;
822-
stored_key_ids[i].mode = key.id.mode;
823-
stored_key_ids[i].p_key_id = &stored_ids[i];
824812
};
825813
}
826814
#endif /* CONFIG_NRF_802154_ENCRYPTION */

include/zephyr/net/ieee802154_radio.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,16 @@ struct ieee802154_filter {
224224
};
225225

226226
struct ieee802154_key {
227+
/** Key material */
227228
uint8_t *key_value;
229+
/** Initial value of frame counter associated with the key, see section 9.4.3 */
228230
uint32_t key_frame_counter;
231+
/** Indicates if per-key frame counter should be used, see section 9.4.3 */
229232
bool frame_counter_per_key;
233+
/** Key Identifier Mode, see section 9.4.2.3, Table 9-7 */
230234
uint8_t key_id_mode;
231-
uint8_t key_index;
235+
/** Key Identifier, see section 9.4.4 */
236+
uint8_t *key_id;
232237
};
233238

234239
/** IEEE802.15.4 Transmission mode. */

modules/openthread/platform/radio.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,20 +1181,14 @@ void otPlatRadioSetMacKey(otInstance *aInstance, uint8_t aKeyIdMode, uint8_t aKe
11811181
struct ieee802154_key keys[] = {
11821182
{
11831183
.key_id_mode = key_id_mode,
1184-
.key_index = aKeyId == 1 ? 0x80 : aKeyId - 1,
1185-
.key_value = (uint8_t *)aPrevKey->mKeyMaterial.mKey.m8,
11861184
.frame_counter_per_key = false,
11871185
},
11881186
{
11891187
.key_id_mode = key_id_mode,
1190-
.key_index = aKeyId,
1191-
.key_value = (uint8_t *)aCurrKey->mKeyMaterial.mKey.m8,
11921188
.frame_counter_per_key = false,
11931189
},
11941190
{
11951191
.key_id_mode = key_id_mode,
1196-
.key_index = aKeyId == 0x80 ? 1 : aKeyId + 1,
1197-
.key_value = (uint8_t *)aNextKey->mKeyMaterial.mKey.m8,
11981192
.frame_counter_per_key = false,
11991193
},
12001194
{
@@ -1208,9 +1202,24 @@ void otPlatRadioSetMacKey(otInstance *aInstance, uint8_t aKeyIdMode, uint8_t aKe
12081202
},
12091203
};
12101204

1211-
/* aKeyId in range: (1, 0x80) means valid keys
1212-
* aKeyId == 0 is used only to clear keys for stack reset in RCP
1213-
*/
1205+
if (key_id_mode == 1) {
1206+
/* aKeyId in range: (1, 0x80) means valid keys */
1207+
uint8_t prev_key_id = aKeyId == 1 ? 0x80 : aKeyId - 1;
1208+
uint8_t next_key_id = aKeyId == 0x80 ? 1 : aKeyId + 1;
1209+
1210+
keys[0].key_id = &prev_key_id;
1211+
keys[0].key_value = (uint8_t *)aPrevKey->mKeyMaterial.mKey.m8;
1212+
1213+
keys[1].key_id = &aKeyId;
1214+
keys[1].key_value = (uint8_t *)aCurrKey->mKeyMaterial.mKey.m8;
1215+
1216+
keys[2].key_id = &next_key_id;
1217+
keys[2].key_value = (uint8_t *)aNextKey->mKeyMaterial.mKey.m8;
1218+
} else {
1219+
/* aKeyId == 0 is used only to clear keys for stack reset in RCP */
1220+
__ASSERT_NO_MSG((key_id_mode == 0) && (aKeyId == 0));
1221+
}
1222+
12141223
struct ieee802154_config config = {
12151224
.mac_keys = aKeyId == 0 ? clear_keys : keys,
12161225
};

0 commit comments

Comments
 (0)