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-2023 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()
320 struct ieee80211_hdr *hdr = (void *)skb->data; in ccmp_gcmp_aad()
322 int a4_included, mgmt; in ccmp_gcmp_aad()
330 mgmt = ieee80211_is_mgmt(hdr->frame_control); in ccmp_gcmp_aad()
331 mask_fc = hdr->frame_control; in ccmp_gcmp_aad()
338 a4_included = ieee80211_has_a4(hdr->frame_control); in ccmp_gcmp_aad()
342 if (ieee80211_is_data_qos(hdr->frame_control)) { in ccmp_gcmp_aad()
357 /* AAD (extra authenticate-only data) / masked 802.11 header in ccmp_gcmp_aad()
361 memcpy(&aad[4], &hdr->addrs, 3 * ETH_ALEN); in ccmp_gcmp_aad()
364 aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f; in ccmp_gcmp_aad()
368 memcpy(&aad[24], hdr->addr4, ETH_ALEN); in ccmp_gcmp_aad()
382 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ccmp_special_blocks()
397 b_0[1] = qos_tid | (ieee80211_is_mgmt(hdr->frame_control) << 4); in ccmp_special_blocks()
398 memcpy(&b_0[2], hdr->addr2, ETH_ALEN); in ccmp_special_blocks()
402 static inline void ccmp_pn2hdr(u8 *hdr, u8 *pn, int key_id) in ccmp_pn2hdr()
426 static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb, in ccmp_encrypt_skb()
427 unsigned int mic_len) in ccmp_encrypt_skb()
429 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ccmp_encrypt_skb()
430 struct ieee80211_key *key = tx->key; in ccmp_encrypt_skb()
432 int hdrlen, len, tail; in ccmp_encrypt_skb()
439 if (info->control.hw_key && in ccmp_encrypt_skb()
440 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) && in ccmp_encrypt_skb()
441 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && in ccmp_encrypt_skb()
442 !((info->control.hw_key->flags & in ccmp_encrypt_skb()
444 ieee80211_is_mgmt(hdr->frame_control))) { in ccmp_encrypt_skb()
447 * header or MIC fields in ccmp_encrypt_skb()
452 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ccmp_encrypt_skb()
453 len = skb->len - hdrlen; in ccmp_encrypt_skb()
455 if (info->control.hw_key) in ccmp_encrypt_skb()
462 return -1; in ccmp_encrypt_skb()
468 if (info->control.hw_key && in ccmp_encrypt_skb()
469 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) in ccmp_encrypt_skb()
474 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ccmp_encrypt_skb()
483 ccmp_pn2hdr(pos, pn, key->conf.keyidx); in ccmp_encrypt_skb()
485 /* hwaccel - with software CCMP header */ in ccmp_encrypt_skb()
486 if (info->control.hw_key) in ccmp_encrypt_skb()
491 key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU); in ccmp_encrypt_skb()
492 return ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len, in ccmp_encrypt_skb()
499 unsigned int mic_len) in ieee80211_crypto_ccmp_encrypt()
505 skb_queue_walk(&tx->skbs, skb) { in ieee80211_crypto_ccmp_encrypt()
516 unsigned int mic_len) in ieee80211_crypto_ccmp_decrypt()
518 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_crypto_ccmp_decrypt()
519 int hdrlen; in ieee80211_crypto_ccmp_decrypt()
520 struct ieee80211_key *key = rx->key; in ieee80211_crypto_ccmp_decrypt()
521 struct sk_buff *skb = rx->skb; in ieee80211_crypto_ccmp_decrypt()
524 int data_len; in ieee80211_crypto_ccmp_decrypt()
525 int queue; in ieee80211_crypto_ccmp_decrypt()
527 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_crypto_ccmp_decrypt()
529 if (!ieee80211_is_data(hdr->frame_control) && in ieee80211_crypto_ccmp_decrypt()
533 if (status->flag & RX_FLAG_DECRYPTED) { in ieee80211_crypto_ccmp_decrypt()
534 if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_CCMP_HDR_LEN)) in ieee80211_crypto_ccmp_decrypt()
536 if (status->flag & RX_FLAG_MIC_STRIPPED) in ieee80211_crypto_ccmp_decrypt()
539 if (skb_linearize(rx->skb)) in ieee80211_crypto_ccmp_decrypt()
543 /* reload hdr - skb might have been reallocated */ in ieee80211_crypto_ccmp_decrypt()
544 hdr = (void *)rx->skb->data; in ieee80211_crypto_ccmp_decrypt()
546 data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len; in ieee80211_crypto_ccmp_decrypt()
547 if (!rx->sta || data_len < 0) in ieee80211_crypto_ccmp_decrypt()
550 if (!(status->flag & RX_FLAG_PN_VALIDATED)) { in ieee80211_crypto_ccmp_decrypt()
551 int res; in ieee80211_crypto_ccmp_decrypt()
553 ccmp_hdr2pn(pn, skb->data + hdrlen); in ieee80211_crypto_ccmp_decrypt()
555 queue = rx->security_idx; in ieee80211_crypto_ccmp_decrypt()
557 res = memcmp(pn, key->u.ccmp.rx_pn[queue], in ieee80211_crypto_ccmp_decrypt()
560 (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) { in ieee80211_crypto_ccmp_decrypt()
561 key->u.ccmp.replays++; in ieee80211_crypto_ccmp_decrypt()
565 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_ccmp_decrypt()
568 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_ccmp_decrypt()
570 key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU); in ieee80211_crypto_ccmp_decrypt()
573 key->u.ccmp.tfm, b_0, aad, in ieee80211_crypto_ccmp_decrypt()
574 skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN, in ieee80211_crypto_ccmp_decrypt()
576 skb->data + skb->len - mic_len)) in ieee80211_crypto_ccmp_decrypt()
580 memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN); in ieee80211_crypto_ccmp_decrypt()
582 memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN); in ieee80211_crypto_ccmp_decrypt()
585 /* Remove CCMP header and MIC */ in ieee80211_crypto_ccmp_decrypt()
586 if (pskb_trim(skb, skb->len - mic_len)) in ieee80211_crypto_ccmp_decrypt()
588 memmove(skb->data + IEEE80211_CCMP_HDR_LEN, skb->data, hdrlen); in ieee80211_crypto_ccmp_decrypt()
597 struct ieee80211_hdr *hdr = (void *)skb->data; in gcmp_special_blocks()
599 memcpy(j_0, hdr->addr2, ETH_ALEN); in gcmp_special_blocks()
605 static inline void gcmp_pn2hdr(u8 *hdr, const u8 *pn, int key_id) in gcmp_pn2hdr()
627 static int gcmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) in gcmp_encrypt_skb()
629 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in gcmp_encrypt_skb()
630 struct ieee80211_key *key = tx->key; in gcmp_encrypt_skb()
632 int hdrlen, len, tail; in gcmp_encrypt_skb()
639 if (info->control.hw_key && in gcmp_encrypt_skb()
640 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) && in gcmp_encrypt_skb()
641 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && in gcmp_encrypt_skb()
642 !((info->control.hw_key->flags & in gcmp_encrypt_skb()
644 ieee80211_is_mgmt(hdr->frame_control))) { in gcmp_encrypt_skb()
646 * header or MIC fields in gcmp_encrypt_skb()
651 hdrlen = ieee80211_hdrlen(hdr->frame_control); in gcmp_encrypt_skb()
652 len = skb->len - hdrlen; in gcmp_encrypt_skb()
654 if (info->control.hw_key) in gcmp_encrypt_skb()
661 return -1; in gcmp_encrypt_skb()
669 if (info->control.hw_key && in gcmp_encrypt_skb()
670 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) in gcmp_encrypt_skb()
675 pn64 = atomic64_inc_return(&key->conf.tx_pn); in gcmp_encrypt_skb()
684 gcmp_pn2hdr(pos, pn, key->conf.keyidx); in gcmp_encrypt_skb()
686 /* hwaccel - with software GCMP header */ in gcmp_encrypt_skb()
687 if (info->control.hw_key) in gcmp_encrypt_skb()
692 key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU); in gcmp_encrypt_skb()
693 return ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len, in gcmp_encrypt_skb()
704 skb_queue_walk(&tx->skbs, skb) { in ieee80211_crypto_gcmp_encrypt()
715 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; in ieee80211_crypto_gcmp_decrypt()
716 int hdrlen; in ieee80211_crypto_gcmp_decrypt()
717 struct ieee80211_key *key = rx->key; in ieee80211_crypto_gcmp_decrypt()
718 struct sk_buff *skb = rx->skb; in ieee80211_crypto_gcmp_decrypt()
721 int data_len, queue, mic_len = IEEE80211_GCMP_MIC_LEN; in ieee80211_crypto_gcmp_decrypt()
723 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_crypto_gcmp_decrypt()
725 if (!ieee80211_is_data(hdr->frame_control) && in ieee80211_crypto_gcmp_decrypt()
729 if (status->flag & RX_FLAG_DECRYPTED) { in ieee80211_crypto_gcmp_decrypt()
730 if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_GCMP_HDR_LEN)) in ieee80211_crypto_gcmp_decrypt()
732 if (status->flag & RX_FLAG_MIC_STRIPPED) in ieee80211_crypto_gcmp_decrypt()
735 if (skb_linearize(rx->skb)) in ieee80211_crypto_gcmp_decrypt()
739 /* reload hdr - skb might have been reallocated */ in ieee80211_crypto_gcmp_decrypt()
740 hdr = (void *)rx->skb->data; in ieee80211_crypto_gcmp_decrypt()
742 data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len; in ieee80211_crypto_gcmp_decrypt()
743 if (!rx->sta || data_len < 0) in ieee80211_crypto_gcmp_decrypt()
746 if (!(status->flag & RX_FLAG_PN_VALIDATED)) { in ieee80211_crypto_gcmp_decrypt()
747 int res; in ieee80211_crypto_gcmp_decrypt()
749 gcmp_hdr2pn(pn, skb->data + hdrlen); in ieee80211_crypto_gcmp_decrypt()
751 queue = rx->security_idx; in ieee80211_crypto_gcmp_decrypt()
753 res = memcmp(pn, key->u.gcmp.rx_pn[queue], in ieee80211_crypto_gcmp_decrypt()
756 (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) { in ieee80211_crypto_gcmp_decrypt()
757 key->u.gcmp.replays++; in ieee80211_crypto_gcmp_decrypt()
761 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_gcmp_decrypt()
764 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_gcmp_decrypt()
766 key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU); in ieee80211_crypto_gcmp_decrypt()
769 key->u.gcmp.tfm, j_0, aad, in ieee80211_crypto_gcmp_decrypt()
770 skb->data + hdrlen + IEEE80211_GCMP_HDR_LEN, in ieee80211_crypto_gcmp_decrypt()
772 skb->data + skb->len - in ieee80211_crypto_gcmp_decrypt()
777 memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN); in ieee80211_crypto_gcmp_decrypt()
779 memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN); in ieee80211_crypto_gcmp_decrypt()
782 /* Remove GCMP header and MIC */ in ieee80211_crypto_gcmp_decrypt()
783 if (pskb_trim(skb, skb->len - mic_len)) in ieee80211_crypto_gcmp_decrypt()
785 memmove(skb->data + IEEE80211_GCMP_HDR_LEN, skb->data, hdrlen); in ieee80211_crypto_gcmp_decrypt()
794 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in bip_aad()
800 mask_fc = hdr->frame_control; in bip_aad()
805 memcpy(aad + 2, &hdr->addrs, 3 * ETH_ALEN); in bip_aad()
835 struct ieee80211_key *key = tx->key; in ieee80211_crypto_aes_cmac_encrypt()
840 if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) in ieee80211_crypto_aes_cmac_encrypt()
843 skb = skb_peek(&tx->skbs); in ieee80211_crypto_aes_cmac_encrypt()
847 if (info->control.hw_key && in ieee80211_crypto_aes_cmac_encrypt()
848 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE)) in ieee80211_crypto_aes_cmac_encrypt()
855 mmie->element_id = WLAN_EID_MMIE; in ieee80211_crypto_aes_cmac_encrypt()
856 mmie->length = sizeof(*mmie) - 2; in ieee80211_crypto_aes_cmac_encrypt()
857 mmie->key_id = cpu_to_le16(key->conf.keyidx); in ieee80211_crypto_aes_cmac_encrypt()
860 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ieee80211_crypto_aes_cmac_encrypt()
862 bip_ipn_set64(mmie->sequence_number, pn64); in ieee80211_crypto_aes_cmac_encrypt()
864 if (info->control.hw_key) in ieee80211_crypto_aes_cmac_encrypt()
870 * MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64) in ieee80211_crypto_aes_cmac_encrypt()
872 ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_encrypt()
873 skb->data + 24, skb->len - 24, mmie->mic); in ieee80211_crypto_aes_cmac_encrypt()
883 struct ieee80211_key *key = tx->key; in ieee80211_crypto_aes_cmac_256_encrypt()
888 if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) in ieee80211_crypto_aes_cmac_256_encrypt()
891 skb = skb_peek(&tx->skbs); in ieee80211_crypto_aes_cmac_256_encrypt()
895 if (info->control.hw_key && in ieee80211_crypto_aes_cmac_256_encrypt()
896 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE)) in ieee80211_crypto_aes_cmac_256_encrypt()
903 mmie->element_id = WLAN_EID_MMIE; in ieee80211_crypto_aes_cmac_256_encrypt()
904 mmie->length = sizeof(*mmie) - 2; in ieee80211_crypto_aes_cmac_256_encrypt()
905 mmie->key_id = cpu_to_le16(key->conf.keyidx); in ieee80211_crypto_aes_cmac_256_encrypt()
908 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ieee80211_crypto_aes_cmac_256_encrypt()
910 bip_ipn_set64(mmie->sequence_number, pn64); in ieee80211_crypto_aes_cmac_256_encrypt()
912 if (info->control.hw_key) in ieee80211_crypto_aes_cmac_256_encrypt()
917 /* MIC = AES-256-CMAC(IGTK, AAD || Management Frame Body || MMIE, 128) in ieee80211_crypto_aes_cmac_256_encrypt()
919 ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_256_encrypt()
920 skb->data + 24, skb->len - 24, mmie->mic); in ieee80211_crypto_aes_cmac_256_encrypt()
928 struct sk_buff *skb = rx->skb; in ieee80211_crypto_aes_cmac_decrypt()
930 struct ieee80211_key *key = rx->key; in ieee80211_crypto_aes_cmac_decrypt()
932 u8 aad[20], mic[8], ipn[6]; in ieee80211_crypto_aes_cmac_decrypt() local
933 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_crypto_aes_cmac_decrypt()
935 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_crypto_aes_cmac_decrypt()
940 if (skb->len < 24 + sizeof(*mmie)) in ieee80211_crypto_aes_cmac_decrypt()
944 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_decrypt()
945 if (mmie->element_id != WLAN_EID_MMIE || in ieee80211_crypto_aes_cmac_decrypt()
946 mmie->length != sizeof(*mmie) - 2) in ieee80211_crypto_aes_cmac_decrypt()
949 bip_ipn_swap(ipn, mmie->sequence_number); in ieee80211_crypto_aes_cmac_decrypt()
951 if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) { in ieee80211_crypto_aes_cmac_decrypt()
952 key->u.aes_cmac.replays++; in ieee80211_crypto_aes_cmac_decrypt()
956 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_aes_cmac_decrypt()
957 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_aes_cmac_decrypt()
959 ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_decrypt()
960 skb->data + 24, skb->len - 24, mic); in ieee80211_crypto_aes_cmac_decrypt()
961 if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { in ieee80211_crypto_aes_cmac_decrypt()
962 key->u.aes_cmac.icverrors++; in ieee80211_crypto_aes_cmac_decrypt()
967 memcpy(key->u.aes_cmac.rx_pn, ipn, 6); in ieee80211_crypto_aes_cmac_decrypt()
970 skb_trim(skb, skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_decrypt()
978 struct sk_buff *skb = rx->skb; in ieee80211_crypto_aes_cmac_256_decrypt()
980 struct ieee80211_key *key = rx->key; in ieee80211_crypto_aes_cmac_256_decrypt()
982 u8 aad[20], mic[16], ipn[6]; in ieee80211_crypto_aes_cmac_256_decrypt() local
983 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_crypto_aes_cmac_256_decrypt()
985 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_crypto_aes_cmac_256_decrypt()
990 if (skb->len < 24 + sizeof(*mmie)) in ieee80211_crypto_aes_cmac_256_decrypt()
994 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_256_decrypt()
995 if (mmie->element_id != WLAN_EID_MMIE || in ieee80211_crypto_aes_cmac_256_decrypt()
996 mmie->length != sizeof(*mmie) - 2) in ieee80211_crypto_aes_cmac_256_decrypt()
999 bip_ipn_swap(ipn, mmie->sequence_number); in ieee80211_crypto_aes_cmac_256_decrypt()
1001 if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) { in ieee80211_crypto_aes_cmac_256_decrypt()
1002 key->u.aes_cmac.replays++; in ieee80211_crypto_aes_cmac_256_decrypt()
1006 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_aes_cmac_256_decrypt()
1007 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_aes_cmac_256_decrypt()
1009 ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad, in ieee80211_crypto_aes_cmac_256_decrypt()
1010 skb->data + 24, skb->len - 24, mic); in ieee80211_crypto_aes_cmac_256_decrypt()
1011 if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { in ieee80211_crypto_aes_cmac_256_decrypt()
1012 key->u.aes_cmac.icverrors++; in ieee80211_crypto_aes_cmac_256_decrypt()
1017 memcpy(key->u.aes_cmac.rx_pn, ipn, 6); in ieee80211_crypto_aes_cmac_256_decrypt()
1020 skb_trim(skb, skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_cmac_256_decrypt()
1030 struct ieee80211_key *key = tx->key; in ieee80211_crypto_aes_gmac_encrypt()
1037 if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) in ieee80211_crypto_aes_gmac_encrypt()
1040 skb = skb_peek(&tx->skbs); in ieee80211_crypto_aes_gmac_encrypt()
1044 if (info->control.hw_key && in ieee80211_crypto_aes_gmac_encrypt()
1045 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE)) in ieee80211_crypto_aes_gmac_encrypt()
1052 mmie->element_id = WLAN_EID_MMIE; in ieee80211_crypto_aes_gmac_encrypt()
1053 mmie->length = sizeof(*mmie) - 2; in ieee80211_crypto_aes_gmac_encrypt()
1054 mmie->key_id = cpu_to_le16(key->conf.keyidx); in ieee80211_crypto_aes_gmac_encrypt()
1057 pn64 = atomic64_inc_return(&key->conf.tx_pn); in ieee80211_crypto_aes_gmac_encrypt()
1059 bip_ipn_set64(mmie->sequence_number, pn64); in ieee80211_crypto_aes_gmac_encrypt()
1061 if (info->control.hw_key) in ieee80211_crypto_aes_gmac_encrypt()
1066 hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_crypto_aes_gmac_encrypt()
1067 memcpy(nonce, hdr->addr2, ETH_ALEN); in ieee80211_crypto_aes_gmac_encrypt()
1068 bip_ipn_swap(nonce + ETH_ALEN, mmie->sequence_number); in ieee80211_crypto_aes_gmac_encrypt()
1070 /* MIC = AES-GMAC(IGTK, AAD || Management Frame Body || MMIE, 128) */ in ieee80211_crypto_aes_gmac_encrypt()
1071 if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce, in ieee80211_crypto_aes_gmac_encrypt()
1072 skb->data + 24, skb->len - 24, mmie->mic) < 0) in ieee80211_crypto_aes_gmac_encrypt()
1081 struct sk_buff *skb = rx->skb; in ieee80211_crypto_aes_gmac_decrypt()
1083 struct ieee80211_key *key = rx->key; in ieee80211_crypto_aes_gmac_decrypt()
1085 u8 aad[GMAC_AAD_LEN], *mic, ipn[6], nonce[GMAC_NONCE_LEN]; in ieee80211_crypto_aes_gmac_decrypt() local
1086 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in ieee80211_crypto_aes_gmac_decrypt()
1088 if (!ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_crypto_aes_gmac_decrypt()
1093 if (skb->len < 24 + sizeof(*mmie)) in ieee80211_crypto_aes_gmac_decrypt()
1097 (skb->data + skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_gmac_decrypt()
1098 if (mmie->element_id != WLAN_EID_MMIE || in ieee80211_crypto_aes_gmac_decrypt()
1099 mmie->length != sizeof(*mmie) - 2) in ieee80211_crypto_aes_gmac_decrypt()
1102 bip_ipn_swap(ipn, mmie->sequence_number); in ieee80211_crypto_aes_gmac_decrypt()
1104 if (memcmp(ipn, key->u.aes_gmac.rx_pn, 6) <= 0) { in ieee80211_crypto_aes_gmac_decrypt()
1105 key->u.aes_gmac.replays++; in ieee80211_crypto_aes_gmac_decrypt()
1109 if (!(status->flag & RX_FLAG_DECRYPTED)) { in ieee80211_crypto_aes_gmac_decrypt()
1110 /* hardware didn't decrypt/verify MIC */ in ieee80211_crypto_aes_gmac_decrypt()
1113 memcpy(nonce, hdr->addr2, ETH_ALEN); in ieee80211_crypto_aes_gmac_decrypt()
1116 mic = kmalloc(GMAC_MIC_LEN, GFP_ATOMIC); in ieee80211_crypto_aes_gmac_decrypt()
1117 if (!mic) in ieee80211_crypto_aes_gmac_decrypt()
1119 if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce, in ieee80211_crypto_aes_gmac_decrypt()
1120 skb->data + 24, skb->len - 24, in ieee80211_crypto_aes_gmac_decrypt()
1121 mic) < 0 || in ieee80211_crypto_aes_gmac_decrypt()
1122 crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { in ieee80211_crypto_aes_gmac_decrypt()
1123 key->u.aes_gmac.icverrors++; in ieee80211_crypto_aes_gmac_decrypt()
1124 kfree(mic); in ieee80211_crypto_aes_gmac_decrypt()
1127 kfree(mic); in ieee80211_crypto_aes_gmac_decrypt()
1130 memcpy(key->u.aes_gmac.rx_pn, ipn, 6); in ieee80211_crypto_aes_gmac_decrypt()
1133 skb_trim(skb, skb->len - sizeof(*mmie)); in ieee80211_crypto_aes_gmac_decrypt()