MLD STA: Group key handshake processing for GTK/IGTK/BIGTK rekeying
Add support for group rekeying in MLO connection. Parse per link MLO GTK/IGTK/BIGTK KDEs from Group Key msg 1/2 and configure to the driver. Signed-off-by: Rohan Dutta <quic_drohan@quicinc.com> Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
This commit is contained in:
parent
f0760aa6dd
commit
2f61d703a1
1 changed files with 110 additions and 3 deletions
|
@ -2788,6 +2788,106 @@ static int wpa_supplicant_send_2_of_2(struct wpa_sm *sm,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void wpa_supplicant_process_mlo_1_of_2(struct wpa_sm *sm,
|
||||||
|
const unsigned char *src_addr,
|
||||||
|
const struct wpa_eapol_key *key,
|
||||||
|
const u8 *key_data,
|
||||||
|
size_t key_data_len, u16 ver)
|
||||||
|
{
|
||||||
|
u16 key_info;
|
||||||
|
u8 i;
|
||||||
|
struct wpa_eapol_ie_parse ie;
|
||||||
|
|
||||||
|
if (!sm->msg_3_of_4_ok && !wpa_fils_is_completed(sm)) {
|
||||||
|
wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
|
||||||
|
"MLO RSN: Group Key Handshake started prior to completion of 4-way handshake");
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "MLO RSN: RX message 1 of Group "
|
||||||
|
"Key Handshake from " MACSTR " (ver=%d)", MAC2STR(src_addr),
|
||||||
|
ver);
|
||||||
|
|
||||||
|
key_info = WPA_GET_BE16(key->key_info);
|
||||||
|
|
||||||
|
wpa_sm_set_state(sm, WPA_GROUP_HANDSHAKE);
|
||||||
|
|
||||||
|
wpa_hexdump_key(MSG_DEBUG, "MLO RSN: msg 1/2 key data", key_data,
|
||||||
|
key_data_len);
|
||||||
|
if (wpa_supplicant_parse_ies(key_data, key_data_len, &ie) < 0)
|
||||||
|
goto failed;
|
||||||
|
|
||||||
|
if (!ie.valid_mlo_gtks) {
|
||||||
|
wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
|
||||||
|
"MLO RSN: No MLO GTK KDE in Group Key msg 1/2");
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(key_info & WPA_KEY_INFO_ENCR_KEY_DATA)) {
|
||||||
|
wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
|
||||||
|
"MLO RSN: MLO GTK KDE in unencrypted key data");
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_OCV
|
||||||
|
if (wpa_sm_ocv_enabled(sm)) {
|
||||||
|
struct wpa_channel_info ci;
|
||||||
|
|
||||||
|
if (wpa_sm_channel_info(sm, &ci) != 0) {
|
||||||
|
wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
|
||||||
|
"Failed to get channel info to validate received OCI in EAPOL-Key group msg 1/2");
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ocv_verify_tx_params(ie.oci, ie.oci_len, &ci,
|
||||||
|
channel_width_to_int(ci.chanwidth),
|
||||||
|
ci.seg1_idx) != OCI_SUCCESS) {
|
||||||
|
wpa_msg(sm->ctx->msg_ctx, MSG_INFO, OCV_FAILURE
|
||||||
|
"addr=" MACSTR " frame=eapol-key-g1 error=%s",
|
||||||
|
MAC2STR(sm->bssid), ocv_errorstr);
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_OCV */
|
||||||
|
|
||||||
|
if (mlo_ieee80211w_set_keys(sm, &ie) < 0)
|
||||||
|
wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
|
||||||
|
"MLO RSN: Failed to configure MLO IGTK");
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_NUM_MLO_LINKS; i++) {
|
||||||
|
if (!(sm->mlo.valid_links & BIT(i)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AP may send group keys for subset of the all links during
|
||||||
|
* rekey
|
||||||
|
*/
|
||||||
|
if (!ie.mlo_gtk[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (wpa_supplicant_mlo_gtk(sm, i, ie.mlo_gtk[i],
|
||||||
|
ie.mlo_gtk_len[i], key_info))
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wpa_supplicant_send_2_of_2(sm, key, ver, key_info) < 0)
|
||||||
|
goto failed;
|
||||||
|
|
||||||
|
wpa_msg(sm->ctx->msg_ctx, MSG_INFO, "MLO RSN: Group rekeying completed "
|
||||||
|
"with " MACSTR " [GTK=%s]", MAC2STR(sm->mlo.ap_mld_addr),
|
||||||
|
wpa_cipher_txt(sm->group_cipher));
|
||||||
|
wpa_sm_cancel_auth_timeout(sm);
|
||||||
|
wpa_sm_set_state(sm, WPA_COMPLETED);
|
||||||
|
|
||||||
|
wpa_sm_set_rekey_offload(sm);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void wpa_supplicant_process_1_of_2(struct wpa_sm *sm,
|
static void wpa_supplicant_process_1_of_2(struct wpa_sm *sm,
|
||||||
const unsigned char *src_addr,
|
const unsigned char *src_addr,
|
||||||
const struct wpa_eapol_key *key,
|
const struct wpa_eapol_key *key,
|
||||||
|
@ -3420,8 +3520,15 @@ int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
|
||||||
if ((mic_len && (key_info & WPA_KEY_INFO_MIC)) ||
|
if ((mic_len && (key_info & WPA_KEY_INFO_MIC)) ||
|
||||||
(!mic_len && (key_info & WPA_KEY_INFO_ENCR_KEY_DATA))) {
|
(!mic_len && (key_info & WPA_KEY_INFO_ENCR_KEY_DATA))) {
|
||||||
/* 1/2 Group Key Handshake */
|
/* 1/2 Group Key Handshake */
|
||||||
|
if (sm->mlo.valid_links)
|
||||||
|
wpa_supplicant_process_mlo_1_of_2(sm, src_addr,
|
||||||
|
key, key_data,
|
||||||
|
key_data_len,
|
||||||
|
ver);
|
||||||
|
else
|
||||||
wpa_supplicant_process_1_of_2(sm, src_addr, key,
|
wpa_supplicant_process_1_of_2(sm, src_addr, key,
|
||||||
key_data, key_data_len,
|
key_data,
|
||||||
|
key_data_len,
|
||||||
ver);
|
ver);
|
||||||
} else {
|
} else {
|
||||||
wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
|
wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
|
||||||
|
|
Loading…
Reference in a new issue