[SPARC64]: Fix 2 bugs in huge page support.
[linux-2.6/verdex.git] / net / ieee80211 / ieee80211_crypt_tkip.c
blobe0988320efbfef0ad976437c83c7dac6357e9f7a
1 /*
2 * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
4 * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
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.
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/slab.h>
16 #include <linux/random.h>
17 #include <linux/skbuff.h>
18 #include <linux/netdevice.h>
19 #include <linux/if_ether.h>
20 #include <linux/if_arp.h>
21 #include <asm/string.h>
23 #include <net/ieee80211.h>
25 #include <linux/crypto.h>
26 #include <asm/scatterlist.h>
27 #include <linux/crc32.h>
29 MODULE_AUTHOR("Jouni Malinen");
30 MODULE_DESCRIPTION("Host AP crypt: TKIP");
31 MODULE_LICENSE("GPL");
33 struct ieee80211_tkip_data {
34 #define TKIP_KEY_LEN 32
35 u8 key[TKIP_KEY_LEN];
36 int key_set;
38 u32 tx_iv32;
39 u16 tx_iv16;
40 u16 tx_ttak[5];
41 int tx_phase1_done;
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;
50 u32 dot11RSNAStatsTKIPReplays;
51 u32 dot11RSNAStatsTKIPICVErrors;
52 u32 dot11RSNAStatsTKIPLocalMICFailures;
54 int key_idx;
56 struct crypto_tfm *tfm_arc4;
57 struct crypto_tfm *tfm_michael;
59 /* scratch buffers for virt_to_page() (crypto API) */
60 u8 rx_hdr[16], tx_hdr[16];
62 unsigned long flags;
65 static unsigned long ieee80211_tkip_set_flags(unsigned long flags, void *priv)
67 struct ieee80211_tkip_data *_priv = priv;
68 unsigned long old_flags = _priv->flags;
69 _priv->flags = flags;
70 return old_flags;
73 static unsigned long ieee80211_tkip_get_flags(void *priv)
75 struct ieee80211_tkip_data *_priv = priv;
76 return _priv->flags;
79 static void *ieee80211_tkip_init(int key_idx)
81 struct ieee80211_tkip_data *priv;
83 priv = kmalloc(sizeof(*priv), GFP_ATOMIC);
84 if (priv == NULL)
85 goto fail;
86 memset(priv, 0, sizeof(*priv));
88 priv->key_idx = key_idx;
90 priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0);
91 if (priv->tfm_arc4 == NULL) {
92 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
93 "crypto API arc4\n");
94 goto fail;
97 priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0);
98 if (priv->tfm_michael == NULL) {
99 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
100 "crypto API michael_mic\n");
101 goto fail;
104 return priv;
106 fail:
107 if (priv) {
108 if (priv->tfm_michael)
109 crypto_free_tfm(priv->tfm_michael);
110 if (priv->tfm_arc4)
111 crypto_free_tfm(priv->tfm_arc4);
112 kfree(priv);
115 return NULL;
118 static void ieee80211_tkip_deinit(void *priv)
120 struct ieee80211_tkip_data *_priv = priv;
121 if (_priv && _priv->tfm_michael)
122 crypto_free_tfm(_priv->tfm_michael);
123 if (_priv && _priv->tfm_arc4)
124 crypto_free_tfm(_priv->tfm_arc4);
125 kfree(priv);
128 static inline u16 RotR1(u16 val)
130 return (val >> 1) | (val << 15);
133 static inline u8 Lo8(u16 val)
135 return val & 0xff;
138 static inline u8 Hi8(u16 val)
140 return val >> 8;
143 static inline u16 Lo16(u32 val)
145 return val & 0xffff;
148 static inline u16 Hi16(u32 val)
150 return val >> 16;
153 static inline u16 Mk16(u8 hi, u8 lo)
155 return lo | (((u16) hi) << 8);
158 static inline u16 Mk16_le(u16 * v)
160 return le16_to_cpu(*v);
163 static const u16 Sbox[256] = {
164 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
165 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
166 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
167 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
168 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
169 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
170 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
171 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
172 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
173 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
174 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
175 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
176 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
177 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
178 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
179 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
180 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
181 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
182 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
183 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
184 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
185 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
186 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
187 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
188 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
189 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
190 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
191 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
192 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
193 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
194 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
195 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
198 static inline u16 _S_(u16 v)
200 u16 t = Sbox[Hi8(v)];
201 return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
204 #define PHASE1_LOOP_COUNT 8
206 static void tkip_mixing_phase1(u16 * TTAK, const u8 * TK, const u8 * TA,
207 u32 IV32)
209 int i, j;
211 /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
212 TTAK[0] = Lo16(IV32);
213 TTAK[1] = Hi16(IV32);
214 TTAK[2] = Mk16(TA[1], TA[0]);
215 TTAK[3] = Mk16(TA[3], TA[2]);
216 TTAK[4] = Mk16(TA[5], TA[4]);
218 for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
219 j = 2 * (i & 1);
220 TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
221 TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
222 TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
223 TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
224 TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
228 static void tkip_mixing_phase2(u8 * WEPSeed, const u8 * TK, const u16 * TTAK,
229 u16 IV16)
231 /* Make temporary area overlap WEP seed so that the final copy can be
232 * avoided on little endian hosts. */
233 u16 *PPK = (u16 *) & WEPSeed[4];
235 /* Step 1 - make copy of TTAK and bring in TSC */
236 PPK[0] = TTAK[0];
237 PPK[1] = TTAK[1];
238 PPK[2] = TTAK[2];
239 PPK[3] = TTAK[3];
240 PPK[4] = TTAK[4];
241 PPK[5] = TTAK[4] + IV16;
243 /* Step 2 - 96-bit bijective mixing using S-box */
244 PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *) & TK[0]));
245 PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *) & TK[2]));
246 PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *) & TK[4]));
247 PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *) & TK[6]));
248 PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *) & TK[8]));
249 PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *) & TK[10]));
251 PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *) & TK[12]));
252 PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *) & TK[14]));
253 PPK[2] += RotR1(PPK[1]);
254 PPK[3] += RotR1(PPK[2]);
255 PPK[4] += RotR1(PPK[3]);
256 PPK[5] += RotR1(PPK[4]);
258 /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
259 * WEPSeed[0..2] is transmitted as WEP IV */
260 WEPSeed[0] = Hi8(IV16);
261 WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
262 WEPSeed[2] = Lo8(IV16);
263 WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *) & TK[0])) >> 1);
265 #ifdef __BIG_ENDIAN
267 int i;
268 for (i = 0; i < 6; i++)
269 PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
271 #endif
274 static u8 *ieee80211_tkip_hdr(struct sk_buff *skb, int hdr_len, void *priv)
276 struct ieee80211_tkip_data *tkey = priv;
277 int len;
278 u8 *rc4key, *pos, *icv;
279 struct ieee80211_hdr_4addr *hdr;
280 u32 crc;
282 hdr = (struct ieee80211_hdr_4addr *)skb->data;
284 if (skb_headroom(skb) < 8 || skb->len < hdr_len)
285 return NULL;
287 if (!tkey->tx_phase1_done) {
288 tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
289 tkey->tx_iv32);
290 tkey->tx_phase1_done = 1;
292 rc4key = kmalloc(16, GFP_ATOMIC);
293 if (!rc4key)
294 return NULL;
295 tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
297 len = skb->len - hdr_len;
298 pos = skb_push(skb, 8);
299 memmove(pos, pos + 8, hdr_len);
300 pos += hdr_len;
301 icv = skb_put(skb, 4);
303 *pos++ = *rc4key;
304 *pos++ = *(rc4key + 1);
305 *pos++ = *(rc4key + 2);
306 *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */ ;
307 *pos++ = tkey->tx_iv32 & 0xff;
308 *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
309 *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
310 *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
312 crc = ~crc32_le(~0, pos, len);
313 icv[0] = crc;
314 icv[1] = crc >> 8;
315 icv[2] = crc >> 16;
316 icv[3] = crc >> 24;
318 return rc4key;
321 static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
323 struct ieee80211_tkip_data *tkey = priv;
324 int len;
325 const u8 *rc4key;
326 u8 *pos;
327 struct scatterlist sg;
329 if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
330 if (net_ratelimit()) {
331 struct ieee80211_hdr_4addr *hdr =
332 (struct ieee80211_hdr_4addr *)skb->data;
333 printk(KERN_DEBUG "TKIP countermeasures: dropped "
334 "TX packet to " MAC_FMT "\n",
335 MAC_ARG(hdr->addr1));
337 return -1;
340 if (skb_tailroom(skb) < 4 || skb->len < hdr_len)
341 return -1;
343 len = skb->len - hdr_len;
344 pos = skb->data + hdr_len;
346 rc4key = ieee80211_tkip_hdr(skb, hdr_len, priv);
347 if (!rc4key)
348 return -1;
350 crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16);
351 sg.page = virt_to_page(pos);
352 sg.offset = offset_in_page(pos);
353 sg.length = len + 4;
354 crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4);
356 tkey->tx_iv16++;
357 if (tkey->tx_iv16 == 0) {
358 tkey->tx_phase1_done = 0;
359 tkey->tx_iv32++;
362 return 0;
365 static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
367 struct ieee80211_tkip_data *tkey = priv;
368 u8 rc4key[16];
369 u8 keyidx, *pos;
370 u32 iv32;
371 u16 iv16;
372 struct ieee80211_hdr_4addr *hdr;
373 u8 icv[4];
374 u32 crc;
375 struct scatterlist sg;
376 int plen;
378 hdr = (struct ieee80211_hdr_4addr *)skb->data;
380 if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
381 if (net_ratelimit()) {
382 printk(KERN_DEBUG "TKIP countermeasures: dropped "
383 "received packet from " MAC_FMT "\n",
384 MAC_ARG(hdr->addr2));
386 return -1;
389 if (skb->len < hdr_len + 8 + 4)
390 return -1;
392 pos = skb->data + hdr_len;
393 keyidx = pos[3];
394 if (!(keyidx & (1 << 5))) {
395 if (net_ratelimit()) {
396 printk(KERN_DEBUG "TKIP: received packet without ExtIV"
397 " flag from " MAC_FMT "\n", MAC_ARG(hdr->addr2));
399 return -2;
401 keyidx >>= 6;
402 if (tkey->key_idx != keyidx) {
403 printk(KERN_DEBUG "TKIP: RX tkey->key_idx=%d frame "
404 "keyidx=%d priv=%p\n", tkey->key_idx, keyidx, priv);
405 return -6;
407 if (!tkey->key_set) {
408 if (net_ratelimit()) {
409 printk(KERN_DEBUG "TKIP: received packet from " MAC_FMT
410 " with keyid=%d that does not have a configured"
411 " key\n", MAC_ARG(hdr->addr2), keyidx);
413 return -3;
415 iv16 = (pos[0] << 8) | pos[2];
416 iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
417 pos += 8;
419 if (iv32 < tkey->rx_iv32 ||
420 (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16)) {
421 if (net_ratelimit()) {
422 printk(KERN_DEBUG "TKIP: replay detected: STA=" MAC_FMT
423 " previous TSC %08x%04x received TSC "
424 "%08x%04x\n", MAC_ARG(hdr->addr2),
425 tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
427 tkey->dot11RSNAStatsTKIPReplays++;
428 return -4;
431 if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
432 tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
433 tkey->rx_phase1_done = 1;
435 tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
437 plen = skb->len - hdr_len - 12;
439 crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16);
440 sg.page = virt_to_page(pos);
441 sg.offset = offset_in_page(pos);
442 sg.length = plen + 4;
443 crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4);
445 crc = ~crc32_le(~0, pos, plen);
446 icv[0] = crc;
447 icv[1] = crc >> 8;
448 icv[2] = crc >> 16;
449 icv[3] = crc >> 24;
450 if (memcmp(icv, pos + plen, 4) != 0) {
451 if (iv32 != tkey->rx_iv32) {
452 /* Previously cached Phase1 result was already lost, so
453 * it needs to be recalculated for the next packet. */
454 tkey->rx_phase1_done = 0;
456 if (net_ratelimit()) {
457 printk(KERN_DEBUG "TKIP: ICV error detected: STA="
458 MAC_FMT "\n", MAC_ARG(hdr->addr2));
460 tkey->dot11RSNAStatsTKIPICVErrors++;
461 return -5;
464 /* Update real counters only after Michael MIC verification has
465 * completed */
466 tkey->rx_iv32_new = iv32;
467 tkey->rx_iv16_new = iv16;
469 /* Remove IV and ICV */
470 memmove(skb->data + 8, skb->data, hdr_len);
471 skb_pull(skb, 8);
472 skb_trim(skb, skb->len - 4);
474 return keyidx;
477 static int michael_mic(struct ieee80211_tkip_data *tkey, u8 * key, u8 * hdr,
478 u8 * data, size_t data_len, u8 * mic)
480 struct scatterlist sg[2];
482 if (tkey->tfm_michael == NULL) {
483 printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
484 return -1;
486 sg[0].page = virt_to_page(hdr);
487 sg[0].offset = offset_in_page(hdr);
488 sg[0].length = 16;
490 sg[1].page = virt_to_page(data);
491 sg[1].offset = offset_in_page(data);
492 sg[1].length = data_len;
494 crypto_digest_init(tkey->tfm_michael);
495 crypto_digest_setkey(tkey->tfm_michael, key, 8);
496 crypto_digest_update(tkey->tfm_michael, sg, 2);
497 crypto_digest_final(tkey->tfm_michael, mic);
499 return 0;
502 static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr)
504 struct ieee80211_hdr_4addr *hdr11;
506 hdr11 = (struct ieee80211_hdr_4addr *)skb->data;
507 switch (le16_to_cpu(hdr11->frame_ctl) &
508 (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
509 case IEEE80211_FCTL_TODS:
510 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
511 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
512 break;
513 case IEEE80211_FCTL_FROMDS:
514 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
515 memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
516 break;
517 case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
518 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
519 memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
520 break;
521 case 0:
522 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
523 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
524 break;
527 hdr[12] = 0; /* priority */
528 hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
531 static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len,
532 void *priv)
534 struct ieee80211_tkip_data *tkey = priv;
535 u8 *pos;
537 if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
538 printk(KERN_DEBUG "Invalid packet for Michael MIC add "
539 "(tailroom=%d hdr_len=%d skb->len=%d)\n",
540 skb_tailroom(skb), hdr_len, skb->len);
541 return -1;
544 michael_mic_hdr(skb, tkey->tx_hdr);
545 pos = skb_put(skb, 8);
546 if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr,
547 skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
548 return -1;
550 return 0;
553 static void ieee80211_michael_mic_failure(struct net_device *dev,
554 struct ieee80211_hdr_4addr *hdr,
555 int keyidx)
557 union iwreq_data wrqu;
558 struct iw_michaelmicfailure ev;
560 /* TODO: needed parameters: count, keyid, key type, TSC */
561 memset(&ev, 0, sizeof(ev));
562 ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
563 if (hdr->addr1[0] & 0x01)
564 ev.flags |= IW_MICFAILURE_GROUP;
565 else
566 ev.flags |= IW_MICFAILURE_PAIRWISE;
567 ev.src_addr.sa_family = ARPHRD_ETHER;
568 memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
569 memset(&wrqu, 0, sizeof(wrqu));
570 wrqu.data.length = sizeof(ev);
571 wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev);
574 static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
575 int hdr_len, void *priv)
577 struct ieee80211_tkip_data *tkey = priv;
578 u8 mic[8];
580 if (!tkey->key_set)
581 return -1;
583 michael_mic_hdr(skb, tkey->rx_hdr);
584 if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr,
585 skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
586 return -1;
587 if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
588 struct ieee80211_hdr_4addr *hdr;
589 hdr = (struct ieee80211_hdr_4addr *)skb->data;
590 printk(KERN_DEBUG "%s: Michael MIC verification failed for "
591 "MSDU from " MAC_FMT " keyidx=%d\n",
592 skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2),
593 keyidx);
594 if (skb->dev)
595 ieee80211_michael_mic_failure(skb->dev, hdr, keyidx);
596 tkey->dot11RSNAStatsTKIPLocalMICFailures++;
597 return -1;
600 /* Update TSC counters for RX now that the packet verification has
601 * completed. */
602 tkey->rx_iv32 = tkey->rx_iv32_new;
603 tkey->rx_iv16 = tkey->rx_iv16_new;
605 skb_trim(skb, skb->len - 8);
607 return 0;
610 static int ieee80211_tkip_set_key(void *key, int len, u8 * seq, void *priv)
612 struct ieee80211_tkip_data *tkey = priv;
613 int keyidx;
614 struct crypto_tfm *tfm = tkey->tfm_michael;
615 struct crypto_tfm *tfm2 = tkey->tfm_arc4;
617 keyidx = tkey->key_idx;
618 memset(tkey, 0, sizeof(*tkey));
619 tkey->key_idx = keyidx;
620 tkey->tfm_michael = tfm;
621 tkey->tfm_arc4 = tfm2;
622 if (len == TKIP_KEY_LEN) {
623 memcpy(tkey->key, key, TKIP_KEY_LEN);
624 tkey->key_set = 1;
625 tkey->tx_iv16 = 1; /* TSC is initialized to 1 */
626 if (seq) {
627 tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
628 (seq[3] << 8) | seq[2];
629 tkey->rx_iv16 = (seq[1] << 8) | seq[0];
631 } else if (len == 0)
632 tkey->key_set = 0;
633 else
634 return -1;
636 return 0;
639 static int ieee80211_tkip_get_key(void *key, int len, u8 * seq, void *priv)
641 struct ieee80211_tkip_data *tkey = priv;
643 if (len < TKIP_KEY_LEN)
644 return -1;
646 if (!tkey->key_set)
647 return 0;
648 memcpy(key, tkey->key, TKIP_KEY_LEN);
650 if (seq) {
651 /* Return the sequence number of the last transmitted frame. */
652 u16 iv16 = tkey->tx_iv16;
653 u32 iv32 = tkey->tx_iv32;
654 if (iv16 == 0)
655 iv32--;
656 iv16--;
657 seq[0] = tkey->tx_iv16;
658 seq[1] = tkey->tx_iv16 >> 8;
659 seq[2] = tkey->tx_iv32;
660 seq[3] = tkey->tx_iv32 >> 8;
661 seq[4] = tkey->tx_iv32 >> 16;
662 seq[5] = tkey->tx_iv32 >> 24;
665 return TKIP_KEY_LEN;
668 static char *ieee80211_tkip_print_stats(char *p, void *priv)
670 struct ieee80211_tkip_data *tkip = priv;
671 p += sprintf(p, "key[%d] alg=TKIP key_set=%d "
672 "tx_pn=%02x%02x%02x%02x%02x%02x "
673 "rx_pn=%02x%02x%02x%02x%02x%02x "
674 "replays=%d icv_errors=%d local_mic_failures=%d\n",
675 tkip->key_idx, tkip->key_set,
676 (tkip->tx_iv32 >> 24) & 0xff,
677 (tkip->tx_iv32 >> 16) & 0xff,
678 (tkip->tx_iv32 >> 8) & 0xff,
679 tkip->tx_iv32 & 0xff,
680 (tkip->tx_iv16 >> 8) & 0xff,
681 tkip->tx_iv16 & 0xff,
682 (tkip->rx_iv32 >> 24) & 0xff,
683 (tkip->rx_iv32 >> 16) & 0xff,
684 (tkip->rx_iv32 >> 8) & 0xff,
685 tkip->rx_iv32 & 0xff,
686 (tkip->rx_iv16 >> 8) & 0xff,
687 tkip->rx_iv16 & 0xff,
688 tkip->dot11RSNAStatsTKIPReplays,
689 tkip->dot11RSNAStatsTKIPICVErrors,
690 tkip->dot11RSNAStatsTKIPLocalMICFailures);
691 return p;
694 static struct ieee80211_crypto_ops ieee80211_crypt_tkip = {
695 .name = "TKIP",
696 .init = ieee80211_tkip_init,
697 .deinit = ieee80211_tkip_deinit,
698 .encrypt_mpdu = ieee80211_tkip_encrypt,
699 .decrypt_mpdu = ieee80211_tkip_decrypt,
700 .encrypt_msdu = ieee80211_michael_mic_add,
701 .decrypt_msdu = ieee80211_michael_mic_verify,
702 .set_key = ieee80211_tkip_set_key,
703 .get_key = ieee80211_tkip_get_key,
704 .print_stats = ieee80211_tkip_print_stats,
705 .extra_mpdu_prefix_len = 4 + 4, /* IV + ExtIV */
706 .extra_mpdu_postfix_len = 4, /* ICV */
707 .extra_msdu_postfix_len = 8, /* MIC */
708 .get_flags = ieee80211_tkip_get_flags,
709 .set_flags = ieee80211_tkip_set_flags,
710 .owner = THIS_MODULE,
713 static int __init ieee80211_crypto_tkip_init(void)
715 return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip);
718 static void __exit ieee80211_crypto_tkip_exit(void)
720 ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip);
723 module_init(ieee80211_crypto_tkip_init);
724 module_exit(ieee80211_crypto_tkip_exit);