wlantest: Learn MLD MAC address from EAPOL-Key msg 1/4 and 2/4
IEEE P802.11be indicates the MLD MAC addresses, i.e., the Authenticator and Supplicant addresses, in the MAC Address KDE in EAPOL-Key msg 1/4 and 2/4. Learn those addresses so that wlantest can be extended to support MLO. Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
This commit is contained in:
parent
cd392151c5
commit
fb448ee2b2
2 changed files with 45 additions and 0 deletions
|
@ -68,6 +68,10 @@ static void rx_data_eapol_key_1_of_4(struct wlantest *wt, const u8 *dst,
|
||||||
struct wlantest_sta *sta;
|
struct wlantest_sta *sta;
|
||||||
const struct ieee802_1x_hdr *eapol;
|
const struct ieee802_1x_hdr *eapol;
|
||||||
const struct wpa_eapol_key *hdr;
|
const struct wpa_eapol_key *hdr;
|
||||||
|
const u8 *key_data, *mic;
|
||||||
|
size_t mic_len;
|
||||||
|
u16 key_data_len;
|
||||||
|
struct wpa_eapol_ie_parse ie;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "EAPOL-Key 1/4 " MACSTR " -> " MACSTR,
|
wpa_printf(MSG_DEBUG, "EAPOL-Key 1/4 " MACSTR " -> " MACSTR,
|
||||||
MAC2STR(src), MAC2STR(dst));
|
MAC2STR(src), MAC2STR(dst));
|
||||||
|
@ -80,6 +84,8 @@ static void rx_data_eapol_key_1_of_4(struct wlantest *wt, const u8 *dst,
|
||||||
|
|
||||||
eapol = (const struct ieee802_1x_hdr *) data;
|
eapol = (const struct ieee802_1x_hdr *) data;
|
||||||
hdr = (const struct wpa_eapol_key *) (eapol + 1);
|
hdr = (const struct wpa_eapol_key *) (eapol + 1);
|
||||||
|
mic_len = wpa_mic_len(sta->key_mgmt, PMK_LEN);
|
||||||
|
mic = (const u8 *) (hdr + 1);
|
||||||
if (is_zero(hdr->key_nonce, WPA_NONCE_LEN)) {
|
if (is_zero(hdr->key_nonce, WPA_NONCE_LEN)) {
|
||||||
add_note(wt, MSG_INFO, "EAPOL-Key 1/4 from " MACSTR
|
add_note(wt, MSG_INFO, "EAPOL-Key 1/4 from " MACSTR
|
||||||
" used zero nonce", MAC2STR(src));
|
" used zero nonce", MAC2STR(src));
|
||||||
|
@ -89,6 +95,28 @@ static void rx_data_eapol_key_1_of_4(struct wlantest *wt, const u8 *dst,
|
||||||
" used non-zero Key RSC", MAC2STR(src));
|
" used non-zero Key RSC", MAC2STR(src));
|
||||||
}
|
}
|
||||||
os_memcpy(sta->anonce, hdr->key_nonce, WPA_NONCE_LEN);
|
os_memcpy(sta->anonce, hdr->key_nonce, WPA_NONCE_LEN);
|
||||||
|
key_data = mic + mic_len + 2;
|
||||||
|
key_data_len = WPA_GET_BE16(mic + mic_len);
|
||||||
|
|
||||||
|
if (wpa_supplicant_parse_ies(key_data, key_data_len, &ie) < 0) {
|
||||||
|
add_note(wt, MSG_INFO, "Failed to parse EAPOL-Key Key Data");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ie.mac_addr) {
|
||||||
|
if (is_zero_ether_addr(bss->mld_mac_addr)) {
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"Learned AP MLD MAC Address from EAPOL-Key 1/4: "
|
||||||
|
MACSTR, MAC2STR(ie.mac_addr));
|
||||||
|
} else {
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"Updated AP MLD MAC Address from EAPOL-Key 1/4: "
|
||||||
|
MACSTR " --> " MACSTR,
|
||||||
|
MAC2STR(bss->mld_mac_addr),
|
||||||
|
MAC2STR(ie.mac_addr));
|
||||||
|
}
|
||||||
|
os_memcpy(bss->mld_mac_addr, ie.mac_addr, ETH_ALEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -289,6 +317,21 @@ static void rx_data_eapol_key_2_of_4(struct wlantest *wt, const u8 *dst,
|
||||||
sta_update_assoc(sta, &elems);
|
sta_update_assoc(sta, &elems);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ie.mac_addr) {
|
||||||
|
if (is_zero_ether_addr(sta->mld_mac_addr)) {
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"Learned non-AP STA MLD MAC Address from EAPOL-Key 2/4: "
|
||||||
|
MACSTR, MAC2STR(ie.mac_addr));
|
||||||
|
} else {
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"Updated non-AP STA MLD MAC Address from EAPOL-Key 2/4: "
|
||||||
|
MACSTR " --> " MACSTR,
|
||||||
|
MAC2STR(sta->mld_mac_addr),
|
||||||
|
MAC2STR(ie.mac_addr));
|
||||||
|
}
|
||||||
|
os_memcpy(sta->mld_mac_addr, ie.mac_addr, ETH_ALEN);
|
||||||
|
}
|
||||||
|
|
||||||
derive_ptk(wt, bss, sta, key_info & WPA_KEY_INFO_TYPE_MASK, data, len);
|
derive_ptk(wt, bss, sta, key_info & WPA_KEY_INFO_TYPE_MASK, data, len);
|
||||||
|
|
||||||
if (!sta->ptk_set && !sta->tptk_set) {
|
if (!sta->ptk_set && !sta->tptk_set) {
|
||||||
|
|
|
@ -55,6 +55,7 @@ struct wlantest_sta {
|
||||||
struct dl_list list;
|
struct dl_list list;
|
||||||
struct wlantest_bss *bss;
|
struct wlantest_bss *bss;
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
|
u8 mld_mac_addr[ETH_ALEN];
|
||||||
enum {
|
enum {
|
||||||
STATE1 /* not authenticated */,
|
STATE1 /* not authenticated */,
|
||||||
STATE2 /* authenticated */,
|
STATE2 /* authenticated */,
|
||||||
|
@ -136,6 +137,7 @@ struct wlantest_tdls {
|
||||||
struct wlantest_bss {
|
struct wlantest_bss {
|
||||||
struct dl_list list;
|
struct dl_list list;
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid[ETH_ALEN];
|
||||||
|
u8 mld_mac_addr[ETH_ALEN];
|
||||||
u16 capab_info;
|
u16 capab_info;
|
||||||
u16 prev_capab_info;
|
u16 prev_capab_info;
|
||||||
u8 ssid[32];
|
u8 ssid[32];
|
||||||
|
|
Loading…
Reference in a new issue