Lines Matching +full:mic +full:- +full:int
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright 2002-2004, Instant802 Networks, Inc.
5 * Copyright (C) 2016-2017 Intel Deutschland GmbH
6 * Copyright (C) 2020-2021 Intel Corporation
32 u8 *data, *key, *mic; in ieee80211_tx_h_michael_mic_add() local
34 unsigned int hdrlen; in ieee80211_tx_h_michael_mic_add()
36 struct sk_buff *skb = tx->skb; in ieee80211_tx_h_michael_mic_add()
38 int tail; in ieee80211_tx_h_michael_mic_add()
40 hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_tx_h_michael_mic_add()
41 if (!tx->key || tx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP || in ieee80211_tx_h_michael_mic_add()
42 skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control)) in ieee80211_tx_h_michael_mic_add()
45 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_tx_h_michael_mic_add()
46 if (skb->len < hdrlen) in ieee80211_tx_h_michael_mic_add()
49 data = skb->data + hdrlen; in ieee80211_tx_h_michael_mic_add()
50 data_len = skb->len - hdrlen; in ieee80211_tx_h_michael_mic_add()
52 if (unlikely(info->flags & IEEE80211_TX_INTFL_TKIP_MIC_FAILURE)) { in ieee80211_tx_h_michael_mic_add()
54 info->control.hw_key = NULL; in ieee80211_tx_h_michael_mic_add()
57 if (info->control.hw_key && in ieee80211_tx_h_michael_mic_add()
58 (info->flags & IEEE80211_TX_CTL_DONTFRAG || in ieee80211_tx_h_michael_mic_add()
59 ieee80211_hw_check(&tx->local->hw, SUPPORTS_TX_FRAG)) && in ieee80211_tx_h_michael_mic_add()
60 !(tx->key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC | in ieee80211_tx_h_michael_mic_add()
62 /* hwaccel - with no need for SW-generated MMIC or MIC space */ in ieee80211_tx_h_michael_mic_add()
67 if (!info->control.hw_key) in ieee80211_tx_h_michael_mic_add()
77 mic = skb_put(skb, MICHAEL_MIC_LEN); in ieee80211_tx_h_michael_mic_add()
79 if (tx->key->conf.flags & IEEE80211_KEY_FLAG_PUT_MIC_SPACE) { in ieee80211_tx_h_michael_mic_add()
80 /* Zeroed MIC can help with debug */ in ieee80211_tx_h_michael_mic_add()
81 memset(mic, 0, MICHAEL_MIC_LEN); in ieee80211_tx_h_michael_mic_add()
85 key = &tx->key->conf.key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY]; in ieee80211_tx_h_michael_mic_add()
86 michael_mic(key, hdr, data, data_len, mic); in ieee80211_tx_h_michael_mic_add()
87 if (unlikely(info->flags & IEEE80211_TX_INTFL_TKIP_MIC_FAILURE)) in ieee80211_tx_h_michael_mic_add()
88 mic[0]++; in ieee80211_tx_h_michael_mic_add()
99 unsigned int hdrlen; in ieee80211_rx_h_michael_mic_verify()
100 u8 mic[MICHAEL_MIC_LEN]; in ieee80211_rx_h_michael_mic_verify() local
101 struct sk_buff *skb = rx->skb; in ieee80211_rx_h_michael_mic_verify()
103 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_rx_h_michael_mic_verify()
106 * it makes no sense to check for MIC errors on anything other in ieee80211_rx_h_michael_mic_verify()
109 if (!ieee80211_is_data_present(hdr->frame_control)) in ieee80211_rx_h_michael_mic_verify()
113 * No way to verify the MIC if the hardware stripped it or in ieee80211_rx_h_michael_mic_verify()
116 * MIC failure report. in ieee80211_rx_h_michael_mic_verify()
118 if (status->flag & (RX_FLAG_MMIC_STRIPPED | RX_FLAG_IV_STRIPPED)) { in ieee80211_rx_h_michael_mic_verify()
119 if (status->flag & RX_FLAG_MMIC_ERROR) in ieee80211_rx_h_michael_mic_verify()
122 if (!(status->flag & RX_FLAG_IV_STRIPPED) && rx->key && in ieee80211_rx_h_michael_mic_verify()
123 rx->key->conf.cipher == WLAN_CIPHER_SUITE_TKIP) in ieee80211_rx_h_michael_mic_verify()
130 * Some hardware seems to generate Michael MIC failure reports; even in ieee80211_rx_h_michael_mic_verify()
132 * MIC. Ignore the flag them to avoid triggering countermeasures. in ieee80211_rx_h_michael_mic_verify()
134 if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP || in ieee80211_rx_h_michael_mic_verify()
135 !(status->flag & RX_FLAG_DECRYPTED)) in ieee80211_rx_h_michael_mic_verify()
138 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && rx->key->conf.keyidx) { in ieee80211_rx_h_michael_mic_verify()
140 * APs with pairwise keys should never receive Michael MIC in ieee80211_rx_h_michael_mic_verify()
141 * errors for non-zero keyidx because these are reserved for in ieee80211_rx_h_michael_mic_verify()
148 if (status->flag & RX_FLAG_MMIC_ERROR) in ieee80211_rx_h_michael_mic_verify()
151 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_rx_h_michael_mic_verify()
152 if (skb->len < hdrlen + MICHAEL_MIC_LEN) in ieee80211_rx_h_michael_mic_verify()
155 if (skb_linearize(rx->skb)) in ieee80211_rx_h_michael_mic_verify()
157 hdr = (void *)skb->data; in ieee80211_rx_h_michael_mic_verify()
159 data = skb->data + hdrlen; in ieee80211_rx_h_michael_mic_verify()
160 data_len = skb->len - hdrlen - MICHAEL_MIC_LEN; in ieee80211_rx_h_michael_mic_verify()
161 key = &rx->key->conf.key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY]; in ieee80211_rx_h_michael_mic_verify()
162 michael_mic(key, hdr, data, data_len, mic); in ieee80211_rx_h_michael_mic_verify()
163 if (crypto_memneq(mic, data + data_len, MICHAEL_MIC_LEN)) in ieee80211_rx_h_michael_mic_verify()
166 /* remove Michael MIC from payload */ in ieee80211_rx_h_michael_mic_verify()
167 skb_trim(skb, skb->len - MICHAEL_MIC_LEN); in ieee80211_rx_h_michael_mic_verify()
171 rx->key->u.tkip.rx[rx->security_idx].iv32 = rx->tkip.iv32; in ieee80211_rx_h_michael_mic_verify()
172 rx->key->u.tkip.rx[rx->security_idx].iv16 = rx->tkip.iv16; in ieee80211_rx_h_michael_mic_verify()
177 rx->key->u.tkip.mic_failures++; in ieee80211_rx_h_michael_mic_verify()
181 * In some cases the key can be unset - e.g. a multicast packet, in in ieee80211_rx_h_michael_mic_verify()
185 cfg80211_michael_mic_failure(rx->sdata->dev, hdr->addr2, in ieee80211_rx_h_michael_mic_verify()
186 is_multicast_ether_addr(hdr->addr1) ? in ieee80211_rx_h_michael_mic_verify()
189 rx->key ? rx->key->conf.keyidx : -1, in ieee80211_rx_h_michael_mic_verify()
194 static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) in tkip_encrypt_skb()
196 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in tkip_encrypt_skb()
197 struct ieee80211_key *key = tx->key; in tkip_encrypt_skb()
199 unsigned int hdrlen; in tkip_encrypt_skb()
200 int len, tail; in tkip_encrypt_skb()
204 if (info->control.hw_key && in tkip_encrypt_skb()
205 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) && in tkip_encrypt_skb()
206 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) { in tkip_encrypt_skb()
207 /* hwaccel - with no need for software-generated IV */ in tkip_encrypt_skb()
211 hdrlen = ieee80211_hdrlen(hdr->frame_control); in tkip_encrypt_skb()
212 len = skb->len - hdrlen; in tkip_encrypt_skb()
214 if (info->control.hw_key) in tkip_encrypt_skb()
221 return -1; in tkip_encrypt_skb()
228 if (info->control.hw_key && in tkip_encrypt_skb()
229 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) in tkip_encrypt_skb()
233 pn = atomic64_inc_return(&key->conf.tx_pn); in tkip_encrypt_skb()
234 pos = ieee80211_tkip_add_iv(pos, &key->conf, pn); in tkip_encrypt_skb()
236 /* hwaccel - with software IV */ in tkip_encrypt_skb()
237 if (info->control.hw_key) in tkip_encrypt_skb()
243 return ieee80211_tkip_encrypt_data(&tx->local->wep_tx_ctx, in tkip_encrypt_skb()
255 skb_queue_walk(&tx->skbs, skb) { in ieee80211_crypto_tkip_encrypt()
267 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data; in ieee80211_crypto_tkip_decrypt()
268 int hdrlen, res, hwaccel = 0; in ieee80211_crypto_tkip_decrypt()
269 struct ieee80211_key *key = rx->key; in ieee80211_crypto_tkip_decrypt()
270 struct sk_buff *skb = rx->skb; in ieee80211_crypto_tkip_decrypt()
273 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_crypto_tkip_decrypt()
275 if (!ieee80211_is_data(hdr->frame_control)) in ieee80211_crypto_tkip_decrypt()
278 if (!rx->sta || skb->len - hdrlen < 12) in ieee80211_crypto_tkip_decrypt()
282 if (skb_linearize(rx->skb)) in ieee80211_crypto_tkip_decrypt()
284 hdr = (void *)skb->data; in ieee80211_crypto_tkip_decrypt()
291 if (status->flag & RX_FLAG_DECRYPTED) in ieee80211_crypto_tkip_decrypt()
294 res = ieee80211_tkip_decrypt_data(&rx->local->wep_rx_ctx, in ieee80211_crypto_tkip_decrypt()
295 key, skb->data + hdrlen, in ieee80211_crypto_tkip_decrypt()
296 skb->len - hdrlen, rx->sta->sta.addr, in ieee80211_crypto_tkip_decrypt()
297 hdr->addr1, hwaccel, rx->security_idx, in ieee80211_crypto_tkip_decrypt()
298 &rx->tkip.iv32, in ieee80211_crypto_tkip_decrypt()
299 &rx->tkip.iv16); in ieee80211_crypto_tkip_decrypt()
304 if (!(status->flag & RX_FLAG_ICV_STRIPPED)) in ieee80211_crypto_tkip_decrypt()
305 skb_trim(skb, skb->len - IEEE80211_TKIP_ICV_LEN); in ieee80211_crypto_tkip_decrypt()
308 memmove(skb->data + IEEE80211_TKIP_IV_LEN, skb->data, hdrlen); in ieee80211_crypto_tkip_decrypt()
318 int a4_included, mgmt; in ccmp_special_blocks()
321 unsigned int hdrlen; in ccmp_special_blocks()
322 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ccmp_special_blocks()
328 mgmt = ieee80211_is_mgmt(hdr->frame_control); in ccmp_special_blocks()
329 mask_fc = hdr->frame_control; in ccmp_special_blocks()
336 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ccmp_special_blocks()
337 len_a = hdrlen - 2; in ccmp_special_blocks()
338 a4_included = ieee80211_has_a4(hdr->frame_control); in ccmp_special_blocks()
340 if (ieee80211_is_data_qos(hdr->frame_control)) in ccmp_special_blocks()
358 memcpy(&b_0[2], hdr->addr2, ETH_ALEN); in ccmp_special_blocks()
361 /* AAD (extra authenticate-only data) / masked 802.11 header in ccmp_special_blocks()
365 memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN); in ccmp_special_blocks()
368 aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f; in ccmp_special_blocks()
372 memcpy(&aad[24], hdr->addr4, ETH_ALEN); in ccmp_special_blocks()
382 static inline void ccmp_pn2hdr(u8 *hdr, u8 *pn, int key_id) in ccmp_pn2hdr()
406 static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb, in ccmp_encrypt_skb()
407 unsigned int mic_len) in ccmp_encrypt_skb()
409 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ccmp_encrypt_skb()
410 struct ieee80211_key *key = tx->key; in ccmp_encrypt_skb()
412 int hdrlen, len, tail; in ccmp_encrypt_skb()
419 if (info->control.hw_key && in ccmp_encrypt_skb()
420 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) && in ccmp_encrypt_skb()
421 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && in ccmp_encrypt_skb()
422 !((info->control.hw_key->flags & in ccmp_encrypt_skb()
424 ieee80211_is_mgmt(hdr->frame_control))) { in ccmp_encrypt_skb()
427 * header or MIC fields in ccmp_encrypt_skb()
432 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ccmp_encrypt_skb()
433 len = skb->len - hdrlen; in ccmp_encrypt_skb()
435 if (info->control.hw_key) in ccmp_encrypt_skb()
442 return -1; in ccmp_encrypt_skb()
448 if (info->control.hw_key && in ccmp_encrypt_skb()
449 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) in ccmp_encrypt_skb()
455 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ccmp_encrypt_skb()
464 ccmp_pn2hdr(pos, pn, key->conf.keyidx); in ccmp_encrypt_skb()
466 /* hwaccel - with software CCMP header */ in ccmp_encrypt_skb()
467 if (info->control.hw_key) in ccmp_encrypt_skb()
472 return ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len, in ccmp_encrypt_skb()
479 unsigned int mic_len) in ieee80211_crypto_ccmp_encrypt()
485 skb_queue_walk(&tx->skbs, skb) { in ieee80211_crypto_ccmp_encrypt()
496 unsigned int mic_len) in ieee80211_crypto_ccmp_decrypt()
498 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_crypto_ccmp_decrypt()
499 int hdrlen; in ieee80211_crypto_ccmp_decrypt()
500 struct ieee80211_key *key = rx->key; in ieee80211_crypto_ccmp_decrypt()
501 struct sk_buff *skb = rx->skb; in ieee80211_crypto_ccmp_decrypt()
504 int data_len; in ieee80211_crypto_ccmp_decrypt()
505 int queue; in ieee80211_crypto_ccmp_decrypt()
507 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_crypto_ccmp_decrypt()
509 if (!ieee80211_is_data(hdr->frame_control) && in ieee80211_crypto_ccmp_decrypt()
513 if (status->flag & RX_FLAG_DECRYPTED) { in ieee80211_crypto_ccmp_decrypt()
514 if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_CCMP_HDR_LEN)) in ieee80211_crypto_ccmp_decrypt()
516 if (status->flag & RX_FLAG_MIC_STRIPPED) in ieee80211_crypto_ccmp_decrypt()
519 if (skb_linearize(rx->skb)) in ieee80211_crypto_ccmp_decrypt()
523 /* reload hdr - skb might have been reallocated */ in ieee80211_crypto_ccmp_decrypt()
524 hdr = (void *)rx->skb->data; in ieee80211_crypto_ccmp_decrypt()
526 data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len; in ieee80211_crypto_ccmp_decrypt()
527 if (!rx->sta || data_len < 0) in ieee80211_crypto_ccmp_decrypt()
530 if (!(status->flag & RX_FLAG_PN_VALIDATED)) { in ieee80211_crypto_ccmp_decrypt()
531 int res; in ieee80211_crypto_ccmp_decrypt()
533 ccmp_hdr2pn(pn, skb->data + hdrlen); in ieee80211_crypto_ccmp_decrypt()
535 queue = rx->security_idx; in ieee80211_crypto_ccmp_decrypt()
537 res = memcmp(pn, key->u.ccmp.rx_pn[queue], in ieee80211_crypto_ccmp_decrypt()
540 (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) { in ieee80211_crypto_ccmp_decrypt()
541 key->u.ccmp.replays++; in ieee80211_crypto_ccmp_decrypt()
545 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_ccmp_decrypt()
548 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_ccmp_decrypt()
552 key->u.ccmp.tfm, b_0, aad, in ieee80211_crypto_ccmp_decrypt()
553 skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN, in ieee80211_crypto_ccmp_decrypt()
555 skb->data + skb->len - mic_len)) in ieee80211_crypto_ccmp_decrypt()
559 memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN); in ieee80211_crypto_ccmp_decrypt()
561 memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN); in ieee80211_crypto_ccmp_decrypt()
564 /* Remove CCMP header and MIC */ in ieee80211_crypto_ccmp_decrypt()
565 if (pskb_trim(skb, skb->len - mic_len)) in ieee80211_crypto_ccmp_decrypt()
567 memmove(skb->data + IEEE80211_CCMP_HDR_LEN, skb->data, hdrlen); in ieee80211_crypto_ccmp_decrypt()
577 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in gcmp_special_blocks()
579 memcpy(j_0, hdr->addr2, ETH_ALEN); in gcmp_special_blocks()
583 j_0[AES_BLOCK_SIZE - 1] = 0x01; in gcmp_special_blocks()
585 /* AAD (extra authenticate-only data) / masked 802.11 header in gcmp_special_blocks()
588 put_unaligned_be16(ieee80211_hdrlen(hdr->frame_control) - 2, &aad[0]); in gcmp_special_blocks()
592 mask_fc = hdr->frame_control; in gcmp_special_blocks()
595 if (!ieee80211_is_mgmt(hdr->frame_control)) in gcmp_special_blocks()
600 memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN); in gcmp_special_blocks()
603 aad[22] = *((u8 *)&hdr->seq_ctrl) & 0x0f; in gcmp_special_blocks()
606 if (ieee80211_is_data_qos(hdr->frame_control)) in gcmp_special_blocks()
611 if (ieee80211_has_a4(hdr->frame_control)) { in gcmp_special_blocks()
612 memcpy(&aad[24], hdr->addr4, ETH_ALEN); in gcmp_special_blocks()
621 static inline void gcmp_pn2hdr(u8 *hdr, const u8 *pn, int key_id) in gcmp_pn2hdr()
643 static int gcmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) in gcmp_encrypt_skb()
645 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in gcmp_encrypt_skb()
646 struct ieee80211_key *key = tx->key; in gcmp_encrypt_skb()
648 int hdrlen, len, tail; in gcmp_encrypt_skb()
655 if (info->control.hw_key && in gcmp_encrypt_skb()
656 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) && in gcmp_encrypt_skb()
657 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && in gcmp_encrypt_skb()
658 !((info->control.hw_key->flags & in gcmp_encrypt_skb()
660 ieee80211_is_mgmt(hdr->frame_control))) { in gcmp_encrypt_skb()
662 * header or MIC fields in gcmp_encrypt_skb()
667 hdrlen = ieee80211_hdrlen(hdr->frame_control); in gcmp_encrypt_skb()
668 len = skb->len - hdrlen; in gcmp_encrypt_skb()
670 if (info->control.hw_key) in gcmp_encrypt_skb()
677 return -1; in gcmp_encrypt_skb()
685 if (info->control.hw_key && in gcmp_encrypt_skb()
686 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) in gcmp_encrypt_skb()
692 pn64 = atomic64_inc_return(&key->conf.tx_pn); in gcmp_encrypt_skb()
701 gcmp_pn2hdr(pos, pn, key->conf.keyidx); in gcmp_encrypt_skb()
703 /* hwaccel - with software GCMP header */ in gcmp_encrypt_skb()
704 if (info->control.hw_key) in gcmp_encrypt_skb()
709 return ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len, in gcmp_encrypt_skb()
720 skb_queue_walk(&tx->skbs, skb) { in ieee80211_crypto_gcmp_encrypt()
731 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_crypto_gcmp_decrypt()
732 int hdrlen; in ieee80211_crypto_gcmp_decrypt()
733 struct ieee80211_key *key = rx->key; in ieee80211_crypto_gcmp_decrypt()
734 struct sk_buff *skb = rx->skb; in ieee80211_crypto_gcmp_decrypt()
737 int data_len, queue, mic_len = IEEE80211_GCMP_MIC_LEN; in ieee80211_crypto_gcmp_decrypt()
739 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_crypto_gcmp_decrypt()
741 if (!ieee80211_is_data(hdr->frame_control) && in ieee80211_crypto_gcmp_decrypt()
745 if (status->flag & RX_FLAG_DECRYPTED) { in ieee80211_crypto_gcmp_decrypt()
746 if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_GCMP_HDR_LEN)) in ieee80211_crypto_gcmp_decrypt()
748 if (status->flag & RX_FLAG_MIC_STRIPPED) in ieee80211_crypto_gcmp_decrypt()
751 if (skb_linearize(rx->skb)) in ieee80211_crypto_gcmp_decrypt()
755 /* reload hdr - skb might have been reallocated */ in ieee80211_crypto_gcmp_decrypt()
756 hdr = (void *)rx->skb->data; in ieee80211_crypto_gcmp_decrypt()
758 data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len; in ieee80211_crypto_gcmp_decrypt()
759 if (!rx->sta || data_len < 0) in ieee80211_crypto_gcmp_decrypt()
762 if (!(status->flag & RX_FLAG_PN_VALIDATED)) { in ieee80211_crypto_gcmp_decrypt()
763 int res; in ieee80211_crypto_gcmp_decrypt()
765 gcmp_hdr2pn(pn, skb->data + hdrlen); in ieee80211_crypto_gcmp_decrypt()
767 queue = rx->security_idx; in ieee80211_crypto_gcmp_decrypt()
769 res = memcmp(pn, key->u.gcmp.rx_pn[queue], in ieee80211_crypto_gcmp_decrypt()
772 (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) { in ieee80211_crypto_gcmp_decrypt()
773 key->u.gcmp.replays++; in ieee80211_crypto_gcmp_decrypt()
777 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_gcmp_decrypt()
780 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_gcmp_decrypt()
784 key->u.gcmp.tfm, j_0, aad, in ieee80211_crypto_gcmp_decrypt()
785 skb->data + hdrlen + IEEE80211_GCMP_HDR_LEN, in ieee80211_crypto_gcmp_decrypt()
787 skb->data + skb->len - in ieee80211_crypto_gcmp_decrypt()
792 memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN); in ieee80211_crypto_gcmp_decrypt()
794 memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN); in ieee80211_crypto_gcmp_decrypt()
797 /* Remove GCMP header and MIC */ in ieee80211_crypto_gcmp_decrypt()
798 if (pskb_trim(skb, skb->len - mic_len)) in ieee80211_crypto_gcmp_decrypt()
800 memmove(skb->data + IEEE80211_GCMP_HDR_LEN, skb->data, hdrlen); in ieee80211_crypto_gcmp_decrypt()
810 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_crypto_cs_encrypt()
811 struct ieee80211_key *key = tx->key; in ieee80211_crypto_cs_encrypt()
813 int hdrlen; in ieee80211_crypto_cs_encrypt()
814 u8 *pos, iv_len = key->conf.iv_len; in ieee80211_crypto_cs_encrypt()
816 if (info->control.hw_key && in ieee80211_crypto_cs_encrypt()
817 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) { in ieee80211_crypto_cs_encrypt()
826 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_crypto_cs_encrypt()
834 static inline int ieee80211_crypto_cs_pn_compare(u8 *pn1, u8 *pn2, int len) in ieee80211_crypto_cs_pn_compare()
836 int i; in ieee80211_crypto_cs_pn_compare()
839 for (i = len - 1; i >= 0; i--) { in ieee80211_crypto_cs_pn_compare()
841 return -1; in ieee80211_crypto_cs_pn_compare()
852 struct ieee80211_key *key = rx->key; in ieee80211_crypto_cs_decrypt()
853 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_crypto_cs_decrypt()
855 int hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_crypto_cs_decrypt()
856 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); in ieee80211_crypto_cs_decrypt()
857 int data_len; in ieee80211_crypto_cs_decrypt()
862 if (!rx->sta || !rx->sta->cipher_scheme || in ieee80211_crypto_cs_decrypt()
863 !(status->flag & RX_FLAG_DECRYPTED)) in ieee80211_crypto_cs_decrypt()
866 if (!ieee80211_is_data(hdr->frame_control)) in ieee80211_crypto_cs_decrypt()
869 cs = rx->sta->cipher_scheme; in ieee80211_crypto_cs_decrypt()
871 data_len = rx->skb->len - hdrlen - cs->hdr_len; in ieee80211_crypto_cs_decrypt()
876 if (ieee80211_is_data_qos(hdr->frame_control)) in ieee80211_crypto_cs_decrypt()
881 if (skb_linearize(rx->skb)) in ieee80211_crypto_cs_decrypt()
884 hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_crypto_cs_decrypt()
886 rx_pn = key->u.gen.rx_pn[qos_tid]; in ieee80211_crypto_cs_decrypt()
887 skb_pn = rx->skb->data + hdrlen + cs->pn_off; in ieee80211_crypto_cs_decrypt()
889 if (ieee80211_crypto_cs_pn_compare(skb_pn, rx_pn, cs->pn_len) <= 0) in ieee80211_crypto_cs_decrypt()
892 memcpy(rx_pn, skb_pn, cs->pn_len); in ieee80211_crypto_cs_decrypt()
894 /* remove security header and MIC */ in ieee80211_crypto_cs_decrypt()
895 if (pskb_trim(rx->skb, rx->skb->len - cs->mic_len)) in ieee80211_crypto_cs_decrypt()
898 memmove(rx->skb->data + cs->hdr_len, rx->skb->data, hdrlen); in ieee80211_crypto_cs_decrypt()
899 skb_pull(rx->skb, cs->hdr_len); in ieee80211_crypto_cs_decrypt()
907 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in bip_aad()
913 mask_fc = hdr->frame_control; in bip_aad()
918 memcpy(aad + 2, &hdr->addr1, 3 * ETH_ALEN); in bip_aad()
948 struct ieee80211_key *key = tx->key; in ieee80211_crypto_aes_cmac_encrypt()
953 if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) in ieee80211_crypto_aes_cmac_encrypt()
956 skb = skb_peek(&tx->skbs); in ieee80211_crypto_aes_cmac_encrypt()
960 if (info->control.hw_key && in ieee80211_crypto_aes_cmac_encrypt()
961 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE)) in ieee80211_crypto_aes_cmac_encrypt()
968 mmie->element_id = WLAN_EID_MMIE; in ieee80211_crypto_aes_cmac_encrypt()
969 mmie->length = sizeof(*mmie) - 2; in ieee80211_crypto_aes_cmac_encrypt()
970 mmie->key_id = cpu_to_le16(key->conf.keyidx); in ieee80211_crypto_aes_cmac_encrypt()
973 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ieee80211_crypto_aes_cmac_encrypt()
975 bip_ipn_set64(mmie->sequence_number, pn64); in ieee80211_crypto_aes_cmac_encrypt()
977 if (info->control.hw_key) in ieee80211_crypto_aes_cmac_encrypt()
983 * MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64) in ieee80211_crypto_aes_cmac_encrypt()
985 ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_encrypt()
986 skb->data + 24, skb->len - 24, mmie->mic); in ieee80211_crypto_aes_cmac_encrypt()
996 struct ieee80211_key *key = tx->key; in ieee80211_crypto_aes_cmac_256_encrypt()
1001 if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) in ieee80211_crypto_aes_cmac_256_encrypt()
1004 skb = skb_peek(&tx->skbs); in ieee80211_crypto_aes_cmac_256_encrypt()
1008 if (info->control.hw_key) in ieee80211_crypto_aes_cmac_256_encrypt()
1015 mmie->element_id = WLAN_EID_MMIE; in ieee80211_crypto_aes_cmac_256_encrypt()
1016 mmie->length = sizeof(*mmie) - 2; in ieee80211_crypto_aes_cmac_256_encrypt()
1017 mmie->key_id = cpu_to_le16(key->conf.keyidx); in ieee80211_crypto_aes_cmac_256_encrypt()
1020 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ieee80211_crypto_aes_cmac_256_encrypt()
1022 bip_ipn_set64(mmie->sequence_number, pn64); in ieee80211_crypto_aes_cmac_256_encrypt()
1026 /* MIC = AES-256-CMAC(IGTK, AAD || Management Frame Body || MMIE, 128) in ieee80211_crypto_aes_cmac_256_encrypt()
1028 ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_256_encrypt()
1029 skb->data + 24, skb->len - 24, mmie->mic); in ieee80211_crypto_aes_cmac_256_encrypt()
1037 struct sk_buff *skb = rx->skb; in ieee80211_crypto_aes_cmac_decrypt()
1039 struct ieee80211_key *key = rx->key; in ieee80211_crypto_aes_cmac_decrypt()
1041 u8 aad[20], mic[8], ipn[6]; in ieee80211_crypto_aes_cmac_decrypt() local
1042 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_crypto_aes_cmac_decrypt()
1044 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_crypto_aes_cmac_decrypt()
1049 if (skb->len < 24 + sizeof(*mmie)) in ieee80211_crypto_aes_cmac_decrypt()
1053 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_decrypt()
1054 if (mmie->element_id != WLAN_EID_MMIE || in ieee80211_crypto_aes_cmac_decrypt()
1055 mmie->length != sizeof(*mmie) - 2) in ieee80211_crypto_aes_cmac_decrypt()
1058 bip_ipn_swap(ipn, mmie->sequence_number); in ieee80211_crypto_aes_cmac_decrypt()
1060 if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) { in ieee80211_crypto_aes_cmac_decrypt()
1061 key->u.aes_cmac.replays++; in ieee80211_crypto_aes_cmac_decrypt()
1065 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_aes_cmac_decrypt()
1066 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_aes_cmac_decrypt()
1068 ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_decrypt()
1069 skb->data + 24, skb->len - 24, mic); in ieee80211_crypto_aes_cmac_decrypt()
1070 if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { in ieee80211_crypto_aes_cmac_decrypt()
1071 key->u.aes_cmac.icverrors++; in ieee80211_crypto_aes_cmac_decrypt()
1076 memcpy(key->u.aes_cmac.rx_pn, ipn, 6); in ieee80211_crypto_aes_cmac_decrypt()
1079 skb_trim(skb, skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_decrypt()
1087 struct sk_buff *skb = rx->skb; in ieee80211_crypto_aes_cmac_256_decrypt()
1089 struct ieee80211_key *key = rx->key; in ieee80211_crypto_aes_cmac_256_decrypt()
1091 u8 aad[20], mic[16], ipn[6]; in ieee80211_crypto_aes_cmac_256_decrypt() local
1092 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_crypto_aes_cmac_256_decrypt()
1094 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_crypto_aes_cmac_256_decrypt()
1099 if (skb->len < 24 + sizeof(*mmie)) in ieee80211_crypto_aes_cmac_256_decrypt()
1103 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_256_decrypt()
1104 if (mmie->element_id != WLAN_EID_MMIE || in ieee80211_crypto_aes_cmac_256_decrypt()
1105 mmie->length != sizeof(*mmie) - 2) in ieee80211_crypto_aes_cmac_256_decrypt()
1108 bip_ipn_swap(ipn, mmie->sequence_number); in ieee80211_crypto_aes_cmac_256_decrypt()
1110 if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) { in ieee80211_crypto_aes_cmac_256_decrypt()
1111 key->u.aes_cmac.replays++; in ieee80211_crypto_aes_cmac_256_decrypt()
1115 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_aes_cmac_256_decrypt()
1116 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_aes_cmac_256_decrypt()
1118 ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_256_decrypt()
1119 skb->data + 24, skb->len - 24, mic); in ieee80211_crypto_aes_cmac_256_decrypt()
1120 if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { in ieee80211_crypto_aes_cmac_256_decrypt()
1121 key->u.aes_cmac.icverrors++; in ieee80211_crypto_aes_cmac_256_decrypt()
1126 memcpy(key->u.aes_cmac.rx_pn, ipn, 6); in ieee80211_crypto_aes_cmac_256_decrypt()
1129 skb_trim(skb, skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_256_decrypt()
1139 struct ieee80211_key *key = tx->key; in ieee80211_crypto_aes_gmac_encrypt()
1146 if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) in ieee80211_crypto_aes_gmac_encrypt()
1149 skb = skb_peek(&tx->skbs); in ieee80211_crypto_aes_gmac_encrypt()
1153 if (info->control.hw_key) in ieee80211_crypto_aes_gmac_encrypt()
1160 mmie->element_id = WLAN_EID_MMIE; in ieee80211_crypto_aes_gmac_encrypt()
1161 mmie->length = sizeof(*mmie) - 2; in ieee80211_crypto_aes_gmac_encrypt()
1162 mmie->key_id = cpu_to_le16(key->conf.keyidx); in ieee80211_crypto_aes_gmac_encrypt()
1165 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ieee80211_crypto_aes_gmac_encrypt()
1167 bip_ipn_set64(mmie->sequence_number, pn64); in ieee80211_crypto_aes_gmac_encrypt()
1171 hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_crypto_aes_gmac_encrypt()
1172 memcpy(nonce, hdr->addr2, ETH_ALEN); in ieee80211_crypto_aes_gmac_encrypt()
1173 bip_ipn_swap(nonce + ETH_ALEN, mmie->sequence_number); in ieee80211_crypto_aes_gmac_encrypt()
1175 /* MIC = AES-GMAC(IGTK, AAD || Management Frame Body || MMIE, 128) */ in ieee80211_crypto_aes_gmac_encrypt()
1176 if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce, in ieee80211_crypto_aes_gmac_encrypt()
1177 skb->data + 24, skb->len - 24, mmie->mic) < 0) in ieee80211_crypto_aes_gmac_encrypt()
1186 struct sk_buff *skb = rx->skb; in ieee80211_crypto_aes_gmac_decrypt()
1188 struct ieee80211_key *key = rx->key; in ieee80211_crypto_aes_gmac_decrypt()
1190 u8 aad[GMAC_AAD_LEN], *mic, ipn[6], nonce[GMAC_NONCE_LEN]; in ieee80211_crypto_aes_gmac_decrypt() local
1191 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_crypto_aes_gmac_decrypt()
1193 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_crypto_aes_gmac_decrypt()
1198 if (skb->len < 24 + sizeof(*mmie)) in ieee80211_crypto_aes_gmac_decrypt()
1202 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_gmac_decrypt()
1203 if (mmie->element_id != WLAN_EID_MMIE || in ieee80211_crypto_aes_gmac_decrypt()
1204 mmie->length != sizeof(*mmie) - 2) in ieee80211_crypto_aes_gmac_decrypt()
1207 bip_ipn_swap(ipn, mmie->sequence_number); in ieee80211_crypto_aes_gmac_decrypt()
1209 if (memcmp(ipn, key->u.aes_gmac.rx_pn, 6) <= 0) { in ieee80211_crypto_aes_gmac_decrypt()
1210 key->u.aes_gmac.replays++; in ieee80211_crypto_aes_gmac_decrypt()
1214 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_aes_gmac_decrypt()
1215 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_aes_gmac_decrypt()
1218 memcpy(nonce, hdr->addr2, ETH_ALEN); in ieee80211_crypto_aes_gmac_decrypt()
1221 mic = kmalloc(GMAC_MIC_LEN, GFP_ATOMIC); in ieee80211_crypto_aes_gmac_decrypt()
1222 if (!mic) in ieee80211_crypto_aes_gmac_decrypt()
1224 if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce, in ieee80211_crypto_aes_gmac_decrypt()
1225 skb->data + 24, skb->len - 24, in ieee80211_crypto_aes_gmac_decrypt()
1226 mic) < 0 || in ieee80211_crypto_aes_gmac_decrypt()
1227 crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { in ieee80211_crypto_aes_gmac_decrypt()
1228 key->u.aes_gmac.icverrors++; in ieee80211_crypto_aes_gmac_decrypt()
1229 kfree(mic); in ieee80211_crypto_aes_gmac_decrypt()
1232 kfree(mic); in ieee80211_crypto_aes_gmac_decrypt()
1235 memcpy(key->u.aes_gmac.rx_pn, ipn, 6); in ieee80211_crypto_aes_gmac_decrypt()
1238 skb_trim(skb, skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_gmac_decrypt()
1250 skb_queue_walk(&tx->skbs, skb) { in ieee80211_crypto_hw_encrypt()
1253 /* handle hw-only algorithm */ in ieee80211_crypto_hw_encrypt()
1254 if (!info->control.hw_key) in ieee80211_crypto_hw_encrypt()
1257 if (tx->key->flags & KEY_FLAG_CIPHER_SCHEME) { in ieee80211_crypto_hw_encrypt()
1272 if (rx->sta && rx->sta->cipher_scheme) in ieee80211_crypto_hw_decrypt()