Blame view

net/mac80211/tkip.c 11.8 KB
f0706e828   Jiri Benc   [MAC80211]: Add m...
1
2
3
4
5
6
7
8
  /*
   * Copyright 2002-2004, Instant802 Networks, Inc.
   * Copyright 2005, Devicescape Software, Inc.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
f0706e828   Jiri Benc   [MAC80211]: Add m...
9
  #include <linux/kernel.h>
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
10
  #include <linux/bitops.h>
f0706e828   Jiri Benc   [MAC80211]: Add m...
11
12
  #include <linux/types.h>
  #include <linux/netdevice.h>
bc3b2d7fb   Paul Gortmaker   net: Add export.h...
13
  #include <linux/export.h>
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
14
  #include <asm/unaligned.h>
f0706e828   Jiri Benc   [MAC80211]: Add m...
15
16
  
  #include <net/mac80211.h>
244879813   Johannes Berg   mac80211: add dri...
17
  #include "driver-ops.h"
2c8dccc77   Johannes Berg   mac80211: rename ...
18
  #include "key.h"
f0706e828   Jiri Benc   [MAC80211]: Add m...
19
20
  #include "tkip.h"
  #include "wep.h"
f0706e828   Jiri Benc   [MAC80211]: Add m...
21
  #define PHASE1_LOOP_COUNT 8
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
22
23
24
25
  /*
   * 2-byte by 2-byte subset of the full AES S-box table; second part of this
   * table is identical to first part but byte-swapped
   */
f0706e828   Jiri Benc   [MAC80211]: Add m...
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  static const u16 tkip_sbox[256] =
  {
  	0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
  	0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
  	0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
  	0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
  	0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
  	0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
  	0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
  	0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
  	0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
  	0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
  	0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
  	0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
  	0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
  	0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
  	0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
  	0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
  	0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
  	0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
  	0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
  	0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
  	0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
  	0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
  	0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
  	0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
  	0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
  	0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
  	0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
  	0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
  	0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
  	0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
  	0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
  	0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
  };
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
61
  static u16 tkipS(u16 val)
f0706e828   Jiri Benc   [MAC80211]: Add m...
62
  {
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
63
  	return tkip_sbox[val & 0xff] ^ swab16(tkip_sbox[val >> 8]);
f0706e828   Jiri Benc   [MAC80211]: Add m...
64
  }
c801242c3   Harvey Harrison   mac80211: tkip.c ...
65
66
67
68
69
70
71
  static u8 *write_tkip_iv(u8 *pos, u16 iv16)
  {
  	*pos++ = iv16 >> 8;
  	*pos++ = ((iv16 >> 8) | 0x20) & 0x7f;
  	*pos++ = iv16 & 0xFF;
  	return pos;
  }
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
72
73
  /*
   * P1K := Phase1(TA, TK, TSC)
f0706e828   Jiri Benc   [MAC80211]: Add m...
74
75
76
77
78
   * TA = transmitter address (48 bits)
   * TK = dot11DefaultKeyValue or dot11KeyMappingValue (128 bits)
   * TSC = TKIP sequence counter (48 bits, only 32 msb bits used)
   * P1K: 80 bits
   */
7c70537f9   Harvey Harrison   mac80211: tkip.c ...
79
80
  static void tkip_mixing_phase1(const u8 *tk, struct tkip_ctx *ctx,
  			       const u8 *ta, u32 tsc_IV32)
f0706e828   Jiri Benc   [MAC80211]: Add m...
81
82
  {
  	int i, j;
82a57447f   Harvey Harrison   mac80211: tkip.c ...
83
  	u16 *p1k = ctx->p1k;
f0706e828   Jiri Benc   [MAC80211]: Add m...
84

8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
85
86
87
88
89
  	p1k[0] = tsc_IV32 & 0xFFFF;
  	p1k[1] = tsc_IV32 >> 16;
  	p1k[2] = get_unaligned_le16(ta + 0);
  	p1k[3] = get_unaligned_le16(ta + 2);
  	p1k[4] = get_unaligned_le16(ta + 4);
f0706e828   Jiri Benc   [MAC80211]: Add m...
90
91
92
  
  	for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
  		j = 2 * (i & 1);
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
93
94
95
96
97
  		p1k[0] += tkipS(p1k[4] ^ get_unaligned_le16(tk + 0 + j));
  		p1k[1] += tkipS(p1k[0] ^ get_unaligned_le16(tk + 4 + j));
  		p1k[2] += tkipS(p1k[1] ^ get_unaligned_le16(tk + 8 + j));
  		p1k[3] += tkipS(p1k[2] ^ get_unaligned_le16(tk + 12 + j));
  		p1k[4] += tkipS(p1k[3] ^ get_unaligned_le16(tk + 0 + j)) + i;
f0706e828   Jiri Benc   [MAC80211]: Add m...
98
  	}
ca99861d5   gregor kowski   mac80211 : fix a ...
99
  	ctx->state = TKIP_STATE_PHASE1_DONE;
523b02ea2   Johannes Berg   mac80211: fix TKI...
100
  	ctx->p1k_iv32 = tsc_IV32;
f0706e828   Jiri Benc   [MAC80211]: Add m...
101
  }
7c70537f9   Harvey Harrison   mac80211: tkip.c ...
102
  static void tkip_mixing_phase2(const u8 *tk, struct tkip_ctx *ctx,
3c8380991   Harvey Harrison   mac80211: tkip.c ...
103
  			       u16 tsc_IV16, u8 *rc4key)
f0706e828   Jiri Benc   [MAC80211]: Add m...
104
105
  {
  	u16 ppk[6];
3c8380991   Harvey Harrison   mac80211: tkip.c ...
106
  	const u16 *p1k = ctx->p1k;
f0706e828   Jiri Benc   [MAC80211]: Add m...
107
108
109
110
111
112
113
114
  	int i;
  
  	ppk[0] = p1k[0];
  	ppk[1] = p1k[1];
  	ppk[2] = p1k[2];
  	ppk[3] = p1k[3];
  	ppk[4] = p1k[4];
  	ppk[5] = p1k[4] + tsc_IV16;
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
115
116
117
118
119
120
121
122
123
124
125
126
  	ppk[0] += tkipS(ppk[5] ^ get_unaligned_le16(tk + 0));
  	ppk[1] += tkipS(ppk[0] ^ get_unaligned_le16(tk + 2));
  	ppk[2] += tkipS(ppk[1] ^ get_unaligned_le16(tk + 4));
  	ppk[3] += tkipS(ppk[2] ^ get_unaligned_le16(tk + 6));
  	ppk[4] += tkipS(ppk[3] ^ get_unaligned_le16(tk + 8));
  	ppk[5] += tkipS(ppk[4] ^ get_unaligned_le16(tk + 10));
  	ppk[0] += ror16(ppk[5] ^ get_unaligned_le16(tk + 12), 1);
  	ppk[1] += ror16(ppk[0] ^ get_unaligned_le16(tk + 14), 1);
  	ppk[2] += ror16(ppk[1], 1);
  	ppk[3] += ror16(ppk[2], 1);
  	ppk[4] += ror16(ppk[3], 1);
  	ppk[5] += ror16(ppk[4], 1);
c801242c3   Harvey Harrison   mac80211: tkip.c ...
127
128
  	rc4key = write_tkip_iv(rc4key, tsc_IV16);
  	*rc4key++ = ((ppk[5] ^ get_unaligned_le16(tk)) >> 1) & 0xFF;
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
129

8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
130
131
  	for (i = 0; i < 6; i++)
  		put_unaligned_le16(ppk[i], rc4key + 2 * i);
f0706e828   Jiri Benc   [MAC80211]: Add m...
132
  }
f0706e828   Jiri Benc   [MAC80211]: Add m...
133
134
135
  /* Add TKIP IV and Ext. IV at @pos. @iv0, @iv1, and @iv2 are the first octets
   * of the IV. Returns pointer to the octet following IVs (i.e., beginning of
   * the packet payload). */
523b02ea2   Johannes Berg   mac80211: fix TKI...
136
  u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key)
f0706e828   Jiri Benc   [MAC80211]: Add m...
137
  {
523b02ea2   Johannes Berg   mac80211: fix TKI...
138
139
140
  	lockdep_assert_held(&key->u.tkip.txlock);
  
  	pos = write_tkip_iv(pos, key->u.tkip.tx.iv16);
8f20fc249   Johannes Berg   [MAC80211]: embed...
141
  	*pos++ = (key->conf.keyidx << 6) | (1 << 5) /* Ext IV */;
b0f76b335   Harvey Harrison   mac80211: add a s...
142
  	put_unaligned_le32(key->u.tkip.tx.iv32, pos);
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
143
  	return pos + 4;
f0706e828   Jiri Benc   [MAC80211]: Add m...
144
  }
523b02ea2   Johannes Berg   mac80211: fix TKI...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  static void ieee80211_compute_tkip_p1k(struct ieee80211_key *key, u32 iv32)
  {
  	struct ieee80211_sub_if_data *sdata = key->sdata;
  	struct tkip_ctx *ctx = &key->u.tkip.tx;
  	const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
  
  	lockdep_assert_held(&key->u.tkip.txlock);
  
  	/*
  	 * Update the P1K when the IV32 is different from the value it
  	 * had when we last computed it (or when not initialised yet).
  	 * This might flip-flop back and forth if packets are processed
  	 * out-of-order due to the different ACs, but then we have to
  	 * just compute the P1K more often.
  	 */
  	if (ctx->p1k_iv32 != iv32 || ctx->state == TKIP_STATE_NOT_INIT)
  		tkip_mixing_phase1(tk, ctx, sdata->vif.addr, iv32);
  }
42d987955   Johannes Berg   mac80211: allow d...
163
164
  void ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *keyconf,
  			       u32 iv32, u16 *p1k)
5d2cdcd4e   Emmanuel Grumbach   mac80211: get a T...
165
166
167
  {
  	struct ieee80211_key *key = (struct ieee80211_key *)
  			container_of(keyconf, struct ieee80211_key, conf);
523b02ea2   Johannes Berg   mac80211: fix TKI...
168
  	struct tkip_ctx *ctx = &key->u.tkip.tx;
523b02ea2   Johannes Berg   mac80211: fix TKI...
169
170
171
172
173
174
175
  	unsigned long flags;
  
  	spin_lock_irqsave(&key->u.tkip.txlock, flags);
  	ieee80211_compute_tkip_p1k(key, iv32);
  	memcpy(p1k, ctx->p1k, sizeof(ctx->p1k));
  	spin_unlock_irqrestore(&key->u.tkip.txlock, flags);
  }
42d987955   Johannes Berg   mac80211: allow d...
176
  EXPORT_SYMBOL(ieee80211_get_tkip_p1k_iv);
5d2cdcd4e   Emmanuel Grumbach   mac80211: get a T...
177

8bca5d815   Johannes Berg   mac80211: allow d...
178
179
180
181
182
183
184
185
186
187
  void ieee80211_get_tkip_rx_p1k(struct ieee80211_key_conf *keyconf,
                                 const u8 *ta, u32 iv32, u16 *p1k)
  {
  	const u8 *tk = &keyconf->key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
  	struct tkip_ctx ctx;
  
  	tkip_mixing_phase1(tk, &ctx, ta, iv32);
  	memcpy(p1k, ctx.p1k, sizeof(ctx.p1k));
  }
  EXPORT_SYMBOL(ieee80211_get_tkip_rx_p1k);
523b02ea2   Johannes Berg   mac80211: fix TKI...
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
  void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
  			    struct sk_buff *skb, u8 *p2k)
  {
  	struct ieee80211_key *key = (struct ieee80211_key *)
  			container_of(keyconf, struct ieee80211_key, conf);
  	const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
  	struct tkip_ctx *ctx = &key->u.tkip.tx;
  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  	const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control);
  	u32 iv32 = get_unaligned_le32(&data[4]);
  	u16 iv16 = data[2] | (data[0] << 8);
  	unsigned long flags;
  
  	spin_lock_irqsave(&key->u.tkip.txlock, flags);
  	ieee80211_compute_tkip_p1k(key, iv32);
  	tkip_mixing_phase2(tk, ctx, iv16, p2k);
  	spin_unlock_irqrestore(&key->u.tkip.txlock, flags);
5d2cdcd4e   Emmanuel Grumbach   mac80211: get a T...
205
  }
523b02ea2   Johannes Berg   mac80211: fix TKI...
206
  EXPORT_SYMBOL(ieee80211_get_tkip_p2k);
5d2cdcd4e   Emmanuel Grumbach   mac80211: get a T...
207

813d76694   Johannes Berg   mac80211: move co...
208
209
  /*
   * Encrypt packet payload with TKIP using @key. @pos is a pointer to the
f0706e828   Jiri Benc   [MAC80211]: Add m...
210
   * beginning of the buffer containing payload. This payload must include
813d76694   Johannes Berg   mac80211: move co...
211
212
213
214
   * the IV/Ext.IV and space for (taildroom) four octets for ICV.
   * @payload_len is the length of payload (_not_ including IV/ICV length).
   * @ta is the transmitter addresses.
   */
5f9f1812b   Felix Fietkau   mac80211: remove ...
215
  int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm,
3473187d2   John W. Linville   mac80211: remove ...
216
  				struct ieee80211_key *key,
523b02ea2   Johannes Berg   mac80211: fix TKI...
217
218
  				struct sk_buff *skb,
  				u8 *payload, size_t payload_len)
f0706e828   Jiri Benc   [MAC80211]: Add m...
219
220
  {
  	u8 rc4key[16];
7c70537f9   Harvey Harrison   mac80211: tkip.c ...
221

523b02ea2   Johannes Berg   mac80211: fix TKI...
222
  	ieee80211_get_tkip_p2k(&key->conf, skb, rc4key);
f0706e828   Jiri Benc   [MAC80211]: Add m...
223

523b02ea2   Johannes Berg   mac80211: fix TKI...
224
225
  	return ieee80211_wep_encrypt_data(tfm, rc4key, 16,
  					  payload, payload_len);
f0706e828   Jiri Benc   [MAC80211]: Add m...
226
  }
f0706e828   Jiri Benc   [MAC80211]: Add m...
227
228
229
230
  /* Decrypt packet payload with TKIP using @key. @pos is a pointer to the
   * beginning of the buffer containing IEEE 802.11 header payload, i.e.,
   * including IV, Ext. IV, real data, Michael MIC, ICV. @payload_len is the
   * length of payload, including IV, Ext. IV, MIC, ICV.  */
5f9f1812b   Felix Fietkau   mac80211: remove ...
231
  int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm,
f0706e828   Jiri Benc   [MAC80211]: Add m...
232
233
  				struct ieee80211_key *key,
  				u8 *payload, size_t payload_len, u8 *ta,
9ae4fda33   Emmanuel Grumbach   mac80211: allows ...
234
  				u8 *ra, int only_iv, int queue,
50741ae05   Johannes Berg   [PATCH] mac80211:...
235
  				u32 *out_iv32, u16 *out_iv16)
f0706e828   Jiri Benc   [MAC80211]: Add m...
236
237
238
239
240
  {
  	u32 iv32;
  	u32 iv16;
  	u8 rc4key[16], keyid, *pos = payload;
  	int res;
ffd7891dc   Luis R. Rodriguez   mac80211: Let dri...
241
  	const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
f0706e828   Jiri Benc   [MAC80211]: Add m...
242
243
244
245
246
247
  
  	if (payload_len < 12)
  		return -1;
  
  	iv16 = (pos[0] << 8) | pos[2];
  	keyid = pos[3];
8c046c8c6   Harvey Harrison   mac80211: tkip.c ...
248
  	iv32 = get_unaligned_le32(pos + 4);
f0706e828   Jiri Benc   [MAC80211]: Add m...
249
  	pos += 8;
9ae705cfd   Johannes Berg   mac80211: rename ...
250
  #ifdef CONFIG_MAC80211_TKIP_DEBUG
f0706e828   Jiri Benc   [MAC80211]: Add m...
251
252
253
254
255
256
257
258
259
260
261
  	{
  		int i;
  		printk(KERN_DEBUG "TKIP decrypt: data(len=%zd)", payload_len);
  		for (i = 0; i < payload_len; i++)
  			printk(" %02x", payload[i]);
  		printk("
  ");
  		printk(KERN_DEBUG "TKIP decrypt: iv16=%04x iv32=%08x
  ",
  		       iv16, iv32);
  	}
9ae705cfd   Johannes Berg   mac80211: rename ...
262
  #endif
f0706e828   Jiri Benc   [MAC80211]: Add m...
263
264
265
  
  	if (!(keyid & (1 << 5)))
  		return TKIP_DECRYPT_NO_EXT_IV;
8f20fc249   Johannes Berg   [MAC80211]: embed...
266
  	if ((keyid >> 6) != key->conf.keyidx)
f0706e828   Jiri Benc   [MAC80211]: Add m...
267
  		return TKIP_DECRYPT_INVALID_KEYIDX;
ca99861d5   gregor kowski   mac80211 : fix a ...
268
  	if (key->u.tkip.rx[queue].state != TKIP_STATE_NOT_INIT &&
b0f76b335   Harvey Harrison   mac80211: add a s...
269
270
271
  	    (iv32 < key->u.tkip.rx[queue].iv32 ||
  	     (iv32 == key->u.tkip.rx[queue].iv32 &&
  	      iv16 <= key->u.tkip.rx[queue].iv16))) {
9ae705cfd   Johannes Berg   mac80211: rename ...
272
  #ifdef CONFIG_MAC80211_TKIP_DEBUG
f0706e828   Jiri Benc   [MAC80211]: Add m...
273
  		printk(KERN_DEBUG "TKIP replay detected for RX frame from "
0c68ae260   Johannes Berg   mac80211: convert...
274
275
276
  		       "%pM (RX IV (%04x,%02x) <= prev. IV (%04x,%02x)
  ",
  		       ta,
b0f76b335   Harvey Harrison   mac80211: add a s...
277
278
  		       iv32, iv16, key->u.tkip.rx[queue].iv32,
  		       key->u.tkip.rx[queue].iv16);
9ae705cfd   Johannes Berg   mac80211: rename ...
279
  #endif
f0706e828   Jiri Benc   [MAC80211]: Add m...
280
281
282
283
284
  		return TKIP_DECRYPT_REPLAY;
  	}
  
  	if (only_iv) {
  		res = TKIP_DECRYPT_OK;
ca99861d5   gregor kowski   mac80211 : fix a ...
285
  		key->u.tkip.rx[queue].state = TKIP_STATE_PHASE1_HW_UPLOADED;
f0706e828   Jiri Benc   [MAC80211]: Add m...
286
287
  		goto done;
  	}
ca99861d5   gregor kowski   mac80211 : fix a ...
288
  	if (key->u.tkip.rx[queue].state == TKIP_STATE_NOT_INIT ||
b0f76b335   Harvey Harrison   mac80211: add a s...
289
  	    key->u.tkip.rx[queue].iv32 != iv32) {
f0706e828   Jiri Benc   [MAC80211]: Add m...
290
  		/* IV16 wrapped around - perform TKIP phase 1 */
7c70537f9   Harvey Harrison   mac80211: tkip.c ...
291
  		tkip_mixing_phase1(tk, &key->u.tkip.rx[queue], ta, iv32);
9ae705cfd   Johannes Berg   mac80211: rename ...
292
  #ifdef CONFIG_MAC80211_TKIP_DEBUG
f0706e828   Jiri Benc   [MAC80211]: Add m...
293
294
  		{
  			int i;
ffd7891dc   Luis R. Rodriguez   mac80211: Let dri...
295
  			u8 key_offset = NL80211_TKIP_DATA_OFFSET_ENCR_KEY;
0c68ae260   Johannes Berg   mac80211: convert...
296
297
  			printk(KERN_DEBUG "TKIP decrypt: Phase1 TA=%pM"
  			       " TK=", ta);
f0706e828   Jiri Benc   [MAC80211]: Add m...
298
299
  			for (i = 0; i < 16; i++)
  				printk("%02x ",
ffd7891dc   Luis R. Rodriguez   mac80211: Let dri...
300
  				       key->conf.key[key_offset + i]);
f0706e828   Jiri Benc   [MAC80211]: Add m...
301
302
303
304
  			printk("
  ");
  			printk(KERN_DEBUG "TKIP decrypt: P1K=");
  			for (i = 0; i < 5; i++)
b0f76b335   Harvey Harrison   mac80211: add a s...
305
  				printk("%04x ", key->u.tkip.rx[queue].p1k[i]);
f0706e828   Jiri Benc   [MAC80211]: Add m...
306
307
308
  			printk("
  ");
  		}
9ae705cfd   Johannes Berg   mac80211: rename ...
309
  #endif
ca99861d5   gregor kowski   mac80211 : fix a ...
310
311
312
313
  	}
  	if (key->local->ops->update_tkip_key &&
  	    key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
  	    key->u.tkip.rx[queue].state != TKIP_STATE_PHASE1_HW_UPLOADED) {
b3fbdcf49   Johannes Berg   mac80211: pass vi...
314
  		struct ieee80211_sub_if_data *sdata = key->sdata;
ca99861d5   gregor kowski   mac80211 : fix a ...
315

b3fbdcf49   Johannes Berg   mac80211: pass vi...
316
317
318
319
  		if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
  			sdata = container_of(key->sdata->bss,
  					struct ieee80211_sub_if_data, u.ap);
  		drv_update_tkip_key(key->local, sdata, &key->conf, key->sta,
ca99861d5   gregor kowski   mac80211 : fix a ...
320
321
  				iv32, key->u.tkip.rx[queue].p1k);
  		key->u.tkip.rx[queue].state = TKIP_STATE_PHASE1_HW_UPLOADED;
f0706e828   Jiri Benc   [MAC80211]: Add m...
322
  	}
7c70537f9   Harvey Harrison   mac80211: tkip.c ...
323
  	tkip_mixing_phase2(tk, &key->u.tkip.rx[queue], iv16, rc4key);
9ae705cfd   Johannes Berg   mac80211: rename ...
324
  #ifdef CONFIG_MAC80211_TKIP_DEBUG
f0706e828   Jiri Benc   [MAC80211]: Add m...
325
326
327
328
329
330
331
332
  	{
  		int i;
  		printk(KERN_DEBUG "TKIP decrypt: Phase2 rc4key=");
  		for (i = 0; i < 16; i++)
  			printk("%02x ", rc4key[i]);
  		printk("
  ");
  	}
9ae705cfd   Johannes Berg   mac80211: rename ...
333
  #endif
f0706e828   Jiri Benc   [MAC80211]: Add m...
334
335
336
337
  
  	res = ieee80211_wep_decrypt_data(tfm, rc4key, 16, pos, payload_len - 12);
   done:
  	if (res == TKIP_DECRYPT_OK) {
50741ae05   Johannes Berg   [PATCH] mac80211:...
338
339
340
341
342
343
344
345
  		/*
  		 * Record previously received IV, will be copied into the
  		 * key information after MIC verification. It is possible
  		 * that we don't catch replays of fragments but that's ok
  		 * because the Michael MIC verication will then fail.
  		 */
  		*out_iv32 = iv32;
  		*out_iv16 = iv16;
f0706e828   Jiri Benc   [MAC80211]: Add m...
346
347
348
349
  	}
  
  	return res;
  }