Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
wpa.c
Go to the documentation of this file.
1 /*
2  * Copyright 2002-2004, Instant802 Networks, Inc.
3  * Copyright 2008, Jouni Malinen <[email protected]>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9 
10 #include <linux/netdevice.h>
11 #include <linux/types.h>
12 #include <linux/skbuff.h>
13 #include <linux/compiler.h>
14 #include <linux/ieee80211.h>
15 #include <linux/gfp.h>
16 #include <asm/unaligned.h>
17 #include <net/mac80211.h>
18 #include <crypto/aes.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 "wpa.h"
26 
29 {
30  u8 *data, *key, *mic;
31  size_t data_len;
32  unsigned int hdrlen;
33  struct ieee80211_hdr *hdr;
34  struct sk_buff *skb = tx->skb;
35  struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
36  int tail;
37 
38  hdr = (struct ieee80211_hdr *)skb->data;
39  if (!tx->key || tx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
40  skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control))
41  return TX_CONTINUE;
42 
43  hdrlen = ieee80211_hdrlen(hdr->frame_control);
44  if (skb->len < hdrlen)
45  return TX_DROP;
46 
47  data = skb->data + hdrlen;
48  data_len = skb->len - hdrlen;
49 
51  /* Need to use software crypto for the test */
52  info->control.hw_key = NULL;
53  }
54 
55  if (info->control.hw_key &&
57  tx->local->ops->set_frag_threshold) &&
58  !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) {
59  /* hwaccel - with no need for SW-generated MMIC */
60  return TX_CONTINUE;
61  }
62 
63  tail = MICHAEL_MIC_LEN;
64  if (!info->control.hw_key)
65  tail += TKIP_ICV_LEN;
66 
67  if (WARN_ON(skb_tailroom(skb) < tail ||
68  skb_headroom(skb) < TKIP_IV_LEN))
69  return TX_DROP;
70 
71  key = &tx->key->conf.key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY];
72  mic = skb_put(skb, MICHAEL_MIC_LEN);
73  michael_mic(key, hdr, data, data_len, mic);
75  mic[0]++;
76 
77  return TX_CONTINUE;
78 }
79 
80 
83 {
84  u8 *data, *key = NULL;
85  size_t data_len;
86  unsigned int hdrlen;
88  struct sk_buff *skb = rx->skb;
89  struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
90  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
91 
92  /*
93  * it makes no sense to check for MIC errors on anything other
94  * than data frames.
95  */
96  if (!ieee80211_is_data_present(hdr->frame_control))
97  return RX_CONTINUE;
98 
99  /*
100  * No way to verify the MIC if the hardware stripped it or
101  * the IV with the key index. In this case we have solely rely
102  * on the driver to set RX_FLAG_MMIC_ERROR in the event of a
103  * MIC failure report.
104  */
105  if (status->flag & (RX_FLAG_MMIC_STRIPPED | RX_FLAG_IV_STRIPPED)) {
106  if (status->flag & RX_FLAG_MMIC_ERROR)
107  goto mic_fail;
108 
109  if (!(status->flag & RX_FLAG_IV_STRIPPED) && rx->key &&
110  rx->key->conf.cipher == WLAN_CIPHER_SUITE_TKIP)
111  goto update_iv;
112 
113  return RX_CONTINUE;
114  }
115 
116  /*
117  * Some hardware seems to generate Michael MIC failure reports; even
118  * though, the frame was not encrypted with TKIP and therefore has no
119  * MIC. Ignore the flag them to avoid triggering countermeasures.
120  */
121  if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
122  !(status->flag & RX_FLAG_DECRYPTED))
123  return RX_CONTINUE;
124 
125  if (rx->sdata->vif.type == NL80211_IFTYPE_AP && rx->key->conf.keyidx) {
126  /*
127  * APs with pairwise keys should never receive Michael MIC
128  * errors for non-zero keyidx because these are reserved for
129  * group keys and only the AP is sending real multicast
130  * frames in the BSS. (
131  */
132  return RX_DROP_UNUSABLE;
133  }
134 
135  if (status->flag & RX_FLAG_MMIC_ERROR)
136  goto mic_fail;
137 
138  hdrlen = ieee80211_hdrlen(hdr->frame_control);
139  if (skb->len < hdrlen + MICHAEL_MIC_LEN)
140  return RX_DROP_UNUSABLE;
141 
142  if (skb_linearize(rx->skb))
143  return RX_DROP_UNUSABLE;
144  hdr = (void *)skb->data;
145 
146  data = skb->data + hdrlen;
147  data_len = skb->len - hdrlen - MICHAEL_MIC_LEN;
148  key = &rx->key->conf.key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY];
149  michael_mic(key, hdr, data, data_len, mic);
150  if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0)
151  goto mic_fail;
152 
153  /* remove Michael MIC from payload */
154  skb_trim(skb, skb->len - MICHAEL_MIC_LEN);
155 
156 update_iv:
157  /* update IV in key information to be able to detect replays */
158  rx->key->u.tkip.rx[rx->security_idx].iv32 = rx->tkip_iv32;
159  rx->key->u.tkip.rx[rx->security_idx].iv16 = rx->tkip_iv16;
160 
161  return RX_CONTINUE;
162 
163 mic_fail:
164  /*
165  * In some cases the key can be unset - e.g. a multicast packet, in
166  * a driver that supports HW encryption. Send up the key idx only if
167  * the key is set.
168  */
170  rx->key ? rx->key->conf.keyidx : -1,
171  (void *) skb->data, NULL, GFP_ATOMIC);
172  return RX_DROP_UNUSABLE;
173 }
174 
175 
176 static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
177 {
178  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
179  struct ieee80211_key *key = tx->key;
180  struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
181  unsigned long flags;
182  unsigned int hdrlen;
183  int len, tail;
184  u8 *pos;
185 
186  if (info->control.hw_key &&
187  !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
188  !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) {
189  /* hwaccel - with no need for software-generated IV */
190  return 0;
191  }
192 
193  hdrlen = ieee80211_hdrlen(hdr->frame_control);
194  len = skb->len - hdrlen;
195 
196  if (info->control.hw_key)
197  tail = 0;
198  else
199  tail = TKIP_ICV_LEN;
200 
201  if (WARN_ON(skb_tailroom(skb) < tail ||
202  skb_headroom(skb) < TKIP_IV_LEN))
203  return -1;
204 
205  pos = skb_push(skb, TKIP_IV_LEN);
206  memmove(pos, pos + TKIP_IV_LEN, hdrlen);
207  skb_set_network_header(skb, skb_network_offset(skb) + TKIP_IV_LEN);
208  pos += hdrlen;
209 
210  /* the HW only needs room for the IV, but not the actual IV */
211  if (info->control.hw_key &&
212  (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
213  return 0;
214 
215  /* Increase IV for the frame */
216  spin_lock_irqsave(&key->u.tkip.txlock, flags);
217  key->u.tkip.tx.iv16++;
218  if (key->u.tkip.tx.iv16 == 0)
219  key->u.tkip.tx.iv32++;
220  pos = ieee80211_tkip_add_iv(pos, key);
221  spin_unlock_irqrestore(&key->u.tkip.txlock, flags);
222 
223  /* hwaccel - with software IV */
224  if (info->control.hw_key)
225  return 0;
226 
227  /* Add room for ICV */
228  skb_put(skb, TKIP_ICV_LEN);
229 
230  return ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm,
231  key, skb, pos, len);
232 }
233 
234 
237 {
238  struct sk_buff *skb;
239 
241 
242  skb_queue_walk(&tx->skbs, skb) {
243  if (tkip_encrypt_skb(tx, skb) < 0)
244  return TX_DROP;
245  }
246 
247  return TX_CONTINUE;
248 }
249 
250 
253 {
254  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
255  int hdrlen, res, hwaccel = 0;
256  struct ieee80211_key *key = rx->key;
257  struct sk_buff *skb = rx->skb;
258  struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
259 
260  hdrlen = ieee80211_hdrlen(hdr->frame_control);
261 
262  if (!ieee80211_is_data(hdr->frame_control))
263  return RX_CONTINUE;
264 
265  if (!rx->sta || skb->len - hdrlen < 12)
266  return RX_DROP_UNUSABLE;
267 
268  /* it may be possible to optimize this a bit more */
269  if (skb_linearize(rx->skb))
270  return RX_DROP_UNUSABLE;
271  hdr = (void *)skb->data;
272 
273  /*
274  * Let TKIP code verify IV, but skip decryption.
275  * In the case where hardware checks the IV as well,
276  * we don't even get here, see ieee80211_rx_h_decrypt()
277  */
278  if (status->flag & RX_FLAG_DECRYPTED)
279  hwaccel = 1;
280 
281  res = ieee80211_tkip_decrypt_data(rx->local->wep_rx_tfm,
282  key, skb->data + hdrlen,
283  skb->len - hdrlen, rx->sta->sta.addr,
284  hdr->addr1, hwaccel, rx->security_idx,
285  &rx->tkip_iv32,
286  &rx->tkip_iv16);
287  if (res != TKIP_DECRYPT_OK)
288  return RX_DROP_UNUSABLE;
289 
290  /* Trim ICV */
291  skb_trim(skb, skb->len - TKIP_ICV_LEN);
292 
293  /* Remove IV */
294  memmove(skb->data + TKIP_IV_LEN, skb->data, hdrlen);
295  skb_pull(skb, TKIP_IV_LEN);
296 
297  return RX_CONTINUE;
298 }
299 
300 
301 static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
302  int encrypted)
303 {
304  __le16 mask_fc;
305  int a4_included, mgmt;
306  u8 qos_tid;
307  u8 *b_0, *aad;
308  u16 data_len, len_a;
309  unsigned int hdrlen;
310  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
311 
312  memset(scratch, 0, 6 * AES_BLOCK_SIZE);
313 
314  b_0 = scratch + 3 * AES_BLOCK_SIZE;
315  aad = scratch + 4 * AES_BLOCK_SIZE;
316 
317  /*
318  * Mask FC: zero subtype b4 b5 b6 (if not mgmt)
319  * Retry, PwrMgt, MoreData; set Protected
320  */
321  mgmt = ieee80211_is_mgmt(hdr->frame_control);
322  mask_fc = hdr->frame_control;
323  mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY |
325  if (!mgmt)
326  mask_fc &= ~cpu_to_le16(0x0070);
328 
329  hdrlen = ieee80211_hdrlen(hdr->frame_control);
330  len_a = hdrlen - 2;
331  a4_included = ieee80211_has_a4(hdr->frame_control);
332 
333  if (ieee80211_is_data_qos(hdr->frame_control))
334  qos_tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
335  else
336  qos_tid = 0;
337 
338  data_len = skb->len - hdrlen - CCMP_HDR_LEN;
339  if (encrypted)
340  data_len -= CCMP_MIC_LEN;
341 
342  /* First block, b_0 */
343  b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
344  /* Nonce: Nonce Flags | A2 | PN
345  * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
346  */
347  b_0[1] = qos_tid | (mgmt << 4);
348  memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
349  memcpy(&b_0[8], pn, CCMP_PN_LEN);
350  /* l(m) */
351  put_unaligned_be16(data_len, &b_0[14]);
352 
353  /* AAD (extra authenticate-only data) / masked 802.11 header
354  * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
355  put_unaligned_be16(len_a, &aad[0]);
356  put_unaligned(mask_fc, (__le16 *)&aad[2]);
357  memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
358 
359  /* Mask Seq#, leave Frag# */
360  aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
361  aad[23] = 0;
362 
363  if (a4_included) {
364  memcpy(&aad[24], hdr->addr4, ETH_ALEN);
365  aad[30] = qos_tid;
366  aad[31] = 0;
367  } else {
368  memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
369  aad[24] = qos_tid;
370  }
371 }
372 
373 
374 static inline void ccmp_pn2hdr(u8 *hdr, u8 *pn, int key_id)
375 {
376  hdr[0] = pn[5];
377  hdr[1] = pn[4];
378  hdr[2] = 0;
379  hdr[3] = 0x20 | (key_id << 6);
380  hdr[4] = pn[3];
381  hdr[5] = pn[2];
382  hdr[6] = pn[1];
383  hdr[7] = pn[0];
384 }
385 
386 
387 static inline void ccmp_hdr2pn(u8 *pn, u8 *hdr)
388 {
389  pn[0] = hdr[7];
390  pn[1] = hdr[6];
391  pn[2] = hdr[5];
392  pn[3] = hdr[4];
393  pn[4] = hdr[1];
394  pn[5] = hdr[0];
395 }
396 
397 
398 static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
399 {
400  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
401  struct ieee80211_key *key = tx->key;
402  struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
403  int hdrlen, len, tail;
404  u8 *pos;
405  u8 pn[6];
406  u64 pn64;
407  u8 scratch[6 * AES_BLOCK_SIZE];
408 
409  if (info->control.hw_key &&
410  !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
411  !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) {
412  /*
413  * hwaccel has no need for preallocated room for CCMP
414  * header or MIC fields
415  */
416  return 0;
417  }
418 
419  hdrlen = ieee80211_hdrlen(hdr->frame_control);
420  len = skb->len - hdrlen;
421 
422  if (info->control.hw_key)
423  tail = 0;
424  else
425  tail = CCMP_MIC_LEN;
426 
427  if (WARN_ON(skb_tailroom(skb) < tail ||
428  skb_headroom(skb) < CCMP_HDR_LEN))
429  return -1;
430 
431  pos = skb_push(skb, CCMP_HDR_LEN);
432  memmove(pos, pos + CCMP_HDR_LEN, hdrlen);
433  skb_set_network_header(skb, skb_network_offset(skb) + CCMP_HDR_LEN);
434 
435  /* the HW only needs room for the IV, but not the actual IV */
436  if (info->control.hw_key &&
437  (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
438  return 0;
439 
440  hdr = (struct ieee80211_hdr *) pos;
441  pos += hdrlen;
442 
443  pn64 = atomic64_inc_return(&key->u.ccmp.tx_pn);
444 
445  pn[5] = pn64;
446  pn[4] = pn64 >> 8;
447  pn[3] = pn64 >> 16;
448  pn[2] = pn64 >> 24;
449  pn[1] = pn64 >> 32;
450  pn[0] = pn64 >> 40;
451 
452  ccmp_pn2hdr(pos, pn, key->conf.keyidx);
453 
454  /* hwaccel - with software CCMP header */
455  if (info->control.hw_key)
456  return 0;
457 
458  pos += CCMP_HDR_LEN;
459  ccmp_special_blocks(skb, pn, scratch, 0);
460  ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len,
461  pos, skb_put(skb, CCMP_MIC_LEN));
462 
463  return 0;
464 }
465 
466 
469 {
470  struct sk_buff *skb;
471 
473 
474  skb_queue_walk(&tx->skbs, skb) {
475  if (ccmp_encrypt_skb(tx, skb) < 0)
476  return TX_DROP;
477  }
478 
479  return TX_CONTINUE;
480 }
481 
482 
485 {
486  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
487  int hdrlen;
488  struct ieee80211_key *key = rx->key;
489  struct sk_buff *skb = rx->skb;
490  struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
491  u8 pn[CCMP_PN_LEN];
492  int data_len;
493  int queue;
494 
495  hdrlen = ieee80211_hdrlen(hdr->frame_control);
496 
497  if (!ieee80211_is_data(hdr->frame_control) &&
498  !ieee80211_is_robust_mgmt_frame(hdr))
499  return RX_CONTINUE;
500 
501  data_len = skb->len - hdrlen - CCMP_HDR_LEN - CCMP_MIC_LEN;
502  if (!rx->sta || data_len < 0)
503  return RX_DROP_UNUSABLE;
504 
505  if (status->flag & RX_FLAG_DECRYPTED) {
506  if (!pskb_may_pull(rx->skb, hdrlen + CCMP_HDR_LEN))
507  return RX_DROP_UNUSABLE;
508  } else {
509  if (skb_linearize(rx->skb))
510  return RX_DROP_UNUSABLE;
511  }
512 
513  ccmp_hdr2pn(pn, skb->data + hdrlen);
514 
515  queue = rx->security_idx;
516 
517  if (memcmp(pn, key->u.ccmp.rx_pn[queue], CCMP_PN_LEN) <= 0) {
518  key->u.ccmp.replays++;
519  return RX_DROP_UNUSABLE;
520  }
521 
522  if (!(status->flag & RX_FLAG_DECRYPTED)) {
523  u8 scratch[6 * AES_BLOCK_SIZE];
524  /* hardware didn't decrypt/verify MIC */
525  ccmp_special_blocks(skb, pn, scratch, 1);
526 
528  key->u.ccmp.tfm, scratch,
529  skb->data + hdrlen + CCMP_HDR_LEN, data_len,
530  skb->data + skb->len - CCMP_MIC_LEN,
531  skb->data + hdrlen + CCMP_HDR_LEN))
532  return RX_DROP_UNUSABLE;
533  }
534 
535  memcpy(key->u.ccmp.rx_pn[queue], pn, CCMP_PN_LEN);
536 
537  /* Remove CCMP header and MIC */
538  if (pskb_trim(skb, skb->len - CCMP_MIC_LEN))
539  return RX_DROP_UNUSABLE;
540  memmove(skb->data + CCMP_HDR_LEN, skb->data, hdrlen);
541  skb_pull(skb, CCMP_HDR_LEN);
542 
543  return RX_CONTINUE;
544 }
545 
546 
547 static void bip_aad(struct sk_buff *skb, u8 *aad)
548 {
549  __le16 mask_fc;
550  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
551 
552  /* BIP AAD: FC(masked) || A1 || A2 || A3 */
553 
554  /* FC type/subtype */
555  /* Mask FC Retry, PwrMgt, MoreData flags to zero */
556  mask_fc = hdr->frame_control;
559  put_unaligned(mask_fc, (__le16 *) &aad[0]);
560  /* A1 || A2 || A3 */
561  memcpy(aad + 2, &hdr->addr1, 3 * ETH_ALEN);
562 }
563 
564 
565 static inline void bip_ipn_set64(u8 *d, u64 pn)
566 {
567  *d++ = pn;
568  *d++ = pn >> 8;
569  *d++ = pn >> 16;
570  *d++ = pn >> 24;
571  *d++ = pn >> 32;
572  *d = pn >> 40;
573 }
574 
575 static inline void bip_ipn_swap(u8 *d, const u8 *s)
576 {
577  *d++ = s[5];
578  *d++ = s[4];
579  *d++ = s[3];
580  *d++ = s[2];
581  *d++ = s[1];
582  *d = s[0];
583 }
584 
585 
588 {
589  struct sk_buff *skb;
590  struct ieee80211_tx_info *info;
591  struct ieee80211_key *key = tx->key;
592  struct ieee80211_mmie *mmie;
593  u8 aad[20];
594  u64 pn64;
595 
596  if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
597  return TX_DROP;
598 
599  skb = skb_peek(&tx->skbs);
600 
601  info = IEEE80211_SKB_CB(skb);
602 
603  if (info->control.hw_key)
604  return TX_CONTINUE;
605 
606  if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
607  return TX_DROP;
608 
609  mmie = (struct ieee80211_mmie *) skb_put(skb, sizeof(*mmie));
610  mmie->element_id = WLAN_EID_MMIE;
611  mmie->length = sizeof(*mmie) - 2;
612  mmie->key_id = cpu_to_le16(key->conf.keyidx);
613 
614  /* PN = PN + 1 */
615  pn64 = atomic64_inc_return(&key->u.aes_cmac.tx_pn);
616 
617  bip_ipn_set64(mmie->sequence_number, pn64);
618 
619  bip_aad(skb, aad);
620 
621  /*
622  * MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64)
623  */
624  ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad,
625  skb->data + 24, skb->len - 24, mmie->mic);
626 
627  return TX_CONTINUE;
628 }
629 
630 
633 {
634  struct sk_buff *skb = rx->skb;
635  struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
636  struct ieee80211_key *key = rx->key;
637  struct ieee80211_mmie *mmie;
638  u8 aad[20], mic[8], ipn[6];
639  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
640 
641  if (!ieee80211_is_mgmt(hdr->frame_control))
642  return RX_CONTINUE;
643 
644  /* management frames are already linear */
645 
646  if (skb->len < 24 + sizeof(*mmie))
647  return RX_DROP_UNUSABLE;
648 
649  mmie = (struct ieee80211_mmie *)
650  (skb->data + skb->len - sizeof(*mmie));
651  if (mmie->element_id != WLAN_EID_MMIE ||
652  mmie->length != sizeof(*mmie) - 2)
653  return RX_DROP_UNUSABLE; /* Invalid MMIE */
654 
655  bip_ipn_swap(ipn, mmie->sequence_number);
656 
657  if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
658  key->u.aes_cmac.replays++;
659  return RX_DROP_UNUSABLE;
660  }
661 
662  if (!(status->flag & RX_FLAG_DECRYPTED)) {
663  /* hardware didn't decrypt/verify MIC */
664  bip_aad(skb, aad);
665  ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad,
666  skb->data + 24, skb->len - 24, mic);
667  if (memcmp(mic, mmie->mic, sizeof(mmie->mic)) != 0) {
668  key->u.aes_cmac.icverrors++;
669  return RX_DROP_UNUSABLE;
670  }
671  }
672 
673  memcpy(key->u.aes_cmac.rx_pn, ipn, 6);
674 
675  /* Remove MMIE */
676  skb_trim(skb, skb->len - sizeof(*mmie));
677 
678  return RX_CONTINUE;
679 }
680 
683 {
684  struct sk_buff *skb;
685  struct ieee80211_tx_info *info = NULL;
686 
687  skb_queue_walk(&tx->skbs, skb) {
688  info = IEEE80211_SKB_CB(skb);
689 
690  /* handle hw-only algorithm */
691  if (!info->control.hw_key)
692  return TX_DROP;
693  }
694 
696 
697  return TX_CONTINUE;
698 }