From: Felix Fietkau <nbd@openwrt.org>
Date: Fri, 25 Mar 2011 21:28:22 +0000 (+0000)
Subject: mac80211: add a pending patch to remove the dependency on ecb
X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=0c98b6b2d2d5cc9c9f741c4a5ea85b668ac81e27;p=openwrt%2Fstaging%2Faparcar.git

mac80211: add a pending patch to remove the dependency on ecb

SVN-Revision: 26295
---

diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index 40fd32db26..4cd18b4c71 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -84,3 +84,161 @@
  }
  
  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);
+