Skip to content

Commit b7deee9

Browse files
author
Jiang Jiang Jian
committed
Merge branch 'feat/ft_with_sae' into 'master'
Add FT with SAE feature for station See merge request espressif/esp-idf!39994
2 parents b5ba537 + 3243373 commit b7deee9

File tree

8 files changed

+273
-57
lines changed

8 files changed

+273
-57
lines changed

components/wpa_supplicant/esp_supplicant/src/esp_common.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ static void register_mgmt_frames(struct wpa_supplicant *wpa_s)
153153
static int handle_auth_frame(u8 *frame, size_t len,
154154
u8 *sender, int8_t rssi, u8 channel)
155155
{
156-
if (gWpaSm.key_mgmt == WPA_KEY_MGMT_FT_PSK) {
156+
if (gWpaSm.key_mgmt == WPA_KEY_MGMT_FT_PSK || gWpaSm.key_mgmt == WPA_KEY_MGMT_FT_SAE) {
157157
if (gWpaSm.ft_protocol) {
158158
if (wpa_ft_process_response(&gWpaSm, frame + 6,
159159
len - 6, 0, sender, NULL, 0) < 0) {
@@ -168,7 +168,7 @@ static int handle_auth_frame(u8 *frame, size_t len,
168168
static int handle_assoc_frame(u8 *frame, size_t len,
169169
u8 *sender, int8_t rssi, u8 channel)
170170
{
171-
if (gWpaSm.key_mgmt == WPA_KEY_MGMT_FT_PSK) {
171+
if (gWpaSm.key_mgmt == WPA_KEY_MGMT_FT_PSK || gWpaSm.key_mgmt == WPA_KEY_MGMT_FT_SAE) {
172172
if (gWpaSm.ft_protocol) {
173173
if (wpa_ft_validate_reassoc_resp(&gWpaSm, frame + 6, len - 6, sender)) {
174174
wpa_sm_set_ft_params(&gWpaSm, NULL, 0);

components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ enum {
7777
WPA3_AUTH_PSK_EXT_KEY = 0x10,
7878
/* this enum is in C2 ROM, do not change before WPA3_AUTH_PSK_EXT_KEY */
7979
WPA3_AUTH_DPP = 0x11,
80+
WPA3_AUTH_FT_SAE = 0x12,
8081
WPA2_AUTH_INVALID
8182
};
8283

components/wpa_supplicant/src/common/wpa_common.c

Lines changed: 55 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
2828
const u8 *mdie, size_t mdie_len,
2929
const u8 *ftie, size_t ftie_len,
3030
const u8 *rsnie, size_t rsnie_len,
31+
const u8 *rsnxe, size_t rsnxe_len,
3132
const u8 *ric, size_t ric_len, u8 *mic)
3233
{
3334
u8 *buf, *pos;
@@ -39,7 +40,7 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
3940
return -1;
4041
}
4142

42-
buf_len = 2 * ETH_ALEN + 1 + mdie_len + ftie_len + rsnie_len + ric_len;
43+
buf_len = 2 * ETH_ALEN + 1 + mdie_len + ftie_len + rsnie_len + ric_len + rsnxe_len;
4344
buf = os_malloc(buf_len);
4445
if (buf == NULL)
4546
return -1;
@@ -51,38 +52,41 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
5152
pos += ETH_ALEN;
5253
*pos++ = transaction_seqnum;
5354
if (rsnie) {
54-
os_memcpy(pos, rsnie, rsnie_len);
55-
pos += rsnie_len;
55+
os_memcpy(pos, rsnie, rsnie_len);
56+
pos += rsnie_len;
5657
}
5758
if (mdie) {
58-
os_memcpy(pos, mdie, mdie_len);
59-
pos += mdie_len;
59+
os_memcpy(pos, mdie, mdie_len);
60+
pos += mdie_len;
6061
}
6162
if (ftie) {
62-
struct rsn_ftie *_ftie;
63-
os_memcpy(pos, ftie, ftie_len);
64-
if (ftie_len < 2 + sizeof(*_ftie)) {
65-
os_free(buf);
66-
return -1;
67-
}
68-
_ftie = (struct rsn_ftie *) (pos + 2);
69-
os_memset(_ftie->mic, 0, sizeof(_ftie->mic));
70-
pos += ftie_len;
71-
}
72-
if (ric) {
73-
os_memcpy(pos, ric, ric_len);
74-
pos += ric_len;
75-
}
76-
63+
struct rsn_ftie *_ftie;
64+
os_memcpy(pos, ftie, ftie_len);
65+
if (ftie_len < 2 + sizeof(*_ftie)) {
66+
os_free(buf);
67+
return -1;
68+
}
69+
_ftie = (struct rsn_ftie *) (pos + 2);
70+
os_memset(_ftie->mic, 0, sizeof(_ftie->mic));
71+
pos += ftie_len;
72+
}
73+
if (ric) {
74+
os_memcpy(pos, ric, ric_len);
75+
pos += ric_len;
76+
}
77+
if (rsnxe) {
78+
os_memcpy(pos, rsnxe, rsnxe_len);
79+
pos += rsnxe_len;
80+
}
7781
wpa_hexdump(MSG_MSGDUMP, "FT: MIC data", buf, pos - buf);
78-
if (omac1_aes_128(kck, buf, pos - buf, mic)) {
79-
os_free(buf);
80-
return -1;
81-
}
82+
if (omac1_aes_128(kck, buf, pos - buf, mic)) {
83+
os_free(buf);
84+
return -1;
85+
}
8286

8387
os_free(buf);
8488

85-
return 0;
89+
return 0;
8690
}
8791

8892

@@ -151,6 +155,9 @@ int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
151155
pos = ies;
152156
end = ies + ies_len;
153157
while (pos + 2 <= end && pos + 2 + pos[1] <= end) {
158+
u8 len;
159+
160+
len = pos[1];
154161
switch (pos[0]) {
155162
case WLAN_EID_RSN:
156163
parse->rsn = pos + 2;
@@ -166,6 +173,13 @@ int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
166173
if (data.num_pmkid == 1 && data.pmkid)
167174
parse->rsn_pmkid = data.pmkid;
168175
break;
176+
case WLAN_EID_RSNX:
177+
wpa_hexdump(MSG_DEBUG, "FT: RSNXE", pos, len);
178+
if (len < 1)
179+
break;
180+
parse->rsnxe = pos + 2;
181+
parse->rsnxe_len = pos[1];
182+
break;
169183
case WLAN_EID_MOBILITY_DOMAIN:
170184
parse->mdie = pos + 2;
171185
parse->mdie_len = pos[1];
@@ -198,16 +212,18 @@ int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
198212
* Check that the protected IE count matches with IEs included in the
199213
* frame.
200214
*/
215+
if (parse->rsnxe)
216+
prot_ie_count--;
201217
if (parse->rsn)
202-
prot_ie_count--;
218+
prot_ie_count--;
203219
if (parse->mdie)
204-
prot_ie_count--;
220+
prot_ie_count--;
205221
if (parse->ftie)
206-
prot_ie_count--;
222+
prot_ie_count--;
207223
if (prot_ie_count < 0) {
208-
wpa_printf(MSG_DEBUG, "FT: Some required IEs not included in "
209-
"the protected IE count");
210-
return -1;
224+
wpa_printf(MSG_DEBUG, "FT: Some required IEs not included in "
225+
"the protected IE count");
226+
return -1;
211227
}
212228

213229
if (prot_ie_count == 0 && parse->ric) {
@@ -225,9 +241,9 @@ int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
225241
}
226242
parse->ric_len = pos - parse->ric;
227243
if (prot_ie_count) {
228-
wpa_printf(MSG_DEBUG, "FT: %d protected IEs missing from "
229-
"frame", (int) prot_ie_count);
230-
return -1;
244+
wpa_printf(MSG_DEBUG, "FT: %d protected IEs missing from "
245+
"frame", (int) prot_ie_count);
246+
return -1;
231247
}
232248

233249
return 0;
@@ -326,6 +342,8 @@ static int rsn_key_mgmt_to_bitfield(const u8 *s)
326342
return WPA_KEY_MGMT_SAE;
327343
if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_SAE_EXT_KEY)
328344
return WPA_KEY_MGMT_SAE_EXT_KEY;
345+
if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_SAE)
346+
return WPA_KEY_MGMT_FT_SAE;
329347
#endif /* CONFIG_WPA3_SAE */
330348
if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA256)
331349
return WPA_KEY_MGMT_IEEE8021X_SHA256;
@@ -340,12 +358,6 @@ static int rsn_key_mgmt_to_bitfield(const u8 *s)
340358
if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192)
341359
return WPA_KEY_MGMT_IEEE8021X_SUITE_B_192;
342360
#endif
343-
#ifdef CONFIG_WPA3_SAE
344-
if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_SAE)
345-
return WPA_KEY_MGMT_SAE;
346-
if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_SAE_EXT_KEY)
347-
return WPA_KEY_MGMT_SAE_EXT_KEY;
348-
#endif /* CONFIG_WPA3_SAE */
349361
#ifdef CONFIG_OWE_STA
350362
if(RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_OWE)
351363
return WPA_KEY_MGMT_OWE;
@@ -943,6 +955,7 @@ int wpa_eapol_key_mic(const u8 *key, size_t key_len, int akmp, int ver,
943955
switch (akmp) {
944956
#ifdef CONFIG_WPA3_SAE
945957
case WPA_KEY_MGMT_SAE:
958+
case WPA_KEY_MGMT_FT_SAE:
946959
return omac1_aes_128(key, buf, len, mic);
947960
case WPA_KEY_MGMT_SAE_EXT_KEY:
948961
wpa_printf(MSG_DEBUG,
@@ -1730,14 +1743,14 @@ int wpa_parse_kde_ies(const u8 *buf, size_t len, struct wpa_eapol_ie_parse *ie)
17301743
if (*pos == WLAN_EID_RSN) {
17311744
ie->rsn_ie = pos;
17321745
ie->rsn_ie_len = pos[1] + 2;
1733-
#ifdef CONFIG_IEEE80211R_AP
1746+
#ifdef CONFIG_IEEE80211R
17341747
} else if (*pos == WLAN_EID_MOBILITY_DOMAIN) {
17351748
ie->mdie = pos;
17361749
ie->mdie_len = pos[1] + 2;
17371750
} else if (*pos == WLAN_EID_FAST_BSS_TRANSITION) {
17381751
ie->ftie = pos;
17391752
ie->ftie_len = pos[1] + 2;
1740-
#endif /* CONFIG_IEEE80211R_AP */
1753+
#endif /* CONFIG_IEEE80211R */
17411754
} else if (*pos == WLAN_EID_RSNX) {
17421755
ie->rsnxe = pos;
17431756
ie->rsnxe_len = pos[1] + 2;

components/wpa_supplicant/src/common/wpa_common.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,17 @@ RSN_SELECTOR(0x00, 0x0f, 0xac, 13)
137137
#define FT_R1KH_ID_LEN 6
138138
#define WPA_PMK_NAME_LEN 16
139139

140+
/* FTE - MIC Control - RSNXE Used */
141+
#define FTE_MIC_CTRL_RSNXE_USED BIT(0)
142+
#define FTE_MIC_CTRL_MIC_LEN_MASK (BIT(1) | BIT(2) | BIT(3))
143+
#define FTE_MIC_CTRL_MIC_LEN_SHIFT 1
144+
145+
/* FTE - MIC Length subfield values */
146+
enum ft_mic_len_subfield {
147+
FTE_MIC_LEN_16 = 0,
148+
FTE_MIC_LEN_24 = 1,
149+
FTE_MIC_LEN_32 = 2,
150+
};
140151

141152
/* IEEE 802.11, 8.5.2 EAPOL-Key frames */
142153
#define WPA_KEY_INFO_TYPE_MASK ((u16) (BIT(0) | BIT(1) | BIT(2)))
@@ -337,6 +348,7 @@ int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
337348
const u8 *mdie, size_t mdie_len,
338349
const u8 *ftie, size_t ftie_len,
339350
const u8 *rsnie, size_t rsnie_len,
351+
const u8 *rsnxe, size_t rsnxe_len,
340352
const u8 *ric, size_t ric_len, u8 *mic);
341353
void wpa_derive_pmk_r0(const u8 *xxkey, size_t xxkey_len,
342354
const u8 *ssid, size_t ssid_len,
@@ -425,6 +437,8 @@ struct wpa_ft_ies {
425437
size_t igtk_len;
426438
const u8 *ric;
427439
size_t ric_len;
440+
const u8 *rsnxe;
441+
size_t rsnxe_len;
428442
};
429443

430444
/* WPA3 specification - RSN Selection element */

0 commit comments

Comments
 (0)