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