aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/mac80211/tkip.c25
-rw-r--r--net/mac80211/tkip.h4
-rw-r--r--net/mac80211/wpa.c8
3 files changed, 17 insertions, 20 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
67static 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). */
139u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, 145u8 *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
diff --git a/net/mac80211/tkip.h b/net/mac80211/tkip.h
index b890427fc959..d4714383f5fc 100644
--- a/net/mac80211/tkip.h
+++ b/net/mac80211/tkip.h
@@ -13,8 +13,8 @@
13#include <linux/crypto.h> 13#include <linux/crypto.h>
14#include "key.h" 14#include "key.h"
15 15
16u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, 16u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16);
17 u8 iv0, u8 iv1, u8 iv2); 17
18void ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm, 18void ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
19 struct ieee80211_key *key, 19 struct ieee80211_key *key,
20 u8 *pos, size_t payload_len, u8 *ta); 20 u8 *pos, size_t payload_len, u8 *ta);
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 9834cecaca35..345e10e9b313 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -198,14 +198,8 @@ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
198 key->u.tkip.tx.iv32++; 198 key->u.tkip.tx.iv32++;
199 199
200 if (tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) { 200 if (tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
201 hdr = (struct ieee80211_hdr *)skb->data;
202
203 /* hwaccel - with preallocated room for IV */ 201 /* hwaccel - with preallocated room for IV */
204 ieee80211_tkip_add_iv(pos, key, 202 ieee80211_tkip_add_iv(pos, key, key->u.tkip.tx.iv16);
205 (u8) (key->u.tkip.tx.iv16 >> 8),
206 (u8) (((key->u.tkip.tx.iv16 >> 8) | 0x20) &
207 0x7f),
208 (u8) key->u.tkip.tx.iv16);
209 203
210 info->control.hw_key = &tx->key->conf; 204 info->control.hw_key = &tx->key->conf;
211 return 0; 205 return 0;