From 0bdd3f507d5dc92e42c72df7f4b79ffdab514fe1 Mon Sep 17 00:00:00 2001 From: Chung-Hsien Hsu Date: Tue, 10 Dec 2019 14:02:39 -0600 Subject: [PATCH 08/60] nl80211: Support 4-way handshake offload for WPA/WPA2-PSK in AP mode If driver advertises support for WPA/WPA2-PSK 4-way handshake offload in AP mode, set WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK flag and pass PSK in NL80211_CMD_NEW_BEACON command. Upstream-Status: Inappropriate [DEY specific] Signed-off-by: Chung-Hsien Hsu --- src/drivers/driver.h | 30 +++++++++++++++++++++++++++--- src/drivers/driver_nl80211.c | 8 ++++++++ src/drivers/driver_nl80211_capa.c | 4 ++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 7cfa92ed8..a42ec5e1f 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -1590,6 +1590,27 @@ struct wpa_driver_ap_params { * Unsolicited broadcast Probe Response template length */ size_t unsol_bcast_probe_resp_tmpl_len; + + /** + * passphrase - RSN passphrase for PSK + * + * This value is made available only for WPA/WPA2-Personal (PSK) and + * only for drivers that set WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK. + * This is the 8..63 character ASCII passphrase, if available. Please + * note that this can be %NULL if passphrase was not used to generate + * the PSK. In that case, the psk field must be used to fetch the PSK. + */ + const char *passphrase; + + /** + * psk - RSN PSK (alternative for passphrase for PSK) + * + * This value is made available only for WPA/WPA2-Personal (PSK) and + * only for drivers that set WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK. + * This is the 32-octet (256-bit) PSK, if available. The driver wrapper + * should be prepared to handle %NULL value as an error. + */ + const u8 *psk; }; struct wpa_driver_mesh_bss_params { @@ -1872,8 +1893,9 @@ struct wpa_driver_capa { #define WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC 0x00000002 /** Driver takes care of all DFS operations */ #define WPA_DRIVER_FLAGS_DFS_OFFLOAD 0x00000004 -/** Driver takes care of RSN 4-way handshake internally; PMK is configured with - * struct wpa_driver_ops::set_key using key_flag = KEY_FLAG_PMK */ +/** Driver takes care of RSN 4-way handshake internally in station mode; PMK is + * configured with struct wpa_driver_ops::set_key using key_flag = KEY_FLAG_PMK + */ #define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X 0x00000008 /** Driver is for a wired Ethernet interface */ #define WPA_DRIVER_FLAGS_WIRED 0x00000010 @@ -1998,7 +2020,7 @@ struct wpa_driver_capa { #define WPA_DRIVER_FLAGS_SELF_MANAGED_REGULATORY 0x0080000000000000ULL /** Driver supports FTM responder functionality */ #define WPA_DRIVER_FLAGS_FTM_RESPONDER 0x0100000000000000ULL -/** Driver support 4-way handshake offload for WPA-Personal */ +/** Driver supports 4-way handshake offload for WPA-Personal in station mode */ #define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK 0x0200000000000000ULL /** Driver supports a separate control port TX for EAPOL frames */ #define WPA_DRIVER_FLAGS_CONTROL_PORT 0x0400000000000000ULL @@ -2037,6 +2059,8 @@ struct wpa_driver_capa { #define WPA_DRIVER_FLAGS2_AP_SME 0x0000000000000100ULL /** Driver supports SAE authentication offload */ #define WPA_DRIVER_FLAGS2_SAE_OFFLOAD 0x0000000000000200ULL +/** Driver supports 4-way handshake offload for WPA-Personal in AP mode */ +#define WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK 0x0000000000000400ULL u64 flags2; #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \ diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 91e8d44d8..f228a0715 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -4677,6 +4677,14 @@ static int wpa_driver_nl80211_set_ap(void *priv, nla_put_u32(msg, NL80211_ATTR_CIPHER_SUITE_GROUP, suite)) goto fail; + /* Add PSK in case of 4-way handshake offload */ + if (params->psk && + (drv->capa.flags2 & WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK)) { + wpa_hexdump_key(MSG_DEBUG, "nl80211: PSK", params->psk, 32); + if (nla_put(msg, NL80211_ATTR_PMK, 32, params->psk)) + goto fail; + } + if (params->beacon_ies) { wpa_hexdump_buf(MSG_DEBUG, "nl80211: beacon_ies", params->beacon_ies); diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c index a443b7c87..dc4988c7c 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -594,6 +594,10 @@ static void wiphy_info_ext_feature_flags(struct wiphy_info_data *info, NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) capa->flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X; + if (ext_feature_isset(ext_features, len, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK)) + capa->flags2 |= WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK; + if (ext_feature_isset(ext_features, len, NL80211_EXT_FEATURE_SAE_OFFLOAD)) capa->flags2 |= WPA_DRIVER_FLAGS2_SAE_OFFLOAD; -- 2.17.1