mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-23 21:19:04 -04:00
qcacld-3.0: Save FTIE from auth response in FT-FILS IM connection
FT-FILS initial mobility domain association requires FTIE in the association request frame sent to the AP. FTIE has the R0-KH and R1-KH ID that is needed to derive the FILS-FT key. Host driver should save the FTIE received from the AP in the authentication response frame and send it without any modification to the AP in association request frame. Change-ID: I047538e13b37e10c2cebad4959fc796af5d16df6 CRs-Fixed: 2414662
This commit is contained in:
parent
c16f627c56
commit
0bd15747c0
4 changed files with 157 additions and 2 deletions
|
|
@ -1466,6 +1466,7 @@ typedef struct sSirMacAuthFrameBody {
|
|||
uint8_t challengeText[SIR_MAC_AUTH_CHALLENGE_LENGTH];
|
||||
#ifdef WLAN_FEATURE_FILS_SK
|
||||
tSirMacRsnInfo rsn_ie;
|
||||
struct mac_ft_ie ft_ie;
|
||||
uint8_t assoc_delay_info;
|
||||
uint8_t session[SIR_FILS_SESSION_LENGTH];
|
||||
uint8_t wrapped_data_len;
|
||||
|
|
|
|||
|
|
@ -169,6 +169,80 @@ struct fils_auth_rsp_info {
|
|||
uint8_t assoc_delay;
|
||||
};
|
||||
|
||||
#define FT_R0KH_ID_MAX_LEN 48
|
||||
#define FT_R1KH_ID_LEN 6
|
||||
#define FT_NONCE_LEN 32
|
||||
|
||||
/* MIC Length Specified in Table 12-8- 802.11-2016 Spec */
|
||||
#define FT_MIC_LEN 16
|
||||
#define FT_GTK_RSC_LEN 8
|
||||
#define FT_GTK_KEY_LEN 32
|
||||
#define FT_IGTK_KEY_ID_LEN 2
|
||||
#define FT_IGTK_IPN_LEN 6
|
||||
#define FT_IGTK_KEY_LEN 24
|
||||
|
||||
/**
|
||||
* struct mac_ft_gtk_ie - structure to parse the gtk ie
|
||||
* @present: flag to indicate ie is present
|
||||
* @key_id: Key-Id
|
||||
* @reserved: reserved bits
|
||||
* @key_length: gtk key length
|
||||
* @rsc: denotes the last TSC or PN sent using the GTK
|
||||
* @num_key: number of keys
|
||||
* @key: actual keys
|
||||
*/
|
||||
struct mac_ft_gtk_ie {
|
||||
uint8_t present;
|
||||
uint16_t key_id:2;
|
||||
uint16_t reserved:14;
|
||||
uint8_t key_len;
|
||||
uint8_t rsc[FT_GTK_RSC_LEN];
|
||||
uint8_t num_key;
|
||||
uint8_t key[FT_GTK_KEY_LEN];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mac_ft_gtk_ie - structure to parse the gtk ie
|
||||
* @present: IE present or not present
|
||||
* @key_id: 2Byte Key-ID
|
||||
* @ipn: icorresponds to the last packet number used by broadcaster/multicaster
|
||||
* @key_len: IGTK key length
|
||||
* @key: IGTK Key
|
||||
*/
|
||||
struct mac_ft_igtk_ie {
|
||||
uint8_t present;
|
||||
uint8_t key_id[FT_IGTK_KEY_ID_LEN];
|
||||
uint8_t ipn[FT_IGTK_IPN_LEN];
|
||||
uint8_t key_len;
|
||||
uint8_t key[FT_IGTK_KEY_LEN];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mac_ft_ie - structure to parse the FT ie from auth frame
|
||||
* @present: true if IE is present in Auth Frame
|
||||
* @element_count: number of elements
|
||||
* @mic: MIC. Will be zero in auth frame sent from AP. (Refer 13.2.4 802.11ai)
|
||||
* @anonce: Authenticator NONCE. Will be zero in auth frame sent from AP.
|
||||
* @snonce: Supplicant NONCE. Will be zero in auth frame
|
||||
* @r1kh_id: R1KH ID. Length of R1KH ID is fixed(6 bytes).
|
||||
* @r0kh_id_len: Length of R0KH ID
|
||||
* @r0kh_id: R0KH id
|
||||
* @gtk_ie: GTK subelement in FTIE
|
||||
* @igtk_ie: IGTK subelement in FTIE
|
||||
*/
|
||||
struct mac_ft_ie {
|
||||
bool present;
|
||||
uint8_t element_count;
|
||||
uint8_t mic[FT_MIC_LEN];
|
||||
uint8_t anonce[FT_NONCE_LEN];
|
||||
uint8_t snonce[FT_NONCE_LEN];
|
||||
uint8_t r1kh_id[FT_R1KH_ID_LEN];
|
||||
uint8_t r0kh_id_len;
|
||||
uint8_t r0kh_id[FT_R0KH_ID_MAX_LEN];
|
||||
struct mac_ft_gtk_ie gtk_ie;
|
||||
struct mac_ft_igtk_ie igtk_ie;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct pe_fils_session: fils session info used in PE session
|
||||
* @is_fils_connection: whether connection is fils or not
|
||||
|
|
@ -188,6 +262,7 @@ struct fils_auth_rsp_info {
|
|||
* @fils_nonce: fils snonce
|
||||
* @rsn_ie: rsn ie used in auth request
|
||||
* @rsn_ie_len: rsn ie length
|
||||
* @ft_ie: structure to store the parsed FTIE from auth response frame
|
||||
* @fils_eap_finish_pkt: pointer to eap finish packet
|
||||
* @fils_eap_finish_pkt_len: eap finish packet length
|
||||
* @fils_rmsk: rmsk data pointer
|
||||
|
|
@ -235,6 +310,7 @@ struct pe_fils_session {
|
|||
uint8_t fils_nonce[SIR_FILS_NONCE_LENGTH];
|
||||
uint8_t rsn_ie[WLAN_MAX_IE_LEN];
|
||||
uint8_t rsn_ie_len;
|
||||
struct mac_ft_ie ft_ie;
|
||||
uint8_t *fils_eap_finish_pkt;
|
||||
uint8_t fils_eap_finish_pkt_len;
|
||||
uint8_t *fils_rmsk;
|
||||
|
|
|
|||
|
|
@ -1109,6 +1109,17 @@ bool lim_process_fils_auth_frame2(struct mac_context *mac_ctx,
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* copy FTIE to fils_info and send it over assoc response frame
|
||||
* for FT-FILS connection
|
||||
*/
|
||||
if (pe_session->is11Rconnection && pe_session->fils_info) {
|
||||
pe_session->fils_info->ft_ie = rx_auth_frm_body->ft_ie;
|
||||
if (!pe_session->fils_info->ft_ie.present) {
|
||||
pe_err("FT-FILS: NO FTIE in auth response");
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < dot11f_ie_rsn.pmkid_count; i++) {
|
||||
if (qdf_mem_cmp(dot11f_ie_rsn.pmkid[i],
|
||||
pe_session->fils_info->fils_pmkid,
|
||||
|
|
|
|||
|
|
@ -4167,6 +4167,69 @@ sir_convert_beacon_frame2_struct(struct mac_context *mac,
|
|||
} /* End sir_convert_beacon_frame2_struct. */
|
||||
|
||||
#ifdef WLAN_FEATURE_FILS_SK
|
||||
|
||||
/* update_ftie_in_fils_conf() - API to update fils info from auth
|
||||
* response packet from AP
|
||||
* @auth: auth packet pointer received from AP
|
||||
* @auth_frame: data structure needs to be updated
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void
|
||||
update_ftie_in_fils_conf(tDot11fAuthentication *auth,
|
||||
tpSirMacAuthFrameBody auth_frame)
|
||||
{
|
||||
/**
|
||||
* Copy the FTIE sent by the AP in the auth request frame.
|
||||
* This is required for FT-FILS connection.
|
||||
* This FTIE will be sent in Assoc request frame without
|
||||
* any modification.
|
||||
*/
|
||||
if (auth->FTInfo.present) {
|
||||
pe_debug("FT-FILS: r0kh_len:%d r1kh_present:%d",
|
||||
auth->FTInfo.R0KH_ID.num_PMK_R0_ID,
|
||||
auth->FTInfo.R1KH_ID.present);
|
||||
|
||||
auth_frame->ft_ie.present = 1;
|
||||
if (auth->FTInfo.R1KH_ID.present) {
|
||||
qdf_mem_copy(auth_frame->ft_ie.r1kh_id,
|
||||
auth->FTInfo.R1KH_ID.PMK_R1_ID,
|
||||
FT_R1KH_ID_LEN);
|
||||
}
|
||||
|
||||
if (auth->FTInfo.R0KH_ID.present) {
|
||||
qdf_mem_copy(auth_frame->ft_ie.r0kh_id,
|
||||
auth->FTInfo.R0KH_ID.PMK_R0_ID,
|
||||
auth->FTInfo.R0KH_ID.num_PMK_R0_ID);
|
||||
auth_frame->ft_ie.r0kh_id_len =
|
||||
auth->FTInfo.R0KH_ID.num_PMK_R0_ID;
|
||||
}
|
||||
|
||||
if (auth_frame->ft_ie.gtk_ie.present) {
|
||||
pe_debug("FT-FILS: GTK present");
|
||||
qdf_mem_copy(&auth_frame->ft_ie.gtk_ie,
|
||||
&auth->FTInfo.GTK,
|
||||
sizeof(struct mac_ft_gtk_ie));
|
||||
}
|
||||
|
||||
if (auth_frame->ft_ie.igtk_ie.present) {
|
||||
pe_debug("FT-FILS: IGTK present");
|
||||
qdf_mem_copy(&auth_frame->ft_ie.igtk_ie,
|
||||
&auth->FTInfo.IGTK,
|
||||
sizeof(struct mac_ft_igtk_ie));
|
||||
}
|
||||
|
||||
qdf_mem_copy(auth_frame->ft_ie.anonce, auth->FTInfo.Anonce,
|
||||
FT_NONCE_LEN);
|
||||
qdf_mem_copy(auth_frame->ft_ie.snonce, auth->FTInfo.Snonce,
|
||||
FT_NONCE_LEN);
|
||||
|
||||
qdf_mem_copy(auth_frame->ft_ie.mic, auth->FTInfo.MIC,
|
||||
FT_MIC_LEN);
|
||||
auth_frame->ft_ie.element_count = auth->FTInfo.IECount;
|
||||
}
|
||||
}
|
||||
|
||||
/* sir_update_auth_frame2_struct_fils_conf: API to update fils info from auth
|
||||
* packet type 2
|
||||
* @auth: auth packet pointer received from AP
|
||||
|
|
@ -4174,8 +4237,9 @@ sir_convert_beacon_frame2_struct(struct mac_context *mac,
|
|||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void sir_update_auth_frame2_struct_fils_conf(tDot11fAuthentication *auth,
|
||||
tpSirMacAuthFrameBody auth_frame)
|
||||
static void
|
||||
sir_update_auth_frame2_struct_fils_conf(tDot11fAuthentication *auth,
|
||||
tpSirMacAuthFrameBody auth_frame)
|
||||
{
|
||||
if (auth->AuthAlgo.algo != SIR_FILS_SK_WITHOUT_PFS)
|
||||
return;
|
||||
|
|
@ -4204,6 +4268,9 @@ static void sir_update_auth_frame2_struct_fils_conf(tDot11fAuthentication *auth,
|
|||
auth->RSNOpaque.num_data);
|
||||
auth_frame->rsn_ie.length = auth->RSNOpaque.num_data;
|
||||
}
|
||||
|
||||
update_ftie_in_fils_conf(auth, auth_frame);
|
||||
|
||||
}
|
||||
#else
|
||||
static void sir_update_auth_frame2_struct_fils_conf(tDot11fAuthentication *auth,
|
||||
|
|
|
|||
Loading…
Reference in a new issue