Skip to content

Commit 9dfe724

Browse files
author
Mika Leppänen
committed
Corrected 4WH retries and timeouts
Supplicant now updates 4WH (temporary) sequence counter when receiving Message 1 retry. When supplicant 4WH protocol timeout occurs after Message 2 has been send, supplicant no longer goes to wait Message 3 retry state. Also security key data is now not updated.
1 parent b47c583 commit 9dfe724

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

source/Security/protocols/fwh_sec_prot/auth_fwh_sec_prot.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ static fwh_sec_prot_msg_e auth_fwh_sec_prot_message_get(eapol_pdu_t *eapol_pdu,
197197
break;
198198
case KEY_INFO_KEY_MIC | KEY_INFO_SECURED_KEY_FRAME:
199199
// Only accept message from supplicant with expected replay counter
200-
if (eapol_pdu->msg.key.replay_counter == sec_prot_keys_pmk_replay_cnt_get(sec_keys)) {
200+
if (eapol_pdu->msg.key.replay_counter == sec_prot_keys_pmk_replay_cnt_get(sec_keys)) {
201201
msg = FWH_MESSAGE_4;
202202
}
203203
break;

source/Security/protocols/fwh_sec_prot/supp_fwh_sec_prot.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ typedef struct {
7777
void *recv_pdu; /**< received pdu */
7878
uint16_t recv_size; /**< received pdu size */
7979
uint64_t recv_replay_cnt; /**< received replay counter */
80+
bool msg3_received : 1; /**< Valid Message 3 has been received */
8081
bool msg3_retry_wait : 1; /**< Waiting for Message 3 retry */
8182
} fwh_sec_prot_int_t;
8283

@@ -137,6 +138,7 @@ static int8_t supp_fwh_sec_prot_init(sec_prot_t *prot)
137138
sec_prot_state_set(prot, &data->common, FWH_STATE_INIT);
138139

139140
data->common.ticks = 30 * 10; // 30 seconds
141+
data->msg3_received = false;
140142
data->msg3_retry_wait = false;
141143
data->recv_replay_cnt = 0;
142144

@@ -351,6 +353,9 @@ static void supp_fwh_sec_prot_state_machine(sec_prot_t *prot)
351353
if (supp_fwh_sec_prot_ptk_generate(prot, prot->sec_keys) < 0) {
352354
return;
353355
}
356+
357+
supp_fwh_sec_prot_recv_replay_counter_store(prot);
358+
354359
// Send 4WH message 2
355360
supp_fwh_sec_prot_message_send(prot, FWH_MESSAGE_2);
356361
data->common.ticks = 30 * 10; // 30 seconds
@@ -376,6 +381,7 @@ static void supp_fwh_sec_prot_state_machine(sec_prot_t *prot)
376381

377382
supp_fwh_sec_prot_recv_replay_counter_store(prot);
378383
supp_fwh_sec_prot_security_replay_counter_update(prot);
384+
data->msg3_received = true;
379385

380386
// Sends 4WH Message 4
381387
supp_fwh_sec_prot_message_send(prot, FWH_MESSAGE_4);
@@ -389,17 +395,24 @@ static void supp_fwh_sec_prot_state_machine(sec_prot_t *prot)
389395
sec_prot_state_set(prot, &data->common, FWH_STATE_FINISHED);
390396
return;
391397
}
392-
data->msg3_retry_wait = true;
393398

394-
tr_info("4WH: finish, wait Message 3 retry");
399+
// If Message 3 has been received updates key data and waits for Message 3 retry
400+
if (data->msg3_received) {
401+
data->msg3_retry_wait = true;
402+
403+
tr_info("4WH: finish, wait Message 3 retry");
404+
405+
sec_prot_keys_ptk_write(prot->sec_keys, data->new_ptk);
406+
sec_prot_keys_ptk_eui_64_write(prot->sec_keys, data->remote_eui64);
407+
408+
data->common.ticks = 60 * 10; // 60 seconds
409+
sec_prot_state_set(prot, &data->common, FWH_STATE_MESSAGE_3_RETRY_WAIT);
410+
} else {
411+
tr_info("4WH: finish");
412+
}
395413

396414
// KMP-FINISHED.indication
397-
sec_prot_keys_ptk_write(prot->sec_keys, data->new_ptk);
398-
sec_prot_keys_ptk_eui_64_write(prot->sec_keys, data->remote_eui64);
399415
prot->finished_ind(prot, sec_prot_result_get(&data->common), prot->sec_keys);
400-
401-
data->common.ticks = 60 * 10; // 60 seconds
402-
sec_prot_state_set(prot, &data->common, FWH_STATE_MESSAGE_3_RETRY_WAIT);
403416
break;
404417

405418
case FWH_STATE_MESSAGE_3_RETRY_WAIT:

0 commit comments

Comments
 (0)