SAE: Internal WPA_KEY_MGMT_* defines for extended key AKMs
Define new WPA_KEY_MGMT_* values for the new SAE AKM suite selectors with variable length keys. This includes updates to various mapping and checking of the SAE key_mgmt values. Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
This commit is contained in:
parent
5c8a714b18
commit
91df8c9c65
16 changed files with 147 additions and 12 deletions
|
@ -4686,7 +4686,7 @@ static int check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
|
|||
sta->auth_alg == WLAN_AUTH_OPEN) {
|
||||
struct rsn_pmksa_cache_entry *sa;
|
||||
sa = wpa_auth_sta_get_pmksa(sta->wpa_sm);
|
||||
if (!sa || sa->akmp != WPA_KEY_MGMT_SAE) {
|
||||
if (!sa || !wpa_key_mgmt_sae(sa->akmp)) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"SAE: No PMKSA cache entry found for "
|
||||
MACSTR, MAC2STR(sta->addr));
|
||||
|
|
|
@ -5267,7 +5267,8 @@ int wpa_auth_uses_ft_sae(struct wpa_state_machine *sm)
|
|||
{
|
||||
if (!sm)
|
||||
return 0;
|
||||
return sm->wpa_key_mgmt == WPA_KEY_MGMT_FT_SAE;
|
||||
return sm->wpa_key_mgmt == WPA_KEY_MGMT_FT_SAE ||
|
||||
sm->wpa_key_mgmt == WPA_KEY_MGMT_FT_SAE_EXT_KEY;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -228,11 +228,21 @@ int wpa_write_rsn_ie(struct wpa_auth_config *conf, u8 *buf, size_t len,
|
|||
pos += RSN_SELECTOR_LEN;
|
||||
num_suites++;
|
||||
}
|
||||
if (conf->wpa_key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE_EXT_KEY);
|
||||
pos += RSN_SELECTOR_LEN;
|
||||
num_suites++;
|
||||
}
|
||||
if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_SAE) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE);
|
||||
pos += RSN_SELECTOR_LEN;
|
||||
num_suites++;
|
||||
}
|
||||
if (conf->wpa_key_mgmt & WPA_KEY_MGMT_FT_SAE_EXT_KEY) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY);
|
||||
pos += RSN_SELECTOR_LEN;
|
||||
num_suites++;
|
||||
}
|
||||
#endif /* CONFIG_SAE */
|
||||
if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SUITE_B);
|
||||
|
@ -670,8 +680,12 @@ wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
|
|||
#ifdef CONFIG_SAE
|
||||
else if (data.key_mgmt & WPA_KEY_MGMT_SAE)
|
||||
selector = RSN_AUTH_KEY_MGMT_SAE;
|
||||
else if (data.key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY)
|
||||
selector = RSN_AUTH_KEY_MGMT_SAE_EXT_KEY;
|
||||
else if (data.key_mgmt & WPA_KEY_MGMT_FT_SAE)
|
||||
selector = RSN_AUTH_KEY_MGMT_FT_SAE;
|
||||
else if (data.key_mgmt & WPA_KEY_MGMT_FT_SAE_EXT_KEY)
|
||||
selector = RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY;
|
||||
#endif /* CONFIG_SAE */
|
||||
else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X)
|
||||
selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X;
|
||||
|
@ -778,8 +792,12 @@ wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
|
|||
#ifdef CONFIG_SAE
|
||||
else if (key_mgmt & WPA_KEY_MGMT_SAE)
|
||||
sm->wpa_key_mgmt = WPA_KEY_MGMT_SAE;
|
||||
else if (key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY)
|
||||
sm->wpa_key_mgmt = WPA_KEY_MGMT_SAE_EXT_KEY;
|
||||
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 */
|
||||
else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X)
|
||||
sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X;
|
||||
|
|
|
@ -50,12 +50,15 @@
|
|||
#define WPA_KEY_MGMT_DPP BIT(23)
|
||||
#define WPA_KEY_MGMT_FT_IEEE8021X_SHA384 BIT(24)
|
||||
#define WPA_KEY_MGMT_PASN BIT(25)
|
||||
#define WPA_KEY_MGMT_SAE_EXT_KEY BIT(26)
|
||||
#define WPA_KEY_MGMT_FT_SAE_EXT_KEY BIT(27)
|
||||
|
||||
|
||||
#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_SAE | \
|
||||
WPA_KEY_MGMT_FT_SAE_EXT_KEY | \
|
||||
WPA_KEY_MGMT_FT_FILS_SHA256 | \
|
||||
WPA_KEY_MGMT_FT_FILS_SHA384)
|
||||
|
||||
|
@ -88,7 +91,9 @@ static inline int wpa_key_mgmt_wpa_psk(int akm)
|
|||
WPA_KEY_MGMT_FT_PSK |
|
||||
WPA_KEY_MGMT_PSK_SHA256 |
|
||||
WPA_KEY_MGMT_SAE |
|
||||
WPA_KEY_MGMT_FT_SAE));
|
||||
WPA_KEY_MGMT_SAE_EXT_KEY |
|
||||
WPA_KEY_MGMT_FT_SAE |
|
||||
WPA_KEY_MGMT_FT_SAE_EXT_KEY));
|
||||
}
|
||||
|
||||
static inline int wpa_key_mgmt_ft(int akm)
|
||||
|
@ -111,7 +116,15 @@ static inline int wpa_key_mgmt_ft_psk(int akm)
|
|||
static inline int wpa_key_mgmt_sae(int akm)
|
||||
{
|
||||
return !!(akm & (WPA_KEY_MGMT_SAE |
|
||||
WPA_KEY_MGMT_FT_SAE));
|
||||
WPA_KEY_MGMT_SAE_EXT_KEY |
|
||||
WPA_KEY_MGMT_FT_SAE |
|
||||
WPA_KEY_MGMT_FT_SAE_EXT_KEY));
|
||||
}
|
||||
|
||||
static inline int wpa_key_mgmt_sae_ext_key(int akm)
|
||||
{
|
||||
return !!(akm & (WPA_KEY_MGMT_SAE_EXT_KEY |
|
||||
WPA_KEY_MGMT_FT_SAE_EXT_KEY));
|
||||
}
|
||||
|
||||
static inline int wpa_key_mgmt_fils(int akm)
|
||||
|
|
|
@ -1479,8 +1479,12 @@ static int rsn_key_mgmt_to_bitfield(const u8 *s)
|
|||
#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;
|
||||
|
@ -2379,8 +2383,12 @@ const char * wpa_key_mgmt_txt(int key_mgmt, int proto)
|
|||
return "WPS";
|
||||
case WPA_KEY_MGMT_SAE:
|
||||
return "SAE";
|
||||
case WPA_KEY_MGMT_SAE_EXT_KEY:
|
||||
return "SAE-EXT-KEY";
|
||||
case WPA_KEY_MGMT_FT_SAE:
|
||||
return "FT-SAE";
|
||||
case WPA_KEY_MGMT_FT_SAE_EXT_KEY:
|
||||
return "FT-SAE-EXT-KEY";
|
||||
case WPA_KEY_MGMT_OSEN:
|
||||
return "OSEN";
|
||||
case WPA_KEY_MGMT_IEEE8021X_SUITE_B:
|
||||
|
@ -2441,8 +2449,12 @@ u32 wpa_akm_to_suite(int akm)
|
|||
return RSN_AUTH_KEY_MGMT_FT_FILS_SHA384;
|
||||
if (akm & WPA_KEY_MGMT_SAE)
|
||||
return RSN_AUTH_KEY_MGMT_SAE;
|
||||
if (akm & WPA_KEY_MGMT_SAE_EXT_KEY)
|
||||
return RSN_AUTH_KEY_MGMT_SAE_EXT_KEY;
|
||||
if (akm & WPA_KEY_MGMT_FT_SAE)
|
||||
return RSN_AUTH_KEY_MGMT_FT_SAE;
|
||||
if (akm & WPA_KEY_MGMT_FT_SAE_EXT_KEY)
|
||||
return RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY;
|
||||
if (akm & WPA_KEY_MGMT_OWE)
|
||||
return RSN_AUTH_KEY_MGMT_OWE;
|
||||
if (akm & WPA_KEY_MGMT_DPP)
|
||||
|
@ -3373,6 +3385,9 @@ int wpa_pasn_add_rsne(struct wpabuf *buf, const u8 *pmkid, int akmp, int cipher)
|
|||
case WPA_KEY_MGMT_SAE:
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE);
|
||||
break;
|
||||
case WPA_KEY_MGMT_SAE_EXT_KEY:
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE_EXT_KEY);
|
||||
break;
|
||||
#endif /* CONFIG_SAE */
|
||||
#ifdef CONFIG_FILS
|
||||
case WPA_KEY_MGMT_FILS_SHA256:
|
||||
|
@ -3586,6 +3601,7 @@ int wpa_pasn_validate_rsne(const struct wpa_ie_data *data)
|
|||
switch (data->key_mgmt) {
|
||||
#ifdef CONFIG_SAE
|
||||
case WPA_KEY_MGMT_SAE:
|
||||
case WPA_KEY_MGMT_SAE_EXT_KEY:
|
||||
/* fall through */
|
||||
#endif /* CONFIG_SAE */
|
||||
#ifdef CONFIG_FILS
|
||||
|
|
|
@ -3171,7 +3171,9 @@ static int wpa_key_mgmt_to_suites(unsigned int key_mgmt_suites, u32 suites[],
|
|||
__AKM(IEEE8021X_SHA256, 802_1X_SHA256);
|
||||
__AKM(PSK_SHA256, PSK_SHA256);
|
||||
__AKM(SAE, SAE);
|
||||
__AKM(SAE_EXT_KEY, SAE_EXT_KEY);
|
||||
__AKM(FT_SAE, FT_SAE);
|
||||
__AKM(FT_SAE_EXT_KEY, FT_SAE_EXT_KEY);
|
||||
__AKM(CCKM, CCKM);
|
||||
__AKM(OSEN, OSEN);
|
||||
__AKM(IEEE8021X_SUITE_B, 802_1X_SUITE_B);
|
||||
|
@ -4663,7 +4665,8 @@ static int wpa_driver_nl80211_set_ap(void *priv,
|
|||
if (drv->device_ap_sme) {
|
||||
u32 flags = 0;
|
||||
|
||||
if (params->key_mgmt_suites & WPA_KEY_MGMT_SAE) {
|
||||
if (params->key_mgmt_suites & (WPA_KEY_MGMT_SAE |
|
||||
WPA_KEY_MGMT_SAE_EXT_KEY)) {
|
||||
/* Add the previously used flag attribute to support
|
||||
* older kernel versions and the newer flag bit for
|
||||
* newer kernels. */
|
||||
|
@ -6249,7 +6252,9 @@ static int nl80211_connect_common(struct wpa_driver_nl80211_data *drv,
|
|||
params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_SAE ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_SAE_EXT_KEY ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_FT_SAE ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_FT_SAE_EXT_KEY ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192 ||
|
||||
params->key_mgmt_suite == WPA_KEY_MGMT_FT_IEEE8021X_SHA384 ||
|
||||
|
@ -6286,9 +6291,15 @@ static int nl80211_connect_common(struct wpa_driver_nl80211_data *drv,
|
|||
case WPA_KEY_MGMT_SAE:
|
||||
mgmt = RSN_AUTH_KEY_MGMT_SAE;
|
||||
break;
|
||||
case WPA_KEY_MGMT_SAE_EXT_KEY:
|
||||
mgmt = RSN_AUTH_KEY_MGMT_SAE_EXT_KEY;
|
||||
break;
|
||||
case WPA_KEY_MGMT_FT_SAE:
|
||||
mgmt = RSN_AUTH_KEY_MGMT_FT_SAE;
|
||||
break;
|
||||
case WPA_KEY_MGMT_FT_SAE_EXT_KEY:
|
||||
mgmt = RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY;
|
||||
break;
|
||||
case WPA_KEY_MGMT_IEEE8021X_SUITE_B:
|
||||
mgmt = RSN_AUTH_KEY_MGMT_802_1X_SUITE_B;
|
||||
break;
|
||||
|
|
|
@ -301,7 +301,8 @@ static int wpa_supplicant_get_pmk(struct wpa_sm *sm,
|
|||
#ifdef CONFIG_IEEE80211R
|
||||
sm->xxkey_len = 0;
|
||||
#ifdef CONFIG_SAE
|
||||
if (sm->key_mgmt == WPA_KEY_MGMT_FT_SAE &&
|
||||
if ((sm->key_mgmt == WPA_KEY_MGMT_FT_SAE ||
|
||||
sm->key_mgmt == WPA_KEY_MGMT_FT_SAE_EXT_KEY) &&
|
||||
sm->pmk_len == PMK_LEN) {
|
||||
/* Need to allow FT key derivation to proceed with
|
||||
* PMK from SAE being used as the XXKey in cases where
|
||||
|
|
|
@ -257,6 +257,8 @@ static u8 * wpa_ft_gen_req_ies(struct wpa_sm *sm, size_t *len,
|
|||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_PSK);
|
||||
else if (sm->key_mgmt == WPA_KEY_MGMT_FT_SAE)
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE);
|
||||
else if (sm->key_mgmt == WPA_KEY_MGMT_FT_SAE_EXT_KEY)
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY);
|
||||
#ifdef CONFIG_FILS
|
||||
else if (sm->key_mgmt == WPA_KEY_MGMT_FT_FILS_SHA256)
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_FILS_SHA256);
|
||||
|
|
|
@ -191,8 +191,12 @@ static int wpa_gen_wpa_ie_rsn(u8 *rsn_ie, size_t rsn_ie_len,
|
|||
#ifdef CONFIG_SAE
|
||||
} else if (key_mgmt == WPA_KEY_MGMT_SAE) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE);
|
||||
} else if (key_mgmt == WPA_KEY_MGMT_SAE_EXT_KEY) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_SAE_EXT_KEY);
|
||||
} else if (key_mgmt == WPA_KEY_MGMT_FT_SAE) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE);
|
||||
} else if (key_mgmt == WPA_KEY_MGMT_FT_SAE_EXT_KEY) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY);
|
||||
#endif /* CONFIG_SAE */
|
||||
} else if (key_mgmt == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) {
|
||||
RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue