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