xref: /kernel/linux/linux-5.10/net/mac80211/wpa.c (revision 8c2ecf20)
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	/* reload hdr - skb might have been reallocated */
524	hdr = (void *)rx->skb->data;
525
526	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;
527	if (!rx->sta || data_len < 0)
528		return RX_DROP_UNUSABLE;
529
530	if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
531		int res;
532
533		ccmp_hdr2pn(pn, skb->data + hdrlen);
534
535		queue = rx->security_idx;
536
537		res = memcmp(pn, key->u.ccmp.rx_pn[queue],
538			     IEEE80211_CCMP_PN_LEN);
539		if (res < 0 ||
540		    (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
541			key->u.ccmp.replays++;
542			return RX_DROP_UNUSABLE;
543		}
544
545		if (!(status->flag & RX_FLAG_DECRYPTED)) {
546			u8 aad[2 * AES_BLOCK_SIZE];
547			u8 b_0[AES_BLOCK_SIZE];
548			/* hardware didn't decrypt/verify MIC */
549			ccmp_special_blocks(skb, pn, b_0, aad);
550
551			if (ieee80211_aes_ccm_decrypt(
552				    key->u.ccmp.tfm, b_0, aad,
553				    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
554				    data_len,
555				    skb->data + skb->len - mic_len))
556				return RX_DROP_UNUSABLE;
557		}
558
559		memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN);
560		if (unlikely(ieee80211_is_frag(hdr)))
561			memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN);
562	}
563
564	/* Remove CCMP header and MIC */
565	if (pskb_trim(skb, skb->len - mic_len))
566		return RX_DROP_UNUSABLE;
567	memmove(skb->data + IEEE80211_CCMP_HDR_LEN, skb->data, hdrlen);
568	skb_pull(skb, IEEE80211_CCMP_HDR_LEN);
569
570	return RX_CONTINUE;
571}
572
573static void gcmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *j_0, u8 *aad)
574{
575	__le16 mask_fc;
576	u8 qos_tid;
577	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
578
579	memcpy(j_0, hdr->addr2, ETH_ALEN);
580	memcpy(&j_0[ETH_ALEN], pn, IEEE80211_GCMP_PN_LEN);
581	j_0[13] = 0;
582	j_0[14] = 0;
583	j_0[AES_BLOCK_SIZE - 1] = 0x01;
584
585	/* AAD (extra authenticate-only data) / masked 802.11 header
586	 * FC | A1 | A2 | A3 | SC | [A4] | [QC]
587	 */
588	put_unaligned_be16(ieee80211_hdrlen(hdr->frame_control) - 2, &aad[0]);
589	/* Mask FC: zero subtype b4 b5 b6 (if not mgmt)
590	 * Retry, PwrMgt, MoreData; set Protected
591	 */
592	mask_fc = hdr->frame_control;
593	mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY |
594				IEEE80211_FCTL_PM | IEEE80211_FCTL_MOREDATA);
595	if (!ieee80211_is_mgmt(hdr->frame_control))
596		mask_fc &= ~cpu_to_le16(0x0070);
597	mask_fc |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
598
599	put_unaligned(mask_fc, (__le16 *)&aad[2]);
600	memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
601
602	/* Mask Seq#, leave Frag# */
603	aad[22] = *((u8 *)&hdr->seq_ctrl) & 0x0f;
604	aad[23] = 0;
605
606	if (ieee80211_is_data_qos(hdr->frame_control))
607		qos_tid = ieee80211_get_tid(hdr);
608	else
609		qos_tid = 0;
610
611	if (ieee80211_has_a4(hdr->frame_control)) {
612		memcpy(&aad[24], hdr->addr4, ETH_ALEN);
613		aad[30] = qos_tid;
614		aad[31] = 0;
615	} else {
616		memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
617		aad[24] = qos_tid;
618	}
619}
620
621static inline void gcmp_pn2hdr(u8 *hdr, const u8 *pn, int key_id)
622{
623	hdr[0] = pn[5];
624	hdr[1] = pn[4];
625	hdr[2] = 0;
626	hdr[3] = 0x20 | (key_id << 6);
627	hdr[4] = pn[3];
628	hdr[5] = pn[2];
629	hdr[6] = pn[1];
630	hdr[7] = pn[0];
631}
632
633static inline void gcmp_hdr2pn(u8 *pn, const u8 *hdr)
634{
635	pn[0] = hdr[7];
636	pn[1] = hdr[6];
637	pn[2] = hdr[5];
638	pn[3] = hdr[4];
639	pn[4] = hdr[1];
640	pn[5] = hdr[0];
641}
642
643static int gcmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
644{
645	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
646	struct ieee80211_key *key = tx->key;
647	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
648	int hdrlen, len, tail;
649	u8 *pos;
650	u8 pn[6];
651	u64 pn64;
652	u8 aad[GCM_AAD_LEN];
653	u8 j_0[AES_BLOCK_SIZE];
654
655	if (info->control.hw_key &&
656	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
657	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
658	    !((info->control.hw_key->flags &
659	       IEEE80211_KEY_FLAG_GENERATE_IV_MGMT) &&
660	      ieee80211_is_mgmt(hdr->frame_control))) {
661		/* hwaccel has no need for preallocated room for GCMP
662		 * header or MIC fields
663		 */
664		return 0;
665	}
666
667	hdrlen = ieee80211_hdrlen(hdr->frame_control);
668	len = skb->len - hdrlen;
669
670	if (info->control.hw_key)
671		tail = 0;
672	else
673		tail = IEEE80211_GCMP_MIC_LEN;
674
675	if (WARN_ON(skb_tailroom(skb) < tail ||
676		    skb_headroom(skb) < IEEE80211_GCMP_HDR_LEN))
677		return -1;
678
679	pos = skb_push(skb, IEEE80211_GCMP_HDR_LEN);
680	memmove(pos, pos + IEEE80211_GCMP_HDR_LEN, hdrlen);
681	skb_set_network_header(skb, skb_network_offset(skb) +
682				    IEEE80211_GCMP_HDR_LEN);
683
684	/* the HW only needs room for the IV, but not the actual IV */
685	if (info->control.hw_key &&
686	    (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
687		return 0;
688
689	hdr = (struct ieee80211_hdr *)pos;
690	pos += hdrlen;
691
692	pn64 = atomic64_inc_return(&key->conf.tx_pn);
693
694	pn[5] = pn64;
695	pn[4] = pn64 >> 8;
696	pn[3] = pn64 >> 16;
697	pn[2] = pn64 >> 24;
698	pn[1] = pn64 >> 32;
699	pn[0] = pn64 >> 40;
700
701	gcmp_pn2hdr(pos, pn, key->conf.keyidx);
702
703	/* hwaccel - with software GCMP header */
704	if (info->control.hw_key)
705		return 0;
706
707	pos += IEEE80211_GCMP_HDR_LEN;
708	gcmp_special_blocks(skb, pn, j_0, aad);
709	return ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len,
710					 skb_put(skb, IEEE80211_GCMP_MIC_LEN));
711}
712
713ieee80211_tx_result
714ieee80211_crypto_gcmp_encrypt(struct ieee80211_tx_data *tx)
715{
716	struct sk_buff *skb;
717
718	ieee80211_tx_set_protected(tx);
719
720	skb_queue_walk(&tx->skbs, skb) {
721		if (gcmp_encrypt_skb(tx, skb) < 0)
722			return TX_DROP;
723	}
724
725	return TX_CONTINUE;
726}
727
728ieee80211_rx_result
729ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
730{
731	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
732	int hdrlen;
733	struct ieee80211_key *key = rx->key;
734	struct sk_buff *skb = rx->skb;
735	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
736	u8 pn[IEEE80211_GCMP_PN_LEN];
737	int data_len, queue, mic_len = IEEE80211_GCMP_MIC_LEN;
738
739	hdrlen = ieee80211_hdrlen(hdr->frame_control);
740
741	if (!ieee80211_is_data(hdr->frame_control) &&
742	    !ieee80211_is_robust_mgmt_frame(skb))
743		return RX_CONTINUE;
744
745	if (status->flag & RX_FLAG_DECRYPTED) {
746		if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_GCMP_HDR_LEN))
747			return RX_DROP_UNUSABLE;
748		if (status->flag & RX_FLAG_MIC_STRIPPED)
749			mic_len = 0;
750	} else {
751		if (skb_linearize(rx->skb))
752			return RX_DROP_UNUSABLE;
753	}
754
755	/* reload hdr - skb might have been reallocated */
756	hdr = (void *)rx->skb->data;
757
758	data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len;
759	if (!rx->sta || data_len < 0)
760		return RX_DROP_UNUSABLE;
761
762	if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
763		int res;
764
765		gcmp_hdr2pn(pn, skb->data + hdrlen);
766
767		queue = rx->security_idx;
768
769		res = memcmp(pn, key->u.gcmp.rx_pn[queue],
770			     IEEE80211_GCMP_PN_LEN);
771		if (res < 0 ||
772		    (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
773			key->u.gcmp.replays++;
774			return RX_DROP_UNUSABLE;
775		}
776
777		if (!(status->flag & RX_FLAG_DECRYPTED)) {
778			u8 aad[2 * AES_BLOCK_SIZE];
779			u8 j_0[AES_BLOCK_SIZE];
780			/* hardware didn't decrypt/verify MIC */
781			gcmp_special_blocks(skb, pn, j_0, aad);
782
783			if (ieee80211_aes_gcm_decrypt(
784				    key->u.gcmp.tfm, j_0, aad,
785				    skb->data + hdrlen + IEEE80211_GCMP_HDR_LEN,
786				    data_len,
787				    skb->data + skb->len -
788				    IEEE80211_GCMP_MIC_LEN))
789				return RX_DROP_UNUSABLE;
790		}
791
792		memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN);
793		if (unlikely(ieee80211_is_frag(hdr)))
794			memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN);
795	}
796
797	/* Remove GCMP header and MIC */
798	if (pskb_trim(skb, skb->len - mic_len))
799		return RX_DROP_UNUSABLE;
800	memmove(skb->data + IEEE80211_GCMP_HDR_LEN, skb->data, hdrlen);
801	skb_pull(skb, IEEE80211_GCMP_HDR_LEN);
802
803	return RX_CONTINUE;
804}
805
806static ieee80211_tx_result
807ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
808			    struct sk_buff *skb)
809{
810	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
811	struct ieee80211_key *key = tx->key;
812	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
813	int hdrlen;
814	u8 *pos, iv_len = key->conf.iv_len;
815
816	if (info->control.hw_key &&
817	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) {
818		/* hwaccel has no need for preallocated head room */
819		return TX_CONTINUE;
820	}
821
822	if (unlikely(skb_headroom(skb) < iv_len &&
823		     pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC)))
824		return TX_DROP;
825
826	hdrlen = ieee80211_hdrlen(hdr->frame_control);
827
828	pos = skb_push(skb, iv_len);
829	memmove(pos, pos + iv_len, hdrlen);
830
831	return TX_CONTINUE;
832}
833
834static inline int ieee80211_crypto_cs_pn_compare(u8 *pn1, u8 *pn2, int len)
835{
836	int i;
837
838	/* pn is little endian */
839	for (i = len - 1; i >= 0; i--) {
840		if (pn1[i] < pn2[i])
841			return -1;
842		else if (pn1[i] > pn2[i])
843			return 1;
844	}
845
846	return 0;
847}
848
849static ieee80211_rx_result
850ieee80211_crypto_cs_decrypt(struct ieee80211_rx_data *rx)
851{
852	struct ieee80211_key *key = rx->key;
853	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
854	const struct ieee80211_cipher_scheme *cs = NULL;
855	int hdrlen = ieee80211_hdrlen(hdr->frame_control);
856	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
857	int data_len;
858	u8 *rx_pn;
859	u8 *skb_pn;
860	u8 qos_tid;
861
862	if (!rx->sta || !rx->sta->cipher_scheme ||
863	    !(status->flag & RX_FLAG_DECRYPTED))
864		return RX_DROP_UNUSABLE;
865
866	if (!ieee80211_is_data(hdr->frame_control))
867		return RX_CONTINUE;
868
869	cs = rx->sta->cipher_scheme;
870
871	data_len = rx->skb->len - hdrlen - cs->hdr_len;
872
873	if (data_len < 0)
874		return RX_DROP_UNUSABLE;
875
876	if (ieee80211_is_data_qos(hdr->frame_control))
877		qos_tid = ieee80211_get_tid(hdr);
878	else
879		qos_tid = 0;
880
881	if (skb_linearize(rx->skb))
882		return RX_DROP_UNUSABLE;
883
884	hdr = (struct ieee80211_hdr *)rx->skb->data;
885
886	rx_pn = key->u.gen.rx_pn[qos_tid];
887	skb_pn = rx->skb->data + hdrlen + cs->pn_off;
888
889	if (ieee80211_crypto_cs_pn_compare(skb_pn, rx_pn, cs->pn_len) <= 0)
890		return RX_DROP_UNUSABLE;
891
892	memcpy(rx_pn, skb_pn, cs->pn_len);
893
894	/* remove security header and MIC */
895	if (pskb_trim(rx->skb, rx->skb->len - cs->mic_len))
896		return RX_DROP_UNUSABLE;
897
898	memmove(rx->skb->data + cs->hdr_len, rx->skb->data, hdrlen);
899	skb_pull(rx->skb, cs->hdr_len);
900
901	return RX_CONTINUE;
902}
903
904static void bip_aad(struct sk_buff *skb, u8 *aad)
905{
906	__le16 mask_fc;
907	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
908
909	/* BIP AAD: FC(masked) || A1 || A2 || A3 */
910
911	/* FC type/subtype */
912	/* Mask FC Retry, PwrMgt, MoreData flags to zero */
913	mask_fc = hdr->frame_control;
914	mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY | IEEE80211_FCTL_PM |
915				IEEE80211_FCTL_MOREDATA);
916	put_unaligned(mask_fc, (__le16 *) &aad[0]);
917	/* A1 || A2 || A3 */
918	memcpy(aad + 2, &hdr->addr1, 3 * ETH_ALEN);
919}
920
921
922static inline void bip_ipn_set64(u8 *d, u64 pn)
923{
924	*d++ = pn;
925	*d++ = pn >> 8;
926	*d++ = pn >> 16;
927	*d++ = pn >> 24;
928	*d++ = pn >> 32;
929	*d = pn >> 40;
930}
931
932static inline void bip_ipn_swap(u8 *d, const u8 *s)
933{
934	*d++ = s[5];
935	*d++ = s[4];
936	*d++ = s[3];
937	*d++ = s[2];
938	*d++ = s[1];
939	*d = s[0];
940}
941
942
943ieee80211_tx_result
944ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx)
945{
946	struct sk_buff *skb;
947	struct ieee80211_tx_info *info;
948	struct ieee80211_key *key = tx->key;
949	struct ieee80211_mmie *mmie;
950	u8 aad[20];
951	u64 pn64;
952
953	if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
954		return TX_DROP;
955
956	skb = skb_peek(&tx->skbs);
957
958	info = IEEE80211_SKB_CB(skb);
959
960	if (info->control.hw_key &&
961	    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE))
962		return TX_CONTINUE;
963
964	if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
965		return TX_DROP;
966
967	mmie = skb_put(skb, sizeof(*mmie));
968	mmie->element_id = WLAN_EID_MMIE;
969	mmie->length = sizeof(*mmie) - 2;
970	mmie->key_id = cpu_to_le16(key->conf.keyidx);
971
972	/* PN = PN + 1 */
973	pn64 = atomic64_inc_return(&key->conf.tx_pn);
974
975	bip_ipn_set64(mmie->sequence_number, pn64);
976
977	if (info->control.hw_key)
978		return TX_CONTINUE;
979
980	bip_aad(skb, aad);
981
982	/*
983	 * MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64)
984	 */
985	ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad,
986			   skb->data + 24, skb->len - 24, mmie->mic);
987
988	return TX_CONTINUE;
989}
990
991ieee80211_tx_result
992ieee80211_crypto_aes_cmac_256_encrypt(struct ieee80211_tx_data *tx)
993{
994	struct sk_buff *skb;
995	struct ieee80211_tx_info *info;
996	struct ieee80211_key *key = tx->key;
997	struct ieee80211_mmie_16 *mmie;
998	u8 aad[20];
999	u64 pn64;
1000
1001	if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
1002		return TX_DROP;
1003
1004	skb = skb_peek(&tx->skbs);
1005
1006	info = IEEE80211_SKB_CB(skb);
1007
1008	if (info->control.hw_key)
1009		return TX_CONTINUE;
1010
1011	if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
1012		return TX_DROP;
1013
1014	mmie = skb_put(skb, sizeof(*mmie));
1015	mmie->element_id = WLAN_EID_MMIE;
1016	mmie->length = sizeof(*mmie) - 2;
1017	mmie->key_id = cpu_to_le16(key->conf.keyidx);
1018
1019	/* PN = PN + 1 */
1020	pn64 = atomic64_inc_return(&key->conf.tx_pn);
1021
1022	bip_ipn_set64(mmie->sequence_number, pn64);
1023
1024	bip_aad(skb, aad);
1025
1026	/* MIC = AES-256-CMAC(IGTK, AAD || Management Frame Body || MMIE, 128)
1027	 */
1028	ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad,
1029			       skb->data + 24, skb->len - 24, mmie->mic);
1030
1031	return TX_CONTINUE;
1032}
1033
1034ieee80211_rx_result
1035ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
1036{
1037	struct sk_buff *skb = rx->skb;
1038	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1039	struct ieee80211_key *key = rx->key;
1040	struct ieee80211_mmie *mmie;
1041	u8 aad[20], mic[8], ipn[6];
1042	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1043
1044	if (!ieee80211_is_mgmt(hdr->frame_control))
1045		return RX_CONTINUE;
1046
1047	/* management frames are already linear */
1048
1049	if (skb->len < 24 + sizeof(*mmie))
1050		return RX_DROP_UNUSABLE;
1051
1052	mmie = (struct ieee80211_mmie *)
1053		(skb->data + skb->len - sizeof(*mmie));
1054	if (mmie->element_id != WLAN_EID_MMIE ||
1055	    mmie->length != sizeof(*mmie) - 2)
1056		return RX_DROP_UNUSABLE; /* Invalid MMIE */
1057
1058	bip_ipn_swap(ipn, mmie->sequence_number);
1059
1060	if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
1061		key->u.aes_cmac.replays++;
1062		return RX_DROP_UNUSABLE;
1063	}
1064
1065	if (!(status->flag & RX_FLAG_DECRYPTED)) {
1066		/* hardware didn't decrypt/verify MIC */
1067		bip_aad(skb, aad);
1068		ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad,
1069				   skb->data + 24, skb->len - 24, mic);
1070		if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
1071			key->u.aes_cmac.icverrors++;
1072			return RX_DROP_UNUSABLE;
1073		}
1074	}
1075
1076	memcpy(key->u.aes_cmac.rx_pn, ipn, 6);
1077
1078	/* Remove MMIE */
1079	skb_trim(skb, skb->len - sizeof(*mmie));
1080
1081	return RX_CONTINUE;
1082}
1083
1084ieee80211_rx_result
1085ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx)
1086{
1087	struct sk_buff *skb = rx->skb;
1088	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1089	struct ieee80211_key *key = rx->key;
1090	struct ieee80211_mmie_16 *mmie;
1091	u8 aad[20], mic[16], ipn[6];
1092	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1093
1094	if (!ieee80211_is_mgmt(hdr->frame_control))
1095		return RX_CONTINUE;
1096
1097	/* management frames are already linear */
1098
1099	if (skb->len < 24 + sizeof(*mmie))
1100		return RX_DROP_UNUSABLE;
1101
1102	mmie = (struct ieee80211_mmie_16 *)
1103		(skb->data + skb->len - sizeof(*mmie));
1104	if (mmie->element_id != WLAN_EID_MMIE ||
1105	    mmie->length != sizeof(*mmie) - 2)
1106		return RX_DROP_UNUSABLE; /* Invalid MMIE */
1107
1108	bip_ipn_swap(ipn, mmie->sequence_number);
1109
1110	if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
1111		key->u.aes_cmac.replays++;
1112		return RX_DROP_UNUSABLE;
1113	}
1114
1115	if (!(status->flag & RX_FLAG_DECRYPTED)) {
1116		/* hardware didn't decrypt/verify MIC */
1117		bip_aad(skb, aad);
1118		ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad,
1119				       skb->data + 24, skb->len - 24, mic);
1120		if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
1121			key->u.aes_cmac.icverrors++;
1122			return RX_DROP_UNUSABLE;
1123		}
1124	}
1125
1126	memcpy(key->u.aes_cmac.rx_pn, ipn, 6);
1127
1128	/* Remove MMIE */
1129	skb_trim(skb, skb->len - sizeof(*mmie));
1130
1131	return RX_CONTINUE;
1132}
1133
1134ieee80211_tx_result
1135ieee80211_crypto_aes_gmac_encrypt(struct ieee80211_tx_data *tx)
1136{
1137	struct sk_buff *skb;
1138	struct ieee80211_tx_info *info;
1139	struct ieee80211_key *key = tx->key;
1140	struct ieee80211_mmie_16 *mmie;
1141	struct ieee80211_hdr *hdr;
1142	u8 aad[GMAC_AAD_LEN];
1143	u64 pn64;
1144	u8 nonce[GMAC_NONCE_LEN];
1145
1146	if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
1147		return TX_DROP;
1148
1149	skb = skb_peek(&tx->skbs);
1150
1151	info = IEEE80211_SKB_CB(skb);
1152
1153	if (info->control.hw_key)
1154		return TX_CONTINUE;
1155
1156	if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
1157		return TX_DROP;
1158
1159	mmie = skb_put(skb, sizeof(*mmie));
1160	mmie->element_id = WLAN_EID_MMIE;
1161	mmie->length = sizeof(*mmie) - 2;
1162	mmie->key_id = cpu_to_le16(key->conf.keyidx);
1163
1164	/* PN = PN + 1 */
1165	pn64 = atomic64_inc_return(&key->conf.tx_pn);
1166
1167	bip_ipn_set64(mmie->sequence_number, pn64);
1168
1169	bip_aad(skb, aad);
1170
1171	hdr = (struct ieee80211_hdr *)skb->data;
1172	memcpy(nonce, hdr->addr2, ETH_ALEN);
1173	bip_ipn_swap(nonce + ETH_ALEN, mmie->sequence_number);
1174
1175	/* MIC = AES-GMAC(IGTK, AAD || Management Frame Body || MMIE, 128) */
1176	if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
1177			       skb->data + 24, skb->len - 24, mmie->mic) < 0)
1178		return TX_DROP;
1179
1180	return TX_CONTINUE;
1181}
1182
1183ieee80211_rx_result
1184ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx)
1185{
1186	struct sk_buff *skb = rx->skb;
1187	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1188	struct ieee80211_key *key = rx->key;
1189	struct ieee80211_mmie_16 *mmie;
1190	u8 aad[GMAC_AAD_LEN], *mic, ipn[6], nonce[GMAC_NONCE_LEN];
1191	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1192
1193	if (!ieee80211_is_mgmt(hdr->frame_control))
1194		return RX_CONTINUE;
1195
1196	/* management frames are already linear */
1197
1198	if (skb->len < 24 + sizeof(*mmie))
1199		return RX_DROP_UNUSABLE;
1200
1201	mmie = (struct ieee80211_mmie_16 *)
1202		(skb->data + skb->len - sizeof(*mmie));
1203	if (mmie->element_id != WLAN_EID_MMIE ||
1204	    mmie->length != sizeof(*mmie) - 2)
1205		return RX_DROP_UNUSABLE; /* Invalid MMIE */
1206
1207	bip_ipn_swap(ipn, mmie->sequence_number);
1208
1209	if (memcmp(ipn, key->u.aes_gmac.rx_pn, 6) <= 0) {
1210		key->u.aes_gmac.replays++;
1211		return RX_DROP_UNUSABLE;
1212	}
1213
1214	if (!(status->flag & RX_FLAG_DECRYPTED)) {
1215		/* hardware didn't decrypt/verify MIC */
1216		bip_aad(skb, aad);
1217
1218		memcpy(nonce, hdr->addr2, ETH_ALEN);
1219		memcpy(nonce + ETH_ALEN, ipn, 6);
1220
1221		mic = kmalloc(GMAC_MIC_LEN, GFP_ATOMIC);
1222		if (!mic)
1223			return RX_DROP_UNUSABLE;
1224		if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
1225				       skb->data + 24, skb->len - 24,
1226				       mic) < 0 ||
1227		    crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
1228			key->u.aes_gmac.icverrors++;
1229			kfree(mic);
1230			return RX_DROP_UNUSABLE;
1231		}
1232		kfree(mic);
1233	}
1234
1235	memcpy(key->u.aes_gmac.rx_pn, ipn, 6);
1236
1237	/* Remove MMIE */
1238	skb_trim(skb, skb->len - sizeof(*mmie));
1239
1240	return RX_CONTINUE;
1241}
1242
1243ieee80211_tx_result
1244ieee80211_crypto_hw_encrypt(struct ieee80211_tx_data *tx)
1245{
1246	struct sk_buff *skb;
1247	struct ieee80211_tx_info *info = NULL;
1248	ieee80211_tx_result res;
1249
1250	skb_queue_walk(&tx->skbs, skb) {
1251		info  = IEEE80211_SKB_CB(skb);
1252
1253		/* handle hw-only algorithm */
1254		if (!info->control.hw_key)
1255			return TX_DROP;
1256
1257		if (tx->key->flags & KEY_FLAG_CIPHER_SCHEME) {
1258			res = ieee80211_crypto_cs_encrypt(tx, skb);
1259			if (res != TX_CONTINUE)
1260				return res;
1261		}
1262	}
1263
1264	ieee80211_tx_set_protected(tx);
1265
1266	return TX_CONTINUE;
1267}
1268
1269ieee80211_rx_result
1270ieee80211_crypto_hw_decrypt(struct ieee80211_rx_data *rx)
1271{
1272	if (rx->sta && rx->sta->cipher_scheme)
1273		return ieee80211_crypto_cs_decrypt(rx);
1274
1275	return RX_DROP_UNUSABLE;
1276}
1277