wpa_supplicant: Set PMK from PMKSA incase of caching

This commit is contained in:
Shyamal Khachane 2023-01-05 14:56:55 +05:30
parent 7d70759991
commit a858328f3b
2 changed files with 21 additions and 22 deletions

View File

@ -114,6 +114,13 @@ static inline int wpa_key_mgmt_cckm(int akm)
return akm == WPA_KEY_MGMT_CCKM;
}
#ifdef ESP_SUPPLICANT
static inline int wpa_key_mgmt_supports_caching(int akm)
{
return wpa_key_mgmt_wpa_ieee8021x(akm) ||
wpa_key_mgmt_sae(akm);
}
#endif
#define WPA_PROTO_WPA BIT(0)
#define WPA_PROTO_RSN BIT(1)

View File

@ -2144,7 +2144,7 @@ int wpa_set_bss(char *macddr, char * bssid, u8 pairwise_cipher, u8 group_cipher,
{
int res = 0;
struct wpa_sm *sm = &gWpaSm;
bool use_pmk_cache = true;
bool use_pmk_cache = !esp_wifi_skip_supp_pmkcaching();
/* Incase AP has changed it's SSID, don't try with PMK caching for SAE connection */
if ((sm->key_mgmt == WPA_KEY_MGMT_SAE) &&
@ -2163,27 +2163,19 @@ int wpa_set_bss(char *macddr, char * bssid, u8 pairwise_cipher, u8 group_cipher,
sm->ap_notify_completed_rsne = esp_wifi_sta_is_ap_notify_completed_rsne_internal();
sm->use_ext_key_id = (sm->proto == WPA_PROTO_WPA);
if (sm->key_mgmt == WPA_KEY_MGMT_SAE ||
is_wpa2_enterprise_connection()) {
if (!esp_wifi_skip_supp_pmkcaching() && use_pmk_cache) {
if (pmksa_cache_set_current(sm, NULL, (const u8*) bssid, 0, 0) == 0) {
struct rsn_pmksa_cache_entry *pmksa = pmksa_cache_get_current(sm);
if (pmksa && (pmksa->akmp != sm->key_mgmt)) {
pmksa_cache_clear_current(sm);
pmksa_cache_flush(sm->pmksa, NULL, pmksa->pmk, pmksa->pmk_len);
}
} else {
wpa_sm_set_pmk_from_pmksa(sm);
}
} else {
struct rsn_pmksa_cache_entry *entry = NULL;
if (sm->pmksa) {
entry = pmksa_cache_get(sm->pmksa, (const u8 *)bssid, NULL, NULL);
}
if (entry) {
pmksa_cache_flush(sm->pmksa, NULL, entry->pmk, entry->pmk_len);
}
struct rsn_pmksa_cache_entry *pmksa = NULL;
if (use_pmk_cache) {
pmksa = pmksa_cache_get(sm->pmksa, (const u8 *)bssid, NULL, NULL);
if (pmksa && (pmksa->akmp != sm->key_mgmt)) {
use_pmk_cache = false;
}
}
if (wpa_key_mgmt_supports_caching(sm->key_mgmt) && use_pmk_cache) {
pmksa_cache_set_current(sm, NULL, (const u8*) bssid, 0, 0);
wpa_sm_set_pmk_from_pmksa(sm);
} else {
if (pmksa) {
pmksa_cache_flush(sm->pmksa, NULL, pmksa->pmk, pmksa->pmk_len);
}
}