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:
parent
4f7d7684a3
commit
00cbd171f1
20
src/fils.c
20
src/fils.c
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user