From e6340996d7330423cbfaba1a4c50a4414e925758 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Tue, 28 Sep 2021 15:25:53 -0700 Subject: [PATCH] eapol: netdev: allow rekeys using FT-FILS Rekeying was overlooked when implementing FT-FILS and there were many places where the AKM was never checked and the rekey was failing. --- src/eapol.c | 17 ++++++++++++----- src/netdev.c | 5 +---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/eapol.c b/src/eapol.c index 2a763eb8..07120fdb 100644 --- a/src/eapol.c +++ b/src/eapol.c @@ -231,6 +231,11 @@ static size_t eapol_get_mic_length(enum ie_rsn_akm_suite akm, size_t pmk_len) l_error("Invalid PMK length of %zu for OWE", pmk_len); return 0; } + case IE_RSN_AKM_SUITE_FILS_SHA256: + case IE_RSN_AKM_SUITE_FILS_SHA384: + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256: + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384: + return 0; default: return 16; } @@ -254,6 +259,8 @@ uint8_t *eapol_decrypt_key_data(enum ie_rsn_akm_suite akm, const uint8_t *kek, switch (akm) { case IE_RSN_AKM_SUITE_FILS_SHA256: case IE_RSN_AKM_SUITE_FILS_SHA384: + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256: + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384: if (key_data_len < 16) return NULL; @@ -329,13 +336,16 @@ uint8_t *eapol_decrypt_key_data(enum ie_rsn_akm_suite akm, const uint8_t *kek, break; case IE_RSN_AKM_SUITE_FILS_SHA256: case IE_RSN_AKM_SUITE_FILS_SHA384: + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256: + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384: { struct iovec ad[1]; ad[0].iov_base = (void *)frame; ad[0].iov_len = key_data - (const uint8_t *)frame; - if (akm == IE_RSN_AKM_SUITE_FILS_SHA256) + if (akm == IE_RSN_AKM_SUITE_FILS_SHA256 || akm == + IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256) kek_len = 32; else kek_len = 64; @@ -1220,10 +1230,7 @@ static void eapol_handle_ptk_1_of_4(struct eapol_sm *sm, goto error_unspecified; } - if (sm->handshake->akm_suite & - (IE_RSN_AKM_SUITE_FT_OVER_8021X | - IE_RSN_AKM_SUITE_FT_USING_PSK | - IE_RSN_AKM_SUITE_FT_OVER_SAE_SHA256)) { + if (IE_AKM_IS_FT(sm->handshake->akm_suite)) { /* * Rebuild the RSNE to include the PMKR1Name and append * MDE + FTE. diff --git a/src/netdev.c b/src/netdev.c index de6af614..c6867ce3 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -2565,10 +2565,7 @@ process_resp_ies: netdev->owe_sm = NULL; } - /* FILS handles its own FT key derivation */ - if (fte && !(netdev->handshake->akm_suite & - (IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256 | - IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384))) { + if (fte) { uint32_t kck_len = handshake_state_get_kck_len(netdev->handshake); /*