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