Fix PTK derivation for CCMP-256 and GCMP-256

Incorrect PTK length was used in PMK-to-PTK derivation and the Michael
MIC TX/RX key swapping code was incorrectly executed for these ciphers
on supplicant side.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jouni Malinen 2014-03-11 15:00:09 +02:00 committed by Jouni Malinen
parent e6ef73f188
commit 3b9c5176d1
2 changed files with 8 additions and 6 deletions

View file

@ -1813,7 +1813,7 @@ SM_STATE(WPA_PTK, PTKSTART)
static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *pmk, static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *pmk,
struct wpa_ptk *ptk) struct wpa_ptk *ptk)
{ {
size_t ptk_len = sm->pairwise != WPA_CIPHER_TKIP ? 48 : 64; size_t ptk_len = wpa_cipher_key_len(sm->pairwise) + 32;
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) if (wpa_key_mgmt_ft(sm->wpa_key_mgmt))
return wpa_auth_derive_ptk_ft(sm, pmk, ptk, ptk_len); return wpa_auth_derive_ptk_ft(sm, pmk, ptk, ptk_len);

View file

@ -362,7 +362,7 @@ static int wpa_derive_ptk(struct wpa_sm *sm, const unsigned char *src_addr,
const struct wpa_eapol_key *key, const struct wpa_eapol_key *key,
struct wpa_ptk *ptk) struct wpa_ptk *ptk)
{ {
size_t ptk_len = sm->pairwise_cipher != WPA_CIPHER_TKIP ? 48 : 64; size_t ptk_len = wpa_cipher_key_len(sm->pairwise_cipher) + 32;
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
if (wpa_key_mgmt_ft(sm->key_mgmt)) if (wpa_key_mgmt_ft(sm->key_mgmt))
return wpa_derive_ptk_ft(sm, src_addr, key, ptk, ptk_len); return wpa_derive_ptk_ft(sm, src_addr, key, ptk, ptk_len);
@ -437,10 +437,12 @@ static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
* been verified when processing message 3/4. */ * been verified when processing message 3/4. */
ptk = &sm->tptk; ptk = &sm->tptk;
wpa_derive_ptk(sm, src_addr, key, ptk); wpa_derive_ptk(sm, src_addr, key, ptk);
/* Supplicant: swap tx/rx Mic keys */ if (sm->pairwise_cipher == WPA_CIPHER_TKIP) {
os_memcpy(buf, ptk->u.auth.tx_mic_key, 8); /* Supplicant: swap tx/rx Mic keys */
os_memcpy(ptk->u.auth.tx_mic_key, ptk->u.auth.rx_mic_key, 8); os_memcpy(buf, ptk->u.auth.tx_mic_key, 8);
os_memcpy(ptk->u.auth.rx_mic_key, buf, 8); os_memcpy(ptk->u.auth.tx_mic_key, ptk->u.auth.rx_mic_key, 8);
os_memcpy(ptk->u.auth.rx_mic_key, buf, 8);
}
sm->tptk_set = 1; sm->tptk_set = 1;
kde = sm->assoc_wpa_ie; kde = sm->assoc_wpa_ie;