Fix Suite B 192-bit AKM to use proper PMK length
In addition to the PTK length increasing, the length of the PMK was increased (from 256 to 384 bits) for the 00-0f-ac:12 AKM. This part was missing from the initial implementation and a fixed length (256-bit) PMK was used for all AKMs. Fix this by adding more complete support for variable length PMK and use 384 bits from MSK instead of 256 bits when using this AKM. This is not backwards compatible with the earlier implementations. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
ae7d9fbd3d
commit
207976f053
11 changed files with 73 additions and 27 deletions
|
@ -130,7 +130,7 @@ pmksa_cache_add(struct rsn_pmksa_cache *pmksa, const u8 *pmk, size_t pmk_len,
|
|||
struct rsn_pmksa_cache_entry *entry, *pos, *prev;
|
||||
struct os_reltime now;
|
||||
|
||||
if (pmk_len > PMK_LEN)
|
||||
if (pmk_len > PMK_LEN_MAX)
|
||||
return NULL;
|
||||
|
||||
if (wpa_key_mgmt_suite_b(akmp) && !kck)
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
struct rsn_pmksa_cache_entry {
|
||||
struct rsn_pmksa_cache_entry *next;
|
||||
u8 pmkid[PMKID_LEN];
|
||||
u8 pmk[PMK_LEN];
|
||||
u8 pmk[PMK_LEN_MAX];
|
||||
size_t pmk_len;
|
||||
os_time_t expiration;
|
||||
int akmp; /* WPA_KEY_MGMT_* */
|
||||
|
|
|
@ -206,15 +206,21 @@ static int wpa_supplicant_get_pmk(struct wpa_sm *sm,
|
|||
#endif /* CONFIG_IEEE80211R */
|
||||
} else if (wpa_key_mgmt_wpa_ieee8021x(sm->key_mgmt) && sm->eapol) {
|
||||
int res, pmk_len;
|
||||
pmk_len = PMK_LEN;
|
||||
res = eapol_sm_get_key(sm->eapol, sm->pmk, PMK_LEN);
|
||||
|
||||
if (sm->key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
|
||||
pmk_len = PMK_LEN_SUITE_B_192;
|
||||
else
|
||||
pmk_len = PMK_LEN;
|
||||
res = eapol_sm_get_key(sm->eapol, sm->pmk, pmk_len);
|
||||
if (res) {
|
||||
/*
|
||||
* EAP-LEAP is an exception from other EAP methods: it
|
||||
* uses only 16-byte PMK.
|
||||
*/
|
||||
res = eapol_sm_get_key(sm->eapol, sm->pmk, 16);
|
||||
pmk_len = 16;
|
||||
if (pmk_len == PMK_LEN) {
|
||||
/*
|
||||
* EAP-LEAP is an exception from other EAP
|
||||
* methods: it uses only 16-byte PMK.
|
||||
*/
|
||||
res = eapol_sm_get_key(sm->eapol, sm->pmk, 16);
|
||||
pmk_len = 16;
|
||||
}
|
||||
} else {
|
||||
#ifdef CONFIG_IEEE80211R
|
||||
u8 buf[2 * PMK_LEN];
|
||||
|
|
|
@ -19,7 +19,7 @@ struct wpa_eapol_key;
|
|||
* struct wpa_sm - Internal WPA state machine data
|
||||
*/
|
||||
struct wpa_sm {
|
||||
u8 pmk[PMK_LEN];
|
||||
u8 pmk[PMK_LEN_MAX];
|
||||
size_t pmk_len;
|
||||
struct wpa_ptk ptk, tptk;
|
||||
int ptk_set, tptk_set;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue