PASN: Add set and get API for PASN data context

Modules that use libpasn for PASN authentication need the context of
PASN data. PASN data is a common context for the library and the modules
using it. Hence, initialize the context through init and deinit
functions. Also use set and get functions to update the parameters.

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
This commit is contained in:
Vinay Gannevaram 2024-03-29 15:17:42 +05:30 committed by Jouni Malinen
parent ab37a57314
commit 147f836924
11 changed files with 388 additions and 73 deletions

View file

@ -1051,6 +1051,7 @@ OBJS += src/ap/wmm.c
OBJS += src/ap/ap_list.c
OBJS += src/ap/comeback_token.c
OBJS += src/pasn/pasn_responder.c
OBJS += src/pasn/pasn_common.c
OBJS += src/ap/ieee802_11.c
OBJS += src/ap/hw_features.c
OBJS += src/ap/dfs.c

View file

@ -1197,6 +1197,7 @@ OBJS += ../src/ap/wmm.o
OBJS += ../src/ap/ap_list.o
OBJS += ../src/ap/comeback_token.o
OBJS += ../src/pasn/pasn_responder.o
OBJS += ../src/pasn/pasn_common.o
OBJS += ../src/ap/ieee802_11.o
OBJS += ../src/ap/hw_features.o
OBJS += ../src/ap/dfs.o

View file

@ -2403,7 +2403,7 @@ static void pasn_fils_auth_resp(struct hostapd_data *hapd,
wpa_hexdump(MSG_DEBUG, "RSN: Generated FILS ANonce",
fils->anonce, FILS_NONCE_LEN);
ret = fils_rmsk_to_pmk(pasn->akmp, msk, msk_len, fils->nonce,
ret = fils_rmsk_to_pmk(pasn_get_akmp(pasn), msk, msk_len, fils->nonce,
fils->anonce, NULL, 0, pmk, &pmk_len);
if (ret) {
wpa_printf(MSG_DEBUG, "FILS: Failed to derive PMK");
@ -2413,15 +2413,16 @@ static void pasn_fils_auth_resp(struct hostapd_data *hapd,
ret = pasn_pmk_to_ptk(pmk, pmk_len, sta->addr, hapd->own_addr,
wpabuf_head(pasn->secret),
wpabuf_len(pasn->secret),
&sta->pasn->ptk, sta->pasn->akmp,
sta->pasn->cipher, sta->pasn->kdk_len);
pasn_get_ptk(sta->pasn), pasn_get_akmp(sta->pasn),
pasn_get_cipher(sta->pasn), sta->pasn->kdk_len);
if (ret) {
wpa_printf(MSG_DEBUG, "PASN: FILS: Failed to derive PTK");
goto fail;
}
if (pasn->secure_ltf) {
ret = wpa_ltf_keyseed(&pasn->ptk, pasn->akmp, pasn->cipher);
ret = wpa_ltf_keyseed(pasn_get_ptk(pasn), pasn_get_akmp(pasn),
pasn_get_cipher(pasn));
if (ret) {
wpa_printf(MSG_DEBUG,
"PASN: FILS: Failed to derive LTF keyseed");
@ -2567,7 +2568,8 @@ static int pasn_wd_handle_fils(struct hostapd_data *hapd, struct sta_info *sta,
* Calculate pending PMKID here so that we do not need to maintain a
* copy of the EAP-Initiate/Reautt message.
*/
fils_pmkid_erp(pasn->akmp, wpabuf_head(fils_wd), wpabuf_len(fils_wd),
fils_pmkid_erp(pasn_get_akmp(pasn),
wpabuf_head(fils_wd), wpabuf_len(fils_wd),
fils->erp_pmkid);
wpabuf_free(fils_wd);
@ -2592,32 +2594,35 @@ static void hapd_initialize_pasn(struct hostapd_data *hapd,
{
struct pasn_data *pasn = sta->pasn;
pasn->cb_ctx = hapd;
pasn->send_mgmt = hapd_pasn_send_mlme;
pasn_register_callbacks(pasn, hapd, hapd_pasn_send_mlme, NULL);
pasn_set_bssid(pasn, hapd->own_addr);
pasn_set_own_addr(pasn, hapd->own_addr);
pasn_set_peer_addr(pasn, sta->addr);
pasn_set_wpa_key_mgmt(pasn, hapd->conf->wpa_key_mgmt);
pasn_set_rsn_pairwise(pasn, hapd->conf->rsn_pairwise);
pasn->pasn_groups = hapd->conf->pasn_groups;
pasn->noauth = hapd->conf->pasn_noauth;
pasn->wpa_key_mgmt = hapd->conf->wpa_key_mgmt;
pasn->rsn_pairwise = hapd->conf->rsn_pairwise;
pasn->derive_kdk = hapd->iface->drv_flags2 &
WPA_DRIVER_FLAGS2_SEC_LTF_AP;
if (hapd->iface->drv_flags2 & WPA_DRIVER_FLAGS2_SEC_LTF_AP)
pasn_enable_kdk_derivation(pasn);
#ifdef CONFIG_TESTING_OPTIONS
pasn->corrupt_mic = hapd->conf->pasn_corrupt_mic;
if (hapd->conf->force_kdk_derivation)
pasn->derive_kdk = true;
pasn_enable_kdk_derivation(pasn);
#endif /* CONFIG_TESTING_OPTIONS */
pasn->use_anti_clogging = use_anti_clogging(hapd);
pasn->password = sae_get_password(hapd, sta, NULL, NULL, &pasn->pt,
NULL);
pasn_set_password(pasn, sae_get_password(hapd, sta, NULL, NULL,
&pasn->pt, NULL));
pasn->rsn_ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &pasn->rsn_ie_len);
pasn->rsnxe_ie = hostapd_wpa_ie(hapd, WLAN_EID_RSNX);
pasn_set_rsnxe_ie(pasn, hostapd_wpa_ie(hapd, WLAN_EID_RSNX));
pasn->disable_pmksa_caching = hapd->conf->disable_pmksa_caching;
pasn->pmksa = wpa_auth_get_pmksa_cache(hapd->wpa_auth);
pasn_set_responder_pmksa(pasn,
wpa_auth_get_pmksa_cache(hapd->wpa_auth));
pasn->comeback_after = hapd->conf->pasn_comeback_after;
pasn->comeback_idx = hapd->comeback_idx;
pasn->comeback_key = hapd->comeback_key;
pasn->comeback_pending_idx = hapd->comeback_pending_idx;
os_memcpy(pasn->bssid, hapd->own_addr, ETH_ALEN);
}
@ -2665,6 +2670,7 @@ static void hapd_pasn_update_params(struct hostapd_data *hapd,
struct wpa_pasn_params_data pasn_params;
struct wpabuf *wrapped_data = NULL;
#endif /* CONFIG_FILS */
int akmp;
if (ieee802_11_parse_elems(mgmt->u.auth.variable,
len - offsetof(struct ieee80211_mgmt,
@ -2688,10 +2694,12 @@ static void hapd_pasn_update_params(struct hostapd_data *hapd,
return;
}
pasn->akmp = rsn_data.key_mgmt;
pasn->cipher = rsn_data.pairwise_cipher;
pasn_set_akmp(pasn, rsn_data.key_mgmt);
pasn_set_cipher(pasn, rsn_data.pairwise_cipher);
if (wpa_key_mgmt_ft(pasn->akmp) && rsn_data.num_pmkid) {
akmp = pasn_get_akmp(pasn);
if (wpa_key_mgmt_ft(akmp) && rsn_data.num_pmkid) {
#ifdef CONFIG_IEEE80211R_AP
pasn->pmk_r1_len = 0;
wpa_ft_fetch_pmk_r1(hapd->wpa_auth, sta->addr,
@ -2702,8 +2710,8 @@ static void hapd_pasn_update_params(struct hostapd_data *hapd,
#endif /* CONFIG_IEEE80211R_AP */
}
#ifdef CONFIG_FILS
if (pasn->akmp != WPA_KEY_MGMT_FILS_SHA256 &&
pasn->akmp != WPA_KEY_MGMT_FILS_SHA384)
if (akmp != WPA_KEY_MGMT_FILS_SHA256 &&
akmp != WPA_KEY_MGMT_FILS_SHA384)
return;
if (!elems.pasn_params ||
wpa_pasn_parse_parameter_ie(elems.pasn_params - 3,
@ -2756,7 +2764,7 @@ static void handle_auth_pasn(struct hostapd_data *hapd, struct sta_info *sta,
return;
}
sta->pasn = os_zalloc(sizeof(*sta->pasn));
sta->pasn = pasn_data_init();
if (!sta->pasn) {
wpa_printf(MSG_DEBUG,
"PASN: Failed to allocate PASN context");
@ -2786,13 +2794,14 @@ static void handle_auth_pasn(struct hostapd_data *hapd, struct sta_info *sta,
if (handle_auth_pasn_3(sta->pasn, hapd->own_addr,
sta->addr, mgmt, len) == 0) {
ptksa_cache_add(hapd->ptksa, hapd->own_addr, sta->addr,
sta->pasn->cipher, 43200,
&sta->pasn->ptk, NULL, NULL,
sta->pasn->akmp);
pasn_get_cipher(sta->pasn), 43200,
pasn_get_ptk(sta->pasn), NULL, NULL,
pasn_get_akmp(sta->pasn));
pasn_set_keys_from_cache(hapd, hapd->own_addr,
sta->addr, sta->pasn->cipher,
sta->pasn->akmp);
sta->addr,
pasn_get_cipher(sta->pasn),
pasn_get_akmp(sta->pasn));
}
ap_free_sta(hapd, sta);
} else {

View file

@ -180,7 +180,7 @@ void ap_free_sta_pasn(struct hostapd_data *hapd, struct sta_info *sta)
sta->pasn->fils.erp_resp = NULL;
#endif /* CONFIG_FILS */
bin_clear_free(sta->pasn, sizeof(*sta->pasn));
pasn_data_deinit(sta->pasn);
sta->pasn = NULL;
}
}

232
src/pasn/pasn_common.c Normal file
View file

@ -0,0 +1,232 @@
/*
* PASN common processing
*
* Copyright (C) 2024, Qualcomm Innovation Center, Inc.
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#include "utils/includes.h"
#include "utils/common.h"
#include "common/wpa_common.h"
#include "common/sae.h"
#include "crypto/sha384.h"
#include "crypto/crypto.h"
#include "common/ieee802_11_defs.h"
#include "pasn_common.h"
struct pasn_data * pasn_data_init(void)
{
struct pasn_data *pasn = os_zalloc(sizeof(struct pasn_data));
return pasn;
}
void pasn_data_deinit(struct pasn_data *pasn)
{
bin_clear_free(pasn, sizeof(struct pasn_data));
}
void pasn_register_callbacks(struct pasn_data *pasn, void *cb_ctx,
int (*send_mgmt)(void *ctx, const u8 *data,
size_t data_len, int noack,
unsigned int freq,
unsigned int wait),
int (*validate_custom_pmkid)(void *ctx,
const u8 *addr,
const u8 *pmkid))
{
if (!pasn)
return;
pasn->cb_ctx = cb_ctx;
pasn->send_mgmt = send_mgmt;
pasn->validate_custom_pmkid = validate_custom_pmkid;
}
void pasn_enable_kdk_derivation(struct pasn_data *pasn)
{
if (!pasn)
return;
pasn->derive_kdk = true;
pasn->kdk_len = WPA_KDK_MAX_LEN;
}
void pasn_disable_kdk_derivation(struct pasn_data *pasn)
{
if (!pasn)
return;
pasn->derive_kdk = false;
pasn->kdk_len = 0;
}
void pasn_set_akmp(struct pasn_data *pasn, int akmp)
{
if (!pasn)
return;
pasn->akmp = akmp;
}
void pasn_set_cipher(struct pasn_data *pasn, int cipher)
{
if (!pasn)
return;
pasn->cipher = cipher;
}
void pasn_set_own_addr(struct pasn_data *pasn, const u8 *addr)
{
if (!pasn || !addr)
return;
os_memcpy(pasn->own_addr, addr, ETH_ALEN);
}
void pasn_set_peer_addr(struct pasn_data *pasn, const u8 *addr)
{
if (!pasn || !addr)
return;
os_memcpy(pasn->peer_addr, addr, ETH_ALEN);
}
void pasn_set_bssid(struct pasn_data *pasn, const u8 *addr)
{
if (!pasn || !addr)
return;
os_memcpy(pasn->bssid, addr, ETH_ALEN);
}
int pasn_set_pt(struct pasn_data *pasn, struct sae_pt *pt)
{
if (!pasn)
return -1;
#ifdef CONFIG_SAE
pasn->pt = pt;
return 0;
#else /* CONFIG_SAE */
return -1;
#endif /* CONFIG_SAE */
}
void pasn_set_password(struct pasn_data *pasn, const char *password)
{
if (!pasn)
return;
pasn->password = password;
}
void pasn_set_wpa_key_mgmt(struct pasn_data *pasn, int key_mgmt)
{
if (!pasn)
return;
pasn->wpa_key_mgmt = key_mgmt;
}
void pasn_set_rsn_pairwise(struct pasn_data *pasn, int rsn_pairwise)
{
if (!pasn)
return;
pasn->rsn_pairwise = rsn_pairwise;
}
void pasn_set_rsnxe_caps(struct pasn_data *pasn, u16 rsnxe_capab)
{
if (!pasn)
return;
pasn->rsnxe_capab = rsnxe_capab;
}
void pasn_set_rsnxe_ie(struct pasn_data *pasn, const u8 *rsnxe_ie)
{
if (!pasn || !rsnxe_ie)
return;
pasn->rsnxe_ie = rsnxe_ie;
}
void pasn_set_custom_pmkid(struct pasn_data *pasn, const u8 *pmkid)
{
if (!pasn || !pmkid)
return;
os_memcpy(pasn->custom_pmkid, pmkid, PMKID_LEN);
pasn->custom_pmkid_valid = true;
}
int pasn_set_extra_ies(struct pasn_data *pasn, const u8 *extra_ies,
size_t extra_ies_len)
{
if (!pasn || !extra_ies_len || !extra_ies)
return -1;
if (pasn->extra_ies) {
os_free((u8 *) pasn->extra_ies);
pasn->extra_ies_len = extra_ies_len;
}
pasn->extra_ies = os_memdup(extra_ies, extra_ies_len);
if (!pasn->extra_ies) {
wpa_printf(MSG_ERROR,
"PASN: Extra IEs memory allocation failed");
return -1;
}
pasn->extra_ies_len = extra_ies_len;
return 0;
}
int pasn_get_akmp(struct pasn_data *pasn)
{
if (!pasn)
return 0;
return pasn->akmp;
}
int pasn_get_cipher(struct pasn_data *pasn)
{
if (!pasn)
return 0;
return pasn->cipher;
}
size_t pasn_get_pmk_len(struct pasn_data *pasn)
{
if (!pasn)
return 0;
return pasn->pmk_len;
}
u8 * pasn_get_pmk(struct pasn_data *pasn)
{
if (!pasn)
return NULL;
return pasn->pmk;
}
struct wpa_ptk * pasn_get_ptk(struct pasn_data *pasn)
{
if (!pasn)
return NULL;
return &pasn->ptk;
}

View file

@ -16,8 +16,6 @@
extern "C" {
#endif
#ifdef CONFIG_PASN
enum pasn_fils_state {
PASN_FILS_STATE_NONE = 0,
PASN_FILS_STATE_PENDING_AS,
@ -35,19 +33,46 @@ struct pasn_fils {
};
struct pasn_data {
/* External modules access below variables using setter and getter
* functions */
int akmp;
int cipher;
u8 own_addr[ETH_ALEN];
u8 peer_addr[ETH_ALEN];
u8 bssid[ETH_ALEN];
struct rsn_pmksa_cache *pmksa;
bool derive_kdk;
size_t kdk_len;
void *cb_ctx;
#ifdef CONFIG_SAE
struct sae_pt *pt;
#endif /* CONFIG_SAE */
/* Responder */
const char *password;
int wpa_key_mgmt;
int rsn_pairwise;
u16 rsnxe_capab;
const u8 *rsnxe_ie;
bool custom_pmkid_valid;
u8 custom_pmkid[PMKID_LEN];
/*
* Extra elements to add into Authentication frames. These can be used,
* e.g., for Wi-Fi Aware use cases.
*/
const u8 *extra_ies;
size_t extra_ies_len;
/* External modules do not access below variables */
u16 group;
bool secure_ltf;
int freq;
size_t kdk_len;
u8 trans_seq;
u8 status;
u8 own_addr[ETH_ALEN];
u8 peer_addr[ETH_ALEN];
u8 bssid[ETH_ALEN];
size_t pmk_len;
u8 pmk[PMK_LEN_MAX];
bool using_pmksa;
@ -63,7 +88,6 @@ struct pasn_data {
#ifdef CONFIG_SAE
struct sae_data sae;
struct sae_pt *pt;
#endif /* CONFIG_SAE */
#ifdef CONFIG_FILS
@ -81,15 +105,12 @@ struct pasn_data {
* differently for the PASN initiator (using RSN Supplicant
* implementation) and PASN responser (using RSN Authenticator
* implementation). Functions cannot be mixed between those cases. */
struct rsn_pmksa_cache *pmksa;
struct rsn_pmksa_cache_entry *pmksa_entry;
struct eapol_sm *eapol;
int fast_reauth;
#ifdef CONFIG_TESTING_OPTIONS
int corrupt_mic;
#endif /* CONFIG_TESTING_OPTIONS */
void *cb_ctx;
u16 rsnxe_capab;
int network_id;
u8 wrapped_data_format;
@ -97,16 +118,11 @@ struct pasn_data {
/* Responder */
bool noauth; /* Whether PASN without mutual authentication is enabled */
int wpa_key_mgmt;
int rsn_pairwise;
bool derive_kdk;
const char *password;
int disable_pmksa_caching;
int *pasn_groups;
struct wpabuf *wrapped_data;
int use_anti_clogging;
const u8 *rsn_ie;
const u8 *rsnxe_ie;
size_t rsn_ie_len;
u8 *comeback_key;
@ -114,16 +130,6 @@ struct pasn_data {
u16 comeback_idx;
u16 *comeback_pending_idx;
bool custom_pmkid_valid;
u8 custom_pmkid[PMKID_LEN];
/**
* Extra elements to add into Authentication frames. These can be used,
* e.g., for Wi-Fi Aware use cases.
*/
const u8 *extra_ies;
size_t extra_ies_len;
/**
* send_mgmt - Function handler to transmit a Management frame
* @ctx: Callback context from cb_ctx
@ -147,7 +153,6 @@ struct pasn_data {
};
/* Initiator */
void wpa_pasn_reset(struct pasn_data *pasn);
int wpas_pasn_start(struct pasn_data *pasn, const u8 *own_addr,
const u8 *peer_addr, const u8 *bssid,
@ -177,7 +182,45 @@ int handle_auth_pasn_resp(struct pasn_data *pasn, const u8 *own_addr,
const u8 *peer_addr,
struct rsn_pmksa_cache_entry *pmksa, u16 status);
#endif /* CONFIG_PASN */
struct pasn_data * pasn_data_init(void);
void pasn_data_deinit(struct pasn_data *pasn);
void pasn_register_callbacks(struct pasn_data *pasn, void *cb_ctx,
int (*send_mgmt)(void *ctx, const u8 *data,
size_t data_len, int noack,
unsigned int freq,
unsigned int wait),
int (*validate_custom_pmkid)(void *ctx,
const u8 *addr,
const u8 *pmkid));
void pasn_enable_kdk_derivation(struct pasn_data *pasn);
void pasn_disable_kdk_derivation(struct pasn_data *pasn);
void pasn_set_akmp(struct pasn_data *pasn, int akmp);
void pasn_set_cipher(struct pasn_data *pasn, int cipher);
void pasn_set_own_addr(struct pasn_data *pasn, const u8 *addr);
void pasn_set_peer_addr(struct pasn_data *pasn, const u8 *addr);
void pasn_set_bssid(struct pasn_data *pasn, const u8 *addr);
void pasn_set_initiator_pmksa(struct pasn_data *pasn,
struct rsn_pmksa_cache *pmksa);
void pasn_set_responder_pmksa(struct pasn_data *pasn,
struct rsn_pmksa_cache *pmksa);
int pasn_set_pt(struct pasn_data *pasn, struct sae_pt *pt);
/* Responder */
void pasn_set_password(struct pasn_data *pasn, const char *password);
void pasn_set_wpa_key_mgmt(struct pasn_data *pasn, int key_mgmt);
void pasn_set_rsn_pairwise(struct pasn_data *pasn, int rsn_pairwise);
void pasn_set_rsnxe_caps(struct pasn_data *pasn, u16 rsnxe_capab);
void pasn_set_rsnxe_ie(struct pasn_data *pasn, const u8 *rsnxe_ie);
void pasn_set_custom_pmkid(struct pasn_data *pasn, const u8 *pmkid);
int pasn_set_extra_ies(struct pasn_data *pasn, const u8 *extra_ies,
size_t extra_ies_len);
int pasn_get_akmp(struct pasn_data *pasn);
int pasn_get_cipher(struct pasn_data *pasn);
size_t pasn_get_pmk_len(struct pasn_data *pasn);
u8 * pasn_get_pmk(struct pasn_data *pasn);
struct wpa_ptk * pasn_get_ptk(struct pasn_data *pasn);
#ifdef __cplusplus
}

View file

@ -26,6 +26,14 @@
#include "pasn_common.h"
void pasn_set_initiator_pmksa(struct pasn_data *pasn,
struct rsn_pmksa_cache *pmksa)
{
if (pasn)
pasn->pmksa = pmksa;
}
#ifdef CONFIG_SAE
static struct wpabuf * wpas_pasn_wd_sae_commit(struct pasn_data *pasn)
@ -741,6 +749,11 @@ void wpa_pasn_reset(struct pasn_data *pasn)
pasn->rsn_ie_len = 0;
pasn->rsnxe_ie = NULL;
pasn->custom_pmkid_valid = false;
if (pasn->extra_ies) {
os_free((u8 *) pasn->extra_ies);
pasn->extra_ies = NULL;
}
}

View file

@ -25,6 +25,15 @@
#include "ap/pmksa_cache_auth.h"
#include "pasn_common.h"
void pasn_set_responder_pmksa(struct pasn_data *pasn,
struct rsn_pmksa_cache *pmksa)
{
if (pasn)
pasn->pmksa = pmksa;
}
#ifdef CONFIG_PASN
#ifdef CONFIG_SAE

View file

@ -391,6 +391,7 @@ NEED_HMAC_SHA384_KDF=y
NEED_SHA256=y
NEED_SHA384=y
OBJS += src/pasn/pasn_initiator.c
OBJS += src/pasn/pasn_common.c
OBJS += pasn_supplicant.c
endif
@ -1890,6 +1891,7 @@ endif
PASNOBJS += src/pasn/pasn_initiator.c
PASNOBJS += src/pasn/pasn_responder.c
PASNOBJS += src/pasn/pasn_common.c
########################

View file

@ -433,6 +433,7 @@ NEED_HMAC_SHA384_KDF=y
NEED_SHA256=y
NEED_SHA384=y
OBJS += ../src/pasn/pasn_initiator.o
OBJS += ../src/pasn/pasn_common.o
OBJS += pasn_supplicant.o
endif
@ -2319,6 +2320,7 @@ endif
LIBPASNSO += ../src/pasn/pasn_initiator.c
LIBPASNSO += ../src/pasn/pasn_responder.c
LIBPASNSO += ../src/pasn/pasn_common.c
libpasn.so: $(LIBPASNSO)
@$(E) " CC $@ ($^)"

View file

@ -560,9 +560,10 @@ static void wpas_pasn_auth_start_cb(struct wpa_radio_work *work, int deinit)
derive_kdk = wpa_s->conf->force_kdk_derivation;
#endif /* CONFIG_TESTING_OPTIONS */
if (derive_kdk)
pasn->kdk_len = WPA_KDK_MAX_LEN;
pasn_enable_kdk_derivation(pasn);
else
pasn->kdk_len = 0;
pasn_disable_kdk_derivation(pasn);
wpa_printf(MSG_DEBUG, "PASN: kdk_len=%zu", pasn->kdk_len);
if ((wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SEC_LTF_STA) &&
@ -582,9 +583,8 @@ static void wpas_pasn_auth_start_cb(struct wpa_radio_work *work, int deinit)
capab |= BIT(WLAN_RSNX_CAPAB_SECURE_RTT);
if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_STA)
capab |= BIT(WLAN_RSNX_CAPAB_URNM_MFPR);
pasn->rsnxe_capab = capab;
pasn->send_mgmt = wpas_pasn_send_mlme;
pasn_set_rsnxe_caps(pasn, capab);
pasn_register_callbacks(pasn, wpa_s, wpas_pasn_send_mlme, NULL);
ssid = wpa_config_get_network(wpa_s->conf, awork->network_id);
#ifdef CONFIG_SAE
@ -594,7 +594,7 @@ static void wpas_pasn_auth_start_cb(struct wpa_radio_work *work, int deinit)
"PASN: No network profile found for SAE");
goto fail;
}
pasn->pt = wpas_pasn_sae_derive_pt(ssid, awork->group);
pasn_set_pt(pasn, wpas_pasn_sae_derive_pt(ssid, awork->group));
if (!pasn->pt) {
wpa_printf(MSG_DEBUG, "PASN: Failed to derive PT");
goto fail;
@ -629,8 +629,7 @@ static void wpas_pasn_auth_start_cb(struct wpa_radio_work *work, int deinit)
}
#endif /* CONFIG_FILS */
pasn->cb_ctx = wpa_s;
pasn->pmksa = wpa_sm_get_pmksa_cache(wpa_s->wpa);
pasn_set_initiator_pmksa(pasn, wpa_sm_get_pmksa_cache(wpa_s->wpa));
if (wpa_key_mgmt_ft(awork->akmp)) {
#ifdef CONFIG_IEEE80211R
@ -753,7 +752,8 @@ void wpas_pasn_auth_stop(struct wpa_supplicant *wpa_s)
wpa_printf(MSG_DEBUG, "PASN: Stopping authentication");
wpas_pasn_auth_status(wpa_s, pasn->peer_addr, pasn->akmp, pasn->cipher,
wpas_pasn_auth_status(wpa_s, pasn->peer_addr, pasn_get_akmp(pasn),
pasn_get_cipher(pasn),
pasn->status, pasn->comeback,
pasn->comeback_after);
@ -765,8 +765,8 @@ static int wpas_pasn_immediate_retry(struct wpa_supplicant *wpa_s,
struct pasn_data *pasn,
struct wpa_pasn_params_data *params)
{
int akmp = pasn->akmp;
int cipher = pasn->cipher;
int akmp = pasn_get_akmp(pasn);
int cipher = pasn_get_cipher(pasn);
u16 group = pasn->group;
u8 own_addr[ETH_ALEN];
u8 peer_addr[ETH_ALEN];
@ -806,20 +806,22 @@ int wpas_pasn_auth_rx(struct wpa_supplicant *wpa_s,
if (!wpa_s->pasn_auth_work)
return -2;
pasn->cb_ctx = wpa_s;
pasn_register_callbacks(pasn, wpa_s, wpas_pasn_send_mlme, NULL);
ret = wpa_pasn_auth_rx(pasn, (const u8 *) mgmt, len, &pasn_data);
if (ret == 0) {
ptksa_cache_add(wpa_s->ptksa, pasn->own_addr, pasn->peer_addr,
pasn->cipher, dot11RSNAConfigPMKLifetime,
&pasn->ptk,
pasn_get_cipher(pasn),
dot11RSNAConfigPMKLifetime,
pasn_get_ptk(pasn),
wpa_s->pasn_params ? wpas_pasn_deauth_cb : NULL,
wpa_s->pasn_params ? wpa_s : NULL, pasn->akmp);
wpa_s->pasn_params ? wpa_s : NULL,
pasn_get_akmp(pasn));
if (pasn->pmksa_entry)
wpa_sm_set_cur_pmksa(wpa_s->wpa, pasn->pmksa_entry);
}
forced_memzero(&pasn->ptk, sizeof(pasn->ptk));
forced_memzero(pasn_get_ptk(pasn), sizeof(pasn->ptk));
if (ret == -1) {
wpas_pasn_auth_stop(wpa_s);
@ -909,7 +911,8 @@ int wpas_pasn_auth_tx_status(struct wpa_supplicant *wpa_s,
}
wpas_pasn_set_keys_from_cache(wpa_s, pasn->own_addr, pasn->peer_addr,
pasn->cipher, pasn->akmp);
pasn_get_cipher(pasn),
pasn_get_akmp(pasn));
wpas_pasn_auth_stop(wpa_s);
wpas_pasn_auth_work_done(wpa_s, PASN_STATUS_SUCCESS);