sched/fair: Fix a comment in task_numa_fault()
[linux/fpc-iii.git] / net / wireless / lib80211_crypt_tkip.c
blobb5e235573c8a0777053e946bbcfde01f65ec7bcf
1 /*
2 * lib80211 crypt: host-based TKIP encryption implementation for lib80211
4 * Copyright (c) 2003-2004, Jouni Malinen <j@w1.fi>
5 * Copyright (c) 2008, John W. Linville <linville@tuxdriver.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation. See README and COPYING for
10 * more details.
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 #include <linux/err.h>
16 #include <linux/module.h>
17 #include <linux/init.h>
18 #include <linux/slab.h>
19 #include <linux/random.h>
20 #include <linux/scatterlist.h>
21 #include <linux/skbuff.h>
22 #include <linux/netdevice.h>
23 #include <linux/mm.h>
24 #include <linux/if_ether.h>
25 #include <linux/if_arp.h>
26 #include <asm/string.h>
28 #include <linux/wireless.h>
29 #include <linux/ieee80211.h>
30 #include <net/iw_handler.h>
32 #include <crypto/hash.h>
33 #include <linux/crypto.h>
34 #include <linux/crc32.h>
36 #include <net/lib80211.h>
38 MODULE_AUTHOR("Jouni Malinen");
39 MODULE_DESCRIPTION("lib80211 crypt: TKIP");
40 MODULE_LICENSE("GPL");
42 #define TKIP_HDR_LEN 8
44 struct lib80211_tkip_data {
45 #define TKIP_KEY_LEN 32
46 u8 key[TKIP_KEY_LEN];
47 int key_set;
49 u32 tx_iv32;
50 u16 tx_iv16;
51 u16 tx_ttak[5];
52 int tx_phase1_done;
54 u32 rx_iv32;
55 u16 rx_iv16;
56 u16 rx_ttak[5];
57 int rx_phase1_done;
58 u32 rx_iv32_new;
59 u16 rx_iv16_new;
61 u32 dot11RSNAStatsTKIPReplays;
62 u32 dot11RSNAStatsTKIPICVErrors;
63 u32 dot11RSNAStatsTKIPLocalMICFailures;
65 int key_idx;
67 struct crypto_cipher *rx_tfm_arc4;
68 struct crypto_shash *rx_tfm_michael;
69 struct crypto_cipher *tx_tfm_arc4;
70 struct crypto_shash *tx_tfm_michael;
72 /* scratch buffers for virt_to_page() (crypto API) */
73 u8 rx_hdr[16], tx_hdr[16];
75 unsigned long flags;
78 static unsigned long lib80211_tkip_set_flags(unsigned long flags, void *priv)
80 struct lib80211_tkip_data *_priv = priv;
81 unsigned long old_flags = _priv->flags;
82 _priv->flags = flags;
83 return old_flags;
86 static unsigned long lib80211_tkip_get_flags(void *priv)
88 struct lib80211_tkip_data *_priv = priv;
89 return _priv->flags;
92 static void *lib80211_tkip_init(int key_idx)
94 struct lib80211_tkip_data *priv;
96 priv = kzalloc(sizeof(*priv), GFP_ATOMIC);
97 if (priv == NULL)
98 goto fail;
100 priv->key_idx = key_idx;
102 priv->tx_tfm_arc4 = crypto_alloc_cipher("arc4", 0, CRYPTO_ALG_ASYNC);
103 if (IS_ERR(priv->tx_tfm_arc4)) {
104 priv->tx_tfm_arc4 = NULL;
105 goto fail;
108 priv->tx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
109 if (IS_ERR(priv->tx_tfm_michael)) {
110 priv->tx_tfm_michael = NULL;
111 goto fail;
114 priv->rx_tfm_arc4 = crypto_alloc_cipher("arc4", 0, CRYPTO_ALG_ASYNC);
115 if (IS_ERR(priv->rx_tfm_arc4)) {
116 priv->rx_tfm_arc4 = NULL;
117 goto fail;
120 priv->rx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
121 if (IS_ERR(priv->rx_tfm_michael)) {
122 priv->rx_tfm_michael = NULL;
123 goto fail;
126 return priv;
128 fail:
129 if (priv) {
130 crypto_free_shash(priv->tx_tfm_michael);
131 crypto_free_cipher(priv->tx_tfm_arc4);
132 crypto_free_shash(priv->rx_tfm_michael);
133 crypto_free_cipher(priv->rx_tfm_arc4);
134 kfree(priv);
137 return NULL;
140 static void lib80211_tkip_deinit(void *priv)
142 struct lib80211_tkip_data *_priv = priv;
143 if (_priv) {
144 crypto_free_shash(_priv->tx_tfm_michael);
145 crypto_free_cipher(_priv->tx_tfm_arc4);
146 crypto_free_shash(_priv->rx_tfm_michael);
147 crypto_free_cipher(_priv->rx_tfm_arc4);
149 kfree(priv);
152 static inline u16 RotR1(u16 val)
154 return (val >> 1) | (val << 15);
157 static inline u8 Lo8(u16 val)
159 return val & 0xff;
162 static inline u8 Hi8(u16 val)
164 return val >> 8;
167 static inline u16 Lo16(u32 val)
169 return val & 0xffff;
172 static inline u16 Hi16(u32 val)
174 return val >> 16;
177 static inline u16 Mk16(u8 hi, u8 lo)
179 return lo | (((u16) hi) << 8);
182 static inline u16 Mk16_le(__le16 * v)
184 return le16_to_cpu(*v);
187 static const u16 Sbox[256] = {
188 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
189 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
190 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
191 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
192 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
193 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
194 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
195 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
196 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
197 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
198 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
199 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
200 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
201 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
202 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
203 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
204 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
205 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
206 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
207 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
208 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
209 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
210 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
211 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
212 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
213 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
214 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
215 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
216 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
217 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
218 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
219 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
222 static inline u16 _S_(u16 v)
224 u16 t = Sbox[Hi8(v)];
225 return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
228 #define PHASE1_LOOP_COUNT 8
230 static void tkip_mixing_phase1(u16 * TTAK, const u8 * TK, const u8 * TA,
231 u32 IV32)
233 int i, j;
235 /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
236 TTAK[0] = Lo16(IV32);
237 TTAK[1] = Hi16(IV32);
238 TTAK[2] = Mk16(TA[1], TA[0]);
239 TTAK[3] = Mk16(TA[3], TA[2]);
240 TTAK[4] = Mk16(TA[5], TA[4]);
242 for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
243 j = 2 * (i & 1);
244 TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
245 TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
246 TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
247 TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
248 TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
252 static void tkip_mixing_phase2(u8 * WEPSeed, const u8 * TK, const u16 * TTAK,
253 u16 IV16)
255 /* Make temporary area overlap WEP seed so that the final copy can be
256 * avoided on little endian hosts. */
257 u16 *PPK = (u16 *) & WEPSeed[4];
259 /* Step 1 - make copy of TTAK and bring in TSC */
260 PPK[0] = TTAK[0];
261 PPK[1] = TTAK[1];
262 PPK[2] = TTAK[2];
263 PPK[3] = TTAK[3];
264 PPK[4] = TTAK[4];
265 PPK[5] = TTAK[4] + IV16;
267 /* Step 2 - 96-bit bijective mixing using S-box */
268 PPK[0] += _S_(PPK[5] ^ Mk16_le((__le16 *) & TK[0]));
269 PPK[1] += _S_(PPK[0] ^ Mk16_le((__le16 *) & TK[2]));
270 PPK[2] += _S_(PPK[1] ^ Mk16_le((__le16 *) & TK[4]));
271 PPK[3] += _S_(PPK[2] ^ Mk16_le((__le16 *) & TK[6]));
272 PPK[4] += _S_(PPK[3] ^ Mk16_le((__le16 *) & TK[8]));
273 PPK[5] += _S_(PPK[4] ^ Mk16_le((__le16 *) & TK[10]));
275 PPK[0] += RotR1(PPK[5] ^ Mk16_le((__le16 *) & TK[12]));
276 PPK[1] += RotR1(PPK[0] ^ Mk16_le((__le16 *) & TK[14]));
277 PPK[2] += RotR1(PPK[1]);
278 PPK[3] += RotR1(PPK[2]);
279 PPK[4] += RotR1(PPK[3]);
280 PPK[5] += RotR1(PPK[4]);
282 /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
283 * WEPSeed[0..2] is transmitted as WEP IV */
284 WEPSeed[0] = Hi8(IV16);
285 WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
286 WEPSeed[2] = Lo8(IV16);
287 WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((__le16 *) & TK[0])) >> 1);
289 #ifdef __BIG_ENDIAN
291 int i;
292 for (i = 0; i < 6; i++)
293 PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
295 #endif
298 static int lib80211_tkip_hdr(struct sk_buff *skb, int hdr_len,
299 u8 * rc4key, int keylen, void *priv)
301 struct lib80211_tkip_data *tkey = priv;
302 u8 *pos;
303 struct ieee80211_hdr *hdr;
305 hdr = (struct ieee80211_hdr *)skb->data;
307 if (skb_headroom(skb) < TKIP_HDR_LEN || skb->len < hdr_len)
308 return -1;
310 if (rc4key == NULL || keylen < 16)
311 return -1;
313 if (!tkey->tx_phase1_done) {
314 tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
315 tkey->tx_iv32);
316 tkey->tx_phase1_done = 1;
318 tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
320 pos = skb_push(skb, TKIP_HDR_LEN);
321 memmove(pos, pos + TKIP_HDR_LEN, hdr_len);
322 pos += hdr_len;
324 *pos++ = *rc4key;
325 *pos++ = *(rc4key + 1);
326 *pos++ = *(rc4key + 2);
327 *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */ ;
328 *pos++ = tkey->tx_iv32 & 0xff;
329 *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
330 *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
331 *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
333 tkey->tx_iv16++;
334 if (tkey->tx_iv16 == 0) {
335 tkey->tx_phase1_done = 0;
336 tkey->tx_iv32++;
339 return TKIP_HDR_LEN;
342 static int lib80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
344 struct lib80211_tkip_data *tkey = priv;
345 int len;
346 u8 rc4key[16], *pos, *icv;
347 u32 crc;
348 int i;
350 if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
351 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
352 net_dbg_ratelimited("TKIP countermeasures: dropped TX packet to %pM\n",
353 hdr->addr1);
354 return -1;
357 if (skb_tailroom(skb) < 4 || skb->len < hdr_len)
358 return -1;
360 len = skb->len - hdr_len;
361 pos = skb->data + hdr_len;
363 if ((lib80211_tkip_hdr(skb, hdr_len, rc4key, 16, priv)) < 0)
364 return -1;
366 crc = ~crc32_le(~0, pos, len);
367 icv = skb_put(skb, 4);
368 icv[0] = crc;
369 icv[1] = crc >> 8;
370 icv[2] = crc >> 16;
371 icv[3] = crc >> 24;
373 crypto_cipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
374 for (i = 0; i < len + 4; i++)
375 crypto_cipher_encrypt_one(tkey->tx_tfm_arc4, pos + i, pos + i);
376 return 0;
380 * deal with seq counter wrapping correctly.
381 * refer to timer_after() for jiffies wrapping handling
383 static inline int tkip_replay_check(u32 iv32_n, u16 iv16_n,
384 u32 iv32_o, u16 iv16_o)
386 if ((s32)iv32_n - (s32)iv32_o < 0 ||
387 (iv32_n == iv32_o && iv16_n <= iv16_o))
388 return 1;
389 return 0;
392 static int lib80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
394 struct lib80211_tkip_data *tkey = priv;
395 u8 rc4key[16];
396 u8 keyidx, *pos;
397 u32 iv32;
398 u16 iv16;
399 struct ieee80211_hdr *hdr;
400 u8 icv[4];
401 u32 crc;
402 int plen;
403 int i;
405 hdr = (struct ieee80211_hdr *)skb->data;
407 if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
408 net_dbg_ratelimited("TKIP countermeasures: dropped received packet from %pM\n",
409 hdr->addr2);
410 return -1;
413 if (skb->len < hdr_len + TKIP_HDR_LEN + 4)
414 return -1;
416 pos = skb->data + hdr_len;
417 keyidx = pos[3];
418 if (!(keyidx & (1 << 5))) {
419 net_dbg_ratelimited("TKIP: received packet without ExtIV flag from %pM\n",
420 hdr->addr2);
421 return -2;
423 keyidx >>= 6;
424 if (tkey->key_idx != keyidx) {
425 net_dbg_ratelimited("TKIP: RX tkey->key_idx=%d frame keyidx=%d\n",
426 tkey->key_idx, keyidx);
427 return -6;
429 if (!tkey->key_set) {
430 net_dbg_ratelimited("TKIP: received packet from %pM with keyid=%d that does not have a configured key\n",
431 hdr->addr2, keyidx);
432 return -3;
434 iv16 = (pos[0] << 8) | pos[2];
435 iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
436 pos += TKIP_HDR_LEN;
438 if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) {
439 #ifdef CONFIG_LIB80211_DEBUG
440 net_dbg_ratelimited("TKIP: replay detected: STA=%pM previous TSC %08x%04x received TSC %08x%04x\n",
441 hdr->addr2, tkey->rx_iv32, tkey->rx_iv16,
442 iv32, iv16);
443 #endif
444 tkey->dot11RSNAStatsTKIPReplays++;
445 return -4;
448 if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
449 tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
450 tkey->rx_phase1_done = 1;
452 tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
454 plen = skb->len - hdr_len - 12;
456 crypto_cipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
457 for (i = 0; i < plen + 4; i++)
458 crypto_cipher_decrypt_one(tkey->rx_tfm_arc4, pos + i, pos + i);
460 crc = ~crc32_le(~0, pos, plen);
461 icv[0] = crc;
462 icv[1] = crc >> 8;
463 icv[2] = crc >> 16;
464 icv[3] = crc >> 24;
465 if (memcmp(icv, pos + plen, 4) != 0) {
466 if (iv32 != tkey->rx_iv32) {
467 /* Previously cached Phase1 result was already lost, so
468 * it needs to be recalculated for the next packet. */
469 tkey->rx_phase1_done = 0;
471 #ifdef CONFIG_LIB80211_DEBUG
472 net_dbg_ratelimited("TKIP: ICV error detected: STA=%pM\n",
473 hdr->addr2);
474 #endif
475 tkey->dot11RSNAStatsTKIPICVErrors++;
476 return -5;
479 /* Update real counters only after Michael MIC verification has
480 * completed */
481 tkey->rx_iv32_new = iv32;
482 tkey->rx_iv16_new = iv16;
484 /* Remove IV and ICV */
485 memmove(skb->data + TKIP_HDR_LEN, skb->data, hdr_len);
486 skb_pull(skb, TKIP_HDR_LEN);
487 skb_trim(skb, skb->len - 4);
489 return keyidx;
492 static int michael_mic(struct crypto_shash *tfm_michael, u8 *key, u8 *hdr,
493 u8 *data, size_t data_len, u8 *mic)
495 SHASH_DESC_ON_STACK(desc, tfm_michael);
496 int err;
498 if (tfm_michael == NULL) {
499 pr_warn("%s(): tfm_michael == NULL\n", __func__);
500 return -1;
503 desc->tfm = tfm_michael;
504 desc->flags = 0;
506 if (crypto_shash_setkey(tfm_michael, key, 8))
507 return -1;
509 err = crypto_shash_init(desc);
510 if (err)
511 goto out;
512 err = crypto_shash_update(desc, hdr, 16);
513 if (err)
514 goto out;
515 err = crypto_shash_update(desc, data, data_len);
516 if (err)
517 goto out;
518 err = crypto_shash_final(desc, mic);
520 out:
521 shash_desc_zero(desc);
522 return err;
525 static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr)
527 struct ieee80211_hdr *hdr11;
529 hdr11 = (struct ieee80211_hdr *)skb->data;
531 switch (le16_to_cpu(hdr11->frame_control) &
532 (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
533 case IEEE80211_FCTL_TODS:
534 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
535 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
536 break;
537 case IEEE80211_FCTL_FROMDS:
538 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
539 memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
540 break;
541 case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
542 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
543 memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
544 break;
545 default:
546 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
547 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
548 break;
551 if (ieee80211_is_data_qos(hdr11->frame_control)) {
552 hdr[12] = le16_to_cpu(*((__le16 *)ieee80211_get_qos_ctl(hdr11)))
553 & IEEE80211_QOS_CTL_TID_MASK;
554 } else
555 hdr[12] = 0; /* priority */
557 hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
560 static int lib80211_michael_mic_add(struct sk_buff *skb, int hdr_len,
561 void *priv)
563 struct lib80211_tkip_data *tkey = priv;
564 u8 *pos;
566 if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
567 printk(KERN_DEBUG "Invalid packet for Michael MIC add "
568 "(tailroom=%d hdr_len=%d skb->len=%d)\n",
569 skb_tailroom(skb), hdr_len, skb->len);
570 return -1;
573 michael_mic_hdr(skb, tkey->tx_hdr);
574 pos = skb_put(skb, 8);
575 if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
576 skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
577 return -1;
579 return 0;
582 static void lib80211_michael_mic_failure(struct net_device *dev,
583 struct ieee80211_hdr *hdr,
584 int keyidx)
586 union iwreq_data wrqu;
587 struct iw_michaelmicfailure ev;
589 /* TODO: needed parameters: count, keyid, key type, TSC */
590 memset(&ev, 0, sizeof(ev));
591 ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
592 if (hdr->addr1[0] & 0x01)
593 ev.flags |= IW_MICFAILURE_GROUP;
594 else
595 ev.flags |= IW_MICFAILURE_PAIRWISE;
596 ev.src_addr.sa_family = ARPHRD_ETHER;
597 memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
598 memset(&wrqu, 0, sizeof(wrqu));
599 wrqu.data.length = sizeof(ev);
600 wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev);
603 static int lib80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
604 int hdr_len, void *priv)
606 struct lib80211_tkip_data *tkey = priv;
607 u8 mic[8];
609 if (!tkey->key_set)
610 return -1;
612 michael_mic_hdr(skb, tkey->rx_hdr);
613 if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
614 skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
615 return -1;
616 if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
617 struct ieee80211_hdr *hdr;
618 hdr = (struct ieee80211_hdr *)skb->data;
619 printk(KERN_DEBUG "%s: Michael MIC verification failed for "
620 "MSDU from %pM keyidx=%d\n",
621 skb->dev ? skb->dev->name : "N/A", hdr->addr2,
622 keyidx);
623 if (skb->dev)
624 lib80211_michael_mic_failure(skb->dev, hdr, keyidx);
625 tkey->dot11RSNAStatsTKIPLocalMICFailures++;
626 return -1;
629 /* Update TSC counters for RX now that the packet verification has
630 * completed. */
631 tkey->rx_iv32 = tkey->rx_iv32_new;
632 tkey->rx_iv16 = tkey->rx_iv16_new;
634 skb_trim(skb, skb->len - 8);
636 return 0;
639 static int lib80211_tkip_set_key(void *key, int len, u8 * seq, void *priv)
641 struct lib80211_tkip_data *tkey = priv;
642 int keyidx;
643 struct crypto_shash *tfm = tkey->tx_tfm_michael;
644 struct crypto_cipher *tfm2 = tkey->tx_tfm_arc4;
645 struct crypto_shash *tfm3 = tkey->rx_tfm_michael;
646 struct crypto_cipher *tfm4 = tkey->rx_tfm_arc4;
648 keyidx = tkey->key_idx;
649 memset(tkey, 0, sizeof(*tkey));
650 tkey->key_idx = keyidx;
651 tkey->tx_tfm_michael = tfm;
652 tkey->tx_tfm_arc4 = tfm2;
653 tkey->rx_tfm_michael = tfm3;
654 tkey->rx_tfm_arc4 = tfm4;
655 if (len == TKIP_KEY_LEN) {
656 memcpy(tkey->key, key, TKIP_KEY_LEN);
657 tkey->key_set = 1;
658 tkey->tx_iv16 = 1; /* TSC is initialized to 1 */
659 if (seq) {
660 tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
661 (seq[3] << 8) | seq[2];
662 tkey->rx_iv16 = (seq[1] << 8) | seq[0];
664 } else if (len == 0)
665 tkey->key_set = 0;
666 else
667 return -1;
669 return 0;
672 static int lib80211_tkip_get_key(void *key, int len, u8 * seq, void *priv)
674 struct lib80211_tkip_data *tkey = priv;
676 if (len < TKIP_KEY_LEN)
677 return -1;
679 if (!tkey->key_set)
680 return 0;
681 memcpy(key, tkey->key, TKIP_KEY_LEN);
683 if (seq) {
684 /* Return the sequence number of the last transmitted frame. */
685 u16 iv16 = tkey->tx_iv16;
686 u32 iv32 = tkey->tx_iv32;
687 if (iv16 == 0)
688 iv32--;
689 iv16--;
690 seq[0] = tkey->tx_iv16;
691 seq[1] = tkey->tx_iv16 >> 8;
692 seq[2] = tkey->tx_iv32;
693 seq[3] = tkey->tx_iv32 >> 8;
694 seq[4] = tkey->tx_iv32 >> 16;
695 seq[5] = tkey->tx_iv32 >> 24;
698 return TKIP_KEY_LEN;
701 static void lib80211_tkip_print_stats(struct seq_file *m, void *priv)
703 struct lib80211_tkip_data *tkip = priv;
704 seq_printf(m,
705 "key[%d] alg=TKIP key_set=%d "
706 "tx_pn=%02x%02x%02x%02x%02x%02x "
707 "rx_pn=%02x%02x%02x%02x%02x%02x "
708 "replays=%d icv_errors=%d local_mic_failures=%d\n",
709 tkip->key_idx, tkip->key_set,
710 (tkip->tx_iv32 >> 24) & 0xff,
711 (tkip->tx_iv32 >> 16) & 0xff,
712 (tkip->tx_iv32 >> 8) & 0xff,
713 tkip->tx_iv32 & 0xff,
714 (tkip->tx_iv16 >> 8) & 0xff,
715 tkip->tx_iv16 & 0xff,
716 (tkip->rx_iv32 >> 24) & 0xff,
717 (tkip->rx_iv32 >> 16) & 0xff,
718 (tkip->rx_iv32 >> 8) & 0xff,
719 tkip->rx_iv32 & 0xff,
720 (tkip->rx_iv16 >> 8) & 0xff,
721 tkip->rx_iv16 & 0xff,
722 tkip->dot11RSNAStatsTKIPReplays,
723 tkip->dot11RSNAStatsTKIPICVErrors,
724 tkip->dot11RSNAStatsTKIPLocalMICFailures);
727 static struct lib80211_crypto_ops lib80211_crypt_tkip = {
728 .name = "TKIP",
729 .init = lib80211_tkip_init,
730 .deinit = lib80211_tkip_deinit,
731 .encrypt_mpdu = lib80211_tkip_encrypt,
732 .decrypt_mpdu = lib80211_tkip_decrypt,
733 .encrypt_msdu = lib80211_michael_mic_add,
734 .decrypt_msdu = lib80211_michael_mic_verify,
735 .set_key = lib80211_tkip_set_key,
736 .get_key = lib80211_tkip_get_key,
737 .print_stats = lib80211_tkip_print_stats,
738 .extra_mpdu_prefix_len = 4 + 4, /* IV + ExtIV */
739 .extra_mpdu_postfix_len = 4, /* ICV */
740 .extra_msdu_postfix_len = 8, /* MIC */
741 .get_flags = lib80211_tkip_get_flags,
742 .set_flags = lib80211_tkip_set_flags,
743 .owner = THIS_MODULE,
746 static int __init lib80211_crypto_tkip_init(void)
748 return lib80211_register_crypto_ops(&lib80211_crypt_tkip);
751 static void __exit lib80211_crypto_tkip_exit(void)
753 lib80211_unregister_crypto_ops(&lib80211_crypt_tkip);
756 module_init(lib80211_crypto_tkip_init);
757 module_exit(lib80211_crypto_tkip_exit);