]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
FT: Extend MIC derivation for FT-SAE-EXT-KEY
authorJouni Malinen <quic_jouni@quicinc.com>
Sun, 16 Oct 2022 13:38:27 +0000 (16:38 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 16 Oct 2022 14:07:54 +0000 (17:07 +0300)
Provide AKM to the helper function so that the new SHA256 and SHA512
options can be covered for FT-SAE-EXT-KEY.

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
src/ap/wpa_auth_ft.c
src/common/wpa_common.c
src/common/wpa_common.h
src/rsn_supp/wpa_ft.c
wlantest/rx_mgmt.c

index 03376b02faf5aed932678b3424d02101cc2cf9b1..eb167cb603e3b65351b85f85b30d6c9708c26b5f 100644 (file)
@@ -2813,7 +2813,8 @@ u8 * wpa_sm_write_assoc_resp_ies(struct wpa_state_machine *sm, u8 *pos,
                kck_len = sm->PTK.kck_len;
        }
        if (auth_alg == WLAN_AUTH_FT &&
-           wpa_ft_mic(kck, kck_len, sm->addr, sm->wpa_auth->addr, 6,
+           wpa_ft_mic(sm->wpa_key_mgmt, kck, kck_len,
+                      sm->addr, sm->wpa_auth->addr, 6,
                       mdie, mdie_len, ftie, ftie_len,
                       rsnie, rsnie_len,
                       ric_start, ric_start ? pos - ric_start : 0,
@@ -3548,7 +3549,8 @@ int wpa_ft_validate_reassoc(struct wpa_state_machine *sm, const u8 *ies,
                kck = sm->PTK.kck;
                kck_len = sm->PTK.kck_len;
        }
-       if (wpa_ft_mic(kck, kck_len, sm->addr, sm->wpa_auth->addr, 5,
+       if (wpa_ft_mic(sm->wpa_key_mgmt, kck, kck_len,
+                      sm->addr, sm->wpa_auth->addr, 5,
                       parse.mdie - 2, parse.mdie_len + 2,
                       parse.ftie - 2, parse.ftie_len + 2,
                       parse.rsn - 2, parse.rsn_len + 2,
index f437def505e331432780d07a44e704f43c3211cd..8c19ace797ecc961e6ab616d1b18ed6789ab9d85 100644 (file)
@@ -882,7 +882,7 @@ int fils_key_auth_sk(const u8 *ick, size_t ick_len, const u8 *snonce,
 
 
 #ifdef CONFIG_IEEE80211R
-int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
+int wpa_ft_mic(int key_mgmt, const u8 *kck, size_t kck_len, const u8 *sta_addr,
               const u8 *ap_addr, u8 transaction_seqnum,
               const u8 *mdie, size_t mdie_len,
               const u8 *ftie, size_t ftie_len,
@@ -894,8 +894,9 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
        const u8 *addr[10];
        size_t len[10];
        size_t i, num_elem = 0;
-       u8 zero_mic[24];
+       u8 zero_mic[32];
        size_t mic_len, fte_fixed_len;
+       int res;
 
        if (kck_len == 16) {
                mic_len = 16;
@@ -903,6 +904,10 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
        } else if (kck_len == 24) {
                mic_len = 24;
 #endif /* CONFIG_SHA384 */
+#ifdef CONFIG_SHA512
+       } else if (kck_len == 32) {
+               mic_len = 32;
+#endif /* CONFIG_SHA512 */
        } else {
                wpa_printf(MSG_WARNING, "FT: Unsupported KCK length %u",
                           (unsigned int) kck_len);
@@ -967,6 +972,17 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
 
        for (i = 0; i < num_elem; i++)
                wpa_hexdump(MSG_MSGDUMP, "FT: MIC data", addr[i], len[i]);
+       res = -1;
+#ifdef CONFIG_SHA512
+       if (kck_len == 32) {
+               u8 hash[SHA512_MAC_LEN];
+
+               if (hmac_sha512_vector(kck, kck_len, num_elem, addr, len, hash))
+                       return -1;
+               os_memcpy(mic, hash, 32);
+               res = 0;
+       }
+#endif /* CONFIG_SHA384 */
 #ifdef CONFIG_SHA384
        if (kck_len == 24) {
                u8 hash[SHA384_MAC_LEN];
@@ -974,13 +990,22 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
                if (hmac_sha384_vector(kck, kck_len, num_elem, addr, len, hash))
                        return -1;
                os_memcpy(mic, hash, 24);
+               res = 0;
        }
 #endif /* CONFIG_SHA384 */
-       if (kck_len == 16 &&
-           omac1_aes_128_vector(kck, num_elem, addr, len, mic))
-               return -1;
+       if (kck_len == 16 && key_mgmt == WPA_KEY_MGMT_FT_SAE_EXT_KEY) {
+               u8 hash[SHA256_MAC_LEN];
 
-       return 0;
+               if (hmac_sha256_vector(kck, kck_len, num_elem, addr, len, hash))
+                       return -1;
+               os_memcpy(mic, hash, 16);
+               res = 0;
+       }
+       if (kck_len == 16 && key_mgmt != WPA_KEY_MGMT_FT_SAE_EXT_KEY &&
+           omac1_aes_128_vector(kck, num_elem, addr, len, mic) == 0)
+               res = 0;
+
+       return res;
 }
 
 
index 4667284a314081c916749b76ed5d5df167bc2443..4af22bf65fd93fdc528216eca82bfda491105ad5 100644 (file)
@@ -463,7 +463,7 @@ int fils_key_auth_sk(const u8 *ick, size_t ick_len, const u8 *snonce,
                     size_t *key_auth_len);
 
 #ifdef CONFIG_IEEE80211R
-int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
+int wpa_ft_mic(int key_mgmt, const u8 *kck, size_t kck_len, const u8 *sta_addr,
               const u8 *ap_addr, u8 transaction_seqnum,
               const u8 *mdie, size_t mdie_len,
               const u8 *ftie, size_t ftie_len,
index c681a99df4a0fa7340b74fe6aede448e2ff622f5..1c27a79bd1632a807c75408c0501dbfd556b8fb1 100644 (file)
@@ -441,7 +441,8 @@ static u8 * wpa_ft_gen_req_ies(struct wpa_sm *sm, size_t *len,
                *elem_count = 3 + ieee802_11_ie_count(ric_ies, ric_ies_len);
                if (rsnxe_len)
                        *elem_count += 1;
-               if (wpa_ft_mic(kck, kck_len, sm->own_addr, target_ap, 5,
+               if (wpa_ft_mic(sm->key_mgmt, kck, kck_len,
+                              sm->own_addr, target_ap, 5,
                               ((u8 *) mdie) - 2, 2 + sizeof(*mdie),
                               ftie_pos, 2 + *ftie_len,
                               (u8 *) rsnie, 2 + rsnie->len, ric_ies,
@@ -1142,7 +1143,7 @@ int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
                kck_len = sm->ptk.kck_len;
        }
 
-       if (wpa_ft_mic(kck, kck_len, sm->own_addr, src_addr, 6,
+       if (wpa_ft_mic(sm->key_mgmt, kck, kck_len, sm->own_addr, src_addr, 6,
                       parse.mdie - 2, parse.mdie_len + 2,
                       parse.ftie - 2, parse.ftie_len + 2,
                       parse.rsn - 2, parse.rsn_len + 2,
index a0751df5b5991a9b20ed455b5dd9c23a920b0323..2a9a03058e5be08df911080870ac2deeef565f06 100644 (file)
@@ -1052,7 +1052,8 @@ static void rx_mgmt_reassoc_req(struct wlantest *wt, const u8 *data,
                        kck = sta->ptk.kck;
                        kck_len = sta->ptk.kck_len;
                }
-               if (wpa_ft_mic(kck, kck_len, sta->addr, bss->bssid, 5,
+               if (wpa_ft_mic(sta->key_mgmt, kck, kck_len,
+                              sta->addr, bss->bssid, 5,
                               parse.mdie - 2, parse.mdie_len + 2,
                               parse.ftie - 2, parse.ftie_len + 2,
                               parse.rsn - 2, parse.rsn_len + 2,
@@ -1556,7 +1557,8 @@ static void rx_mgmt_reassoc_resp(struct wlantest *wt, const u8 *data,
                        kek = sta->ptk.kek;
                        kek_len = sta->ptk.kek_len;
                }
-               if (wpa_ft_mic(kck, kck_len, sta->addr, bss->bssid, 6,
+               if (wpa_ft_mic(sta->key_mgmt, kck, kck_len,
+                              sta->addr, bss->bssid, 6,
                               parse.mdie - 2, parse.mdie_len + 2,
                               parse.ftie - 2, parse.ftie_len + 2,
                               parse.rsn - 2, parse.rsn_len + 2,