diff options
Diffstat (limited to 'net/mac80211/tkip.c')
-rw-r--r-- | net/mac80211/tkip.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/net/mac80211/tkip.c b/net/mac80211/tkip.c index a00cf1ea7719..a2c8ca1100b2 100644 --- a/net/mac80211/tkip.c +++ b/net/mac80211/tkip.c | |||
@@ -64,6 +64,15 @@ static u16 tkipS(u16 val) | |||
64 | return tkip_sbox[val & 0xff] ^ swab16(tkip_sbox[val >> 8]); | 64 | return tkip_sbox[val & 0xff] ^ swab16(tkip_sbox[val >> 8]); |
65 | } | 65 | } |
66 | 66 | ||
67 | static u8 *write_tkip_iv(u8 *pos, u16 iv16) | ||
68 | { | ||
69 | *pos++ = iv16 >> 8; | ||
70 | *pos++ = ((iv16 >> 8) | 0x20) & 0x7f; | ||
71 | *pos++ = iv16 & 0xFF; | ||
72 | return pos; | ||
73 | } | ||
74 | |||
75 | |||
67 | /* | 76 | /* |
68 | * P1K := Phase1(TA, TK, TSC) | 77 | * P1K := Phase1(TA, TK, TSC) |
69 | * TA = transmitter address (48 bits) | 78 | * TA = transmitter address (48 bits) |
@@ -123,12 +132,9 @@ static void tkip_mixing_phase2(struct ieee80211_key *key, struct tkip_ctx *ctx, | |||
123 | ppk[4] += ror16(ppk[3], 1); | 132 | ppk[4] += ror16(ppk[3], 1); |
124 | ppk[5] += ror16(ppk[4], 1); | 133 | ppk[5] += ror16(ppk[4], 1); |
125 | 134 | ||
126 | rc4key[0] = tsc_IV16 >> 8; | 135 | rc4key = write_tkip_iv(rc4key, tsc_IV16); |
127 | rc4key[1] = ((tsc_IV16 >> 8) | 0x20) & 0x7f; | 136 | *rc4key++ = ((ppk[5] ^ get_unaligned_le16(tk)) >> 1) & 0xFF; |
128 | rc4key[2] = tsc_IV16 & 0xFF; | ||
129 | rc4key[3] = ((ppk[5] ^ get_unaligned_le16(tk)) >> 1) & 0xFF; | ||
130 | 137 | ||
131 | rc4key += 4; | ||
132 | for (i = 0; i < 6; i++) | 138 | for (i = 0; i < 6; i++) |
133 | put_unaligned_le16(ppk[i], rc4key + 2 * i); | 139 | put_unaligned_le16(ppk[i], rc4key + 2 * i); |
134 | } | 140 | } |
@@ -136,12 +142,9 @@ static void tkip_mixing_phase2(struct ieee80211_key *key, struct tkip_ctx *ctx, | |||
136 | /* Add TKIP IV and Ext. IV at @pos. @iv0, @iv1, and @iv2 are the first octets | 142 | /* Add TKIP IV and Ext. IV at @pos. @iv0, @iv1, and @iv2 are the first octets |
137 | * of the IV. Returns pointer to the octet following IVs (i.e., beginning of | 143 | * of the IV. Returns pointer to the octet following IVs (i.e., beginning of |
138 | * the packet payload). */ | 144 | * the packet payload). */ |
139 | u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, | 145 | u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16) |
140 | u8 iv0, u8 iv1, u8 iv2) | ||
141 | { | 146 | { |
142 | *pos++ = iv0; | 147 | pos = write_tkip_iv(pos, iv16); |
143 | *pos++ = iv1; | ||
144 | *pos++ = iv2; | ||
145 | *pos++ = (key->conf.keyidx << 6) | (1 << 5) /* Ext IV */; | 148 | *pos++ = (key->conf.keyidx << 6) | (1 << 5) /* Ext IV */; |
146 | put_unaligned_le32(key->u.tkip.tx.iv32, pos); | 149 | put_unaligned_le32(key->u.tkip.tx.iv32, pos); |
147 | return pos + 4; | 150 | return pos + 4; |
@@ -213,7 +216,7 @@ void ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm, | |||
213 | u8 rc4key[16]; | 216 | u8 rc4key[16]; |
214 | 217 | ||
215 | ieee80211_tkip_gen_rc4key(key, ta, rc4key); | 218 | ieee80211_tkip_gen_rc4key(key, ta, rc4key); |
216 | pos = ieee80211_tkip_add_iv(pos, key, rc4key[0], rc4key[1], rc4key[2]); | 219 | pos = ieee80211_tkip_add_iv(pos, key, key->u.tkip.tx.iv16); |
217 | ieee80211_wep_encrypt_data(tfm, rc4key, 16, pos, payload_len); | 220 | ieee80211_wep_encrypt_data(tfm, rc4key, 16, pos, payload_len); |
218 | } | 221 | } |
219 | 222 | ||