diff --git a/src/crypto.h b/src/crypto.h index 165b192e..a20b7f7b 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -45,6 +45,10 @@ enum crypto_akm { CRYPTO_AKM_8021X_SUITE_B_SHA256 = 0x000fac0b, CRYPTO_AKM_8021X_SUITE_B_SHA384 = 0x000fac0c, CRYPTO_AKM_FT_OVER_8021X_SHA384 = 0x000fac0d, + CRYPTO_AKM_FILS_SHA256 = 0x000fac0e, + CRYPTO_AKM_FILS_SHA384 = 0x000fac0f, + CRYPTO_AKM_FT_OVER_FILS_SHA256 = 0x000fac10, + CRYPTO_AKM_FT_OVER_FILS_SHA384 = 0x000fac11, CRYPTO_AKM_OWE = 0x000fac12, }; diff --git a/src/ie.c b/src/ie.c index f20e2fce..51b4faf9 100644 --- a/src/ie.c +++ b/src/ie.c @@ -460,6 +460,18 @@ static int ie_parse_akm_suite(const uint8_t *data, case 13: *out = IE_RSN_AKM_SUITE_FT_OVER_8021X_SHA384; return 0; + case 14: + *out = IE_RSN_AKM_SUITE_FILS_SHA256; + return 0; + case 15: + *out = IE_RSN_AKM_SUITE_FILS_SHA384; + return 0; + case 16: + *out = IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256; + return 0; + case 17: + *out = IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384; + return 0; case 18: *out = IE_RSN_AKM_SUITE_OWE; return 0; @@ -803,6 +815,14 @@ static bool ie_build_rsn_akm_suite(uint8_t *data, enum ie_rsn_akm_suite suite) RETURN_AKM(data, ieee_oui, 12); case IE_RSN_AKM_SUITE_FT_OVER_8021X_SHA384: RETURN_AKM(data, ieee_oui, 13); + case IE_RSN_AKM_SUITE_FILS_SHA256: + RETURN_AKM(data, ieee_oui, 14); + case IE_RSN_AKM_SUITE_FILS_SHA384: + RETURN_AKM(data, ieee_oui, 15); + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256: + RETURN_AKM(data, ieee_oui, 16); + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384: + RETURN_AKM(data, ieee_oui, 17); case IE_RSN_AKM_SUITE_OWE: RETURN_AKM(data, ieee_oui, 18); } @@ -892,7 +912,7 @@ bool ie_build_rsne(const struct ie_rsn_info *info, uint8_t *to) count = 0; for (count = 0, akm_suite = IE_RSN_AKM_SUITE_8021X; - akm_suite <= IE_RSN_AKM_SUITE_OWE; + akm_suite <= IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384; akm_suite <<= 1) { if (!(info->akm_suites & akm_suite)) continue; diff --git a/src/ie.h b/src/ie.h index bc14b805..4b35626e 100644 --- a/src/ie.h +++ b/src/ie.h @@ -261,6 +261,10 @@ enum ie_rsn_akm_suite { IE_RSN_AKM_SUITE_8021X_SUITE_B_SHA384 = 0x0800, IE_RSN_AKM_SUITE_FT_OVER_8021X_SHA384 = 0x1000, IE_RSN_AKM_SUITE_OWE = 0x2000, + IE_RSN_AKM_SUITE_FILS_SHA256 = 0x4000, + IE_RSN_AKM_SUITE_FILS_SHA384 = 0x8000, + IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256 = 0x10000, + IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384 = 0x20000, }; #define IE_AKM_IS_SAE(akm) \ @@ -296,7 +300,7 @@ struct ie_tlv_builder { struct ie_rsn_info { enum ie_rsn_cipher_suite group_cipher; uint16_t pairwise_ciphers; - uint16_t akm_suites; + uint32_t akm_suites; bool preauthentication:1; bool no_pairwise:1; uint8_t ptksa_replay_counter:2; diff --git a/src/netdev.c b/src/netdev.c index 75d8f239..ce6f8161 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -1893,6 +1893,14 @@ static unsigned int ie_rsn_akm_suite_to_nl80211(enum ie_rsn_akm_suite akm) return CRYPTO_AKM_8021X_SUITE_B_SHA384; case IE_RSN_AKM_SUITE_FT_OVER_8021X_SHA384: return CRYPTO_AKM_FT_OVER_8021X_SHA384; + case IE_RSN_AKM_SUITE_FILS_SHA256: + return CRYPTO_AKM_FILS_SHA256; + case IE_RSN_AKM_SUITE_FILS_SHA384: + return CRYPTO_AKM_FILS_SHA384; + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA256: + return CRYPTO_AKM_FT_OVER_FILS_SHA256; + case IE_RSN_AKM_SUITE_FT_OVER_FILS_SHA384: + return CRYPTO_AKM_FT_OVER_FILS_SHA384; case IE_RSN_AKM_SUITE_OWE: return CRYPTO_AKM_OWE; }