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