mac80211: Update to version 5.7-rc3-1
[openwrt/staging/chunkeey.git] / package / kernel / mac80211 / patches / subsys / 131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch
index 0c5f85236e4089aa8273c0b81b2dcd553c49ae18..c3bf7ccc7abda2a6f48a8dcc75208ce8e08938a6 100644 (file)
@@ -11,14 +11,13 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/aes_cmac.c
 +++ b/net/mac80211/aes_cmac.c
-@@ -19,50 +19,126 @@
+@@ -19,67 +19,151 @@
  #define CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */
  #define AAD_LEN 20
  
 -static const u8 zero[CMAC_TLEN_256];
  
 -void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad,
--                      const u8 *data, size_t data_len, u8 *mic)
 +void gf_mulx(u8 *pad)
 +{
 +      int i, carry;
@@ -34,9 +33,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
 +                   const u8 *addr[], const size_t *len, u8 *mac,
 +                   size_t mac_len)
- {
--      SHASH_DESC_ON_STACK(desc, tfm);
--      u8 out[AES_BLOCK_SIZE];
++{
 +      u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
 +      const u8 *pos, *end;
 +      size_t i, e, left, total_len;
@@ -88,30 +85,48 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +      crypto_cipher_encrypt_one(tfm, pad, pad);
 +      memcpy(mac, pad, mac_len);
 +}
++
++
++void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
+                       const u8 *data, size_t data_len, u8 *mic)
+ {
+-      SHASH_DESC_ON_STACK(desc, tfm);
+-      u8 out[AES_BLOCK_SIZE];
++      const u8 *addr[4];
++      size_t len[4];
++      u8 zero[CMAC_TLEN];
+       const __le16 *fc;
  
 -      desc->tfm = tfm;
+-
 -      crypto_shash_init(desc);
 -      crypto_shash_update(desc, aad, AAD_LEN);
--      crypto_shash_update(desc, data, data_len - CMAC_TLEN);
--      crypto_shash_finup(desc, zero, CMAC_TLEN, out);
-+void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
-+                      const u8 *data, size_t data_len, u8 *mic)
-+{
-+      const u8 *addr[3];
-+      size_t len[3];
-+      u8 zero[CMAC_TLEN];
-+
 +      memset(zero, 0, CMAC_TLEN);
 +      addr[0] = aad;
 +      len[0] = AAD_LEN;
-+      addr[1] = data;
-+      len[1] = data_len - CMAC_TLEN;
-+      addr[2] = zero;
-+      len[2] = CMAC_TLEN;
+       fc = (const __le16 *)aad;
+       if (ieee80211_is_beacon(*fc)) {
+               /* mask Timestamp field to zero */
+-              crypto_shash_update(desc, zero, 8);
+-              crypto_shash_update(desc, data + 8, data_len - 8 - CMAC_TLEN);
++              addr[1] = zero;
++              len[1] = 8;
++              addr[2] = data + 8;
++              len[2] = data_len - 8 - CMAC_TLEN;
++              addr[3] = zero;
++              len[3] = CMAC_TLEN;
++              aes_cmac_vector(tfm, 4, addr, len, mic, CMAC_TLEN);
+       } else {
+-              crypto_shash_update(desc, data, data_len - CMAC_TLEN);
++              addr[1] = data;
++              len[1] = data_len - CMAC_TLEN;
++              addr[2] = zero;
++              len[2] = CMAC_TLEN;
++              aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN);
+       }
+-      crypto_shash_finup(desc, zero, CMAC_TLEN, out);
+-
 -      memcpy(mic, out, CMAC_TLEN);
-+      aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN);
  }
  
 -void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad,
@@ -119,25 +134,41 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                            const u8 *data, size_t data_len, u8 *mic)
  {
 -      SHASH_DESC_ON_STACK(desc, tfm);
-+      const u8 *addr[3];
-+      size_t len[3];
++      const u8 *addr[4];
++      size_t len[4];
 +      u8 zero[CMAC_TLEN_256];
-+
-+      memset(zero, 0, CMAC_TLEN_256);
-+      addr[0] = aad;
-+      len[0] = AAD_LEN;
-+      addr[1] = data;
-+      len[1] = data_len - CMAC_TLEN_256;
-+      addr[2] = zero;
-+      len[2] = CMAC_TLEN_256;
+       const __le16 *fc;
  
 -      desc->tfm = tfm;
 -
 -      crypto_shash_init(desc);
 -      crypto_shash_update(desc, aad, AAD_LEN);
--      crypto_shash_update(desc, data, data_len - CMAC_TLEN_256);
++      memset(zero, 0, CMAC_TLEN_256);
++      addr[0] = aad;
++      len[0] = AAD_LEN;
++      addr[1] = data;
+       fc = (const __le16 *)aad;
+       if (ieee80211_is_beacon(*fc)) {
+               /* mask Timestamp field to zero */
+-              crypto_shash_update(desc, zero, 8);
+-              crypto_shash_update(desc, data + 8,
+-                                  data_len - 8 - CMAC_TLEN_256);
++              addr[1] = zero;
++              len[1] = 8;
++              addr[2] = data + 8;
++              len[2] = data_len - 8 - CMAC_TLEN_256;
++              addr[3] = zero;
++              len[3] = CMAC_TLEN_256;
++              aes_cmac_vector(tfm, 4, addr, len, mic, CMAC_TLEN_256);
+       } else {
+-              crypto_shash_update(desc, data, data_len - CMAC_TLEN_256);
++              addr[1] = data;
++              len[1] = data_len - CMAC_TLEN_256;
++              addr[2] = zero;
++              len[2] = CMAC_TLEN_256;
++              aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256);
+       }
 -      crypto_shash_finup(desc, zero, CMAC_TLEN_256, mic);
-+      aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256);
  }
  
 -struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
@@ -188,7 +219,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  #endif /* AES_CMAC_H */
 --- a/net/mac80211/key.h
 +++ b/net/mac80211/key.h
-@@ -91,7 +91,7 @@ struct ieee80211_key {
+@@ -94,7 +94,7 @@ struct ieee80211_key {
                } ccmp;
                struct {
                        u8 rx_pn[IEEE80211_CMAC_PN_LEN];