diff options
author | Jouni Malinen <jouni@qca.qualcomm.com> | 2015-09-08 17:58:53 (GMT) |
---|---|---|
committer | Jouni Malinen <j@w1.fi> | 2016-10-25 17:01:06 (GMT) |
commit | 86cd6928e022794c5d352f6ae6fa1caf0726b869 (patch) | |
tree | 7161e6978ba4518d530ca256da22f2e6df8c2bdc /wpa_supplicant | |
parent | ac56c39532c0d6be5bea618818675ed549cd50bc (diff) | |
download | hostap-86cd6928e022794c5d352f6ae6fa1caf0726b869.zip hostap-86cd6928e022794c5d352f6ae6fa1caf0726b869.tar.gz hostap-86cd6928e022794c5d352f6ae6fa1caf0726b869.tar.bz2 |
FILS: Add elements to FILS Association Request frame
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Diffstat (limited to 'wpa_supplicant')
-rw-r--r-- | wpa_supplicant/sme.c | 34 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant_i.h | 2 |
2 files changed, 35 insertions, 1 deletions
diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index 4e004e9..ab71f6d 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -986,6 +986,9 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode, { struct wpa_driver_associate_params params; struct ieee802_11_elems elems; +#ifdef CONFIG_FILS + u8 nonces[2 * FILS_NONCE_LEN]; +#endif /* CONFIG_FILS */ #ifdef CONFIG_HT_OVERRIDES struct ieee80211_ht_capabilities htcaps; struct ieee80211_ht_capabilities htcaps_mask; @@ -996,6 +999,37 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode, #endif /* CONFIG_VHT_OVERRIDES */ os_memset(¶ms, 0, sizeof(params)); + +#ifdef CONFIG_FILS + if (auth_type == WLAN_AUTH_FILS_SK) { + struct wpabuf *buf; + const u8 *snonce, *anonce; + + buf = fils_build_assoc_req(wpa_s->wpa, ¶ms.fils_kek, + ¶ms.fils_kek_len, &snonce, + &anonce); + if (!buf) + return; + /* TODO: Make wpa_s->sme.assoc_req_ie use dynamic allocation */ + if (wpa_s->sme.assoc_req_ie_len + wpabuf_len(buf) > + sizeof(wpa_s->sme.assoc_req_ie)) { + wpa_printf(MSG_ERROR, + "FILS: Not enough buffer room for own AssocReq elements"); + wpabuf_free(buf); + return; + } + os_memcpy(wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len, + wpabuf_head(buf), wpabuf_len(buf)); + wpa_s->sme.assoc_req_ie_len += wpabuf_len(buf); + wpabuf_free(buf); + + os_memcpy(nonces, snonce, FILS_NONCE_LEN); + os_memcpy(nonces + FILS_NONCE_LEN, anonce, FILS_NONCE_LEN); + params.fils_nonces = nonces; + params.fils_nonces_len = sizeof(nonces); + } +#endif /* CONFIG_FILS */ + params.bssid = bssid; params.ssid = wpa_s->sme.ssid; params.ssid_len = wpa_s->sme.ssid_len; diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index ef9273d..d6ff6de 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -721,7 +721,7 @@ struct wpa_supplicant { u8 ssid[SSID_MAX_LEN]; size_t ssid_len; int freq; - u8 assoc_req_ie[200]; + u8 assoc_req_ie[300]; size_t assoc_req_ie_len; int mfp; int ft_used; |