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