1 /*
2 * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
3 *
4 * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation. See README and COPYING for
9 * more details.
10 */
11
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/slab.h>
15 #include <linux/random.h>
16 #include <linux/skbuff.h>
17 #include <linux/netdevice.h>
18 #include <linux/if_ether.h>
19 #include <linux/if_arp.h>
20 #include <linux/string.h>
21
22 #include "ieee80211.h"
23
24 #include <crypto/hash.h>
25 #include <crypto/skcipher.h>
26 #include <linux/scatterlist.h>
27 #include <linux/crc32.h>
28
29 MODULE_AUTHOR("Jouni Malinen");
30 MODULE_DESCRIPTION("Host AP crypt: TKIP");
31 MODULE_LICENSE("GPL");
32
33 struct ieee80211_tkip_data {
34 #define TKIP_KEY_LEN 32
35 u8 key[TKIP_KEY_LEN];
36 int key_set;
37
38 u32 tx_iv32;
39 u16 tx_iv16;
40 u16 tx_ttak[5];
41 int tx_phase1_done;
42
43 u32 rx_iv32;
44 u16 rx_iv16;
45 u16 rx_ttak[5];
46 int rx_phase1_done;
47 u32 rx_iv32_new;
48 u16 rx_iv16_new;
49
50 u32 dot11RSNAStatsTKIPReplays;
51 u32 dot11RSNAStatsTKIPICVErrors;
52 u32 dot11RSNAStatsTKIPLocalMICFailures;
53
54 int key_idx;
55
56 struct crypto_skcipher *rx_tfm_arc4;
57 struct crypto_shash *rx_tfm_michael;
58 struct crypto_skcipher *tx_tfm_arc4;
59 struct crypto_shash *tx_tfm_michael;
60
61 /* scratch buffers for virt_to_page() (crypto API) */
62 u8 rx_hdr[16], tx_hdr[16];
63 };
64
ieee80211_tkip_init(int key_idx)65 static void *ieee80211_tkip_init(int key_idx)
66 {
67 struct ieee80211_tkip_data *priv;
68
69 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
70 if (!priv)
71 goto fail;
72 priv->key_idx = key_idx;
73
74 priv->tx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
75 CRYPTO_ALG_ASYNC);
76 if (IS_ERR(priv->tx_tfm_arc4)) {
77 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
78 "crypto API arc4\n");
79 priv->tx_tfm_arc4 = NULL;
80 goto fail;
81 }
82
83 priv->tx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
84 if (IS_ERR(priv->tx_tfm_michael)) {
85 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
86 "crypto API michael_mic\n");
87 priv->tx_tfm_michael = NULL;
88 goto fail;
89 }
90
91 priv->rx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
92 CRYPTO_ALG_ASYNC);
93 if (IS_ERR(priv->rx_tfm_arc4)) {
94 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
95 "crypto API arc4\n");
96 priv->rx_tfm_arc4 = NULL;
97 goto fail;
98 }
99
100 priv->rx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
101 if (IS_ERR(priv->rx_tfm_michael)) {
102 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
103 "crypto API michael_mic\n");
104 priv->rx_tfm_michael = NULL;
105 goto fail;
106 }
107
108 return priv;
109
110 fail:
111 if (priv) {
112 crypto_free_shash(priv->tx_tfm_michael);
113 crypto_free_skcipher(priv->tx_tfm_arc4);
114 crypto_free_shash(priv->rx_tfm_michael);
115 crypto_free_skcipher(priv->rx_tfm_arc4);
116 kfree(priv);
117 }
118
119 return NULL;
120 }
121
122
ieee80211_tkip_deinit(void * priv)123 static void ieee80211_tkip_deinit(void *priv)
124 {
125 struct ieee80211_tkip_data *_priv = priv;
126
127 if (_priv) {
128 crypto_free_shash(_priv->tx_tfm_michael);
129 crypto_free_skcipher(_priv->tx_tfm_arc4);
130 crypto_free_shash(_priv->rx_tfm_michael);
131 crypto_free_skcipher(_priv->rx_tfm_arc4);
132 }
133 kfree(priv);
134 }
135
136
RotR1(u16 val)137 static inline u16 RotR1(u16 val)
138 {
139 return (val >> 1) | (val << 15);
140 }
141
142
Lo8(u16 val)143 static inline u8 Lo8(u16 val)
144 {
145 return val & 0xff;
146 }
147
148
Hi8(u16 val)149 static inline u8 Hi8(u16 val)
150 {
151 return val >> 8;
152 }
153
154
Lo16(u32 val)155 static inline u16 Lo16(u32 val)
156 {
157 return val & 0xffff;
158 }
159
160
Hi16(u32 val)161 static inline u16 Hi16(u32 val)
162 {
163 return val >> 16;
164 }
165
166
Mk16(u8 hi,u8 lo)167 static inline u16 Mk16(u8 hi, u8 lo)
168 {
169 return lo | (((u16) hi) << 8);
170 }
171
172 static const u16 Sbox[256] = {
173 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
174 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
175 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
176 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
177 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
178 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
179 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
180 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
181 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
182 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
183 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
184 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
185 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
186 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
187 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
188 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
189 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
190 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
191 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
192 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
193 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
194 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
195 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
196 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
197 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
198 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
199 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
200 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
201 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
202 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
203 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
204 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
205 };
206
207
_S_(u16 v)208 static inline u16 _S_(u16 v)
209 {
210 u16 t = Sbox[Hi8(v)];
211 return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
212 }
213
214
215 #define PHASE1_LOOP_COUNT 8
216
217
tkip_mixing_phase1(u16 * TTAK,const u8 * TK,const u8 * TA,u32 IV32)218 static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32)
219 {
220 int i, j;
221
222 /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
223 TTAK[0] = Lo16(IV32);
224 TTAK[1] = Hi16(IV32);
225 TTAK[2] = Mk16(TA[1], TA[0]);
226 TTAK[3] = Mk16(TA[3], TA[2]);
227 TTAK[4] = Mk16(TA[5], TA[4]);
228
229 for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
230 j = 2 * (i & 1);
231 TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
232 TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
233 TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
234 TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
235 TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
236 }
237 }
238
239
tkip_mixing_phase2(u8 * WEPSeed,const u8 * TK,const u16 * TTAK,u16 IV16)240 static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK,
241 u16 IV16)
242 {
243 /*
244 * Make temporary area overlap WEP seed so that the final copy can be
245 * avoided on little endian hosts.
246 */
247 u16 *PPK = (u16 *) &WEPSeed[4];
248
249 /* Step 1 - make copy of TTAK and bring in TSC */
250 PPK[0] = TTAK[0];
251 PPK[1] = TTAK[1];
252 PPK[2] = TTAK[2];
253 PPK[3] = TTAK[3];
254 PPK[4] = TTAK[4];
255 PPK[5] = TTAK[4] + IV16;
256
257 /* Step 2 - 96-bit bijective mixing using S-box */
258 PPK[0] += _S_(PPK[5] ^ le16_to_cpu(*(__le16 *)(&TK[0])));
259 PPK[1] += _S_(PPK[0] ^ le16_to_cpu(*(__le16 *)(&TK[2])));
260 PPK[2] += _S_(PPK[1] ^ le16_to_cpu(*(__le16 *)(&TK[4])));
261 PPK[3] += _S_(PPK[2] ^ le16_to_cpu(*(__le16 *)(&TK[6])));
262 PPK[4] += _S_(PPK[3] ^ le16_to_cpu(*(__le16 *)(&TK[8])));
263 PPK[5] += _S_(PPK[4] ^ le16_to_cpu(*(__le16 *)(&TK[10])));
264
265 PPK[0] += RotR1(PPK[5] ^ le16_to_cpu(*(__le16 *)(&TK[12])));
266 PPK[1] += RotR1(PPK[0] ^ le16_to_cpu(*(__le16 *)(&TK[14])));
267 PPK[2] += RotR1(PPK[1]);
268 PPK[3] += RotR1(PPK[2]);
269 PPK[4] += RotR1(PPK[3]);
270 PPK[5] += RotR1(PPK[4]);
271
272 /*
273 * Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
274 * WEPSeed[0..2] is transmitted as WEP IV
275 */
276 WEPSeed[0] = Hi8(IV16);
277 WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
278 WEPSeed[2] = Lo8(IV16);
279 WEPSeed[3] = Lo8((PPK[5] ^ le16_to_cpu(*(__le16 *)(&TK[0]))) >> 1);
280
281 #ifdef __BIG_ENDIAN
282 {
283 int i;
284
285 for (i = 0; i < 6; i++)
286 PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
287 }
288 #endif
289 }
290
291
ieee80211_tkip_encrypt(struct sk_buff * skb,int hdr_len,void * priv)292 static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
293 {
294 struct ieee80211_tkip_data *tkey = priv;
295 int len;
296 u8 *pos;
297 struct rtl_80211_hdr_4addr *hdr;
298 struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
299 int ret = 0;
300 u8 rc4key[16], *icv;
301 u32 crc;
302 struct scatterlist sg;
303
304 if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 ||
305 skb->len < hdr_len)
306 return -1;
307
308 hdr = (struct rtl_80211_hdr_4addr *) skb->data;
309
310 if (!tcb_desc->bHwSec) {
311 if (!tkey->tx_phase1_done) {
312 tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
313 tkey->tx_iv32);
314 tkey->tx_phase1_done = 1;
315 }
316 tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
317 } else
318 tkey->tx_phase1_done = 1;
319
320
321 len = skb->len - hdr_len;
322 pos = skb_push(skb, 8);
323 memmove(pos, pos + 8, hdr_len);
324 pos += hdr_len;
325
326 if (tcb_desc->bHwSec) {
327 *pos++ = Hi8(tkey->tx_iv16);
328 *pos++ = (Hi8(tkey->tx_iv16) | 0x20) & 0x7F;
329 *pos++ = Lo8(tkey->tx_iv16);
330 } else {
331 *pos++ = rc4key[0];
332 *pos++ = rc4key[1];
333 *pos++ = rc4key[2];
334 }
335
336 *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */;
337 *pos++ = tkey->tx_iv32 & 0xff;
338 *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
339 *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
340 *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
341
342 if (!tcb_desc->bHwSec) {
343 SKCIPHER_REQUEST_ON_STACK(req, tkey->tx_tfm_arc4);
344
345 icv = skb_put(skb, 4);
346 crc = ~crc32_le(~0, pos, len);
347 icv[0] = crc;
348 icv[1] = crc >> 8;
349 icv[2] = crc >> 16;
350 icv[3] = crc >> 24;
351 crypto_skcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
352 sg_init_one(&sg, pos, len+4);
353 skcipher_request_set_tfm(req, tkey->tx_tfm_arc4);
354 skcipher_request_set_callback(req, 0, NULL, NULL);
355 skcipher_request_set_crypt(req, &sg, &sg, len + 4, NULL);
356 ret = crypto_skcipher_encrypt(req);
357 skcipher_request_zero(req);
358 }
359
360 tkey->tx_iv16++;
361 if (tkey->tx_iv16 == 0) {
362 tkey->tx_phase1_done = 0;
363 tkey->tx_iv32++;
364 }
365
366 if (!tcb_desc->bHwSec)
367 return ret;
368 else
369 return 0;
370
371
372 }
373
ieee80211_tkip_decrypt(struct sk_buff * skb,int hdr_len,void * priv)374 static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
375 {
376 struct ieee80211_tkip_data *tkey = priv;
377 u8 keyidx, *pos;
378 u32 iv32;
379 u16 iv16;
380 struct rtl_80211_hdr_4addr *hdr;
381 struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
382 u8 rc4key[16];
383 u8 icv[4];
384 u32 crc;
385 struct scatterlist sg;
386 int plen;
387 int err;
388
389 if (skb->len < hdr_len + 8 + 4)
390 return -1;
391
392 hdr = (struct rtl_80211_hdr_4addr *) skb->data;
393 pos = skb->data + hdr_len;
394 keyidx = pos[3];
395 if (!(keyidx & (1 << 5))) {
396 if (net_ratelimit()) {
397 printk(KERN_DEBUG "TKIP: received packet without ExtIV"
398 " flag from %pM\n", hdr->addr2);
399 }
400 return -2;
401 }
402 keyidx >>= 6;
403 if (tkey->key_idx != keyidx) {
404 printk(KERN_DEBUG "TKIP: RX tkey->key_idx=%d frame "
405 "keyidx=%d priv=%p\n", tkey->key_idx, keyidx, priv);
406 return -6;
407 }
408 if (!tkey->key_set) {
409 if (net_ratelimit()) {
410 printk(KERN_DEBUG "TKIP: received packet from %pM"
411 " with keyid=%d that does not have a configured"
412 " key\n", hdr->addr2, keyidx);
413 }
414 return -3;
415 }
416 iv16 = (pos[0] << 8) | pos[2];
417 iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
418 pos += 8;
419
420 if (!tcb_desc->bHwSec) {
421 SKCIPHER_REQUEST_ON_STACK(req, tkey->rx_tfm_arc4);
422
423 if (iv32 < tkey->rx_iv32 ||
424 (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16)) {
425 if (net_ratelimit()) {
426 printk(KERN_DEBUG "TKIP: replay detected: STA=%pM"
427 " previous TSC %08x%04x received TSC "
428 "%08x%04x\n", hdr->addr2,
429 tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
430 }
431 tkey->dot11RSNAStatsTKIPReplays++;
432 return -4;
433 }
434
435 if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
436 tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
437 tkey->rx_phase1_done = 1;
438 }
439 tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
440
441 plen = skb->len - hdr_len - 12;
442
443 crypto_skcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
444 sg_init_one(&sg, pos, plen+4);
445
446 skcipher_request_set_tfm(req, tkey->rx_tfm_arc4);
447 skcipher_request_set_callback(req, 0, NULL, NULL);
448 skcipher_request_set_crypt(req, &sg, &sg, plen + 4, NULL);
449
450 err = crypto_skcipher_decrypt(req);
451 skcipher_request_zero(req);
452 if (err) {
453 if (net_ratelimit()) {
454 printk(KERN_DEBUG ": TKIP: failed to decrypt "
455 "received packet from %pM\n",
456 hdr->addr2);
457 }
458 return -7;
459 }
460
461 crc = ~crc32_le(~0, pos, plen);
462 icv[0] = crc;
463 icv[1] = crc >> 8;
464 icv[2] = crc >> 16;
465 icv[3] = crc >> 24;
466
467 if (memcmp(icv, pos + plen, 4) != 0) {
468 if (iv32 != tkey->rx_iv32) {
469 /*
470 * Previously cached Phase1 result was already
471 * lost, so it needs to be recalculated for the
472 * next packet.
473 */
474 tkey->rx_phase1_done = 0;
475 }
476 if (net_ratelimit()) {
477 printk(KERN_DEBUG "TKIP: ICV error detected: STA="
478 "%pM\n", hdr->addr2);
479 }
480 tkey->dot11RSNAStatsTKIPICVErrors++;
481 return -5;
482 }
483
484 }
485
486 /*
487 * Update real counters only after Michael MIC verification has
488 * completed.
489 */
490 tkey->rx_iv32_new = iv32;
491 tkey->rx_iv16_new = iv16;
492
493 /* Remove IV and ICV */
494 memmove(skb->data + 8, skb->data, hdr_len);
495 skb_pull(skb, 8);
496 skb_trim(skb, skb->len - 4);
497
498 return keyidx;
499 }
500
michael_mic(struct crypto_shash * tfm_michael,u8 * key,u8 * hdr,u8 * data,size_t data_len,u8 * mic)501 static int michael_mic(struct crypto_shash *tfm_michael, u8 *key, u8 *hdr,
502 u8 *data, size_t data_len, u8 *mic)
503 {
504 SHASH_DESC_ON_STACK(desc, tfm_michael);
505 int err;
506
507 desc->tfm = tfm_michael;
508 desc->flags = 0;
509
510 if (crypto_shash_setkey(tfm_michael, key, 8))
511 return -1;
512
513 err = crypto_shash_init(desc);
514 if (err)
515 goto out;
516 err = crypto_shash_update(desc, hdr, 16);
517 if (err)
518 goto out;
519 err = crypto_shash_update(desc, data, data_len);
520 if (err)
521 goto out;
522 err = crypto_shash_final(desc, mic);
523
524 out:
525 shash_desc_zero(desc);
526 return err;
527 }
528
michael_mic_hdr(struct sk_buff * skb,u8 * hdr)529 static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr)
530 {
531 struct rtl_80211_hdr_4addr *hdr11;
532
533 hdr11 = (struct rtl_80211_hdr_4addr *) skb->data;
534 switch (le16_to_cpu(hdr11->frame_ctl) &
535 (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
536 case IEEE80211_FCTL_TODS:
537 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
538 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
539 break;
540 case IEEE80211_FCTL_FROMDS:
541 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
542 memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
543 break;
544 case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
545 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
546 memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
547 break;
548 default:
549 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
550 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
551 break;
552 }
553
554 hdr[12] = 0; /* priority */
555
556 hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
557 }
558
559
ieee80211_michael_mic_add(struct sk_buff * skb,int hdr_len,void * priv)560 static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv)
561 {
562 struct ieee80211_tkip_data *tkey = priv;
563 u8 *pos;
564 struct rtl_80211_hdr_4addr *hdr;
565
566 hdr = (struct rtl_80211_hdr_4addr *) skb->data;
567
568 if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
569 printk(KERN_DEBUG "Invalid packet for Michael MIC add "
570 "(tailroom=%d hdr_len=%d skb->len=%d)\n",
571 skb_tailroom(skb), hdr_len, skb->len);
572 return -1;
573 }
574
575 michael_mic_hdr(skb, tkey->tx_hdr);
576
577 // { david, 2006.9.1
578 // fix the wpa process with wmm enabled.
579 if (IEEE80211_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl)))
580 tkey->tx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
581 // }
582 pos = skb_put(skb, 8);
583
584 if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
585 skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
586 return -1;
587
588 return 0;
589 }
590
ieee80211_michael_mic_failure(struct net_device * dev,struct rtl_80211_hdr_4addr * hdr,int keyidx)591 static void ieee80211_michael_mic_failure(struct net_device *dev,
592 struct rtl_80211_hdr_4addr *hdr,
593 int keyidx)
594 {
595 union iwreq_data wrqu;
596 struct iw_michaelmicfailure ev;
597
598 /* TODO: needed parameters: count, keyid, key type, TSC */
599 memset(&ev, 0, sizeof(ev));
600 ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
601 if (hdr->addr1[0] & 0x01)
602 ev.flags |= IW_MICFAILURE_GROUP;
603 else
604 ev.flags |= IW_MICFAILURE_PAIRWISE;
605 ev.src_addr.sa_family = ARPHRD_ETHER;
606 memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
607 memset(&wrqu, 0, sizeof(wrqu));
608 wrqu.data.length = sizeof(ev);
609 wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev);
610 }
611
ieee80211_michael_mic_verify(struct sk_buff * skb,int keyidx,int hdr_len,void * priv)612 static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
613 int hdr_len, void *priv)
614 {
615 struct ieee80211_tkip_data *tkey = priv;
616 u8 mic[8];
617 struct rtl_80211_hdr_4addr *hdr;
618
619 hdr = (struct rtl_80211_hdr_4addr *) skb->data;
620
621 if (!tkey->key_set)
622 return -1;
623
624 michael_mic_hdr(skb, tkey->rx_hdr);
625 // { david, 2006.9.1
626 // fix the wpa process with wmm enabled.
627 if (IEEE80211_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl)))
628 tkey->rx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
629 // }
630
631 if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
632 skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
633 return -1;
634 if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
635 struct rtl_80211_hdr_4addr *hdr;
636 hdr = (struct rtl_80211_hdr_4addr *) skb->data;
637
638 printk(KERN_DEBUG "%s: Michael MIC verification failed for "
639 "MSDU from %pM keyidx=%d\n",
640 skb->dev ? skb->dev->name : "N/A", hdr->addr2,
641 keyidx);
642 if (skb->dev)
643 ieee80211_michael_mic_failure(skb->dev, hdr, keyidx);
644 tkey->dot11RSNAStatsTKIPLocalMICFailures++;
645 return -1;
646 }
647
648 /*
649 * Update TSC counters for RX now that the packet verification has
650 * completed.
651 */
652 tkey->rx_iv32 = tkey->rx_iv32_new;
653 tkey->rx_iv16 = tkey->rx_iv16_new;
654
655 skb_trim(skb, skb->len - 8);
656
657 return 0;
658 }
659
660
ieee80211_tkip_set_key(void * key,int len,u8 * seq,void * priv)661 static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv)
662 {
663 struct ieee80211_tkip_data *tkey = priv;
664 int keyidx;
665 struct crypto_shash *tfm = tkey->tx_tfm_michael;
666 struct crypto_skcipher *tfm2 = tkey->tx_tfm_arc4;
667 struct crypto_shash *tfm3 = tkey->rx_tfm_michael;
668 struct crypto_skcipher *tfm4 = tkey->rx_tfm_arc4;
669
670 keyidx = tkey->key_idx;
671 memset(tkey, 0, sizeof(*tkey));
672 tkey->key_idx = keyidx;
673 tkey->tx_tfm_michael = tfm;
674 tkey->tx_tfm_arc4 = tfm2;
675 tkey->rx_tfm_michael = tfm3;
676 tkey->rx_tfm_arc4 = tfm4;
677
678 if (len == TKIP_KEY_LEN) {
679 memcpy(tkey->key, key, TKIP_KEY_LEN);
680 tkey->key_set = 1;
681 tkey->tx_iv16 = 1; /* TSC is initialized to 1 */
682 if (seq) {
683 tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
684 (seq[3] << 8) | seq[2];
685 tkey->rx_iv16 = (seq[1] << 8) | seq[0];
686 }
687 } else if (len == 0)
688 tkey->key_set = 0;
689 else
690 return -1;
691
692 return 0;
693 }
694
695
ieee80211_tkip_get_key(void * key,int len,u8 * seq,void * priv)696 static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv)
697 {
698 struct ieee80211_tkip_data *tkey = priv;
699
700 if (len < TKIP_KEY_LEN)
701 return -1;
702
703 if (!tkey->key_set)
704 return 0;
705 memcpy(key, tkey->key, TKIP_KEY_LEN);
706
707 if (seq) {
708 /* Return the sequence number of the last transmitted frame. */
709 u16 iv16 = tkey->tx_iv16;
710 u32 iv32 = tkey->tx_iv32;
711
712 if (iv16 == 0)
713 iv32--;
714 iv16--;
715 seq[0] = tkey->tx_iv16;
716 seq[1] = tkey->tx_iv16 >> 8;
717 seq[2] = tkey->tx_iv32;
718 seq[3] = tkey->tx_iv32 >> 8;
719 seq[4] = tkey->tx_iv32 >> 16;
720 seq[5] = tkey->tx_iv32 >> 24;
721 }
722
723 return TKIP_KEY_LEN;
724 }
725
726
ieee80211_tkip_print_stats(char * p,void * priv)727 static char *ieee80211_tkip_print_stats(char *p, void *priv)
728 {
729 struct ieee80211_tkip_data *tkip = priv;
730
731 p += sprintf(p, "key[%d] alg=TKIP key_set=%d "
732 "tx_pn=%02x%02x%02x%02x%02x%02x "
733 "rx_pn=%02x%02x%02x%02x%02x%02x "
734 "replays=%d icv_errors=%d local_mic_failures=%d\n",
735 tkip->key_idx, tkip->key_set,
736 (tkip->tx_iv32 >> 24) & 0xff,
737 (tkip->tx_iv32 >> 16) & 0xff,
738 (tkip->tx_iv32 >> 8) & 0xff,
739 tkip->tx_iv32 & 0xff,
740 (tkip->tx_iv16 >> 8) & 0xff,
741 tkip->tx_iv16 & 0xff,
742 (tkip->rx_iv32 >> 24) & 0xff,
743 (tkip->rx_iv32 >> 16) & 0xff,
744 (tkip->rx_iv32 >> 8) & 0xff,
745 tkip->rx_iv32 & 0xff,
746 (tkip->rx_iv16 >> 8) & 0xff,
747 tkip->rx_iv16 & 0xff,
748 tkip->dot11RSNAStatsTKIPReplays,
749 tkip->dot11RSNAStatsTKIPICVErrors,
750 tkip->dot11RSNAStatsTKIPLocalMICFailures);
751 return p;
752 }
753
754
755 static struct ieee80211_crypto_ops ieee80211_crypt_tkip = {
756 .name = "TKIP",
757 .init = ieee80211_tkip_init,
758 .deinit = ieee80211_tkip_deinit,
759 .encrypt_mpdu = ieee80211_tkip_encrypt,
760 .decrypt_mpdu = ieee80211_tkip_decrypt,
761 .encrypt_msdu = ieee80211_michael_mic_add,
762 .decrypt_msdu = ieee80211_michael_mic_verify,
763 .set_key = ieee80211_tkip_set_key,
764 .get_key = ieee80211_tkip_get_key,
765 .print_stats = ieee80211_tkip_print_stats,
766 .extra_prefix_len = 4 + 4, /* IV + ExtIV */
767 .extra_postfix_len = 8 + 4, /* MIC + ICV */
768 .owner = THIS_MODULE,
769 };
770
ieee80211_crypto_tkip_init(void)771 int __init ieee80211_crypto_tkip_init(void)
772 {
773 return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip);
774 }
775
ieee80211_crypto_tkip_exit(void)776 void __exit ieee80211_crypto_tkip_exit(void)
777 {
778 ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip);
779 }
780
ieee80211_tkip_null(void)781 void ieee80211_tkip_null(void)
782 {
783 // printk("============>%s()\n", __func__);
784 return;
785 }
786