Commit 1b96175b authored by Senthil Balasubramanian's avatar Senthil Balasubramanian Committed by John W. Linville

ath9k: Incorrect key used when group and pairwise ciphers are different.

Updating sc_keytype multiple times when groupwise and pairwise
ciphers are different results in incorrect pairwise key type
assumed for TX control and normal ping fails. This works fine
for cases where both groupwise and pairwise ciphers are same.

Also use mac80211 provided enums for key length calculation.
Signed-off-by: default avatarSenthil Balasubramanian <senthilkumar@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 445df54f
...@@ -7285,15 +7285,15 @@ ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry, ...@@ -7285,15 +7285,15 @@ ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry,
} }
break; break;
case ATH9K_CIPHER_WEP: case ATH9K_CIPHER_WEP:
if (k->kv_len < 40 / NBBY) { if (k->kv_len < LEN_WEP40) {
DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE, DPRINTF(ah->ah_sc, ATH_DBG_KEYCACHE,
"%s: WEP key length %u too small\n", "%s: WEP key length %u too small\n",
__func__, k->kv_len); __func__, k->kv_len);
return false; return false;
} }
if (k->kv_len <= 40 / NBBY) if (k->kv_len <= LEN_WEP40)
keyType = AR_KEYTABLE_TYPE_40; keyType = AR_KEYTABLE_TYPE_40;
else if (k->kv_len <= 104 / NBBY) else if (k->kv_len <= LEN_WEP104)
keyType = AR_KEYTABLE_TYPE_104; keyType = AR_KEYTABLE_TYPE_104;
else else
keyType = AR_KEYTABLE_TYPE_128; keyType = AR_KEYTABLE_TYPE_128;
...@@ -7313,7 +7313,7 @@ ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry, ...@@ -7313,7 +7313,7 @@ ath9k_hw_set_keycache_entry(struct ath_hal *ah, u16 entry,
key2 = get_unaligned_le32(k->kv_val + 6) ^ xorMask; key2 = get_unaligned_le32(k->kv_val + 6) ^ xorMask;
key3 = (get_unaligned_le16(k->kv_val + 10) ^ xorMask) & 0xffff; key3 = (get_unaligned_le16(k->kv_val + 10) ^ xorMask) & 0xffff;
key4 = get_unaligned_le32(k->kv_val + 12) ^ xorMask; key4 = get_unaligned_le32(k->kv_val + 12) ^ xorMask;
if (k->kv_len <= 104 / NBBY) if (k->kv_len <= LEN_WEP104)
key4 &= 0xff; key4 &= 0xff;
if (keyType == AR_KEYTABLE_TYPE_TKIP && ATH9K_IS_MIC_ENABLED(ah)) { if (keyType == AR_KEYTABLE_TYPE_TKIP && ATH9K_IS_MIC_ENABLED(ah)) {
......
...@@ -206,7 +206,8 @@ static int ath_key_config(struct ath_softc *sc, ...@@ -206,7 +206,8 @@ static int ath_key_config(struct ath_softc *sc,
if (!ret) if (!ret)
return -EIO; return -EIO;
sc->sc_keytype = hk.kv_type; if (mac)
sc->sc_keytype = hk.kv_type;
return 0; return 0;
} }
...@@ -756,7 +757,8 @@ static int ath9k_set_key(struct ieee80211_hw *hw, ...@@ -756,7 +757,8 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
key->hw_key_idx = key->keyidx; key->hw_key_idx = key->keyidx;
/* push IV and Michael MIC generation to stack */ /* push IV and Michael MIC generation to stack */
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; if (key->alg == ALG_TKIP)
key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
} }
break; break;
case DISABLE_KEY: case DISABLE_KEY:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment