staging: erofs: integrate decompression inplace
[linux/fpc-iii.git] / net / wireless / lib80211_crypt_tkip.c
blob62edf5b01953f7f1598657ff7f0f7f9fbb588eef
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * lib80211 crypt: host-based TKIP encryption implementation for lib80211
5 * Copyright (c) 2003-2004, Jouni Malinen <j@w1.fi>
6 * Copyright (c) 2008, John W. Linville <linville@tuxdriver.com>
7 */
9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11 #include <linux/err.h>
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/slab.h>
15 #include <linux/random.h>
16 #include <linux/scatterlist.h>
17 #include <linux/skbuff.h>
18 #include <linux/netdevice.h>
19 #include <linux/mm.h>
20 #include <linux/if_ether.h>
21 #include <linux/if_arp.h>
22 #include <asm/string.h>
24 #include <linux/wireless.h>
25 #include <linux/ieee80211.h>
26 #include <net/iw_handler.h>
28 #include <crypto/hash.h>
29 #include <linux/crypto.h>
30 #include <linux/crc32.h>
32 #include <net/lib80211.h>
34 MODULE_AUTHOR("Jouni Malinen");
35 MODULE_DESCRIPTION("lib80211 crypt: TKIP");
36 MODULE_LICENSE("GPL");
38 #define TKIP_HDR_LEN 8
40 struct lib80211_tkip_data {
41 #define TKIP_KEY_LEN 32
42 u8 key[TKIP_KEY_LEN];
43 int key_set;
45 u32 tx_iv32;
46 u16 tx_iv16;
47 u16 tx_ttak[5];
48 int tx_phase1_done;
50 u32 rx_iv32;
51 u16 rx_iv16;
52 u16 rx_ttak[5];
53 int rx_phase1_done;
54 u32 rx_iv32_new;
55 u16 rx_iv16_new;
57 u32 dot11RSNAStatsTKIPReplays;
58 u32 dot11RSNAStatsTKIPICVErrors;
59 u32 dot11RSNAStatsTKIPLocalMICFailures;
61 int key_idx;
63 struct crypto_cipher *rx_tfm_arc4;
64 struct crypto_shash *rx_tfm_michael;
65 struct crypto_cipher *tx_tfm_arc4;
66 struct crypto_shash *tx_tfm_michael;
68 /* scratch buffers for virt_to_page() (crypto API) */
69 u8 rx_hdr[16], tx_hdr[16];
71 unsigned long flags;
74 static unsigned long lib80211_tkip_set_flags(unsigned long flags, void *priv)
76 struct lib80211_tkip_data *_priv = priv;
77 unsigned long old_flags = _priv->flags;
78 _priv->flags = flags;
79 return old_flags;
82 static unsigned long lib80211_tkip_get_flags(void *priv)
84 struct lib80211_tkip_data *_priv = priv;
85 return _priv->flags;
88 static void *lib80211_tkip_init(int key_idx)
90 struct lib80211_tkip_data *priv;
92 priv = kzalloc(sizeof(*priv), GFP_ATOMIC);
93 if (priv == NULL)
94 goto fail;
96 priv->key_idx = key_idx;
98 priv->tx_tfm_arc4 = crypto_alloc_cipher("arc4", 0, 0);
99 if (IS_ERR(priv->tx_tfm_arc4)) {
100 priv->tx_tfm_arc4 = NULL;
101 goto fail;
104 priv->tx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
105 if (IS_ERR(priv->tx_tfm_michael)) {
106 priv->tx_tfm_michael = NULL;
107 goto fail;
110 priv->rx_tfm_arc4 = crypto_alloc_cipher("arc4", 0, 0);
111 if (IS_ERR(priv->rx_tfm_arc4)) {
112 priv->rx_tfm_arc4 = NULL;
113 goto fail;
116 priv->rx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
117 if (IS_ERR(priv->rx_tfm_michael)) {
118 priv->rx_tfm_michael = NULL;
119 goto fail;
122 return priv;
124 fail:
125 if (priv) {
126 crypto_free_shash(priv->tx_tfm_michael);
127 crypto_free_cipher(priv->tx_tfm_arc4);
128 crypto_free_shash(priv->rx_tfm_michael);
129 crypto_free_cipher(priv->rx_tfm_arc4);
130 kfree(priv);
133 return NULL;
136 static void lib80211_tkip_deinit(void *priv)
138 struct lib80211_tkip_data *_priv = priv;
139 if (_priv) {
140 crypto_free_shash(_priv->tx_tfm_michael);
141 crypto_free_cipher(_priv->tx_tfm_arc4);
142 crypto_free_shash(_priv->rx_tfm_michael);
143 crypto_free_cipher(_priv->rx_tfm_arc4);
145 kfree(priv);
148 static inline u16 RotR1(u16 val)
150 return (val >> 1) | (val << 15);
153 static inline u8 Lo8(u16 val)
155 return val & 0xff;
158 static inline u8 Hi8(u16 val)
160 return val >> 8;
163 static inline u16 Lo16(u32 val)
165 return val & 0xffff;
168 static inline u16 Hi16(u32 val)
170 return val >> 16;
173 static inline u16 Mk16(u8 hi, u8 lo)
175 return lo | (((u16) hi) << 8);
178 static inline u16 Mk16_le(__le16 * v)
180 return le16_to_cpu(*v);
183 static const u16 Sbox[256] = {
184 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
185 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
186 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
187 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
188 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
189 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
190 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
191 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
192 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
193 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
194 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
195 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
196 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
197 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
198 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
199 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
200 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
201 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
202 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
203 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
204 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
205 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
206 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
207 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
208 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
209 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
210 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
211 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
212 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
213 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
214 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
215 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
218 static inline u16 _S_(u16 v)
220 u16 t = Sbox[Hi8(v)];
221 return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
224 #define PHASE1_LOOP_COUNT 8
226 static void tkip_mixing_phase1(u16 * TTAK, const u8 * TK, const u8 * TA,
227 u32 IV32)
229 int i, j;
231 /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
232 TTAK[0] = Lo16(IV32);
233 TTAK[1] = Hi16(IV32);
234 TTAK[2] = Mk16(TA[1], TA[0]);
235 TTAK[3] = Mk16(TA[3], TA[2]);
236 TTAK[4] = Mk16(TA[5], TA[4]);
238 for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
239 j = 2 * (i & 1);
240 TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
241 TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
242 TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
243 TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
244 TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
248 static void tkip_mixing_phase2(u8 * WEPSeed, const u8 * TK, const u16 * TTAK,
249 u16 IV16)
251 /* Make temporary area overlap WEP seed so that the final copy can be
252 * avoided on little endian hosts. */
253 u16 *PPK = (u16 *) & WEPSeed[4];
255 /* Step 1 - make copy of TTAK and bring in TSC */
256 PPK[0] = TTAK[0];
257 PPK[1] = TTAK[1];
258 PPK[2] = TTAK[2];
259 PPK[3] = TTAK[3];
260 PPK[4] = TTAK[4];
261 PPK[5] = TTAK[4] + IV16;
263 /* Step 2 - 96-bit bijective mixing using S-box */
264 PPK[0] += _S_(PPK[5] ^ Mk16_le((__le16 *) & TK[0]));
265 PPK[1] += _S_(PPK[0] ^ Mk16_le((__le16 *) & TK[2]));
266 PPK[2] += _S_(PPK[1] ^ Mk16_le((__le16 *) & TK[4]));
267 PPK[3] += _S_(PPK[2] ^ Mk16_le((__le16 *) & TK[6]));
268 PPK[4] += _S_(PPK[3] ^ Mk16_le((__le16 *) & TK[8]));
269 PPK[5] += _S_(PPK[4] ^ Mk16_le((__le16 *) & TK[10]));
271 PPK[0] += RotR1(PPK[5] ^ Mk16_le((__le16 *) & TK[12]));
272 PPK[1] += RotR1(PPK[0] ^ Mk16_le((__le16 *) & TK[14]));
273 PPK[2] += RotR1(PPK[1]);
274 PPK[3] += RotR1(PPK[2]);
275 PPK[4] += RotR1(PPK[3]);
276 PPK[5] += RotR1(PPK[4]);
278 /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
279 * WEPSeed[0..2] is transmitted as WEP IV */
280 WEPSeed[0] = Hi8(IV16);
281 WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
282 WEPSeed[2] = Lo8(IV16);
283 WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((__le16 *) & TK[0])) >> 1);
285 #ifdef __BIG_ENDIAN
287 int i;
288 for (i = 0; i < 6; i++)
289 PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
291 #endif
294 static int lib80211_tkip_hdr(struct sk_buff *skb, int hdr_len,
295 u8 * rc4key, int keylen, void *priv)
297 struct lib80211_tkip_data *tkey = priv;
298 u8 *pos;
299 struct ieee80211_hdr *hdr;
301 hdr = (struct ieee80211_hdr *)skb->data;
303 if (skb_headroom(skb) < TKIP_HDR_LEN || skb->len < hdr_len)
304 return -1;
306 if (rc4key == NULL || keylen < 16)
307 return -1;
309 if (!tkey->tx_phase1_done) {
310 tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
311 tkey->tx_iv32);
312 tkey->tx_phase1_done = 1;
314 tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
316 pos = skb_push(skb, TKIP_HDR_LEN);
317 memmove(pos, pos + TKIP_HDR_LEN, hdr_len);
318 pos += hdr_len;
320 *pos++ = *rc4key;
321 *pos++ = *(rc4key + 1);
322 *pos++ = *(rc4key + 2);
323 *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */ ;
324 *pos++ = tkey->tx_iv32 & 0xff;
325 *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
326 *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
327 *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
329 tkey->tx_iv16++;
330 if (tkey->tx_iv16 == 0) {
331 tkey->tx_phase1_done = 0;
332 tkey->tx_iv32++;
335 return TKIP_HDR_LEN;
338 static int lib80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
340 struct lib80211_tkip_data *tkey = priv;
341 int len;
342 u8 rc4key[16], *pos, *icv;
343 u32 crc;
344 int i;
346 if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
347 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
348 net_dbg_ratelimited("TKIP countermeasures: dropped TX packet to %pM\n",
349 hdr->addr1);
350 return -1;
353 if (skb_tailroom(skb) < 4 || skb->len < hdr_len)
354 return -1;
356 len = skb->len - hdr_len;
357 pos = skb->data + hdr_len;
359 if ((lib80211_tkip_hdr(skb, hdr_len, rc4key, 16, priv)) < 0)
360 return -1;
362 crc = ~crc32_le(~0, pos, len);
363 icv = skb_put(skb, 4);
364 icv[0] = crc;
365 icv[1] = crc >> 8;
366 icv[2] = crc >> 16;
367 icv[3] = crc >> 24;
369 crypto_cipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
370 for (i = 0; i < len + 4; i++)
371 crypto_cipher_encrypt_one(tkey->tx_tfm_arc4, pos + i, pos + i);
372 return 0;
376 * deal with seq counter wrapping correctly.
377 * refer to timer_after() for jiffies wrapping handling
379 static inline int tkip_replay_check(u32 iv32_n, u16 iv16_n,
380 u32 iv32_o, u16 iv16_o)
382 if ((s32)iv32_n - (s32)iv32_o < 0 ||
383 (iv32_n == iv32_o && iv16_n <= iv16_o))
384 return 1;
385 return 0;
388 static int lib80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
390 struct lib80211_tkip_data *tkey = priv;
391 u8 rc4key[16];
392 u8 keyidx, *pos;
393 u32 iv32;
394 u16 iv16;
395 struct ieee80211_hdr *hdr;
396 u8 icv[4];
397 u32 crc;
398 int plen;
399 int i;
401 hdr = (struct ieee80211_hdr *)skb->data;
403 if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
404 net_dbg_ratelimited("TKIP countermeasures: dropped received packet from %pM\n",
405 hdr->addr2);
406 return -1;
409 if (skb->len < hdr_len + TKIP_HDR_LEN + 4)
410 return -1;
412 pos = skb->data + hdr_len;
413 keyidx = pos[3];
414 if (!(keyidx & (1 << 5))) {
415 net_dbg_ratelimited("TKIP: received packet without ExtIV flag from %pM\n",
416 hdr->addr2);
417 return -2;
419 keyidx >>= 6;
420 if (tkey->key_idx != keyidx) {
421 net_dbg_ratelimited("TKIP: RX tkey->key_idx=%d frame keyidx=%d\n",
422 tkey->key_idx, keyidx);
423 return -6;
425 if (!tkey->key_set) {
426 net_dbg_ratelimited("TKIP: received packet from %pM with keyid=%d that does not have a configured key\n",
427 hdr->addr2, keyidx);
428 return -3;
430 iv16 = (pos[0] << 8) | pos[2];
431 iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
432 pos += TKIP_HDR_LEN;
434 if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) {
435 #ifdef CONFIG_LIB80211_DEBUG
436 net_dbg_ratelimited("TKIP: replay detected: STA=%pM previous TSC %08x%04x received TSC %08x%04x\n",
437 hdr->addr2, tkey->rx_iv32, tkey->rx_iv16,
438 iv32, iv16);
439 #endif
440 tkey->dot11RSNAStatsTKIPReplays++;
441 return -4;
444 if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
445 tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
446 tkey->rx_phase1_done = 1;
448 tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
450 plen = skb->len - hdr_len - 12;
452 crypto_cipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
453 for (i = 0; i < plen + 4; i++)
454 crypto_cipher_decrypt_one(tkey->rx_tfm_arc4, pos + i, pos + i);
456 crc = ~crc32_le(~0, pos, plen);
457 icv[0] = crc;
458 icv[1] = crc >> 8;
459 icv[2] = crc >> 16;
460 icv[3] = crc >> 24;
461 if (memcmp(icv, pos + plen, 4) != 0) {
462 if (iv32 != tkey->rx_iv32) {
463 /* Previously cached Phase1 result was already lost, so
464 * it needs to be recalculated for the next packet. */
465 tkey->rx_phase1_done = 0;
467 #ifdef CONFIG_LIB80211_DEBUG
468 net_dbg_ratelimited("TKIP: ICV error detected: STA=%pM\n",
469 hdr->addr2);
470 #endif
471 tkey->dot11RSNAStatsTKIPICVErrors++;
472 return -5;
475 /* Update real counters only after Michael MIC verification has
476 * completed */
477 tkey->rx_iv32_new = iv32;
478 tkey->rx_iv16_new = iv16;
480 /* Remove IV and ICV */
481 memmove(skb->data + TKIP_HDR_LEN, skb->data, hdr_len);
482 skb_pull(skb, TKIP_HDR_LEN);
483 skb_trim(skb, skb->len - 4);
485 return keyidx;
488 static int michael_mic(struct crypto_shash *tfm_michael, u8 *key, u8 *hdr,
489 u8 *data, size_t data_len, u8 *mic)
491 SHASH_DESC_ON_STACK(desc, tfm_michael);
492 int err;
494 if (tfm_michael == NULL) {
495 pr_warn("%s(): tfm_michael == NULL\n", __func__);
496 return -1;
499 desc->tfm = tfm_michael;
501 if (crypto_shash_setkey(tfm_michael, key, 8))
502 return -1;
504 err = crypto_shash_init(desc);
505 if (err)
506 goto out;
507 err = crypto_shash_update(desc, hdr, 16);
508 if (err)
509 goto out;
510 err = crypto_shash_update(desc, data, data_len);
511 if (err)
512 goto out;
513 err = crypto_shash_final(desc, mic);
515 out:
516 shash_desc_zero(desc);
517 return err;
520 static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr)
522 struct ieee80211_hdr *hdr11;
524 hdr11 = (struct ieee80211_hdr *)skb->data;
526 switch (le16_to_cpu(hdr11->frame_control) &
527 (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
528 case IEEE80211_FCTL_TODS:
529 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
530 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
531 break;
532 case IEEE80211_FCTL_FROMDS:
533 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
534 memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
535 break;
536 case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
537 memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
538 memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
539 break;
540 default:
541 memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
542 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
543 break;
546 if (ieee80211_is_data_qos(hdr11->frame_control)) {
547 hdr[12] = le16_to_cpu(*((__le16 *)ieee80211_get_qos_ctl(hdr11)))
548 & IEEE80211_QOS_CTL_TID_MASK;
549 } else
550 hdr[12] = 0; /* priority */
552 hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
555 static int lib80211_michael_mic_add(struct sk_buff *skb, int hdr_len,
556 void *priv)
558 struct lib80211_tkip_data *tkey = priv;
559 u8 *pos;
561 if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
562 printk(KERN_DEBUG "Invalid packet for Michael MIC add "
563 "(tailroom=%d hdr_len=%d skb->len=%d)\n",
564 skb_tailroom(skb), hdr_len, skb->len);
565 return -1;
568 michael_mic_hdr(skb, tkey->tx_hdr);
569 pos = skb_put(skb, 8);
570 if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
571 skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
572 return -1;
574 return 0;
577 static void lib80211_michael_mic_failure(struct net_device *dev,
578 struct ieee80211_hdr *hdr,
579 int keyidx)
581 union iwreq_data wrqu;
582 struct iw_michaelmicfailure ev;
584 /* TODO: needed parameters: count, keyid, key type, TSC */
585 memset(&ev, 0, sizeof(ev));
586 ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
587 if (hdr->addr1[0] & 0x01)
588 ev.flags |= IW_MICFAILURE_GROUP;
589 else
590 ev.flags |= IW_MICFAILURE_PAIRWISE;
591 ev.src_addr.sa_family = ARPHRD_ETHER;
592 memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
593 memset(&wrqu, 0, sizeof(wrqu));
594 wrqu.data.length = sizeof(ev);
595 wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev);
598 static int lib80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
599 int hdr_len, void *priv)
601 struct lib80211_tkip_data *tkey = priv;
602 u8 mic[8];
604 if (!tkey->key_set)
605 return -1;
607 michael_mic_hdr(skb, tkey->rx_hdr);
608 if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
609 skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
610 return -1;
611 if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
612 struct ieee80211_hdr *hdr;
613 hdr = (struct ieee80211_hdr *)skb->data;
614 printk(KERN_DEBUG "%s: Michael MIC verification failed for "
615 "MSDU from %pM keyidx=%d\n",
616 skb->dev ? skb->dev->name : "N/A", hdr->addr2,
617 keyidx);
618 if (skb->dev)
619 lib80211_michael_mic_failure(skb->dev, hdr, keyidx);
620 tkey->dot11RSNAStatsTKIPLocalMICFailures++;
621 return -1;
624 /* Update TSC counters for RX now that the packet verification has
625 * completed. */
626 tkey->rx_iv32 = tkey->rx_iv32_new;
627 tkey->rx_iv16 = tkey->rx_iv16_new;
629 skb_trim(skb, skb->len - 8);
631 return 0;
634 static int lib80211_tkip_set_key(void *key, int len, u8 * seq, void *priv)
636 struct lib80211_tkip_data *tkey = priv;
637 int keyidx;
638 struct crypto_shash *tfm = tkey->tx_tfm_michael;
639 struct crypto_cipher *tfm2 = tkey->tx_tfm_arc4;
640 struct crypto_shash *tfm3 = tkey->rx_tfm_michael;
641 struct crypto_cipher *tfm4 = tkey->rx_tfm_arc4;
643 keyidx = tkey->key_idx;
644 memset(tkey, 0, sizeof(*tkey));
645 tkey->key_idx = keyidx;
646 tkey->tx_tfm_michael = tfm;
647 tkey->tx_tfm_arc4 = tfm2;
648 tkey->rx_tfm_michael = tfm3;
649 tkey->rx_tfm_arc4 = tfm4;
650 if (len == TKIP_KEY_LEN) {
651 memcpy(tkey->key, key, TKIP_KEY_LEN);
652 tkey->key_set = 1;
653 tkey->tx_iv16 = 1; /* TSC is initialized to 1 */
654 if (seq) {
655 tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
656 (seq[3] << 8) | seq[2];
657 tkey->rx_iv16 = (seq[1] << 8) | seq[0];
659 } else if (len == 0)
660 tkey->key_set = 0;
661 else
662 return -1;
664 return 0;
667 static int lib80211_tkip_get_key(void *key, int len, u8 * seq, void *priv)
669 struct lib80211_tkip_data *tkey = priv;
671 if (len < TKIP_KEY_LEN)
672 return -1;
674 if (!tkey->key_set)
675 return 0;
676 memcpy(key, tkey->key, TKIP_KEY_LEN);
678 if (seq) {
679 /* Return the sequence number of the last transmitted frame. */
680 u16 iv16 = tkey->tx_iv16;
681 u32 iv32 = tkey->tx_iv32;
682 if (iv16 == 0)
683 iv32--;
684 iv16--;
685 seq[0] = tkey->tx_iv16;
686 seq[1] = tkey->tx_iv16 >> 8;
687 seq[2] = tkey->tx_iv32;
688 seq[3] = tkey->tx_iv32 >> 8;
689 seq[4] = tkey->tx_iv32 >> 16;
690 seq[5] = tkey->tx_iv32 >> 24;
693 return TKIP_KEY_LEN;
696 static void lib80211_tkip_print_stats(struct seq_file *m, void *priv)
698 struct lib80211_tkip_data *tkip = priv;
699 seq_printf(m,
700 "key[%d] alg=TKIP key_set=%d "
701 "tx_pn=%02x%02x%02x%02x%02x%02x "
702 "rx_pn=%02x%02x%02x%02x%02x%02x "
703 "replays=%d icv_errors=%d local_mic_failures=%d\n",
704 tkip->key_idx, tkip->key_set,
705 (tkip->tx_iv32 >> 24) & 0xff,
706 (tkip->tx_iv32 >> 16) & 0xff,
707 (tkip->tx_iv32 >> 8) & 0xff,
708 tkip->tx_iv32 & 0xff,
709 (tkip->tx_iv16 >> 8) & 0xff,
710 tkip->tx_iv16 & 0xff,
711 (tkip->rx_iv32 >> 24) & 0xff,
712 (tkip->rx_iv32 >> 16) & 0xff,
713 (tkip->rx_iv32 >> 8) & 0xff,
714 tkip->rx_iv32 & 0xff,
715 (tkip->rx_iv16 >> 8) & 0xff,
716 tkip->rx_iv16 & 0xff,
717 tkip->dot11RSNAStatsTKIPReplays,
718 tkip->dot11RSNAStatsTKIPICVErrors,
719 tkip->dot11RSNAStatsTKIPLocalMICFailures);
722 static struct lib80211_crypto_ops lib80211_crypt_tkip = {
723 .name = "TKIP",
724 .init = lib80211_tkip_init,
725 .deinit = lib80211_tkip_deinit,
726 .encrypt_mpdu = lib80211_tkip_encrypt,
727 .decrypt_mpdu = lib80211_tkip_decrypt,
728 .encrypt_msdu = lib80211_michael_mic_add,
729 .decrypt_msdu = lib80211_michael_mic_verify,
730 .set_key = lib80211_tkip_set_key,
731 .get_key = lib80211_tkip_get_key,
732 .print_stats = lib80211_tkip_print_stats,
733 .extra_mpdu_prefix_len = 4 + 4, /* IV + ExtIV */
734 .extra_mpdu_postfix_len = 4, /* ICV */
735 .extra_msdu_postfix_len = 8, /* MIC */
736 .get_flags = lib80211_tkip_get_flags,
737 .set_flags = lib80211_tkip_set_flags,
738 .owner = THIS_MODULE,
741 static int __init lib80211_crypto_tkip_init(void)
743 return lib80211_register_crypto_ops(&lib80211_crypt_tkip);
746 static void __exit lib80211_crypto_tkip_exit(void)
748 lib80211_unregister_crypto_ops(&lib80211_crypt_tkip);
751 module_init(lib80211_crypto_tkip_init);
752 module_exit(lib80211_crypto_tkip_exit);