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