mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-29 05:39:24 +01:00
handshake: simplify IE setters
The handshake object had 4 setters for authenticator/supplicant IE. Since the IE ultimately gets put into the same buffer, there really only needs to be a single setter for authenticator/supplicant. The handshake object can deal with parsing to decide what kind of IE it is (WPA or RSN).
This commit is contained in:
parent
f6df93d358
commit
75e6ee98f3
@ -228,8 +228,8 @@ static struct eapol_sm *adhoc_new_sm(struct sta_state *sta, bool authenticator,
|
|||||||
handshake_state_set_event_func(hs, adhoc_handshake_event, sta);
|
handshake_state_set_event_func(hs, adhoc_handshake_event, sta);
|
||||||
handshake_state_set_ssid(hs, (void *)adhoc->ssid, strlen(adhoc->ssid));
|
handshake_state_set_ssid(hs, (void *)adhoc->ssid, strlen(adhoc->ssid));
|
||||||
/* we dont have the connecting peer rsn info, so just set ap == own */
|
/* we dont have the connecting peer rsn info, so just set ap == own */
|
||||||
handshake_state_set_authenticator_rsn(hs, bss_rsne);
|
handshake_state_set_authenticator_ie(hs, bss_rsne);
|
||||||
handshake_state_set_supplicant_rsn(hs, bss_rsne);
|
handshake_state_set_supplicant_ie(hs, bss_rsne);
|
||||||
handshake_state_set_pmk(hs, adhoc->pmk, 32);
|
handshake_state_set_pmk(hs, adhoc->pmk, 32);
|
||||||
|
|
||||||
if (authenticator) {
|
if (authenticator) {
|
||||||
|
4
src/ap.c
4
src/ap.c
@ -425,8 +425,8 @@ static void ap_start_rsna(struct sta_state *sta, const uint8_t *gtk_rsc)
|
|||||||
handshake_state_set_event_func(sta->hs, ap_handshake_event, sta);
|
handshake_state_set_event_func(sta->hs, ap_handshake_event, sta);
|
||||||
handshake_state_set_ssid(sta->hs, (void *)ap->ssid, strlen(ap->ssid));
|
handshake_state_set_ssid(sta->hs, (void *)ap->ssid, strlen(ap->ssid));
|
||||||
handshake_state_set_authenticator(sta->hs, true);
|
handshake_state_set_authenticator(sta->hs, true);
|
||||||
handshake_state_set_authenticator_rsn(sta->hs, bss_rsne);
|
handshake_state_set_authenticator_ie(sta->hs, bss_rsne);
|
||||||
handshake_state_set_supplicant_rsn(sta->hs, sta->assoc_rsne);
|
handshake_state_set_supplicant_ie(sta->hs, sta->assoc_rsne);
|
||||||
handshake_state_set_pmk(sta->hs, ap->pmk, 32);
|
handshake_state_set_pmk(sta->hs, ap->pmk, 32);
|
||||||
handshake_state_set_authenticator_address(sta->hs, own_addr);
|
handshake_state_set_authenticator_address(sta->hs, own_addr);
|
||||||
handshake_state_set_supplicant_address(sta->hs, sta->addr);
|
handshake_state_set_supplicant_address(sta->hs, sta->addr);
|
||||||
|
@ -148,19 +148,19 @@ static bool handshake_state_setup_own_ciphers(struct handshake_state *s,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool handshake_state_set_authenticator_ie(struct handshake_state *s,
|
bool handshake_state_set_authenticator_ie(struct handshake_state *s,
|
||||||
const uint8_t *ie, bool is_wpa)
|
const uint8_t *ie)
|
||||||
{
|
{
|
||||||
struct ie_rsn_info info;
|
struct ie_rsn_info info;
|
||||||
|
|
||||||
l_free(s->authenticator_ie);
|
l_free(s->authenticator_ie);
|
||||||
s->authenticator_ie = l_memdup(ie, ie[1] + 2u);
|
s->authenticator_ie = l_memdup(ie, ie[1] + 2u);
|
||||||
s->wpa_ie = is_wpa;
|
s->wpa_ie = is_ie_wpa_ie(ie + 2, ie[1]);
|
||||||
|
|
||||||
if (!s->authenticator)
|
if (!s->authenticator)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (is_wpa) {
|
if (s->wpa_ie) {
|
||||||
if (ie_parse_wpa_from_data(ie, ie[1] + 2, &info) < 0)
|
if (ie_parse_wpa_from_data(ie, ie[1] + 2, &info) < 0)
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@ -171,19 +171,19 @@ static bool handshake_state_set_authenticator_ie(struct handshake_state *s,
|
|||||||
return handshake_state_setup_own_ciphers(s, &info);
|
return handshake_state_setup_own_ciphers(s, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool handshake_state_set_supplicant_ie(struct handshake_state *s,
|
bool handshake_state_set_supplicant_ie(struct handshake_state *s,
|
||||||
const uint8_t *ie, bool is_wpa)
|
const uint8_t *ie)
|
||||||
{
|
{
|
||||||
struct ie_rsn_info info;
|
struct ie_rsn_info info;
|
||||||
|
|
||||||
l_free(s->supplicant_ie);
|
l_free(s->supplicant_ie);
|
||||||
s->supplicant_ie = l_memdup(ie, ie[1] + 2u);
|
s->supplicant_ie = l_memdup(ie, ie[1] + 2u);
|
||||||
s->wpa_ie = is_wpa;
|
s->wpa_ie = is_ie_wpa_ie(ie + 2, ie[1]);
|
||||||
|
|
||||||
if (s->authenticator)
|
if (s->authenticator)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (is_wpa) {
|
if (s->wpa_ie) {
|
||||||
if (ie_parse_wpa_from_data(ie, ie[1] + 2, &info) < 0)
|
if (ie_parse_wpa_from_data(ie, ie[1] + 2, &info) < 0)
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@ -194,30 +194,6 @@ static bool handshake_state_set_supplicant_ie(struct handshake_state *s,
|
|||||||
return handshake_state_setup_own_ciphers(s, &info);
|
return handshake_state_setup_own_ciphers(s, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handshake_state_set_authenticator_rsn(struct handshake_state *s,
|
|
||||||
const uint8_t *rsn_ie)
|
|
||||||
{
|
|
||||||
return handshake_state_set_authenticator_ie(s, rsn_ie, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool handshake_state_set_supplicant_rsn(struct handshake_state *s,
|
|
||||||
const uint8_t *rsn_ie)
|
|
||||||
{
|
|
||||||
return handshake_state_set_supplicant_ie(s, rsn_ie, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool handshake_state_set_authenticator_wpa(struct handshake_state *s,
|
|
||||||
const uint8_t *wpa_ie)
|
|
||||||
{
|
|
||||||
return handshake_state_set_authenticator_ie(s, wpa_ie, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool handshake_state_set_supplicant_wpa(struct handshake_state *s,
|
|
||||||
const uint8_t *wpa_ie)
|
|
||||||
{
|
|
||||||
return handshake_state_set_supplicant_ie(s, wpa_ie, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handshake_state_set_ssid(struct handshake_state *s, const uint8_t *ssid,
|
void handshake_state_set_ssid(struct handshake_state *s, const uint8_t *ssid,
|
||||||
size_t ssid_len)
|
size_t ssid_len)
|
||||||
{
|
{
|
||||||
|
@ -141,14 +141,10 @@ void handshake_state_set_ptk(struct handshake_state *s, const uint8_t *ptk,
|
|||||||
size_t ptk_len);
|
size_t ptk_len);
|
||||||
void handshake_state_set_8021x_config(struct handshake_state *s,
|
void handshake_state_set_8021x_config(struct handshake_state *s,
|
||||||
struct l_settings *settings);
|
struct l_settings *settings);
|
||||||
bool handshake_state_set_supplicant_rsn(struct handshake_state *s,
|
bool handshake_state_set_authenticator_ie(struct handshake_state *s,
|
||||||
const uint8_t *rsn_ie);
|
const uint8_t *ie);
|
||||||
bool handshake_state_set_authenticator_rsn(struct handshake_state *s,
|
bool handshake_state_set_supplicant_ie(struct handshake_state *s,
|
||||||
const uint8_t *rsn_ie);
|
const uint8_t *ie);
|
||||||
bool handshake_state_set_supplicant_wpa(struct handshake_state *s,
|
|
||||||
const uint8_t *wpa_ie);
|
|
||||||
bool handshake_state_set_authenticator_wpa(struct handshake_state *s,
|
|
||||||
const uint8_t *wpa_ie);
|
|
||||||
void handshake_state_set_ssid(struct handshake_state *s,
|
void handshake_state_set_ssid(struct handshake_state *s,
|
||||||
const uint8_t *ssid, size_t ssid_len);
|
const uint8_t *ssid, size_t ssid_len);
|
||||||
void handshake_state_set_mde(struct handshake_state *s,
|
void handshake_state_set_mde(struct handshake_state *s,
|
||||||
|
@ -1616,14 +1616,14 @@ static void netdev_connect_event(struct l_genl_msg *msg, struct netdev *netdev)
|
|||||||
|
|
||||||
switch (ie_tlv_iter_get_tag(&iter)) {
|
switch (ie_tlv_iter_get_tag(&iter)) {
|
||||||
case IE_TYPE_RSN:
|
case IE_TYPE_RSN:
|
||||||
handshake_state_set_supplicant_rsn(netdev->handshake,
|
handshake_state_set_supplicant_ie(netdev->handshake,
|
||||||
data - 2);
|
data - 2);
|
||||||
break;
|
break;
|
||||||
case IE_TYPE_VENDOR_SPECIFIC:
|
case IE_TYPE_VENDOR_SPECIFIC:
|
||||||
if (!is_ie_wpa_ie(data, ie_tlv_iter_get_length(&iter)))
|
if (!is_ie_wpa_ie(data, ie_tlv_iter_get_length(&iter)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
handshake_state_set_supplicant_wpa(netdev->handshake,
|
handshake_state_set_supplicant_ie(netdev->handshake,
|
||||||
data - 2);
|
data - 2);
|
||||||
break;
|
break;
|
||||||
case IE_TYPE_MOBILITY_DOMAIN:
|
case IE_TYPE_MOBILITY_DOMAIN:
|
||||||
@ -2876,7 +2876,7 @@ static int fast_transition(struct netdev *netdev, struct scan_bss *target_bss,
|
|||||||
handshake_state_set_authenticator_address(netdev->handshake,
|
handshake_state_set_authenticator_address(netdev->handshake,
|
||||||
target_bss->addr);
|
target_bss->addr);
|
||||||
|
|
||||||
handshake_state_set_authenticator_rsn(netdev->handshake,
|
handshake_state_set_authenticator_ie(netdev->handshake,
|
||||||
target_bss->rsne);
|
target_bss->rsne);
|
||||||
memcpy(netdev->handshake->mde + 2, target_bss->mde, 3);
|
memcpy(netdev->handshake->mde + 2, target_bss->mde, 3);
|
||||||
|
|
||||||
|
@ -623,12 +623,12 @@ static int station_build_handshake_rsn(struct handshake_state *hs,
|
|||||||
/* RSN takes priority */
|
/* RSN takes priority */
|
||||||
if (bss->rsne) {
|
if (bss->rsne) {
|
||||||
ie_build_rsne(&info, rsne_buf);
|
ie_build_rsne(&info, rsne_buf);
|
||||||
handshake_state_set_authenticator_rsn(hs, bss->rsne);
|
handshake_state_set_authenticator_ie(hs, bss->rsne);
|
||||||
handshake_state_set_supplicant_rsn(hs, rsne_buf);
|
handshake_state_set_supplicant_ie(hs, rsne_buf);
|
||||||
} else {
|
} else {
|
||||||
ie_build_wpa(&info, rsne_buf);
|
ie_build_wpa(&info, rsne_buf);
|
||||||
handshake_state_set_authenticator_wpa(hs, bss->wpa);
|
handshake_state_set_authenticator_ie(hs, bss->wpa);
|
||||||
handshake_state_set_supplicant_wpa(hs, rsne_buf);
|
handshake_state_set_supplicant_ie(hs, rsne_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info.akm_suites & (IE_RSN_AKM_SUITE_FT_OVER_8021X |
|
if (info.akm_suites & (IE_RSN_AKM_SUITE_FT_OVER_8021X |
|
||||||
@ -1199,7 +1199,7 @@ static void station_preauthenticate_cb(struct netdev *netdev,
|
|||||||
rsn_info.pmkids = pmkid;
|
rsn_info.pmkids = pmkid;
|
||||||
|
|
||||||
ie_build_rsne(&rsn_info, rsne_buf);
|
ie_build_rsne(&rsn_info, rsne_buf);
|
||||||
handshake_state_set_supplicant_rsn(new_hs, rsne_buf);
|
handshake_state_set_supplicant_ie(new_hs, rsne_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
station_transition_reassociate(station, bss, new_hs);
|
station_transition_reassociate(station, bss, new_hs);
|
||||||
|
Loading…
Reference in New Issue
Block a user