Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 5635089

Browse files
author
Mika Tervonen
committed
fix key sequence issues when keys are rotated
Created function to calculate prev key Used key generation functions in all places that keys are calculated When device is started after boot all keys are calculated prev,current,next Removed function to get MLE keys with KeyID as it is not supported Fixed key rotation time to be hours according to specification When ED attaches using link sync guard time is not used as timer is lost When router attaches using link sync key sequence is learned
1 parent 74db027 commit 5635089

15 files changed

+141
-162
lines changed

source/6LoWPAN/Thread/thread_bootstrap.c

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -563,9 +563,6 @@ void thread_set_link_local_address(protocol_interface_info_entry_t *cur)
563563

564564
static int thread_configuration_security_activate(protocol_interface_info_entry_t *cur, link_configuration_s *linkConfiguration)
565565
{
566-
uint8_t key_material[32];
567-
uint8_t key_index;
568-
569566
tr_debug("MAC SET Security Mode");
570567

571568
if (!(cur->lowpan_info & INTERFACE_NWK_ACTIVE) || !(cur->configure_flags & INTERFACE_BOOTSTRAP_DEFINED)) {
@@ -580,16 +577,11 @@ static int thread_configuration_security_activate(protocol_interface_info_entry_
580577
cur->thread_info->masterSecretMaterial.historyKeyValid = false;
581578
cur->thread_info->masterSecretMaterial.valid_Info = true;
582579
// Update the guard timer value
583-
thread_calculate_key_guard_timer(cur, linkConfiguration, true);
580+
thread_key_guard_timer_calculate(cur, linkConfiguration, true);
584581
//Define KEY's
585-
thread_key_get(linkConfiguration->master_key, key_material, linkConfiguration->key_sequence);
586-
key_index = THREAD_KEY_INDEX(linkConfiguration->key_sequence);
587-
//Set Keys
588-
mac_helper_security_default_key_set(cur, &key_material[16], key_index, MAC_KEY_ID_MODE_IDX);
589-
//Add Security to MLE service
590-
mle_service_security_set_security_key(cur->id, key_material, key_index, true);
591-
//Gen also Next Key
592-
thread_security_next_key_generate(cur, linkConfiguration->master_key, linkConfiguration->key_sequence);
582+
thread_security_prev_key_generate(cur,linkConfiguration->master_key,linkConfiguration->key_sequence);
583+
thread_security_key_generate(cur,linkConfiguration->master_key,linkConfiguration->key_sequence);
584+
thread_security_next_key_generate(cur,linkConfiguration->master_key,linkConfiguration->key_sequence);
593585
return 0;
594586
}
595587

source/6LoWPAN/Thread/thread_common.c

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -154,33 +154,37 @@ uint8_t *thread_management_key_request_with_sequence(int8_t interface_id, uint8_
154154
if (!linkConfiguration) {
155155
return NULL;
156156
}
157+
//tr_debug("MLE key request by sequence id %"PRIu8" seq %"PRIu32, keyId, keySequnce);
157158

158159
cur = protocol_stack_interface_info_get_by_id(interface_id);
159-
if (cur && cur->thread_info) {
160-
if (cur->thread_info->masterSecretMaterial.valid_Info) {
161-
if (keySequnce == linkConfiguration->key_sequence) {
162-
if (mle_service_security_default_key_id_get(interface_id) == keyId) {
163-
keyPtr = mle_service_security_default_key_get(interface_id);
164-
}
165-
} else if (keySequnce == (linkConfiguration->key_sequence + 1)) {
166-
if (mle_service_security_next_key_id_get(interface_id) == keyId) {
167-
keyPtr = mle_service_security_next_key_get(interface_id);
168-
}
169-
}
170-
171-
if (!keyPtr) {
172-
tr_debug("Gen temporary key id %"PRIu8" seq %"PRIu32, keyId, keySequnce);
173-
thread_key_get(linkConfiguration->master_key, cur->thread_info->masterSecretMaterial.historyKey, keySequnce);
174-
cur->thread_info->masterSecretMaterial.historyKeyId = keyId;
175-
cur->thread_info->masterSecretMaterial.historyKeyValid = false;
176-
keyPtr = cur->thread_info->masterSecretMaterial.historyKey;
177-
}
160+
if (!cur || !cur->thread_info) {
161+
return NULL;
162+
}
163+
if (!cur->thread_info->masterSecretMaterial.valid_Info) {
164+
return NULL;
165+
}
166+
if (keySequnce == linkConfiguration->key_sequence) {
167+
if (mle_service_security_default_key_id_get(interface_id) == keyId) {
168+
keyPtr = mle_service_security_default_key_get(interface_id);
169+
}
170+
} else if (keySequnce == (linkConfiguration->key_sequence + 1)) {
171+
if (mle_service_security_next_key_id_get(interface_id) == keyId) {
172+
keyPtr = mle_service_security_next_key_get(interface_id);
178173
}
179174
}
175+
176+
if (!keyPtr) {
177+
tr_debug("Gen temporary key id %"PRIu8" seq %"PRIu32, keyId, keySequnce);
178+
thread_key_get(linkConfiguration->master_key, cur->thread_info->masterSecretMaterial.historyKey, keySequnce);
179+
cur->thread_info->masterSecretMaterial.historyKeyId = keyId;
180+
cur->thread_info->masterSecretMaterial.historyKeyValid = false;
181+
keyPtr = cur->thread_info->masterSecretMaterial.historyKey;
182+
}
180183
return keyPtr;
181184
}
182185
uint8_t * thread_mle_service_security_notify_cb(int8_t interface_id, mle_security_event_t event, uint8_t keyId)
183186
{
187+
(void)keyId;
184188
protocol_interface_info_entry_t *interface = protocol_stack_interface_info_get_by_id(interface_id);
185189
if (!interface) {
186190
return NULL;
@@ -199,7 +203,7 @@ uint8_t * thread_mle_service_security_notify_cb(int8_t interface_id, mle_securit
199203
break;
200204

201205
case MLE_SEC_UNKNOWN_KEY:
202-
return thread_management_key_request(interface_id,keyId);
206+
return NULL;
203207
}
204208
return NULL;
205209
}
@@ -362,17 +366,22 @@ bool thread_connectivity_tlv_parse(uint8_t *ptr, uint16_t dataLength, thread_con
362366
return false;
363367
}
364368

365-
void thread_calculate_key_guard_timer(protocol_interface_info_entry_t *cur, link_configuration_s *linkConfiguration, bool is_init)
369+
void thread_key_guard_timer_calculate(protocol_interface_info_entry_t *cur, link_configuration_s *linkConfiguration, bool is_init)
366370
{
367371
uint32_t key_rotation = linkConfiguration ? linkConfiguration->key_rotation : 0;
368372

369-
if (is_init && key_rotation < 3600) {
373+
if (is_init && key_rotation < 1) {
370374
tr_warn("Attempted to set key rotation time smaller than 1 hour.");
371-
key_rotation = 3600;
375+
key_rotation = 1;
372376
}
373377

374-
cur->thread_info->masterSecretMaterial.keyRotation = key_rotation;
375-
cur->thread_info->masterSecretMaterial.keySwitchGuardTimer = is_init ? 0 : (key_rotation * 0.93);
378+
cur->thread_info->masterSecretMaterial.keyRotation = key_rotation * 3600; // setting value is hours converting to seconds
379+
cur->thread_info->masterSecretMaterial.keySwitchGuardTimer = is_init ? 0 : (key_rotation * 3600 * 0.93);
380+
}
381+
382+
void thread_key_guard_timer_reset(protocol_interface_info_entry_t *cur)
383+
{
384+
cur->thread_info->masterSecretMaterial.keySwitchGuardTimer = 0;
376385
}
377386

378387
thread_leader_data_t *thread_leader_data_generate(void)
@@ -932,7 +941,7 @@ static void thread_key_switch_timer(protocol_interface_info_entry_t *cur, uint16
932941

933942
tr_debug("thrKeyRotation == 0: sync key material by %"PRIu32, linkConfiguration->key_sequence + 1);
934943
thread_management_key_sets_calc(cur, linkConfiguration, linkConfiguration->key_sequence + 1);
935-
thread_calculate_key_guard_timer(cur, linkConfiguration, false);
944+
thread_key_guard_timer_calculate(cur, linkConfiguration, false);
936945
}
937946
}
938947

source/6LoWPAN/Thread/thread_common.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,8 @@ uint8_t *thread_pending_operational_dataset_write(protocol_interface_info_entry_
432432
bool thread_pending_operational_dataset_process(protocol_interface_info_entry_t *cur, uint64_t mle_pending_timestamp, uint8_t *ptr, uint16_t len);
433433
/*Write optional thread leader data TLV if leader data is known*/
434434
uint8_t thread_pending_timestamp_tlv_size(protocol_interface_info_entry_t *cur);
435-
void thread_calculate_key_guard_timer(protocol_interface_info_entry_t *cur, link_configuration_s *linkConfiguration, bool is_init);
435+
void thread_key_guard_timer_calculate(protocol_interface_info_entry_t *cur, link_configuration_s *linkConfiguration, bool is_init);
436+
void thread_key_guard_timer_reset(protocol_interface_info_entry_t *cur);
436437
void thread_set_link_local_address(protocol_interface_info_entry_t *cur);
437438
void thread_mcast_group_change(struct protocol_interface_info_entry *interface, struct if_group_entry *group, bool group_added);
438439
void thread_partition_data_purge(protocol_interface_info_entry_t *cur);

source/6LoWPAN/Thread/thread_host_bootstrap.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ static bool thread_parent_discover_timeout_cb(int8_t interface_id, uint16_t msgI
172172
mle_service_frame_counter_entry_add(interface_id, entry_temp->index, parent->mleFrameCounter);
173173

174174
thread_management_key_sets_calc(cur, linkConfiguration, cur->thread_info->thread_attach_scanned_parent->keySequence);
175-
thread_calculate_key_guard_timer(cur, linkConfiguration, true);
175+
thread_key_guard_timer_calculate(cur, linkConfiguration, true);
176176

177177
mlme_device_descriptor_t device_desc;
178178
mac_helper_device_description_write(cur, &device_desc, entry_temp->mac64, entry_temp->mac16,parent->linLayerFrameCounter, false);
@@ -331,6 +331,8 @@ static int thread_end_device_synch_response_validate(protocol_interface_info_ent
331331

332332
if (securityHeader->KeyIdMode == MAC_KEY_ID_MODE_SRC4_IDX) {
333333
thread_management_key_synch_req(cur->id, common_read_32_bit(securityHeader->Keysource));
334+
// if learning key sequence from link sync actual guard timer value is not known
335+
thread_key_guard_timer_reset(cur);
334336
} else {
335337
tr_debug("Key ID Mode 2 not used; dropped.");
336338
return -3;

source/6LoWPAN/Thread/thread_joiner_application.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -778,8 +778,8 @@ static bool thread_joiner_application_validate_settings(thread_joiner_t *this)
778778
new_value_generated = 1;
779779
tr_info("Generating Random ML-EID");
780780
}
781-
if (this->configuration_ptr->key_rotation < 3600) {
782-
this->configuration_ptr->key_rotation = 3600;
781+
if (this->configuration_ptr->key_rotation < 1) {
782+
this->configuration_ptr->key_rotation = 1;
783783
}
784784
return new_value_generated;
785785
}
@@ -967,17 +967,12 @@ static int thread_joiner_application_nvm_link_config_read(thread_joiner_t *this)
967967
this->configuration_valid = true;
968968
link_configuration_trace(this->configuration_ptr);
969969

970+
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(this->interface_id);
970971
//Add Security to MLE service
971-
uint8_t key_material[32];
972-
uint8_t key_index;
973-
//Define KEY's
972+
thread_security_prev_key_generate(cur,this->configuration_ptr->master_key,this->configuration_ptr->key_sequence);
973+
thread_security_key_generate(cur,this->configuration_ptr->master_key,this->configuration_ptr->key_sequence);
974+
thread_security_next_key_generate(cur,this->configuration_ptr->master_key,this->configuration_ptr->key_sequence);
974975

975-
thread_key_get(this->configuration_ptr->master_key, key_material, this->configuration_ptr->key_sequence);
976-
key_index = THREAD_KEY_INDEX(this->configuration_ptr->key_sequence);
977-
//Set Keys
978-
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(this->interface_id);
979-
mac_helper_security_default_key_set(cur, &key_material[16], key_index, MAC_KEY_ID_MODE_IDX);
980-
mle_service_security_set_security_key(this->interface_id, key_material, key_index, true);
981976
// update counters
982977
mle_service_security_set_frame_counter(this->interface_id, fast_data.mle_frame_counter);
983978
mac_helper_link_frame_counter_set(this->interface_id, fast_data.mac_frame_counter);

source/6LoWPAN/Thread/thread_leader_service.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ static int thread_leader_service_active_set_cb(int8_t service_id, uint8_t source
414414
}
415415
}
416416
if (3 <= thread_meshcop_tlv_find(request_ptr->payload_ptr, request_ptr->payload_len, MESHCOP_TLV_SECURITY_POLICY, &ptr)) {
417-
if (common_read_16_bit(ptr) < 3600) {
417+
if (common_read_16_bit(ptr) < 1) {
418418
tr_warn("invalid security policy");
419419
ret = -1;
420420
goto send_response;

0 commit comments

Comments
 (0)