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