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