|
@@ -254,14 +254,29 @@ static void wpa_supplicant_eapol_cb(struct eapol_sm *eapol, int success,
|
|
|
"handshake");
|
|
|
|
|
|
pmk_len = PMK_LEN;
|
|
|
- res = eapol_sm_get_key(eapol, pmk, PMK_LEN);
|
|
|
- if (res) {
|
|
|
- /*
|
|
|
- * EAP-LEAP is an exception from other EAP methods: it
|
|
|
- * uses only 16-byte PMK.
|
|
|
- */
|
|
|
- res = eapol_sm_get_key(eapol, pmk, 16);
|
|
|
- pmk_len = 16;
|
|
|
+ if (wpa_key_mgmt_ft(wpa_s->key_mgmt)) {
|
|
|
+#ifdef CONFIG_IEEE80211R
|
|
|
+ u8 buf[2 * PMK_LEN];
|
|
|
+ wpa_printf(MSG_DEBUG, "RSN: Use FT XXKey as PMK for "
|
|
|
+ "driver-based 4-way hs and FT");
|
|
|
+ res = eapol_sm_get_key(eapol, buf, 2 * PMK_LEN);
|
|
|
+ if (res == 0) {
|
|
|
+ os_memcpy(pmk, buf + PMK_LEN, PMK_LEN);
|
|
|
+ os_memset(buf, 0, sizeof(buf));
|
|
|
+ }
|
|
|
+#else /* CONFIG_IEEE80211R */
|
|
|
+ res = -1;
|
|
|
+#endif /* CONFIG_IEEE80211R */
|
|
|
+ } else {
|
|
|
+ res = eapol_sm_get_key(eapol, pmk, PMK_LEN);
|
|
|
+ if (res) {
|
|
|
+ /*
|
|
|
+ * EAP-LEAP is an exception from other EAP methods: it
|
|
|
+ * uses only 16-byte PMK.
|
|
|
+ */
|
|
|
+ res = eapol_sm_get_key(eapol, pmk, 16);
|
|
|
+ pmk_len = 16;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (res) {
|
|
@@ -270,6 +285,9 @@ static void wpa_supplicant_eapol_cb(struct eapol_sm *eapol, int success,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ wpa_hexdump_key(MSG_DEBUG, "RSN: Configure PMK for driver-based 4-way "
|
|
|
+ "handshake", pmk, pmk_len);
|
|
|
+
|
|
|
if (wpa_drv_set_key(wpa_s, WPA_ALG_PMK, NULL, 0, 0, NULL, 0, pmk,
|
|
|
pmk_len)) {
|
|
|
wpa_printf(MSG_DEBUG, "Failed to set PMK to the driver");
|