linux/net/mac80211/wpa.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright 2002-2004, Instant802 Networks, Inc.
   4 * Copyright 2008, Jouni Malinen <j@w1.fi>
   5 * Copyright (C) 2016-2017 Intel Deutschland GmbH
   6 * Copyright (C) 2020-2021 Intel Corporation
   7 */
   8
   9#include <linux/netdevice.h>
  10#include <linux/types.h>
  11#include <linux/skbuff.h>
  12#include <linux/compiler.h>
  13#include <linux/ieee80211.h>
  14#include <linux/gfp.h>
  15#include <asm/unaligned.h>
  16#include <net/mac80211.h>
  17#include <crypto/aes.h>
  18#include <crypto/algapi.h>
  19
  20#include "ieee80211_i.h"
  21#include "michael.h"
  22#include "tkip.h"
  23#include "aes_ccm.h"
  24#include "aes_cmac.h"
  25#include "aes_gmac.h"
  26#include "aes_gcm.h"
  27#include "wpa.h"
  28
  29ieee80211_tx_result
  30ieee80211_tx_h_michael_mic_add(struct ieee80211_tx_data *tx)
  31{
  32        u8 *data, *key, *mic;
  33        size_t data_len;
  34        unsigned int hdrlen;
  35        struct ieee80211_hdr *hdr;
  36        struct sk_buff *skb = tx->skb;
  37        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  38        int tail;
  39
  40        hdr = (struct ieee80211_hdr *)skb->data;
  41        if (!tx->key || tx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
  42            skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control))
  43                return TX_CONTINUE;
  44
  45        hdrlen = ieee80211_hdrlen(hdr->frame_control);
  46        if (skb->len < hdrlen)
  47                return TX_DROP;
  48
  49        data = skb->data + hdrlen;
  50        data_len = skb->len - hdrlen;
  51
  52        if (unlikely(info->flags & IEEE80211_TX_INTFL_TKIP_MIC_FAILURE)) {
  53                /* Need to use software crypto for the test */
  54                info->control.hw_key = NULL;
  55        }
  56
  57        if (info->control.hw_key &&
  58            (info->flags & IEEE80211_TX_CTL_DONTFRAG ||
  59             ieee80211_hw_check(&tx->local->hw, SUPPORTS_TX_FRAG)) &&
  60            !(tx->key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
  61                                     IEEE80211_KEY_FLAG_PUT_MIC_SPACE))) {
  62                /* hwaccel - with no need for SW-generated MMIC or MIC space */
  63                return TX_CONTINUE;
  64        }
  65
  66        tail = MICHAEL_MIC_LEN;
  67        if (!info->control.hw_key)
  68                tail += IEEE80211_TKIP_ICV_LEN;
  69
  70        if (WARN(skb_tailroom(skb) < tail ||
  71                 skb_headroom(skb) < IEEE80211_TKIP_IV_LEN,
  72                 "mmic: not enough head/tail (%d/%d,%d/%d)\n",
  73                 skb_headroom(skb), IEEE80211_TKIP_IV_LEN,
  74                 skb_tailroom(skb), tail))
  75                return TX_DROP;
  76
  77        mic = skb_put(skb, MICHAEL_MIC_LEN);
  78
  79        if (tx->key->conf.flags & IEEE80211_KEY_FLAG_PUT_MIC_SPACE) {
  80                /* Zeroed MIC can help with debug */
  81                memset(mic, 0, MICHAEL_MIC_LEN);
  82                return TX_CONTINUE;
  83        }
  84
  85        key = &tx->key->conf.key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY];
  86        michael_mic(key, hdr, data, data_len, mic);
  87        if (unlikely(info->flags & IEEE80211_TX_INTFL_TKIP_MIC_FAILURE))
  88                mic[0]++;
  89
  90        return TX_CONTINUE;
  91}
  92
  93
  94ieee80211_rx_result
  95ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
  96{
  97        u8 *data, *key = NULL;
  98        size_t data_len;
  99        unsigned int hdrlen;
 100        u8 mic[MICHAEL_MIC_LEN];
 101        struct sk_buff *skb = rx->skb;
 102        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
 103        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 104
 105        /*
 106         * it makes no sense to check for MIC errors on anything other
 107         * than data frames.
 108         */
 109        if (!ieee80211_is_data_present(hdr->frame_control))
 110                return RX_CONTINUE;
 111
 112        /*
 113         * No way to verify the MIC if the hardware stripped it or
 114         * the IV with the key index. In this case we have solely rely
 115         * on the driver to set RX_FLAG_MMIC_ERROR in the event of a
 116         * MIC failure report.
 117         */
 118        if (status->flag & (RX_FLAG_MMIC_STRIPPED | RX_FLAG_IV_STRIPPED)) {
 119                if (status->flag & RX_FLAG_MMIC_ERROR)
 120                        goto mic_fail_no_key;
 121
 122                if (!(status->flag & RX_FLAG_IV_STRIPPED) && rx->key &&
 123                    rx->key->conf.cipher == WLAN_CIPHER_SUITE_TKIP)
 124                        goto update_iv;
 125
 126                return RX_CONTINUE;
 127        }
 128
 129        /*
 130         * Some hardware seems to generate Michael MIC failure reports; even
 131         * though, the frame was not encrypted with TKIP and therefore has no
 132         * MIC. Ignore the flag them to avoid triggering countermeasures.
 133         */
 134        if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
 135            !(status->flag & RX_FLAG_DECRYPTED))
 136                return RX_CONTINUE;
 137
 138        if (rx->sdata->vif.type == NL80211_IFTYPE_AP && rx->key->conf.keyidx) {
 139                /*
 140                 * APs with pairwise keys should never receive Michael MIC
 141                 * errors for non-zero keyidx because these are reserved for
 142                 * group keys and only the AP is sending real multicast
 143                 * frames in the BSS.
 144                 */
 145                return RX_DROP_UNUSABLE;
 146        }
 147
 148        if (status->flag & RX_FLAG_MMIC_ERROR)
 149                goto mic_fail;
 150
 151        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 152        if (skb->len < hdrlen + MICHAEL_MIC_LEN)
 153                return RX_DROP_UNUSABLE;
 154
 155        if (skb_linearize(rx->skb))
 156                return RX_DROP_UNUSABLE;
 157        hdr = (void *)skb->data;
 158
 159        data = skb->data + hdrlen;
 160        data_len = skb->len - hdrlen - MICHAEL_MIC_LEN;
 161        key = &rx->key->conf.key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY];
 162        michael_mic(key, hdr, data, data_len, mic);
 163        if (crypto_memneq(mic, data + data_len, MICHAEL_MIC_LEN))
 164                goto mic_fail;
 165
 166        /* remove Michael MIC from payload */
 167        skb_trim(skb, skb->len - MICHAEL_MIC_LEN);
 168
 169update_iv:
 170        /* update IV in key information to be able to detect replays */
 171        rx->key->u.tkip.rx[rx->security_idx].iv32 = rx->tkip.iv32;
 172        rx->key->u.tkip.rx[rx->security_idx].iv16 = rx->tkip.iv16;
 173
 174        return RX_CONTINUE;
 175
 176mic_fail:
 177        rx->key->u.tkip.mic_failures++;
 178
 179mic_fail_no_key:
 180        /*
 181         * In some cases the key can be unset - e.g. a multicast packet, in
 182         * a driver that supports HW encryption. Send up the key idx only if
 183         * the key is set.
 184         */
 185        cfg80211_michael_mic_failure(rx->sdata->dev, hdr->addr2,
 186                                     is_multicast_ether_addr(hdr->addr1) ?
 187                                     NL80211_KEYTYPE_GROUP :
 188                                     NL80211_KEYTYPE_PAIRWISE,
 189                                     rx->key ? rx->key->conf.keyidx : -1,
 190                                     NULL, GFP_ATOMIC);
 191        return RX_DROP_UNUSABLE;
 192}
 193
 194static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
 195{
 196        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 197        struct ieee80211_key *key = tx->key;
 198        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 199        unsigned int hdrlen;
 200        int len, tail;
 201        u64 pn;
 202        u8 *pos;
 203
 204        if (info->control.hw_key &&
 205            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
 206            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) {
 207                /* hwaccel - with no need for software-generated IV */
 208                return 0;
 209        }
 210
 211        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 212        len = skb->len - hdrlen;
 213
 214        if (info->control.hw_key)
 215                tail = 0;
 216        else
 217                tail = IEEE80211_TKIP_ICV_LEN;
 218
 219        if (WARN_ON(skb_tailroom(skb) < tail ||
 220                    skb_headroom(skb) < IEEE80211_TKIP_IV_LEN))
 221                return -1;
 222
 223        pos = skb_push(skb, IEEE80211_TKIP_IV_LEN);
 224        memmove(pos, pos + IEEE80211_TKIP_IV_LEN, hdrlen);
 225        pos += hdrlen;
 226
 227        /* the HW only needs room for the IV, but not the actual IV */
 228        if (info->control.hw_key &&
 229            (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
 230                return 0;
 231
 232        /* Increase IV for the frame */
 233        pn = atomic64_inc_return(&key->conf.tx_pn);
 234        pos = ieee80211_tkip_add_iv(pos, &key->conf, pn);
 235
 236        /* hwaccel - with software IV */
 237        if (info->control.hw_key)
 238                return 0;
 239
 240        /* Add room for ICV */
 241        skb_put(skb, IEEE80211_TKIP_ICV_LEN);
 242
 243        return ieee80211_tkip_encrypt_data(&tx->local->wep_tx_ctx,
 244                                           key, skb, pos, len);
 245}
 246
 247
 248ieee80211_tx_result
 249ieee80211_crypto_tkip_encrypt(struct ieee80211_tx_data *tx)
 250{
 251        struct sk_buff *skb;
 252
 253        ieee80211_tx_set_protected(tx);
 254
 255        skb_queue_walk(&tx->skbs, skb) {
 256                if (tkip_encrypt_skb(tx, skb) < 0)
 257                        return TX_DROP;
 258        }
 259
 260        return TX_CONTINUE;
 261}
 262
 263
 264ieee80211_rx_result
 265ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
 266{
 267        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
 268        int hdrlen, res, hwaccel = 0;
 269        struct ieee80211_key *key = rx->key;
 270        struct sk_buff *skb = rx->skb;
 271        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
 272
 273        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 274
 275        if (!ieee80211_is_data(hdr->frame_control))
 276                return RX_CONTINUE;
 277
 278        if (!rx->sta || skb->len - hdrlen < 12)
 279                return RX_DROP_UNUSABLE;
 280
 281        /* it may be possible to optimize this a bit more */
 282        if (skb_linearize(rx->skb))
 283                return RX_DROP_UNUSABLE;
 284        hdr = (void *)skb->data;
 285
 286        /*
 287         * Let TKIP code verify IV, but skip decryption.
 288         * In the case where hardware checks the IV as well,
 289         * we don't even get here, see ieee80211_rx_h_decrypt()
 290         */
 291        if (status->flag & RX_FLAG_DECRYPTED)
 292                hwaccel = 1;
 293
 294        res = ieee80211_tkip_decrypt_data(&rx->local->wep_rx_ctx,
 295                                          key, skb->data + hdrlen,
 296                                          skb->len - hdrlen, rx->sta->sta.addr,
 297                                          hdr->addr1, hwaccel, rx->security_idx,
 298                                          &rx->tkip.iv32,
 299                                          &rx->tkip.iv16);
 300        if (res != TKIP_DECRYPT_OK)
 301                return RX_DROP_UNUSABLE;
 302
 303        /* Trim ICV */
 304        if (!(status->flag & RX_FLAG_ICV_STRIPPED))
 305                skb_trim(skb, skb->len - IEEE80211_TKIP_ICV_LEN);
 306
 307        /* Remove IV */
 308        memmove(skb->data + IEEE80211_TKIP_IV_LEN, skb->data, hdrlen);
 309        skb_pull(skb, IEEE80211_TKIP_IV_LEN);
 310
 311        return RX_CONTINUE;
 312}
 313
 314
 315static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad)
 316{
 317        __le16 mask_fc;
 318        int a4_included, mgmt;
 319        u8 qos_tid;
 320        u16 len_a;
 321        unsigned int hdrlen;
 322        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 323
 324        /*
 325         * Mask FC: zero subtype b4 b5 b6 (if not mgmt)
 326         * Retry, PwrMgt, MoreData; set Protected
 327         */
 328        mgmt = ieee80211_is_mgmt(hdr->frame_control);
 329        mask_fc = hdr->frame_control;
 330        mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY |
 331                                IEEE80211_FCTL_PM | IEEE80211_FCTL_MOREDATA);
 332        if (!mgmt)
 333                mask_fc &= ~cpu_to_le16(0x0070);
 334        mask_fc |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
 335
 336        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 337        len_a = hdrlen - 2;
 338        a4_included = ieee80211_has_a4(hdr->frame_control);
 339
 340        if (ieee80211_is_data_qos(hdr->frame_control))
 341                qos_tid = ieee80211_get_tid(hdr);
 342        else
 343                qos_tid = 0;
 344
 345        /* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
 346         * mode authentication are not allowed to collide, yet both are derived
 347         * from this vector b_0. We only set L := 1 here to indicate that the
 348         * data size can be represented in (L+1) bytes. The CCM layer will take
 349         * care of storing the data length in the top (L+1) bytes and setting
 350         * and clearing the other bits as is required to derive the two IVs.
 351         */
 352        b_0[0] = 0x1;
 353
 354        /* Nonce: Nonce Flags | A2 | PN
 355         * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
 356         */
 357        b_0[1] = qos_tid | (mgmt << 4);
 358        memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
 359        memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
 360
 361        /* AAD (extra authenticate-only data) / masked 802.11 header
 362         * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
 363        put_unaligned_be16(len_a, &aad[0]);
 364        put_unaligned(mask_fc, (__le16 *)&aad[2]);
 365        memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
 366
 367        /* Mask Seq#, leave Frag# */
 368        aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
 369        aad[23] = 0;
 370
 371        if (a4_included) {
 372                memcpy(&aad[24], hdr->addr4, ETH_ALEN);
 373                aad[30] = qos_tid;
 374                aad[31] = 0;
 375        } else {
 376                memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
 377                aad[24] = qos_tid;
 378        }
 379}
 380
 381
 382static inline void ccmp_pn2hdr(u8 *hdr, u8 *pn, int key_id)
 383{
 384        hdr[0] = pn[5];
 385        hdr[1] = pn[4];
 386        hdr[2] = 0;
 387        hdr[3] = 0x20 | (key_id << 6);
 388        hdr[4] = pn[3];
 389        hdr[5] = pn[2];
 390        hdr[6] = pn[1];
 391        hdr[7] = pn[0];
 392}
 393
 394
 395static inline void ccmp_hdr2pn(u8 *pn, u8 *hdr)
 396{
 397        pn[0] = hdr[7];
 398        pn[1] = hdr[6];
 399        pn[2] = hdr[5];
 400        pn[3] = hdr[4];
 401        pn[4] = hdr[1];
 402        pn[5] = hdr[0];
 403}
 404
 405
 406static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb,
 407                            unsigned int mic_len)
 408{
 409        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 410        struct ieee80211_key *key = tx->key;
 411        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 412        int hdrlen, len, tail;
 413        u8 *pos;
 414        u8 pn[6];
 415        u64 pn64;
 416        u8 aad[CCM_AAD_LEN];
 417        u8 b_0[AES_BLOCK_SIZE];
 418
 419        if (info->control.hw_key &&
 420            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
 421            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
 422            !((info->control.hw_key->flags &
 423               IEEE80211_KEY_FLAG_GENERATE_IV_MGMT) &&
 424              ieee80211_is_mgmt(hdr->frame_control))) {
 425                /*
 426                 * hwaccel has no need for preallocated room for CCMP
 427                 * header or MIC fields
 428                 */
 429                return 0;
 430        }
 431
 432        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 433        len = skb->len - hdrlen;
 434
 435        if (info->control.hw_key)
 436                tail = 0;
 437        else
 438                tail = mic_len;
 439
 440        if (WARN_ON(skb_tailroom(skb) < tail ||
 441                    skb_headroom(skb) < IEEE80211_CCMP_HDR_LEN))
 442                return -1;
 443
 444        pos = skb_push(skb, IEEE80211_CCMP_HDR_LEN);
 445        memmove(pos, pos + IEEE80211_CCMP_HDR_LEN, hdrlen);
 446
 447        /* the HW only needs room for the IV, but not the actual IV */
 448        if (info->control.hw_key &&
 449            (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
 450                return 0;
 451
 452        hdr = (struct ieee80211_hdr *) pos;
 453        pos += hdrlen;
 454
 455        pn64 = atomic64_inc_return(&key->conf.tx_pn);
 456
 457        pn[5] = pn64;
 458        pn[4] = pn64 >> 8;
 459        pn[3] = pn64 >> 16;
 460        pn[2] = pn64 >> 24;
 461        pn[1] = pn64 >> 32;
 462        pn[0] = pn64 >> 40;
 463
 464        ccmp_pn2hdr(pos, pn, key->conf.keyidx);
 465
 466        /* hwaccel - with software CCMP header */
 467        if (info->control.hw_key)
 468                return 0;
 469
 470        pos += IEEE80211_CCMP_HDR_LEN;
 471        ccmp_special_blocks(skb, pn, b_0, aad);
 472        return ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
 473                                         skb_put(skb, mic_len));
 474}
 475
 476
 477ieee80211_tx_result
 478ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx,
 479                              unsigned int mic_len)
 480{
 481        struct sk_buff *skb;
 482
 483        ieee80211_tx_set_protected(tx);
 484
 485        skb_queue_walk(&tx->skbs, skb) {
 486                if (ccmp_encrypt_skb(tx, skb, mic_len) < 0)
 487                        return TX_DROP;
 488        }
 489
 490        return TX_CONTINUE;
 491}
 492
 493
 494ieee80211_rx_result
 495ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
 496                              unsigned int mic_len)
 497{
 498        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
 499        int hdrlen;
 500        struct ieee80211_key *key = rx->key;
 501        struct sk_buff *skb = rx->skb;
 502        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
 503        u8 pn[IEEE80211_CCMP_PN_LEN];
 504        int data_len;
 505        int queue;
 506
 507        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 508
 509        if (!ieee80211_is_data(hdr->frame_control) &&
 510            !ieee80211_is_robust_mgmt_frame(skb))
 511                return RX_CONTINUE;
 512
 513        if (status->flag & RX_FLAG_DECRYPTED) {
 514                if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_CCMP_HDR_LEN))
 515                        return RX_DROP_UNUSABLE;
 516                if (status->flag & RX_FLAG_MIC_STRIPPED)
 517                        mic_len = 0;
 518        } else {
 519                if (skb_linearize(rx->skb))
 520                        return RX_DROP_UNUSABLE;
 521        }
 522
 523        data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;
 524        if (!rx->sta || data_len < 0)
 525                return RX_DROP_UNUSABLE;
 526
 527        if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
 528                int res;
 529
 530                ccmp_hdr2pn(pn, skb->data + hdrlen);
 531
 532                queue = rx->security_idx;
 533
 534                res = memcmp(pn, key->u.ccmp.rx_pn[queue],
 535                             IEEE80211_CCMP_PN_LEN);
 536                if (res < 0 ||
 537                    (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
 538                        key->u.ccmp.replays++;
 539                        return RX_DROP_UNUSABLE;
 540                }
 541
 542                if (!(status->flag & RX_FLAG_DECRYPTED)) {
 543                        u8 aad[2 * AES_BLOCK_SIZE];
 544                        u8 b_0[AES_BLOCK_SIZE];
 545                        /* hardware didn't decrypt/verify MIC */
 546                        ccmp_special_blocks(skb, pn, b_0, aad);
 547
 548                        if (ieee80211_aes_ccm_decrypt(
 549                                    key->u.ccmp.tfm, b_0, aad,
 550                                    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
 551                                    data_len,
 552                                    skb->data + skb->len - mic_len))
 553                                return RX_DROP_UNUSABLE;
 554                }
 555
 556                memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN);
 557                if (unlikely(ieee80211_is_frag(hdr)))
 558                        memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN);
 559        }
 560
 561        /* Remove CCMP header and MIC */
 562        if (pskb_trim(skb, skb->len - mic_len))
 563                return RX_DROP_UNUSABLE;
 564        memmove(skb->data + IEEE80211_CCMP_HDR_LEN, skb->data, hdrlen);
 565        skb_pull(skb, IEEE80211_CCMP_HDR_LEN);
 566
 567        return RX_CONTINUE;
 568}
 569
 570static void gcmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *j_0, u8 *aad)
 571{
 572        __le16 mask_fc;
 573        u8 qos_tid;
 574        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 575
 576        memcpy(j_0, hdr->addr2, ETH_ALEN);
 577        memcpy(&j_0[ETH_ALEN], pn, IEEE80211_GCMP_PN_LEN);
 578        j_0[13] = 0;
 579        j_0[14] = 0;
 580        j_0[AES_BLOCK_SIZE - 1] = 0x01;
 581
 582        /* AAD (extra authenticate-only data) / masked 802.11 header
 583         * FC | A1 | A2 | A3 | SC | [A4] | [QC]
 584         */
 585        put_unaligned_be16(ieee80211_hdrlen(hdr->frame_control) - 2, &aad[0]);
 586        /* Mask FC: zero subtype b4 b5 b6 (if not mgmt)
 587         * Retry, PwrMgt, MoreData; set Protected
 588         */
 589        mask_fc = hdr->frame_control;
 590        mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY |
 591                                IEEE80211_FCTL_PM | IEEE80211_FCTL_MOREDATA);
 592        if (!ieee80211_is_mgmt(hdr->frame_control))
 593                mask_fc &= ~cpu_to_le16(0x0070);
 594        mask_fc |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
 595
 596        put_unaligned(mask_fc, (__le16 *)&aad[2]);
 597        memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
 598
 599        /* Mask Seq#, leave Frag# */
 600        aad[22] = *((u8 *)&hdr->seq_ctrl) & 0x0f;
 601        aad[23] = 0;
 602
 603        if (ieee80211_is_data_qos(hdr->frame_control))
 604                qos_tid = ieee80211_get_tid(hdr);
 605        else
 606                qos_tid = 0;
 607
 608        if (ieee80211_has_a4(hdr->frame_control)) {
 609                memcpy(&aad[24], hdr->addr4, ETH_ALEN);
 610                aad[30] = qos_tid;
 611                aad[31] = 0;
 612        } else {
 613                memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
 614                aad[24] = qos_tid;
 615        }
 616}
 617
 618static inline void gcmp_pn2hdr(u8 *hdr, const u8 *pn, int key_id)
 619{
 620        hdr[0] = pn[5];
 621        hdr[1] = pn[4];
 622        hdr[2] = 0;
 623        hdr[3] = 0x20 | (key_id << 6);
 624        hdr[4] = pn[3];
 625        hdr[5] = pn[2];
 626        hdr[6] = pn[1];
 627        hdr[7] = pn[0];
 628}
 629
 630static inline void gcmp_hdr2pn(u8 *pn, const u8 *hdr)
 631{
 632        pn[0] = hdr[7];
 633        pn[1] = hdr[6];
 634        pn[2] = hdr[5];
 635        pn[3] = hdr[4];
 636        pn[4] = hdr[1];
 637        pn[5] = hdr[0];
 638}
 639
 640static int gcmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
 641{
 642        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 643        struct ieee80211_key *key = tx->key;
 644        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 645        int hdrlen, len, tail;
 646        u8 *pos;
 647        u8 pn[6];
 648        u64 pn64;
 649        u8 aad[GCM_AAD_LEN];
 650        u8 j_0[AES_BLOCK_SIZE];
 651
 652        if (info->control.hw_key &&
 653            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
 654            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
 655            !((info->control.hw_key->flags &
 656               IEEE80211_KEY_FLAG_GENERATE_IV_MGMT) &&
 657              ieee80211_is_mgmt(hdr->frame_control))) {
 658                /* hwaccel has no need for preallocated room for GCMP
 659                 * header or MIC fields
 660                 */
 661                return 0;
 662        }
 663
 664        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 665        len = skb->len - hdrlen;
 666
 667        if (info->control.hw_key)
 668                tail = 0;
 669        else
 670                tail = IEEE80211_GCMP_MIC_LEN;
 671
 672        if (WARN_ON(skb_tailroom(skb) < tail ||
 673                    skb_headroom(skb) < IEEE80211_GCMP_HDR_LEN))
 674                return -1;
 675
 676        pos = skb_push(skb, IEEE80211_GCMP_HDR_LEN);
 677        memmove(pos, pos + IEEE80211_GCMP_HDR_LEN, hdrlen);
 678        skb_set_network_header(skb, skb_network_offset(skb) +
 679                                    IEEE80211_GCMP_HDR_LEN);
 680
 681        /* the HW only needs room for the IV, but not the actual IV */
 682        if (info->control.hw_key &&
 683            (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
 684                return 0;
 685
 686        hdr = (struct ieee80211_hdr *)pos;
 687        pos += hdrlen;
 688
 689        pn64 = atomic64_inc_return(&key->conf.tx_pn);
 690
 691        pn[5] = pn64;
 692        pn[4] = pn64 >> 8;
 693        pn[3] = pn64 >> 16;
 694        pn[2] = pn64 >> 24;
 695        pn[1] = pn64 >> 32;
 696        pn[0] = pn64 >> 40;
 697
 698        gcmp_pn2hdr(pos, pn, key->conf.keyidx);
 699
 700        /* hwaccel - with software GCMP header */
 701        if (info->control.hw_key)
 702                return 0;
 703
 704        pos += IEEE80211_GCMP_HDR_LEN;
 705        gcmp_special_blocks(skb, pn, j_0, aad);
 706        return ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len,
 707                                         skb_put(skb, IEEE80211_GCMP_MIC_LEN));
 708}
 709
 710ieee80211_tx_result
 711ieee80211_crypto_gcmp_encrypt(struct ieee80211_tx_data *tx)
 712{
 713        struct sk_buff *skb;
 714
 715        ieee80211_tx_set_protected(tx);
 716
 717        skb_queue_walk(&tx->skbs, skb) {
 718                if (gcmp_encrypt_skb(tx, skb) < 0)
 719                        return TX_DROP;
 720        }
 721
 722        return TX_CONTINUE;
 723}
 724
 725ieee80211_rx_result
 726ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
 727{
 728        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
 729        int hdrlen;
 730        struct ieee80211_key *key = rx->key;
 731        struct sk_buff *skb = rx->skb;
 732        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
 733        u8 pn[IEEE80211_GCMP_PN_LEN];
 734        int data_len, queue, mic_len = IEEE80211_GCMP_MIC_LEN;
 735
 736        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 737
 738        if (!ieee80211_is_data(hdr->frame_control) &&
 739            !ieee80211_is_robust_mgmt_frame(skb))
 740                return RX_CONTINUE;
 741
 742        if (status->flag & RX_FLAG_DECRYPTED) {
 743                if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_GCMP_HDR_LEN))
 744                        return RX_DROP_UNUSABLE;
 745                if (status->flag & RX_FLAG_MIC_STRIPPED)
 746                        mic_len = 0;
 747        } else {
 748                if (skb_linearize(rx->skb))
 749                        return RX_DROP_UNUSABLE;
 750        }
 751
 752        data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len;
 753        if (!rx->sta || data_len < 0)
 754                return RX_DROP_UNUSABLE;
 755
 756        if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
 757                int res;
 758
 759                gcmp_hdr2pn(pn, skb->data + hdrlen);
 760
 761                queue = rx->security_idx;
 762
 763                res = memcmp(pn, key->u.gcmp.rx_pn[queue],
 764                             IEEE80211_GCMP_PN_LEN);
 765                if (res < 0 ||
 766                    (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
 767                        key->u.gcmp.replays++;
 768                        return RX_DROP_UNUSABLE;
 769                }
 770
 771                if (!(status->flag & RX_FLAG_DECRYPTED)) {
 772                        u8 aad[2 * AES_BLOCK_SIZE];
 773                        u8 j_0[AES_BLOCK_SIZE];
 774                        /* hardware didn't decrypt/verify MIC */
 775                        gcmp_special_blocks(skb, pn, j_0, aad);
 776
 777                        if (ieee80211_aes_gcm_decrypt(
 778                                    key->u.gcmp.tfm, j_0, aad,
 779                                    skb->data + hdrlen + IEEE80211_GCMP_HDR_LEN,
 780                                    data_len,
 781                                    skb->data + skb->len -
 782                                    IEEE80211_GCMP_MIC_LEN))
 783                                return RX_DROP_UNUSABLE;
 784                }
 785
 786                memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN);
 787                if (unlikely(ieee80211_is_frag(hdr)))
 788                        memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN);
 789        }
 790
 791        /* Remove GCMP header and MIC */
 792        if (pskb_trim(skb, skb->len - mic_len))
 793                return RX_DROP_UNUSABLE;
 794        memmove(skb->data + IEEE80211_GCMP_HDR_LEN, skb->data, hdrlen);
 795        skb_pull(skb, IEEE80211_GCMP_HDR_LEN);
 796
 797        return RX_CONTINUE;
 798}
 799
 800static ieee80211_tx_result
 801ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
 802                            struct sk_buff *skb)
 803{
 804        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 805        struct ieee80211_key *key = tx->key;
 806        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 807        int hdrlen;
 808        u8 *pos, iv_len = key->conf.iv_len;
 809
 810        if (info->control.hw_key &&
 811            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) {
 812                /* hwaccel has no need for preallocated head room */
 813                return TX_CONTINUE;
 814        }
 815
 816        if (unlikely(skb_headroom(skb) < iv_len &&
 817                     pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC)))
 818                return TX_DROP;
 819
 820        hdrlen = ieee80211_hdrlen(hdr->frame_control);
 821
 822        pos = skb_push(skb, iv_len);
 823        memmove(pos, pos + iv_len, hdrlen);
 824
 825        return TX_CONTINUE;
 826}
 827
 828static inline int ieee80211_crypto_cs_pn_compare(u8 *pn1, u8 *pn2, int len)
 829{
 830        int i;
 831
 832        /* pn is little endian */
 833        for (i = len - 1; i >= 0; i--) {
 834                if (pn1[i] < pn2[i])
 835                        return -1;
 836                else if (pn1[i] > pn2[i])
 837                        return 1;
 838        }
 839
 840        return 0;
 841}
 842
 843static ieee80211_rx_result
 844ieee80211_crypto_cs_decrypt(struct ieee80211_rx_data *rx)
 845{
 846        struct ieee80211_key *key = rx->key;
 847        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
 848        const struct ieee80211_cipher_scheme *cs = NULL;
 849        int hdrlen = ieee80211_hdrlen(hdr->frame_control);
 850        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
 851        int data_len;
 852        u8 *rx_pn;
 853        u8 *skb_pn;
 854        u8 qos_tid;
 855
 856        if (!rx->sta || !rx->sta->cipher_scheme ||
 857            !(status->flag & RX_FLAG_DECRYPTED))
 858                return RX_DROP_UNUSABLE;
 859
 860        if (!ieee80211_is_data(hdr->frame_control))
 861                return RX_CONTINUE;
 862
 863        cs = rx->sta->cipher_scheme;
 864
 865        data_len = rx->skb->len - hdrlen - cs->hdr_len;
 866
 867        if (data_len < 0)
 868                return RX_DROP_UNUSABLE;
 869
 870        if (ieee80211_is_data_qos(hdr->frame_control))
 871                qos_tid = ieee80211_get_tid(hdr);
 872        else
 873                qos_tid = 0;
 874
 875        if (skb_linearize(rx->skb))
 876                return RX_DROP_UNUSABLE;
 877
 878        hdr = (struct ieee80211_hdr *)rx->skb->data;
 879
 880        rx_pn = key->u.gen.rx_pn[qos_tid];
 881        skb_pn = rx->skb->data + hdrlen + cs->pn_off;
 882
 883        if (ieee80211_crypto_cs_pn_compare(skb_pn, rx_pn, cs->pn_len) <= 0)
 884                return RX_DROP_UNUSABLE;
 885
 886        memcpy(rx_pn, skb_pn, cs->pn_len);
 887
 888        /* remove security header and MIC */
 889        if (pskb_trim(rx->skb, rx->skb->len - cs->mic_len))
 890                return RX_DROP_UNUSABLE;
 891
 892        memmove(rx->skb->data + cs->hdr_len, rx->skb->data, hdrlen);
 893        skb_pull(rx->skb, cs->hdr_len);
 894
 895        return RX_CONTINUE;
 896}
 897
 898static void bip_aad(struct sk_buff *skb, u8 *aad)
 899{
 900        __le16 mask_fc;
 901        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 902
 903        /* BIP AAD: FC(masked) || A1 || A2 || A3 */
 904
 905        /* FC type/subtype */
 906        /* Mask FC Retry, PwrMgt, MoreData flags to zero */
 907        mask_fc = hdr->frame_control;
 908        mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY | IEEE80211_FCTL_PM |
 909                                IEEE80211_FCTL_MOREDATA);
 910        put_unaligned(mask_fc, (__le16 *) &aad[0]);
 911        /* A1 || A2 || A3 */
 912        memcpy(aad + 2, &hdr->addr1, 3 * ETH_ALEN);
 913}
 914
 915
 916static inline void bip_ipn_set64(u8 *d, u64 pn)
 917{
 918        *d++ = pn;
 919        *d++ = pn >> 8;
 920        *d++ = pn >> 16;
 921        *d++ = pn >> 24;
 922        *d++ = pn >> 32;
 923        *d = pn >> 40;
 924}
 925
 926static inline void bip_ipn_swap(u8 *d, const u8 *s)
 927{
 928        *d++ = s[5];
 929        *d++ = s[4];
 930        *d++ = s[3];
 931        *d++ = s[2];
 932        *d++ = s[1];
 933        *d = s[0];
 934}
 935
 936
 937ieee80211_tx_result
 938ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx)
 939{
 940        struct sk_buff *skb;
 941        struct ieee80211_tx_info *info;
 942        struct ieee80211_key *key = tx->key;
 943        struct ieee80211_mmie *mmie;
 944        u8 aad[20];
 945        u64 pn64;
 946
 947        if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
 948                return TX_DROP;
 949
 950        skb = skb_peek(&tx->skbs);
 951
 952        info = IEEE80211_SKB_CB(skb);
 953
 954        if (info->control.hw_key &&
 955            !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE))
 956                return TX_CONTINUE;
 957
 958        if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
 959                return TX_DROP;
 960
 961        mmie = skb_put(skb, sizeof(*mmie));
 962        mmie->element_id = WLAN_EID_MMIE;
 963        mmie->length = sizeof(*mmie) - 2;
 964        mmie->key_id = cpu_to_le16(key->conf.keyidx);
 965
 966        /* PN = PN + 1 */
 967        pn64 = atomic64_inc_return(&key->conf.tx_pn);
 968
 969        bip_ipn_set64(mmie->sequence_number, pn64);
 970
 971        if (info->control.hw_key)
 972                return TX_CONTINUE;
 973
 974        bip_aad(skb, aad);
 975
 976        /*
 977         * MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64)
 978         */
 979        ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad,
 980                           skb->data + 24, skb->len - 24, mmie->mic);
 981
 982        return TX_CONTINUE;
 983}
 984
 985ieee80211_tx_result
 986ieee80211_crypto_aes_cmac_256_encrypt(struct ieee80211_tx_data *tx)
 987{
 988        struct sk_buff *skb;
 989        struct ieee80211_tx_info *info;
 990        struct ieee80211_key *key = tx->key;
 991        struct ieee80211_mmie_16 *mmie;
 992        u8 aad[20];
 993        u64 pn64;
 994
 995        if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
 996                return TX_DROP;
 997
 998        skb = skb_peek(&tx->skbs);
 999
1000        info = IEEE80211_SKB_CB(skb);
1001
1002        if (info->control.hw_key)
1003                return TX_CONTINUE;
1004
1005        if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
1006                return TX_DROP;
1007
1008        mmie = skb_put(skb, sizeof(*mmie));
1009        mmie->element_id = WLAN_EID_MMIE;
1010        mmie->length = sizeof(*mmie) - 2;
1011        mmie->key_id = cpu_to_le16(key->conf.keyidx);
1012
1013        /* PN = PN + 1 */
1014        pn64 = atomic64_inc_return(&key->conf.tx_pn);
1015
1016        bip_ipn_set64(mmie->sequence_number, pn64);
1017
1018        bip_aad(skb, aad);
1019
1020        /* MIC = AES-256-CMAC(IGTK, AAD || Management Frame Body || MMIE, 128)
1021         */
1022        ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad,
1023                               skb->data + 24, skb->len - 24, mmie->mic);
1024
1025        return TX_CONTINUE;
1026}
1027
1028ieee80211_rx_result
1029ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
1030{
1031        struct sk_buff *skb = rx->skb;
1032        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1033        struct ieee80211_key *key = rx->key;
1034        struct ieee80211_mmie *mmie;
1035        u8 aad[20], mic[8], ipn[6];
1036        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1037
1038        if (!ieee80211_is_mgmt(hdr->frame_control))
1039                return RX_CONTINUE;
1040
1041        /* management frames are already linear */
1042
1043        if (skb->len < 24 + sizeof(*mmie))
1044                return RX_DROP_UNUSABLE;
1045
1046        mmie = (struct ieee80211_mmie *)
1047                (skb->data + skb->len - sizeof(*mmie));
1048        if (mmie->element_id != WLAN_EID_MMIE ||
1049            mmie->length != sizeof(*mmie) - 2)
1050                return RX_DROP_UNUSABLE; /* Invalid MMIE */
1051
1052        bip_ipn_swap(ipn, mmie->sequence_number);
1053
1054        if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
1055                key->u.aes_cmac.replays++;
1056                return RX_DROP_UNUSABLE;
1057        }
1058
1059        if (!(status->flag & RX_FLAG_DECRYPTED)) {
1060                /* hardware didn't decrypt/verify MIC */
1061                bip_aad(skb, aad);
1062                ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad,
1063                                   skb->data + 24, skb->len - 24, mic);
1064                if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
1065                        key->u.aes_cmac.icverrors++;
1066                        return RX_DROP_UNUSABLE;
1067                }
1068        }
1069
1070        memcpy(key->u.aes_cmac.rx_pn, ipn, 6);
1071
1072        /* Remove MMIE */
1073        skb_trim(skb, skb->len - sizeof(*mmie));
1074
1075        return RX_CONTINUE;
1076}
1077
1078ieee80211_rx_result
1079ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx)
1080{
1081        struct sk_buff *skb = rx->skb;
1082        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1083        struct ieee80211_key *key = rx->key;
1084        struct ieee80211_mmie_16 *mmie;
1085        u8 aad[20], mic[16], ipn[6];
1086        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1087
1088        if (!ieee80211_is_mgmt(hdr->frame_control))
1089                return RX_CONTINUE;
1090
1091        /* management frames are already linear */
1092
1093        if (skb->len < 24 + sizeof(*mmie))
1094                return RX_DROP_UNUSABLE;
1095
1096        mmie = (struct ieee80211_mmie_16 *)
1097                (skb->data + skb->len - sizeof(*mmie));
1098        if (mmie->element_id != WLAN_EID_MMIE ||
1099            mmie->length != sizeof(*mmie) - 2)
1100                return RX_DROP_UNUSABLE; /* Invalid MMIE */
1101
1102        bip_ipn_swap(ipn, mmie->sequence_number);
1103
1104        if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
1105                key->u.aes_cmac.replays++;
1106                return RX_DROP_UNUSABLE;
1107        }
1108
1109        if (!(status->flag & RX_FLAG_DECRYPTED)) {
1110                /* hardware didn't decrypt/verify MIC */
1111                bip_aad(skb, aad);
1112                ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad,
1113                                       skb->data + 24, skb->len - 24, mic);
1114                if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
1115                        key->u.aes_cmac.icverrors++;
1116                        return RX_DROP_UNUSABLE;
1117                }
1118        }
1119
1120        memcpy(key->u.aes_cmac.rx_pn, ipn, 6);
1121
1122        /* Remove MMIE */
1123        skb_trim(skb, skb->len - sizeof(*mmie));
1124
1125        return RX_CONTINUE;
1126}
1127
1128ieee80211_tx_result
1129ieee80211_crypto_aes_gmac_encrypt(struct ieee80211_tx_data *tx)
1130{
1131        struct sk_buff *skb;
1132        struct ieee80211_tx_info *info;
1133        struct ieee80211_key *key = tx->key;
1134        struct ieee80211_mmie_16 *mmie;
1135        struct ieee80211_hdr *hdr;
1136        u8 aad[GMAC_AAD_LEN];
1137        u64 pn64;
1138        u8 nonce[GMAC_NONCE_LEN];
1139
1140        if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
1141                return TX_DROP;
1142
1143        skb = skb_peek(&tx->skbs);
1144
1145        info = IEEE80211_SKB_CB(skb);
1146
1147        if (info->control.hw_key)
1148                return TX_CONTINUE;
1149
1150        if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
1151                return TX_DROP;
1152
1153        mmie = skb_put(skb, sizeof(*mmie));
1154        mmie->element_id = WLAN_EID_MMIE;
1155        mmie->length = sizeof(*mmie) - 2;
1156        mmie->key_id = cpu_to_le16(key->conf.keyidx);
1157
1158        /* PN = PN + 1 */
1159        pn64 = atomic64_inc_return(&key->conf.tx_pn);
1160
1161        bip_ipn_set64(mmie->sequence_number, pn64);
1162
1163        bip_aad(skb, aad);
1164
1165        hdr = (struct ieee80211_hdr *)skb->data;
1166        memcpy(nonce, hdr->addr2, ETH_ALEN);
1167        bip_ipn_swap(nonce + ETH_ALEN, mmie->sequence_number);
1168
1169        /* MIC = AES-GMAC(IGTK, AAD || Management Frame Body || MMIE, 128) */
1170        if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
1171                               skb->data + 24, skb->len - 24, mmie->mic) < 0)
1172                return TX_DROP;
1173
1174        return TX_CONTINUE;
1175}
1176
1177ieee80211_rx_result
1178ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx)
1179{
1180        struct sk_buff *skb = rx->skb;
1181        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1182        struct ieee80211_key *key = rx->key;
1183        struct ieee80211_mmie_16 *mmie;
1184        u8 aad[GMAC_AAD_LEN], *mic, ipn[6], nonce[GMAC_NONCE_LEN];
1185        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1186
1187        if (!ieee80211_is_mgmt(hdr->frame_control))
1188                return RX_CONTINUE;
1189
1190        /* management frames are already linear */
1191
1192        if (skb->len < 24 + sizeof(*mmie))
1193                return RX_DROP_UNUSABLE;
1194
1195        mmie = (struct ieee80211_mmie_16 *)
1196                (skb->data + skb->len - sizeof(*mmie));
1197        if (mmie->element_id != WLAN_EID_MMIE ||
1198            mmie->length != sizeof(*mmie) - 2)
1199                return RX_DROP_UNUSABLE; /* Invalid MMIE */
1200
1201        bip_ipn_swap(ipn, mmie->sequence_number);
1202
1203        if (memcmp(ipn, key->u.aes_gmac.rx_pn, 6) <= 0) {
1204                key->u.aes_gmac.replays++;
1205                return RX_DROP_UNUSABLE;
1206        }
1207
1208        if (!(status->flag & RX_FLAG_DECRYPTED)) {
1209                /* hardware didn't decrypt/verify MIC */
1210                bip_aad(skb, aad);
1211
1212                memcpy(nonce, hdr->addr2, ETH_ALEN);
1213                memcpy(nonce + ETH_ALEN, ipn, 6);
1214
1215                mic = kmalloc(GMAC_MIC_LEN, GFP_ATOMIC);
1216                if (!mic)
1217                        return RX_DROP_UNUSABLE;
1218                if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
1219                                       skb->data + 24, skb->len - 24,
1220                                       mic) < 0 ||
1221                    crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
1222                        key->u.aes_gmac.icverrors++;
1223                        kfree(mic);
1224                        return RX_DROP_UNUSABLE;
1225                }
1226                kfree(mic);
1227        }
1228
1229        memcpy(key->u.aes_gmac.rx_pn, ipn, 6);
1230
1231        /* Remove MMIE */
1232        skb_trim(skb, skb->len - sizeof(*mmie));
1233
1234        return RX_CONTINUE;
1235}
1236
1237ieee80211_tx_result
1238ieee80211_crypto_hw_encrypt(struct ieee80211_tx_data *tx)
1239{
1240        struct sk_buff *skb;
1241        struct ieee80211_tx_info *info = NULL;
1242        ieee80211_tx_result res;
1243
1244        skb_queue_walk(&tx->skbs, skb) {
1245                info  = IEEE80211_SKB_CB(skb);
1246
1247                /* handle hw-only algorithm */
1248                if (!info->control.hw_key)
1249                        return TX_DROP;
1250
1251                if (tx->key->flags & KEY_FLAG_CIPHER_SCHEME) {
1252                        res = ieee80211_crypto_cs_encrypt(tx, skb);
1253                        if (res != TX_CONTINUE)
1254                                return res;
1255                }
1256        }
1257
1258        ieee80211_tx_set_protected(tx);
1259
1260        return TX_CONTINUE;
1261}
1262
1263ieee80211_rx_result
1264ieee80211_crypto_hw_decrypt(struct ieee80211_rx_data *rx)
1265{
1266        if (rx->sta && rx->sta->cipher_scheme)
1267                return ieee80211_crypto_cs_decrypt(rx);
1268
1269        return RX_DROP_UNUSABLE;
1270}
1271