3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-11-22 14:49:24 +01:00

fils: add support for PMKID derivation

FILS defines its own derivation for the PMKID, which is just a
SHA256 or SHA384 hash of the ERP data. Setting the PMKID will
allow FILS PTK rekeys.
This commit is contained in:
James Prestwood 2019-04-25 12:52:55 -07:00 committed by Denis Kenzior
parent 4f7d7684a3
commit 00cbd171f1

View File

@ -57,6 +57,7 @@ struct fils_sm {
size_t kek_len; size_t kek_len;
uint8_t pmk[48]; uint8_t pmk[48];
size_t pmk_len; size_t pmk_len;
uint8_t pmkid[16];
bool in_auth : 1; bool in_auth : 1;
}; };
@ -66,6 +67,21 @@ static void fils_failed(struct fils_sm *fils, uint16_t status, bool ap_reject)
fils->complete(status, fils->in_auth, ap_reject, fils->user_data); fils->complete(status, fils->in_auth, ap_reject, fils->user_data);
} }
static void fils_derive_pmkid(struct fils_sm *fils, const uint8_t *erp_data,
size_t len)
{
struct l_checksum *sha;
enum l_checksum_type type;
type = (fils->hs->akm_suite == IE_RSN_AKM_SUITE_FILS_SHA256) ?
L_CHECKSUM_SHA256 : L_CHECKSUM_SHA384;
sha = l_checksum_new(type);
l_checksum_update(sha, erp_data, len);
l_checksum_get_digest(sha, fils->pmkid, sizeof(fils->pmkid));
l_checksum_free(sha);
}
static void fils_erp_tx_func(const uint8_t *eap_data, size_t len, static void fils_erp_tx_func(const uint8_t *eap_data, size_t len,
void *user_data) void *user_data)
{ {
@ -78,6 +94,8 @@ static void fils_erp_tx_func(const uint8_t *eap_data, size_t len,
l_getrandom(fils->nonce, 16); l_getrandom(fils->nonce, 16);
l_getrandom(fils->session, 8); l_getrandom(fils->session, 8);
fils_derive_pmkid(fils, eap_data, len);
/* transaction */ /* transaction */
l_put_le16(1, ptr); l_put_le16(1, ptr);
ptr += 2; ptr += 2;
@ -254,6 +272,7 @@ void fils_sm_free(struct fils_sm *fils)
explicit_bzero(fils->ick, sizeof(fils->ick)); explicit_bzero(fils->ick, sizeof(fils->ick));
explicit_bzero(fils->kek_and_tk, sizeof(fils->kek_and_tk)); explicit_bzero(fils->kek_and_tk, sizeof(fils->kek_and_tk));
explicit_bzero(fils->pmk, fils->pmk_len); explicit_bzero(fils->pmk, fils->pmk_len);
explicit_bzero(fils->pmkid, sizeof(fils->pmkid));
l_free(fils); l_free(fils);
} }
@ -453,6 +472,7 @@ void fils_rx_associate(struct fils_sm *fils, const uint8_t *frame, size_t len)
} }
handshake_state_set_pmk(fils->hs, fils->pmk, fils->pmk_len); handshake_state_set_pmk(fils->hs, fils->pmk, fils->pmk_len);
handshake_state_set_pmkid(fils->hs, fils->pmkid);
if (gtk) if (gtk)
handshake_state_install_gtk(fils->hs, gtk_key_index, gtk, handshake_state_install_gtk(fils->hs, gtk_key_index, gtk,