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