eapol: Add functions to set own/ap WPA IEs
If EAPoL is being run for in WPA mode, then instead of RSN elements, the WPA elements are required.
This commit is contained in:
parent
c9f1090380
commit
bc98bc9ecb
55
src/eapol.c
55
src/eapol.c
|
@ -434,8 +434,8 @@ struct eapol_sm {
|
||||||
uint32_t ifindex;
|
uint32_t ifindex;
|
||||||
uint8_t spa[6];
|
uint8_t spa[6];
|
||||||
uint8_t aa[6];
|
uint8_t aa[6];
|
||||||
uint8_t *ap_rsn;
|
uint8_t *ap_ie;
|
||||||
uint8_t *own_rsn;
|
uint8_t *own_ie;
|
||||||
uint8_t pmk[32];
|
uint8_t pmk[32];
|
||||||
uint64_t replay_counter;
|
uint64_t replay_counter;
|
||||||
uint8_t snonce[32];
|
uint8_t snonce[32];
|
||||||
|
@ -445,14 +445,15 @@ struct eapol_sm {
|
||||||
struct l_timeout *timeout;
|
struct l_timeout *timeout;
|
||||||
bool have_snonce:1;
|
bool have_snonce:1;
|
||||||
bool have_replay:1;
|
bool have_replay:1;
|
||||||
|
bool wpa_ie:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void eapol_sm_destroy(void *value)
|
static void eapol_sm_destroy(void *value)
|
||||||
{
|
{
|
||||||
struct eapol_sm *sm = value;
|
struct eapol_sm *sm = value;
|
||||||
|
|
||||||
l_free(sm->ap_rsn);
|
l_free(sm->ap_ie);
|
||||||
l_free(sm->own_rsn);
|
l_free(sm->own_ie);
|
||||||
|
|
||||||
l_timeout_remove(sm->timeout);
|
l_timeout_remove(sm->timeout);
|
||||||
|
|
||||||
|
@ -488,24 +489,48 @@ void eapol_sm_set_pmk(struct eapol_sm *sm, const uint8_t *pmk)
|
||||||
memcpy(sm->pmk, pmk, sizeof(sm->pmk));
|
memcpy(sm->pmk, pmk, sizeof(sm->pmk));
|
||||||
}
|
}
|
||||||
|
|
||||||
void eapol_sm_set_ap_rsn(struct eapol_sm *sm, const uint8_t *rsn_ie,
|
static void eapol_sm_set_ap_ie(struct eapol_sm *sm, const uint8_t *ie,
|
||||||
size_t len)
|
size_t len, bool is_wpa)
|
||||||
{
|
{
|
||||||
if (rsn_ie[1] + 2u != len)
|
if (ie[1] + 2u != len)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
l_free(sm->ap_rsn);
|
l_free(sm->ap_ie);
|
||||||
sm->ap_rsn = l_memdup(rsn_ie, len);
|
sm->ap_ie = l_memdup(ie, len);
|
||||||
|
sm->wpa_ie = is_wpa;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void eapol_sm_set_own_ie(struct eapol_sm *sm, const uint8_t *ie,
|
||||||
|
size_t len, bool is_wpa)
|
||||||
|
{
|
||||||
|
if (ie[1] + 2u != len)
|
||||||
|
return;
|
||||||
|
|
||||||
|
l_free(sm->own_ie);
|
||||||
|
sm->own_ie = l_memdup(ie, len);
|
||||||
|
sm->wpa_ie = is_wpa;
|
||||||
|
}
|
||||||
|
|
||||||
|
void eapol_sm_set_ap_rsn(struct eapol_sm *sm, const uint8_t *rsn_ie, size_t len)
|
||||||
|
{
|
||||||
|
eapol_sm_set_ap_ie(sm, rsn_ie, len, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void eapol_sm_set_own_rsn(struct eapol_sm *sm, const uint8_t *rsn_ie,
|
void eapol_sm_set_own_rsn(struct eapol_sm *sm, const uint8_t *rsn_ie,
|
||||||
size_t len)
|
size_t len)
|
||||||
{
|
{
|
||||||
if (rsn_ie[1] + 2u != len)
|
eapol_sm_set_own_ie(sm, rsn_ie, len, false);
|
||||||
return;
|
}
|
||||||
|
|
||||||
l_free(sm->own_rsn);
|
void eapol_sm_set_ap_wpa(struct eapol_sm *sm, const uint8_t *wpa_ie, size_t len)
|
||||||
sm->own_rsn = l_memdup(rsn_ie, len);
|
{
|
||||||
|
eapol_sm_set_ap_ie(sm, wpa_ie, len, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eapol_sm_set_own_wpa(struct eapol_sm *sm, const uint8_t *wpa_ie,
|
||||||
|
size_t len)
|
||||||
|
{
|
||||||
|
eapol_sm_set_own_ie(sm, wpa_ie, len, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void eapol_sm_set_user_data(struct eapol_sm *sm, void *user_data)
|
void eapol_sm_set_user_data(struct eapol_sm *sm, void *user_data)
|
||||||
|
@ -592,7 +617,7 @@ static void eapol_handle_ptk_1_of_4(uint32_t ifindex, struct eapol_sm *sm,
|
||||||
ek->key_descriptor_version,
|
ek->key_descriptor_version,
|
||||||
sm->replay_counter,
|
sm->replay_counter,
|
||||||
sm->snonce,
|
sm->snonce,
|
||||||
sm->own_rsn[1] + 2, sm->own_rsn);
|
sm->own_ie[1] + 2, sm->own_ie);
|
||||||
|
|
||||||
if (!eapol_calculate_mic(ptk->kck, step2, mic)) {
|
if (!eapol_calculate_mic(ptk->kck, step2, mic)) {
|
||||||
l_info("MIC calculation failed. "
|
l_info("MIC calculation failed. "
|
||||||
|
@ -781,7 +806,7 @@ static void eapol_handle_ptk_3_of_4(uint32_t ifindex,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!eapol_ap_rsne_matches(rsne, sm->ap_rsn)) {
|
if (!eapol_ap_rsne_matches(rsne, sm->ap_ie)) {
|
||||||
handshake_failed(ifindex, sm, MPDU_REASON_CODE_IE_DIFFERENT);
|
handshake_failed(ifindex, sm, MPDU_REASON_CODE_IE_DIFFERENT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,6 +160,10 @@ void eapol_sm_set_ap_rsn(struct eapol_sm *sm, const uint8_t *rsn_ie,
|
||||||
size_t len);
|
size_t len);
|
||||||
void eapol_sm_set_own_rsn(struct eapol_sm *sm, const uint8_t *rsn_ie,
|
void eapol_sm_set_own_rsn(struct eapol_sm *sm, const uint8_t *rsn_ie,
|
||||||
size_t len);
|
size_t len);
|
||||||
|
void eapol_sm_set_ap_wpa(struct eapol_sm *sm, const uint8_t *wpa_ie,
|
||||||
|
size_t len);
|
||||||
|
void eapol_sm_set_own_wpa(struct eapol_sm *sm, const uint8_t *wpa_ie,
|
||||||
|
size_t len);
|
||||||
void eapol_sm_set_user_data(struct eapol_sm *sm, void *user_data);
|
void eapol_sm_set_user_data(struct eapol_sm *sm, void *user_data);
|
||||||
struct l_io *eapol_open_pae(uint32_t index);
|
struct l_io *eapol_open_pae(uint32_t index);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue