SAE: Check hmac_sha256() result in sae_token_hash()
In theory, hmac_sha256() might fail, so check for that possibility instead of continuing with undetermined index value that could point to an arbitrary token entry. Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
b0927e5d06
commit
7f1f69e897
1 changed files with 11 additions and 7 deletions
|
@ -639,13 +639,15 @@ static int use_sae_anti_clogging(struct hostapd_data *hapd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static u8 sae_token_hash(struct hostapd_data *hapd, const u8 *addr)
|
static int sae_token_hash(struct hostapd_data *hapd, const u8 *addr, u8 *idx)
|
||||||
{
|
{
|
||||||
u8 hash[SHA256_MAC_LEN];
|
u8 hash[SHA256_MAC_LEN];
|
||||||
|
|
||||||
hmac_sha256(hapd->sae_token_key, sizeof(hapd->sae_token_key),
|
if (hmac_sha256(hapd->sae_token_key, sizeof(hapd->sae_token_key),
|
||||||
addr, ETH_ALEN, hash);
|
addr, ETH_ALEN, hash) < 0)
|
||||||
return hash[0];
|
return -1;
|
||||||
|
*idx = hash[0];
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -658,9 +660,8 @@ static int check_sae_token(struct hostapd_data *hapd, const u8 *addr,
|
||||||
u16 token_idx;
|
u16 token_idx;
|
||||||
u8 idx;
|
u8 idx;
|
||||||
|
|
||||||
if (token_len != SHA256_MAC_LEN)
|
if (token_len != SHA256_MAC_LEN || sae_token_hash(hapd, addr, &idx) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
idx = sae_token_hash(hapd, addr);
|
|
||||||
token_idx = hapd->sae_pending_token_idx[idx];
|
token_idx = hapd->sae_pending_token_idx[idx];
|
||||||
if (token_idx == 0 || token_idx != WPA_GET_BE16(token)) {
|
if (token_idx == 0 || token_idx != WPA_GET_BE16(token)) {
|
||||||
wpa_printf(MSG_DEBUG, "SAE: Invalid anti-clogging token from "
|
wpa_printf(MSG_DEBUG, "SAE: Invalid anti-clogging token from "
|
||||||
|
@ -724,7 +725,10 @@ static struct wpabuf * auth_build_token_req(struct hostapd_data *hapd,
|
||||||
wpabuf_put_u8(buf, WLAN_EID_EXT_ANTI_CLOGGING_TOKEN);
|
wpabuf_put_u8(buf, WLAN_EID_EXT_ANTI_CLOGGING_TOKEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
p_idx = sae_token_hash(hapd, addr);
|
if (sae_token_hash(hapd, addr, &p_idx) < 0) {
|
||||||
|
wpabuf_free(buf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
token_idx = hapd->sae_pending_token_idx[p_idx];
|
token_idx = hapd->sae_pending_token_idx[p_idx];
|
||||||
if (!token_idx) {
|
if (!token_idx) {
|
||||||
hapd->sae_token_idx++;
|
hapd->sae_token_idx++;
|
||||||
|
|
Loading…
Reference in a new issue