Huh. I assumed crc32_le gave us the result in little endian, but I guess 
that's wrong.

I've attached another patch which basically does the same thing but adds some 
sparse bitwise annotations to make things clear. Also, it has a signed-off-by 
line. :)

d80211: fix WEP on big endian cpus

This patch fixes the endian issues with the ICV in WEP, as pointed out by 
David Kimdon <[EMAIL PROTECTED]>, and uses __le32 where 
appropriate to make things clear.

Signed-off-by: Michael Wu <[EMAIL PROTECTED]>

---

 net/d80211/wep.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/net/d80211/wep.c b/net/d80211/wep.c
index c3e4728..22c2e53 100644
--- a/net/d80211/wep.c
+++ b/net/d80211/wep.c
@@ -120,10 +120,10 @@ void ieee80211_wep_encrypt_data(struct c
                                size_t klen, u8 *data, size_t data_len)
 {
        struct scatterlist sg;
-       u32 *icv;
+       __le32 *icv;
 
-       icv = (u32 *)(data + data_len);
-       *icv = ~crc32_le(~0, data, data_len);
+       icv = (__le32 *)(data + data_len);
+       *icv = cpu_to_le32(~crc32_le(~0, data, data_len));
 
        crypto_cipher_setkey(tfm, rc4key, klen);
        sg.page = virt_to_page(data);
@@ -187,7 +187,7 @@ int ieee80211_wep_decrypt_data(struct cr
                               size_t klen, u8 *data, size_t data_len)
 {
        struct scatterlist sg;
-       u32 crc;
+       __le32 crc;
 
        crypto_cipher_setkey(tfm, rc4key, klen);
        sg.page = virt_to_page(data);
@@ -195,7 +195,7 @@ int ieee80211_wep_decrypt_data(struct cr
        sg.length = data_len + WEP_ICV_LEN;
        crypto_cipher_decrypt(tfm, &sg, &sg, sg.length);
 
-       crc = ~crc32_le(~0, data, data_len);
+       crc = cpu_to_le32(~crc32_le(~0, data, data_len));
        if (memcmp(&crc, data + data_len, WEP_ICV_LEN) != 0)
                /* ICV mismatch */
                return -1;

Attachment: pgpNK32qlwZjB.pgp
Description: PGP signature

Reply via email to