[PATCH 1/5] FT: Accept RSN Override AKM suites in FT authentication

Gopi Raga ragagopi7 at gmail.com
Thu Jul 16 05:11:11 PDT 2026


In WPA3-Personal Compatibility Mode (RSN Overriding, WPA3 specification
v3.4+), the SAE and FT-SAE AKM suites are advertised only in the RSNE
Override / RSNE Override 2 elements, while the base RSNE carries a
reduced, legacy-compatible suite (e.g., PSK/FT-PSK). A roaming STA that
selected FT-SAE via the override element signals FT-SAE in the RSNE of
its FT authentication request.

wpa_ft_set_key_mgmt() validated the requested AKM (and pairwise cipher)
against the base configuration only (conf->wpa_key_mgmt and
conf->rsn_pairwise), so FT-SAE was rejected with "FT: Invalid key mgmt"
and the FT authentication response carried status
UNSPECIFIED_FAILURE. In addition, the AKM-to-key_mgmt mapping had no
FT-SAE / FT-SAE-EXT-KEY branch.

Validate the requested AKM and pairwise cipher against the union of the
base and RSN Override suites, and add the missing FT-SAE / FT-SAE-EXT-KEY
mappings, mirroring the (Re)Association handling in
wpa_validate_wpa_ie(). This allows 802.11r Fast BSS Transition to work
for SAE clients in Compatibility Mode.

Signed-off-by: Gopi Raga <ragagopi7 at gmail.com>
---
 src/ap/wpa_auth_ft.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/ap/wpa_auth_ft.c b/src/ap/wpa_auth_ft.c
index 76b14ddd3..6be65d2bc 100644
--- a/src/ap/wpa_auth_ft.c
+++ b/src/ap/wpa_auth_ft.c
@@ -3016,11 +3016,20 @@ static int wpa_ft_set_key_mgmt(struct wpa_state_machine *sm,
 			       struct wpa_ft_ies *parse)
 {
 	int key_mgmt, ciphers;
+	struct wpa_auth_config *conf = &sm->wpa_auth->conf;
 
 	if (sm->wpa_key_mgmt)
 		return 0;
 
-	key_mgmt = parse->key_mgmt & sm->wpa_auth->conf.wpa_key_mgmt;
+	/* In WPA3-Personal Compatibility Mode (RSN Overriding), the SAE and
+	 * FT-SAE AKMs are advertised only in the RSNE Override element(s), not
+	 * in the base RSNE. A STA that selected such an AKM signals it in the
+	 * FT authentication RSNE, so validate the requested AKM against the RSN
+	 * Override key_mgmt suites in addition to the base configuration
+	 * (matching wpa_validate_wpa_ie() for (Re)Association). */
+	key_mgmt = parse->key_mgmt & (conf->wpa_key_mgmt |
+				      conf->rsn_override_key_mgmt |
+				      conf->rsn_override_key_mgmt_2);
 	if (!key_mgmt) {
 		wpa_printf(MSG_DEBUG, "FT: Invalid key mgmt (0x%x) from "
 			   MACSTR, parse->key_mgmt, MAC2STR(sm->addr));
@@ -3034,13 +3043,21 @@ static int wpa_ft_set_key_mgmt(struct wpa_state_machine *sm,
 #endif /* CONFIG_SHA384 */
 	else if (key_mgmt & WPA_KEY_MGMT_FT_PSK)
 		sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_PSK;
+#ifdef CONFIG_SAE
+	else if (key_mgmt & WPA_KEY_MGMT_FT_SAE)
+		sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_SAE;
+	else if (key_mgmt & WPA_KEY_MGMT_FT_SAE_EXT_KEY)
+		sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_SAE_EXT_KEY;
+#endif /* CONFIG_SAE */
 #ifdef CONFIG_FILS
 	else if (key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA256)
 		sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA256;
 	else if (key_mgmt & WPA_KEY_MGMT_FT_FILS_SHA384)
 		sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA384;
 #endif /* CONFIG_FILS */
-	ciphers = parse->pairwise_cipher & sm->wpa_auth->conf.rsn_pairwise;
+	ciphers = parse->pairwise_cipher & (conf->rsn_pairwise |
+					    conf->rsn_override_pairwise |
+					    conf->rsn_override_pairwise_2);
 	if (!ciphers) {
 		wpa_printf(MSG_DEBUG, "FT: Invalid pairwise cipher (0x%x) from "
 			   MACSTR,
-- 
2.43.0




More information about the Hostap mailing list