]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
FILS: Set EAPOL-Key Key Info MIC=0 when using AEAD cipher (supplicant)
authorJouni Malinen <jouni@qca.qualcomm.com>
Wed, 2 Sep 2015 21:29:54 +0000 (00:29 +0300)
committerJouni Malinen <j@w1.fi>
Mon, 10 Oct 2016 18:11:46 +0000 (21:11 +0300)
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/rsn_supp/wpa.c

index 498108f9d8b00b687a5d5a0119e2b887f0083700..7be2ec6187af3d9c210026f79dcb7506d9755f13 100644 (file)
@@ -129,7 +129,9 @@ void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise)
                EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
        key_info = WPA_KEY_INFO_REQUEST | ver;
        if (sm->ptk_set)
-               key_info |= WPA_KEY_INFO_MIC | WPA_KEY_INFO_SECURE;
+               key_info |= WPA_KEY_INFO_SECURE;
+       if (sm->ptk_set && mic_len)
+               key_info |= WPA_KEY_INFO_MIC;
        if (error)
                key_info |= WPA_KEY_INFO_ERROR;
        if (pairwise)
@@ -339,6 +341,7 @@ int wpa_supplicant_send_2_of_4(struct wpa_sm *sm, const unsigned char *dst,
        struct wpa_eapol_key *reply;
        u8 *rbuf, *key_mic;
        u8 *rsn_ie_buf = NULL;
+       u16 key_info;
 
        if (wpa_ie == NULL) {
                wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, "WPA: No wpa_ie set - "
@@ -391,8 +394,10 @@ int wpa_supplicant_send_2_of_4(struct wpa_sm *sm, const unsigned char *dst,
        reply->type = (sm->proto == WPA_PROTO_RSN ||
                       sm->proto == WPA_PROTO_OSEN) ?
                EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
-       WPA_PUT_BE16(reply->key_info,
-                    ver | WPA_KEY_INFO_KEY_TYPE | WPA_KEY_INFO_MIC);
+       key_info = ver | WPA_KEY_INFO_KEY_TYPE;
+       if (mic_len)
+               key_info |= WPA_KEY_INFO_MIC;
+       WPA_PUT_BE16(reply->key_info, key_info);
        if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN)
                WPA_PUT_BE16(reply->key_length, 0);
        else
@@ -1149,7 +1154,9 @@ int wpa_supplicant_send_4_of_4(struct wpa_sm *sm, const unsigned char *dst,
                       sm->proto == WPA_PROTO_OSEN) ?
                EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
        key_info &= WPA_KEY_INFO_SECURE;
-       key_info |= ver | WPA_KEY_INFO_KEY_TYPE | WPA_KEY_INFO_MIC;
+       key_info |= ver | WPA_KEY_INFO_KEY_TYPE;
+       if (mic_len)
+               key_info |= WPA_KEY_INFO_MIC;
        WPA_PUT_BE16(reply->key_info, key_info);
        if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN)
                WPA_PUT_BE16(reply->key_length, 0);
@@ -1453,7 +1460,9 @@ static int wpa_supplicant_send_2_of_2(struct wpa_sm *sm,
                       sm->proto == WPA_PROTO_OSEN) ?
                EAPOL_KEY_TYPE_RSN : EAPOL_KEY_TYPE_WPA;
        key_info &= WPA_KEY_INFO_KEY_INDEX_MASK;
-       key_info |= ver | WPA_KEY_INFO_MIC | WPA_KEY_INFO_SECURE;
+       key_info |= ver | WPA_KEY_INFO_SECURE;
+       if (mic_len)
+               key_info |= WPA_KEY_INFO_MIC;
        WPA_PUT_BE16(reply->key_info, key_info);
        if (sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN)
                WPA_PUT_BE16(reply->key_length, 0);