|
@@ -109,6 +109,7 @@ static void pmksa_cache_set_expiration(struct rsn_pmksa_cache *pmksa)
|
|
|
* @pmksa: Pointer to PMKSA cache data from pmksa_cache_init()
|
|
|
* @pmk: The new pairwise master key
|
|
|
* @pmk_len: PMK length in bytes, usually PMK_LEN (32)
|
|
|
+ * @pmkid: Calculated PMKID
|
|
|
* @kck: Key confirmation key or %NULL if not yet derived
|
|
|
* @kck_len: KCK length in bytes
|
|
|
* @aa: Authenticator address
|
|
@@ -124,7 +125,7 @@ static void pmksa_cache_set_expiration(struct rsn_pmksa_cache *pmksa)
|
|
|
*/
|
|
|
struct rsn_pmksa_cache_entry *
|
|
|
pmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len,
|
|
|
- const u8 *kck, size_t kck_len,
|
|
|
+ const u8 *pmkid, const u8 *kck, size_t kck_len,
|
|
|
const u8 *aa, const u8 *spa, void *network_ctx, int akmp)
|
|
|
{
|
|
|
struct rsn_pmksa_cache_entry *entry, *pos, *prev;
|
|
@@ -141,7 +142,9 @@ pmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len,
|
|
|
return NULL;
|
|
|
os_memcpy(entry->pmk, pmk, pmk_len);
|
|
|
entry->pmk_len = pmk_len;
|
|
|
- if (akmp == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
|
|
|
+ if (pmkid)
|
|
|
+ os_memcpy(entry->pmkid, pmkid, PMKID_LEN);
|
|
|
+ else if (akmp == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
|
|
|
rsn_pmkid_suite_b_192(kck, kck_len, aa, spa, entry->pmkid);
|
|
|
else if (wpa_key_mgmt_suite_b(akmp))
|
|
|
rsn_pmkid_suite_b(kck, kck_len, aa, spa, entry->pmkid);
|
|
@@ -344,7 +347,7 @@ pmksa_cache_clone_entry(struct rsn_pmksa_cache *pmksa,
|
|
|
struct rsn_pmksa_cache_entry *new_entry;
|
|
|
|
|
|
new_entry = pmksa_cache_add(pmksa, old_entry->pmk, old_entry->pmk_len,
|
|
|
- NULL, 0,
|
|
|
+ NULL, NULL, 0,
|
|
|
aa, pmksa->sm->own_addr,
|
|
|
old_entry->network_ctx, old_entry->akmp);
|
|
|
if (new_entry == NULL)
|