From: Peddolla Harshavardhan Reddy Date: Sat, 14 Jun 2025 05:58:53 +0000 (+0530) Subject: Make cipher/AKM conversion helpers more reusable X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=705829bbeaf4ed3b5161649f2295e5bac9220a49;p=thirdparty%2Fhostap.git Make cipher/AKM conversion helpers more reusable These helper functions for converting between cipher/AKM suites and internal bitmaps should not be limited to cases where a pointer to a buffer containing the suite selector is used. Split them into separate functions that enable more convenient reuse in other places. Signed-off-by: Peddolla Harshavardhan Reddy --- diff --git a/src/common/wpa_common.c b/src/common/wpa_common.c index b01706573..39da3ea70 100644 --- a/src/common/wpa_common.c +++ b/src/common/wpa_common.c @@ -127,6 +127,102 @@ unsigned int wpa_mic_len(int akmp, size_t pmk_len) } +int rsn_cipher_suite_to_wpa_cipher(u32 cipher) +{ + switch (cipher) { + case RSN_CIPHER_SUITE_NONE: + return WPA_CIPHER_NONE; + case RSN_CIPHER_SUITE_TKIP: + return WPA_CIPHER_TKIP; + case RSN_CIPHER_SUITE_CCMP: + return WPA_CIPHER_CCMP; + case RSN_CIPHER_SUITE_AES_128_CMAC: + return WPA_CIPHER_AES_128_CMAC; + case RSN_CIPHER_SUITE_GCMP: + return WPA_CIPHER_GCMP; + case RSN_CIPHER_SUITE_CCMP_256: + return WPA_CIPHER_CCMP_256; + case RSN_CIPHER_SUITE_GCMP_256: + return WPA_CIPHER_GCMP_256; + case RSN_CIPHER_SUITE_BIP_GMAC_128: + return WPA_CIPHER_BIP_GMAC_128; + case RSN_CIPHER_SUITE_BIP_GMAC_256: + return WPA_CIPHER_BIP_GMAC_256; + case RSN_CIPHER_SUITE_BIP_CMAC_256: + return WPA_CIPHER_BIP_CMAC_256; + case RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED: + return WPA_CIPHER_GTK_NOT_USED; + default: + return 0; + } +} + + +int rsn_key_mgmt_to_wpa_akm(u32 akm_suite) +{ + switch (akm_suite) { + case RSN_AUTH_KEY_MGMT_UNSPEC_802_1X: + return WPA_KEY_MGMT_IEEE8021X; + case RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X: + return WPA_KEY_MGMT_PSK; +#ifdef CONFIG_IEEE80211R + case RSN_AUTH_KEY_MGMT_FT_802_1X: + return WPA_KEY_MGMT_FT_IEEE8021X; + case RSN_AUTH_KEY_MGMT_FT_PSK: + return WPA_KEY_MGMT_FT_PSK; +#ifdef CONFIG_SHA384 + case RSN_AUTH_KEY_MGMT_FT_802_1X_SHA384: + return WPA_KEY_MGMT_FT_IEEE8021X_SHA384; +#endif /* CONFIG_SHA384 */ +#endif /* CONFIG_IEEE80211R */ +#ifdef CONFIG_SHA384 + case RSN_AUTH_KEY_MGMT_802_1X_SHA384: + return WPA_KEY_MGMT_IEEE8021X_SHA384; +#endif /* CONFIG_SHA384 */ + case RSN_AUTH_KEY_MGMT_802_1X_SHA256: + return WPA_KEY_MGMT_IEEE8021X_SHA256; + case RSN_AUTH_KEY_MGMT_PSK_SHA256: + return WPA_KEY_MGMT_PSK_SHA256; +#ifdef CONFIG_SAE + case RSN_AUTH_KEY_MGMT_SAE: + return WPA_KEY_MGMT_SAE; + case RSN_AUTH_KEY_MGMT_SAE_EXT_KEY: + return WPA_KEY_MGMT_SAE_EXT_KEY; + case RSN_AUTH_KEY_MGMT_FT_SAE: + return WPA_KEY_MGMT_FT_SAE; + case RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY: + return WPA_KEY_MGMT_FT_SAE_EXT_KEY; +#endif /* CONFIG_SAE */ + case RSN_AUTH_KEY_MGMT_802_1X_SUITE_B: + return WPA_KEY_MGMT_IEEE8021X_SUITE_B; + case RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192: + return WPA_KEY_MGMT_IEEE8021X_SUITE_B_192; + case RSN_AUTH_KEY_MGMT_FILS_SHA256: + return WPA_KEY_MGMT_FILS_SHA256; + case RSN_AUTH_KEY_MGMT_FILS_SHA384: + return WPA_KEY_MGMT_FILS_SHA384; + case RSN_AUTH_KEY_MGMT_FT_FILS_SHA256: + return WPA_KEY_MGMT_FT_FILS_SHA256; + case RSN_AUTH_KEY_MGMT_FT_FILS_SHA384: + return WPA_KEY_MGMT_FT_FILS_SHA384; +#ifdef CONFIG_OWE + case RSN_AUTH_KEY_MGMT_OWE: + return WPA_KEY_MGMT_OWE; +#endif /* CONFIG_OWE */ +#ifdef CONFIG_DPP + case RSN_AUTH_KEY_MGMT_DPP: + return WPA_KEY_MGMT_DPP; +#endif /* CONFIG_DPP */ +#ifdef CONFIG_PASN + case RSN_AUTH_KEY_MGMT_PASN: + return WPA_KEY_MGMT_PASN; +#endif /* CONFIG_PASN */ + default: + return 0; + } +} + + /** * wpa_use_akm_defined - Is AKM-defined Key Descriptor Version used * @akmp: WPA_KEY_MGMT_* used in key derivation @@ -1743,91 +1839,13 @@ int pasn_auth_frame_hash(int akmp, int cipher, const u8 *data, size_t len, static int rsn_selector_to_bitfield(const u8 *s) { - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NONE) - return WPA_CIPHER_NONE; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_TKIP) - return WPA_CIPHER_TKIP; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP) - return WPA_CIPHER_CCMP; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_AES_128_CMAC) - return WPA_CIPHER_AES_128_CMAC; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_GCMP) - return WPA_CIPHER_GCMP; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP_256) - return WPA_CIPHER_CCMP_256; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_GCMP_256) - return WPA_CIPHER_GCMP_256; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_GMAC_128) - return WPA_CIPHER_BIP_GMAC_128; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_GMAC_256) - return WPA_CIPHER_BIP_GMAC_256; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_CMAC_256) - return WPA_CIPHER_BIP_CMAC_256; - if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED) - return WPA_CIPHER_GTK_NOT_USED; - return 0; + return rsn_cipher_suite_to_wpa_cipher(RSN_SELECTOR_GET(s)); } static int rsn_key_mgmt_to_bitfield(const u8 *s) { - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_UNSPEC_802_1X) - return WPA_KEY_MGMT_IEEE8021X; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X) - return WPA_KEY_MGMT_PSK; -#ifdef CONFIG_IEEE80211R - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_802_1X) - return WPA_KEY_MGMT_FT_IEEE8021X; - 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_802_1X_SHA384) - return WPA_KEY_MGMT_FT_IEEE8021X_SHA384; -#endif /* CONFIG_SHA384 */ -#endif /* CONFIG_IEEE80211R */ -#ifdef CONFIG_SHA384 - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA384) - return WPA_KEY_MGMT_IEEE8021X_SHA384; -#endif /* CONFIG_SHA384 */ - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA256) - return WPA_KEY_MGMT_IEEE8021X_SHA256; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_SHA256) - return WPA_KEY_MGMT_PSK_SHA256; -#ifdef CONFIG_SAE - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_SAE) - return WPA_KEY_MGMT_SAE; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_SAE_EXT_KEY) - return WPA_KEY_MGMT_SAE_EXT_KEY; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_SAE) - return WPA_KEY_MGMT_FT_SAE; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY) - return WPA_KEY_MGMT_FT_SAE_EXT_KEY; -#endif /* CONFIG_SAE */ - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SUITE_B) - return WPA_KEY_MGMT_IEEE8021X_SUITE_B; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192) - return WPA_KEY_MGMT_IEEE8021X_SUITE_B_192; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FILS_SHA256) - return WPA_KEY_MGMT_FILS_SHA256; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FILS_SHA384) - return WPA_KEY_MGMT_FILS_SHA384; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_FILS_SHA256) - return WPA_KEY_MGMT_FT_FILS_SHA256; - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_FILS_SHA384) - return WPA_KEY_MGMT_FT_FILS_SHA384; -#ifdef CONFIG_OWE - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_OWE) - return WPA_KEY_MGMT_OWE; -#endif /* CONFIG_OWE */ -#ifdef CONFIG_DPP - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_DPP) - return WPA_KEY_MGMT_DPP; -#endif /* CONFIG_DPP */ -#ifdef CONFIG_PASN - if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PASN) - return WPA_KEY_MGMT_PASN; -#endif /* CONFIG_PASN */ - return 0; + return rsn_key_mgmt_to_wpa_akm(RSN_SELECTOR_GET(s)); } diff --git a/src/common/wpa_common.h b/src/common/wpa_common.h index 5b9773e33..eb75650ee 100644 --- a/src/common/wpa_common.h +++ b/src/common/wpa_common.h @@ -811,4 +811,7 @@ int wpa_pasn_add_extra_ies(struct wpabuf *buf, const u8 *extra_ies, size_t len); void rsn_set_snonce_cookie(u8 *snonce); bool rsn_is_snonce_cookie(const u8 *snonce); +int rsn_cipher_suite_to_wpa_cipher(u32 cipher); +int rsn_key_mgmt_to_wpa_akm(u32 akm_suite); + #endif /* WPA_COMMON_H */