diff --git a/src/common/defs.h b/src/common/defs.h index 8cca094e8f..25defe68e2 100644 --- a/src/common/defs.h +++ b/src/common/defs.h @@ -53,11 +53,14 @@ #define WPA_KEY_MGMT_SAE_EXT_KEY BIT(26) #define WPA_KEY_MGMT_FT_SAE_EXT_KEY BIT(27) #define WPA_KEY_MGMT_IEEE8021X_SHA384 BIT(28) +#define WPA_KEY_MGMT_FT_PSK_SHA384 BIT(29) +#define WPA_KEY_MGMT_PSK_SHA384 BIT(30) #define WPA_KEY_MGMT_FT (WPA_KEY_MGMT_FT_PSK | \ WPA_KEY_MGMT_FT_IEEE8021X | \ WPA_KEY_MGMT_FT_IEEE8021X_SHA384 | \ + WPA_KEY_MGMT_FT_PSK_SHA384 | \ WPA_KEY_MGMT_FT_SAE | \ WPA_KEY_MGMT_FT_SAE_EXT_KEY | \ WPA_KEY_MGMT_FT_FILS_SHA256 | \ @@ -84,7 +87,9 @@ static inline int wpa_key_mgmt_wpa_psk_no_sae(int akm) { return !!(akm & (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK | - WPA_KEY_MGMT_PSK_SHA256)); + WPA_KEY_MGMT_PSK_SHA256 | + WPA_KEY_MGMT_PSK_SHA384 | + WPA_KEY_MGMT_FT_PSK_SHA384)); } static inline int wpa_key_mgmt_wpa_psk(int akm) @@ -92,6 +97,8 @@ static inline int wpa_key_mgmt_wpa_psk(int akm) return !!(akm & (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK | WPA_KEY_MGMT_PSK_SHA256 | + WPA_KEY_MGMT_PSK_SHA384 | + WPA_KEY_MGMT_FT_PSK_SHA384 | WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_SAE_EXT_KEY | WPA_KEY_MGMT_FT_SAE | diff --git a/src/common/wpa_common.c b/src/common/wpa_common.c index eb74c0393f..2e9900a71c 100644 --- a/src/common/wpa_common.c +++ b/src/common/wpa_common.c @@ -1776,6 +1776,8 @@ static int rsn_key_mgmt_to_bitfield(const u8 *s) if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_PSK) return WPA_KEY_MGMT_FT_PSK; #ifdef CONFIG_SHA384 + if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_PSK_SHA384) + return WPA_KEY_MGMT_FT_PSK_SHA384; if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_802_1X_SHA384) return WPA_KEY_MGMT_FT_IEEE8021X_SHA384; #endif /* CONFIG_SHA384 */ @@ -1783,6 +1785,8 @@ static int rsn_key_mgmt_to_bitfield(const u8 *s) #ifdef CONFIG_SHA384 if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA384) return WPA_KEY_MGMT_IEEE8021X_SHA384; + if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_SHA384) + return WPA_KEY_MGMT_PSK_SHA384; #endif /* CONFIG_SHA384 */ if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA256) return WPA_KEY_MGMT_IEEE8021X_SHA256; @@ -2822,6 +2826,8 @@ u32 wpa_akm_to_suite(int akm) return RSN_AUTH_KEY_MGMT_FT_802_1X_SHA384; if (akm & WPA_KEY_MGMT_FT_IEEE8021X) return RSN_AUTH_KEY_MGMT_FT_802_1X; + if (akm & WPA_KEY_MGMT_FT_PSK_SHA384) + return RSN_AUTH_KEY_MGMT_FT_PSK_SHA384; if (akm & WPA_KEY_MGMT_FT_PSK) return RSN_AUTH_KEY_MGMT_FT_PSK; if (akm & WPA_KEY_MGMT_IEEE8021X_SHA384) @@ -2830,6 +2836,8 @@ u32 wpa_akm_to_suite(int akm) return RSN_AUTH_KEY_MGMT_802_1X_SHA256; if (akm & WPA_KEY_MGMT_IEEE8021X) return RSN_AUTH_KEY_MGMT_UNSPEC_802_1X; + if (akm & WPA_KEY_MGMT_PSK_SHA384) + return RSN_AUTH_KEY_MGMT_PSK_SHA384; if (akm & WPA_KEY_MGMT_PSK_SHA256) return RSN_AUTH_KEY_MGMT_PSK_SHA256; if (akm & WPA_KEY_MGMT_PSK) diff --git a/src/rsn_supp/wpa_ie.c b/src/rsn_supp/wpa_ie.c index 515f1b0275..29c64f2df6 100644 --- a/src/rsn_supp/wpa_ie.c +++ b/src/rsn_supp/wpa_ie.c @@ -194,11 +194,19 @@ static int wpa_gen_wpa_ie_rsn(u8 *rsn_ie, size_t rsn_ie_len, #endif /* CONFIG_SHA384 */ } else if (key_mgmt == WPA_KEY_MGMT_FT_PSK) { RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_PSK); +#ifdef CONFIG_SHA384 + } else if (key_mgmt == WPA_KEY_MGMT_FT_PSK_SHA384) { + RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_PSK_SHA384); +#endif /* CONFIG_SHA384 */ #endif /* CONFIG_IEEE80211R */ } else if (key_mgmt == WPA_KEY_MGMT_IEEE8021X_SHA256) { RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SHA256); } else if (key_mgmt == WPA_KEY_MGMT_PSK_SHA256) { RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PSK_SHA256); +#ifdef CONFIG_SHA384 + } else if (key_mgmt == WPA_KEY_MGMT_PSK_SHA384) { + RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_PSK_SHA384); +#endif /* CONFIG_SHA384 */ #ifdef CONFIG_SAE } else if (key_mgmt == WPA_KEY_MGMT_SAE) { RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE); diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index 537ef69ac4..4e635aec20 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -805,6 +805,8 @@ static int wpa_config_parse_key_mgmt(const struct parse_data *data, else if (os_strcmp(start, "FT-EAP") == 0) val |= WPA_KEY_MGMT_FT_IEEE8021X; #ifdef CONFIG_SHA384 + else if (os_strcmp(start, "FT-PSK-SHA384") == 0) + val |= WPA_KEY_MGMT_FT_PSK_SHA384; else if (os_strcmp(start, "FT-EAP-SHA384") == 0) val |= WPA_KEY_MGMT_FT_IEEE8021X_SHA384; #endif /* CONFIG_SHA384 */ @@ -812,6 +814,8 @@ static int wpa_config_parse_key_mgmt(const struct parse_data *data, #ifdef CONFIG_SHA384 else if (os_strcmp(start, "WPA-EAP-SHA384") == 0) val |= WPA_KEY_MGMT_IEEE8021X_SHA384; + else if (os_strcmp(start, "WPA-PSK-SHA384") == 0) + val |= WPA_KEY_MGMT_PSK_SHA384; #endif /* CONFIG_SHA384 */ else if (os_strcmp(start, "WPA-PSK-SHA256") == 0) val |= WPA_KEY_MGMT_PSK_SHA256; @@ -973,6 +977,16 @@ static char * wpa_config_write_key_mgmt(const struct parse_data *data, } #ifdef CONFIG_SHA384 + if (ssid->key_mgmt & WPA_KEY_MGMT_FT_PSK_SHA384) { + ret = os_snprintf(pos, end - pos, "%sFT-PSK-SHA384", + pos == buf ? "" : " "); + if (os_snprintf_error(end - pos, ret)) { + end[-1] = '\0'; + return buf; + } + pos += ret; + } + if (ssid->key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X_SHA384) { ret = os_snprintf(pos, end - pos, "%sFT-EAP-SHA384", pos == buf ? "" : " "); @@ -1007,6 +1021,18 @@ static char * wpa_config_write_key_mgmt(const struct parse_data *data, pos += ret; } +#ifdef CONFIG_SHA384 + if (ssid->key_mgmt & WPA_KEY_MGMT_PSK_SHA384) { + ret = os_snprintf(pos, end - pos, "%sWPA-PSK-SHA384", + pos == buf ? "" : " "); + if (os_snprintf_error(end - pos, ret)) { + end[-1] = '\0'; + return buf; + } + pos += ret; + } +#endif /* CONFIG_SHA384 */ + if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) { ret = os_snprintf(pos, end - pos, "%sWPA-EAP-SHA256", pos == buf ? "" : " ");