Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

wifi: mac80211: refactor CMAC packet handlers

Merge CMAC-128 and CMAC-256 handlers since they are almost the same.
This removes duplication.

The comment 'MIC = AES-128-CMAC(IGTK, AAD ...' is out-dated since CMAC
is also used with BIGTK, as is the comment for CMAC-256. Simply remove
the comments.

Tested-on: mac80211_hwsim

Signed-off-by: Chien Wong <m@xv97.com>
Link: https://patch.msgid.link/20251113140511.48658-6-m@xv97.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>

authored by

Chien Wong and committed by
Johannes Berg
b688a944 a22fb192

+39 -133
+4 -2
net/mac80211/rx.c
··· 2215 2215 rx, IEEE80211_CCMP_256_MIC_LEN); 2216 2216 break; 2217 2217 case WLAN_CIPHER_SUITE_AES_CMAC: 2218 - result = ieee80211_crypto_aes_cmac_decrypt(rx); 2218 + result = ieee80211_crypto_aes_cmac_decrypt( 2219 + rx, IEEE80211_CMAC_128_MIC_LEN); 2219 2220 break; 2220 2221 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 2221 - result = ieee80211_crypto_aes_cmac_256_decrypt(rx); 2222 + result = ieee80211_crypto_aes_cmac_decrypt( 2223 + rx, IEEE80211_CMAC_256_MIC_LEN); 2222 2224 break; 2223 2225 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 2224 2226 case WLAN_CIPHER_SUITE_BIP_GMAC_256:
+4 -2
net/mac80211/tx.c
··· 1062 1062 return ieee80211_crypto_ccmp_encrypt( 1063 1063 tx, IEEE80211_CCMP_256_MIC_LEN); 1064 1064 case WLAN_CIPHER_SUITE_AES_CMAC: 1065 - return ieee80211_crypto_aes_cmac_encrypt(tx); 1065 + return ieee80211_crypto_aes_cmac_encrypt( 1066 + tx, IEEE80211_CMAC_128_MIC_LEN); 1066 1067 case WLAN_CIPHER_SUITE_BIP_CMAC_256: 1067 - return ieee80211_crypto_aes_cmac_256_encrypt(tx); 1068 + return ieee80211_crypto_aes_cmac_encrypt( 1069 + tx, IEEE80211_CMAC_256_MIC_LEN); 1068 1070 case WLAN_CIPHER_SUITE_BIP_GMAC_128: 1069 1071 case WLAN_CIPHER_SUITE_BIP_GMAC_256: 1070 1072 return ieee80211_crypto_aes_gmac_encrypt(tx);
+27 -123
net/mac80211/wpa.c
··· 828 828 829 829 830 830 ieee80211_tx_result 831 - ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx) 831 + ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx, 832 + unsigned int mic_len) 832 833 { 833 834 struct sk_buff *skb; 834 835 struct ieee80211_tx_info *info; 835 836 struct ieee80211_key *key = tx->key; 836 - struct ieee80211_mmie *mmie; 837 + struct ieee80211_mmie_var *mmie; 838 + size_t mmie_len; 837 839 u8 aad[20]; 838 840 u64 pn64; 839 841 ··· 850 848 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE)) 851 849 return TX_CONTINUE; 852 850 853 - if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie))) 851 + mmie_len = sizeof(*mmie) + mic_len; 852 + 853 + if (WARN_ON(skb_tailroom(skb) < mmie_len)) 854 854 return TX_DROP; 855 855 856 - mmie = skb_put(skb, sizeof(*mmie)); 856 + mmie = skb_put(skb, mmie_len); 857 857 mmie->element_id = WLAN_EID_MMIE; 858 - mmie->length = sizeof(*mmie) - 2; 858 + mmie->length = mmie_len - 2; 859 859 mmie->key_id = cpu_to_le16(key->conf.keyidx); 860 860 861 861 /* PN = PN + 1 */ ··· 870 866 871 867 bip_aad(skb, aad); 872 868 873 - /* 874 - * MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64) 875 - */ 876 869 if (ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, 877 - skb->data + 24, skb->len - 24, mmie->mic, 878 - IEEE80211_CMAC_128_MIC_LEN)) 879 - return TX_DROP; 880 - 881 - return TX_CONTINUE; 882 - } 883 - 884 - ieee80211_tx_result 885 - ieee80211_crypto_aes_cmac_256_encrypt(struct ieee80211_tx_data *tx) 886 - { 887 - struct sk_buff *skb; 888 - struct ieee80211_tx_info *info; 889 - struct ieee80211_key *key = tx->key; 890 - struct ieee80211_mmie_16 *mmie; 891 - u8 aad[20]; 892 - u64 pn64; 893 - 894 - if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) 895 - return TX_DROP; 896 - 897 - skb = skb_peek(&tx->skbs); 898 - 899 - info = IEEE80211_SKB_CB(skb); 900 - 901 - if (info->control.hw_key && 902 - !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE)) 903 - return TX_CONTINUE; 904 - 905 - if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie))) 906 - return TX_DROP; 907 - 908 - mmie = skb_put(skb, sizeof(*mmie)); 909 - mmie->element_id = WLAN_EID_MMIE; 910 - mmie->length = sizeof(*mmie) - 2; 911 - mmie->key_id = cpu_to_le16(key->conf.keyidx); 912 - 913 - /* PN = PN + 1 */ 914 - pn64 = atomic64_inc_return(&key->conf.tx_pn); 915 - 916 - bip_ipn_set64(mmie->sequence_number, pn64); 917 - 918 - if (info->control.hw_key) 919 - return TX_CONTINUE; 920 - 921 - bip_aad(skb, aad); 922 - 923 - /* MIC = AES-256-CMAC(IGTK, AAD || Management Frame Body || MMIE, 128) 924 - */ 925 - if (ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, 926 - skb->data + 24, skb->len - 24, mmie->mic, 927 - IEEE80211_CMAC_256_MIC_LEN)) 870 + skb->data + 24, skb->len - 24, 871 + mmie->mic, mic_len)) 928 872 return TX_DROP; 929 873 930 874 return TX_CONTINUE; 931 875 } 932 876 933 877 ieee80211_rx_result 934 - ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx) 878 + ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx, 879 + unsigned int mic_len) 935 880 { 936 881 struct sk_buff *skb = rx->skb; 937 882 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 938 883 struct ieee80211_key *key = rx->key; 939 - struct ieee80211_mmie *mmie; 940 - u8 aad[20], mic[8], ipn[6]; 884 + struct ieee80211_mmie_var *mmie; 885 + size_t mmie_len; 886 + u8 aad[20], mic[IEEE80211_CMAC_256_MIC_LEN], ipn[6]; 941 887 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; 942 888 943 889 if (!ieee80211_is_mgmt(hdr->frame_control)) 944 890 return RX_CONTINUE; 945 891 892 + mmie_len = sizeof(*mmie) + mic_len; 893 + 946 894 /* management frames are already linear */ 947 895 948 - if (skb->len < 24 + sizeof(*mmie)) 949 - return RX_DROP_U_SHORT_CMAC; 896 + if (skb->len < 24 + mmie_len) 897 + return mic_len == IEEE80211_CMAC_128_MIC_LEN ? 898 + RX_DROP_U_SHORT_CMAC : RX_DROP_U_SHORT_CMAC256; 950 899 951 - mmie = (struct ieee80211_mmie *) 952 - (skb->data + skb->len - sizeof(*mmie)); 900 + mmie = (struct ieee80211_mmie_var *)(skb->data + skb->len - mmie_len); 953 901 if (mmie->element_id != WLAN_EID_MMIE || 954 - mmie->length != sizeof(*mmie) - 2) 902 + mmie->length != mmie_len - 2) 955 903 return RX_DROP_U_BAD_MMIE; /* Invalid MMIE */ 956 904 957 905 bip_ipn_swap(ipn, mmie->sequence_number); ··· 917 961 /* hardware didn't decrypt/verify MIC */ 918 962 bip_aad(skb, aad); 919 963 if (ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, 920 - skb->data + 24, skb->len - 24, mic, 921 - IEEE80211_CMAC_128_MIC_LEN)) 964 + skb->data + 24, skb->len - 24, 965 + mic, mic_len)) 922 966 return RX_DROP_U_DECRYPT_FAIL; 923 - if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { 967 + if (crypto_memneq(mic, mmie->mic, mic_len)) { 924 968 key->u.aes_cmac.icverrors++; 925 969 return RX_DROP_U_MIC_FAIL; 926 970 } ··· 929 973 memcpy(key->u.aes_cmac.rx_pn, ipn, 6); 930 974 931 975 /* Remove MMIE */ 932 - skb_trim(skb, skb->len - sizeof(*mmie)); 933 - 934 - return RX_CONTINUE; 935 - } 936 - 937 - ieee80211_rx_result 938 - ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx) 939 - { 940 - struct sk_buff *skb = rx->skb; 941 - struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 942 - struct ieee80211_key *key = rx->key; 943 - struct ieee80211_mmie_16 *mmie; 944 - u8 aad[20], mic[16], ipn[6]; 945 - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 946 - 947 - if (!ieee80211_is_mgmt(hdr->frame_control)) 948 - return RX_CONTINUE; 949 - 950 - /* management frames are already linear */ 951 - 952 - if (skb->len < 24 + sizeof(*mmie)) 953 - return RX_DROP_U_SHORT_CMAC256; 954 - 955 - mmie = (struct ieee80211_mmie_16 *) 956 - (skb->data + skb->len - sizeof(*mmie)); 957 - if (mmie->element_id != WLAN_EID_MMIE || 958 - mmie->length != sizeof(*mmie) - 2) 959 - return RX_DROP_U_BAD_MMIE; /* Invalid MMIE */ 960 - 961 - bip_ipn_swap(ipn, mmie->sequence_number); 962 - 963 - if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) { 964 - key->u.aes_cmac.replays++; 965 - return RX_DROP_U_REPLAY; 966 - } 967 - 968 - if (!(status->flag & RX_FLAG_DECRYPTED)) { 969 - /* hardware didn't decrypt/verify MIC */ 970 - bip_aad(skb, aad); 971 - if (ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, 972 - skb->data + 24, skb->len - 24, mic, 973 - IEEE80211_CMAC_256_MIC_LEN)) 974 - return RX_DROP_U_DECRYPT_FAIL; 975 - if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { 976 - key->u.aes_cmac.icverrors++; 977 - return RX_DROP_U_MIC_FAIL; 978 - } 979 - } 980 - 981 - memcpy(key->u.aes_cmac.rx_pn, ipn, 6); 982 - 983 - /* Remove MMIE */ 984 - skb_trim(skb, skb->len - sizeof(*mmie)); 976 + skb_trim(skb, skb->len - mmie_len); 985 977 986 978 return RX_CONTINUE; 987 979 }
+4 -6
net/mac80211/wpa.h
··· 29 29 unsigned int mic_len); 30 30 31 31 ieee80211_tx_result 32 - ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx); 33 - ieee80211_tx_result 34 - ieee80211_crypto_aes_cmac_256_encrypt(struct ieee80211_tx_data *tx); 32 + ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx, 33 + unsigned int mic_len); 35 34 ieee80211_rx_result 36 - ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx); 37 - ieee80211_rx_result 38 - ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx); 35 + ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx, 36 + unsigned int mic_len); 39 37 ieee80211_tx_result 40 38 ieee80211_crypto_aes_gmac_encrypt(struct ieee80211_tx_data *tx); 41 39 ieee80211_rx_result