mac80211: add a pending patch to remove the dependency on ecb
authorFelix Fietkau <nbd@openwrt.org>
Fri, 25 Mar 2011 21:28:22 +0000 (21:28 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 25 Mar 2011 21:28:22 +0000 (21:28 +0000)
SVN-Revision: 26295

package/mac80211/patches/300-pending_work.patch

index 40fd32db26a79305453ff52710939e288860a603..4cd18b4c716255da18f6503497c9530e7f48d20e 100644 (file)
  }
  
  static void
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -814,8 +814,8 @@ struct ieee80211_local {
+       struct rate_control_ref *rate_ctrl;
+-      struct crypto_blkcipher *wep_tx_tfm;
+-      struct crypto_blkcipher *wep_rx_tfm;
++      struct crypto_cipher *wep_tx_tfm;
++      struct crypto_cipher *wep_rx_tfm;
+       u32 wep_iv;
+       /* see iface.c */
+--- a/net/mac80211/tkip.c
++++ b/net/mac80211/tkip.c
+@@ -202,7 +202,7 @@ EXPORT_SYMBOL(ieee80211_get_tkip_key);
+  * @payload_len is the length of payload (_not_ including IV/ICV length).
+  * @ta is the transmitter addresses.
+  */
+-int ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
++int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm,
+                               struct ieee80211_key *key,
+                               u8 *pos, size_t payload_len, u8 *ta)
+ {
+@@ -223,7 +223,7 @@ int ieee80211_tkip_encrypt_data(struct c
+  * beginning of the buffer containing IEEE 802.11 header payload, i.e.,
+  * including IV, Ext. IV, real data, Michael MIC, ICV. @payload_len is the
+  * length of payload, including IV, Ext. IV, MIC, ICV.  */
+-int ieee80211_tkip_decrypt_data(struct crypto_blkcipher *tfm,
++int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm,
+                               struct ieee80211_key *key,
+                               u8 *payload, size_t payload_len, u8 *ta,
+                               u8 *ra, int only_iv, int queue,
+--- a/net/mac80211/tkip.h
++++ b/net/mac80211/tkip.h
+@@ -15,7 +15,7 @@
+ u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16);
+-int ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm,
++int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm,
+                                struct ieee80211_key *key,
+                                u8 *pos, size_t payload_len, u8 *ta);
+ enum {
+@@ -24,7 +24,7 @@ enum {
+       TKIP_DECRYPT_INVALID_KEYIDX = -2,
+       TKIP_DECRYPT_REPLAY = -3,
+ };
+-int ieee80211_tkip_decrypt_data(struct crypto_blkcipher *tfm,
++int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm,
+                               struct ieee80211_key *key,
+                               u8 *payload, size_t payload_len, u8 *ta,
+                               u8 *ra, int only_iv, int queue,
+--- a/net/mac80211/wep.c
++++ b/net/mac80211/wep.c
+@@ -30,17 +30,15 @@ int ieee80211_wep_init(struct ieee80211_
+       /* start WEP IV from a random value */
+       get_random_bytes(&local->wep_iv, WEP_IV_LEN);
+-      local->wep_tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0,
+-                                              CRYPTO_ALG_ASYNC);
++      local->wep_tx_tfm = crypto_alloc_cipher("arc4", 0, CRYPTO_ALG_ASYNC);
+       if (IS_ERR(local->wep_tx_tfm)) {
+               local->wep_rx_tfm = ERR_PTR(-EINVAL);
+               return PTR_ERR(local->wep_tx_tfm);
+       }
+-      local->wep_rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0,
+-                                              CRYPTO_ALG_ASYNC);
++      local->wep_rx_tfm = crypto_alloc_cipher("arc4", 0, CRYPTO_ALG_ASYNC);
+       if (IS_ERR(local->wep_rx_tfm)) {
+-              crypto_free_blkcipher(local->wep_tx_tfm);
++              crypto_free_cipher(local->wep_tx_tfm);
+               local->wep_tx_tfm = ERR_PTR(-EINVAL);
+               return PTR_ERR(local->wep_rx_tfm);
+       }
+@@ -51,9 +49,9 @@ int ieee80211_wep_init(struct ieee80211_
+ void ieee80211_wep_free(struct ieee80211_local *local)
+ {
+       if (!IS_ERR(local->wep_tx_tfm))
+-              crypto_free_blkcipher(local->wep_tx_tfm);
++              crypto_free_cipher(local->wep_tx_tfm);
+       if (!IS_ERR(local->wep_rx_tfm))
+-              crypto_free_blkcipher(local->wep_rx_tfm);
++              crypto_free_cipher(local->wep_rx_tfm);
+ }
+ static inline bool ieee80211_wep_weak_iv(u32 iv, int keylen)
+@@ -127,12 +125,11 @@ static void ieee80211_wep_remove_iv(stru
+ /* Perform WEP encryption using given key. data buffer must have tailroom
+  * for 4-byte ICV. data_len must not include this ICV. Note: this function
+  * does _not_ add IV. data = RC4(data | CRC32(data)) */
+-int ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
++int ieee80211_wep_encrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
+                              size_t klen, u8 *data, size_t data_len)
+ {
+-      struct blkcipher_desc desc = { .tfm = tfm };
+-      struct scatterlist sg;
+       __le32 icv;
++      int i;
+       if (IS_ERR(tfm))
+               return -1;
+@@ -140,9 +137,9 @@ int ieee80211_wep_encrypt_data(struct cr
+       icv = cpu_to_le32(~crc32_le(~0, data, data_len));
+       put_unaligned(icv, (__le32 *)(data + data_len));
+-      crypto_blkcipher_setkey(tfm, rc4key, klen);
+-      sg_init_one(&sg, data, data_len + WEP_ICV_LEN);
+-      crypto_blkcipher_encrypt(&desc, &sg, &sg, sg.length);
++      crypto_cipher_setkey(tfm, rc4key, klen);
++      for (i = 0; i < data_len + WEP_ICV_LEN; i++)
++              crypto_cipher_encrypt_one(tfm, data + i, data + i);
+       return 0;
+ }
+@@ -186,19 +183,18 @@ int ieee80211_wep_encrypt(struct ieee802
+ /* Perform WEP decryption using given key. data buffer includes encrypted
+  * payload, including 4-byte ICV, but _not_ IV. data_len must not include ICV.
+  * Return 0 on success and -1 on ICV mismatch. */
+-int ieee80211_wep_decrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
++int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
+                              size_t klen, u8 *data, size_t data_len)
+ {
+-      struct blkcipher_desc desc = { .tfm = tfm };
+-      struct scatterlist sg;
+       __le32 crc;
++      int i;
+       if (IS_ERR(tfm))
+               return -1;
+-      crypto_blkcipher_setkey(tfm, rc4key, klen);
+-      sg_init_one(&sg, data, data_len + WEP_ICV_LEN);
+-      crypto_blkcipher_decrypt(&desc, &sg, &sg, sg.length);
++      crypto_cipher_setkey(tfm, rc4key, klen);
++      for (i = 0; i < data_len + WEP_ICV_LEN; i++)
++              crypto_cipher_decrypt_one(tfm, data + i, data + i);
+       crc = cpu_to_le32(~crc32_le(~0, data, data_len));
+       if (memcmp(&crc, data + data_len, WEP_ICV_LEN) != 0)
+--- a/net/mac80211/wep.h
++++ b/net/mac80211/wep.h
+@@ -18,12 +18,12 @@
+ int ieee80211_wep_init(struct ieee80211_local *local);
+ void ieee80211_wep_free(struct ieee80211_local *local);
+-int ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
++int ieee80211_wep_encrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
+                               size_t klen, u8 *data, size_t data_len);
+ int ieee80211_wep_encrypt(struct ieee80211_local *local,
+                         struct sk_buff *skb,
+                         const u8 *key, int keylen, int keyidx);
+-int ieee80211_wep_decrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
++int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
+                              size_t klen, u8 *data, size_t data_len);
+ bool ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key);