]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
SAE: Use PMK in 4-way handshake
authorJouni Malinen <j@w1.fi>
Sun, 30 Dec 2012 20:35:59 +0000 (22:35 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 12 Jan 2013 15:51:52 +0000 (17:51 +0200)
Use the PMK that is derived as part of the SAE authentication in the
4-way handshake instead of the PSK.

Signed-hostap: Jouni Malinen <j@w1.fi>

src/ap/wpa_auth_glue.c
wpa_supplicant/sme.c

index 76c61ea18e06b44ed9d7ee8e69b24566819cc606..fdaaaff5a3f09e266db645b57903901678eb7695 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * hostapd / WPA authenticator glue code
- * Copyright (c) 2002-2011, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2012, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -10,6 +10,7 @@
 
 #include "utils/common.h"
 #include "common/ieee802_11_defs.h"
+#include "common/sae.h"
 #include "eapol_auth/eapol_auth_sm.h"
 #include "eapol_auth/eapol_auth_sm_i.h"
 #include "eap_server/eap.h"
@@ -184,7 +185,17 @@ static const u8 * hostapd_wpa_auth_get_psk(void *ctx, const u8 *addr,
 {
        struct hostapd_data *hapd = ctx;
        struct sta_info *sta = ap_get_sta(hapd, addr);
-       const u8 *psk = hostapd_get_psk(hapd->conf, addr, prev_psk);
+       const u8 *psk;
+
+#ifdef CONFIG_SAE
+       if (sta && sta->auth_alg == WLAN_AUTH_SAE) {
+               if (!sta->sae || prev_psk)
+                       return NULL;
+               return sta->sae->pmk;
+       }
+#endif /* CONFIG_SAE */
+
+       psk = hostapd_get_psk(hapd->conf, addr, prev_psk);
        /*
         * This is about to iterate over all psks, prev_psk gives the last
         * returned psk which should not be returned again.
index 870313dae553a108d557af285e640145ef890da2..043a0a77345144e4637bf290d6e3f0ff33b979f8 100644 (file)
@@ -488,6 +488,10 @@ void sme_event_auth(struct wpa_supplicant *wpa_s, union wpa_event_data *data)
                }
                if (res != 1)
                        return;
+
+               wpa_printf(MSG_DEBUG, "SME: SAE completed - setting PMK for "
+                          "4-way handshake");
+               wpa_sm_set_pmk(wpa_s->wpa, wpa_s->sme.sae.pmk, PMK_LEN);
        }
 #endif /* CONFIG_SAE */