|
@@ -23,18 +23,8 @@
|
|
|
|
|
|
#include "ieee80211.h"
|
|
|
|
|
|
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
|
|
|
-#include "rtl_crypto.h"
|
|
|
-#else
|
|
|
#include <linux/crypto.h>
|
|
|
-#endif
|
|
|
-//#include <asm/scatterlist.h>
|
|
|
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
|
|
|
- #include <asm/scatterlist.h>
|
|
|
-#else
|
|
|
- #include <linux/scatterlist.h>
|
|
|
-#endif
|
|
|
-
|
|
|
+#include <linux/scatterlist.h>
|
|
|
#include <linux/crc32.h>
|
|
|
|
|
|
MODULE_AUTHOR("Jouni Malinen");
|
|
@@ -70,13 +60,10 @@ struct ieee80211_tkip_data {
|
|
|
|
|
|
int key_idx;
|
|
|
|
|
|
- #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))||(IN_OPENSUSE_SLED))
|
|
|
- struct crypto_blkcipher *rx_tfm_arc4;
|
|
|
- struct crypto_hash *rx_tfm_michael;
|
|
|
- struct crypto_blkcipher *tx_tfm_arc4;
|
|
|
- struct crypto_hash *tx_tfm_michael;
|
|
|
- #endif
|
|
|
-
|
|
|
+ struct crypto_blkcipher *rx_tfm_arc4;
|
|
|
+ struct crypto_hash *rx_tfm_michael;
|
|
|
+ struct crypto_blkcipher *tx_tfm_arc4;
|
|
|
+ struct crypto_hash *tx_tfm_michael;
|
|
|
struct crypto_tfm *tfm_arc4;
|
|
|
struct crypto_tfm *tfm_michael;
|
|
|
|
|
@@ -94,22 +81,6 @@ static void * ieee80211_tkip_init(int key_idx)
|
|
|
memset(priv, 0, sizeof(*priv));
|
|
|
priv->key_idx = key_idx;
|
|
|
|
|
|
- #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0);
|
|
|
- if (priv->tfm_arc4 == NULL) {
|
|
|
- printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
|
|
|
- "crypto API arc4\n");
|
|
|
- goto fail;
|
|
|
- }
|
|
|
-
|
|
|
- priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0);
|
|
|
- if (priv->tfm_michael == NULL) {
|
|
|
- printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
|
|
|
- "crypto API michael_mic\n");
|
|
|
- goto fail;
|
|
|
- }
|
|
|
-
|
|
|
- #else
|
|
|
priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
|
|
|
CRYPTO_ALG_ASYNC);
|
|
|
if (IS_ERR(priv->tx_tfm_arc4)) {
|
|
@@ -145,17 +116,11 @@ static void * ieee80211_tkip_init(int key_idx)
|
|
|
priv->rx_tfm_michael = NULL;
|
|
|
goto fail;
|
|
|
}
|
|
|
- #endif
|
|
|
+
|
|
|
return priv;
|
|
|
|
|
|
fail:
|
|
|
if (priv) {
|
|
|
- #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- if (priv->tfm_michael)
|
|
|
- crypto_free_tfm(priv->tfm_michael);
|
|
|
- if (priv->tfm_arc4)
|
|
|
- crypto_free_tfm(priv->tfm_arc4);
|
|
|
- #else
|
|
|
if (priv->tx_tfm_michael)
|
|
|
crypto_free_hash(priv->tx_tfm_michael);
|
|
|
if (priv->tx_tfm_arc4)
|
|
@@ -164,7 +129,6 @@ fail:
|
|
|
crypto_free_hash(priv->rx_tfm_michael);
|
|
|
if (priv->rx_tfm_arc4)
|
|
|
crypto_free_blkcipher(priv->rx_tfm_arc4);
|
|
|
- #endif
|
|
|
kfree(priv);
|
|
|
}
|
|
|
|
|
@@ -175,12 +139,7 @@ fail:
|
|
|
static void ieee80211_tkip_deinit(void *priv)
|
|
|
{
|
|
|
struct ieee80211_tkip_data *_priv = priv;
|
|
|
- #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- if (_priv && _priv->tfm_michael)
|
|
|
- crypto_free_tfm(_priv->tfm_michael);
|
|
|
- if (_priv && _priv->tfm_arc4)
|
|
|
- crypto_free_tfm(_priv->tfm_arc4);
|
|
|
- #else
|
|
|
+
|
|
|
if (_priv) {
|
|
|
if (_priv->tx_tfm_michael)
|
|
|
crypto_free_hash(_priv->tx_tfm_michael);
|
|
@@ -191,7 +150,6 @@ static void ieee80211_tkip_deinit(void *priv)
|
|
|
if (_priv->rx_tfm_arc4)
|
|
|
crypto_free_blkcipher(_priv->rx_tfm_arc4);
|
|
|
}
|
|
|
- #endif
|
|
|
kfree(priv);
|
|
|
}
|
|
|
|
|
@@ -355,9 +313,7 @@ static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK,
|
|
|
static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
|
|
|
{
|
|
|
struct ieee80211_tkip_data *tkey = priv;
|
|
|
- #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))||(IN_OPENSUSE_SLED))
|
|
|
struct blkcipher_desc desc = {.tfm = tkey->tx_tfm_arc4};
|
|
|
- #endif
|
|
|
int len;
|
|
|
u8 *pos;
|
|
|
struct ieee80211_hdr *hdr;
|
|
@@ -419,32 +375,14 @@ printk("%x\n", ((u32*)tkey->key)[7]);
|
|
|
*pos++ = (tkey->tx_iv32 >> 24) & 0xff;
|
|
|
#ifndef JOHN_TKIP
|
|
|
icv = skb_put(skb, 4);
|
|
|
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
|
|
|
crc = ~crc32_le(~0, pos, len);
|
|
|
-#else
|
|
|
- crc = ~ether_crc_le(len, pos);
|
|
|
-#endif
|
|
|
icv[0] = crc;
|
|
|
icv[1] = crc >> 8;
|
|
|
icv[2] = crc >> 16;
|
|
|
icv[3] = crc >> 24;
|
|
|
- #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16);
|
|
|
- sg.page = virt_to_page(pos);
|
|
|
- sg.offset = offset_in_page(pos);
|
|
|
- sg.length = len + 4;
|
|
|
- crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4);
|
|
|
- #else
|
|
|
crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
|
|
|
- #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
|
|
|
- sg.page = virt_to_page(pos);
|
|
|
- sg.offset = offset_in_page(pos);
|
|
|
- sg.length = len + 4;
|
|
|
- #else
|
|
|
- sg_init_one(&sg, pos, len+4);
|
|
|
- #endif
|
|
|
+ sg_init_one(&sg, pos, len + 4);
|
|
|
ret= crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
|
|
|
- #endif
|
|
|
#endif
|
|
|
tkey->tx_iv16++;
|
|
|
if (tkey->tx_iv16 == 0) {
|
|
@@ -452,11 +390,7 @@ printk("%x\n", ((u32*)tkey->key)[7]);
|
|
|
tkey->tx_iv32++;
|
|
|
}
|
|
|
#ifndef JOHN_TKIP
|
|
|
- #if((LINUX_VERSION_CODE <KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- return 0;
|
|
|
- #else
|
|
|
return ret;
|
|
|
- #endif
|
|
|
#else
|
|
|
return 0;
|
|
|
#endif
|
|
@@ -464,10 +398,8 @@ printk("%x\n", ((u32*)tkey->key)[7]);
|
|
|
|
|
|
static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
|
|
|
{
|
|
|
- struct ieee80211_tkip_data *tkey = priv;
|
|
|
- #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) ||(IN_OPENSUSE_SLED))
|
|
|
- struct blkcipher_desc desc = {.tfm = tkey->rx_tfm_arc4};
|
|
|
- #endif
|
|
|
+ struct ieee80211_tkip_data *tkey = priv;
|
|
|
+ struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 };
|
|
|
u8 keyidx, *pos;
|
|
|
u32 iv32;
|
|
|
u16 iv16;
|
|
@@ -530,21 +462,8 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
|
|
|
tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
|
|
|
|
|
|
plen = skb->len - hdr_len - 12;
|
|
|
- #if((LINUX_VERSION_CODE <KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16);
|
|
|
- sg.page = virt_to_page(pos);
|
|
|
- sg.offset = offset_in_page(pos);
|
|
|
- sg.length = plen + 4;
|
|
|
- crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4);
|
|
|
- #else
|
|
|
crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
|
|
|
- #if(LINUX_VERSION_CODE <KERNEL_VERSION(2,6,24))
|
|
|
- sg.page = virt_to_page(pos);
|
|
|
- sg.offset = offset_in_page(pos);
|
|
|
- sg.length = plen + 4;
|
|
|
- #else
|
|
|
- sg_init_one(&sg, pos, plen+4);
|
|
|
- #endif
|
|
|
+ sg_init_one(&sg, pos, plen + 4);
|
|
|
if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) {
|
|
|
if (net_ratelimit()) {
|
|
|
printk(KERN_DEBUG ": TKIP: failed to decrypt "
|
|
@@ -553,13 +472,8 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
|
|
|
}
|
|
|
return -7;
|
|
|
}
|
|
|
- #endif
|
|
|
|
|
|
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
|
|
|
crc = ~crc32_le(~0, pos, plen);
|
|
|
-#else
|
|
|
- crc = ~ether_crc_le(plen, pos);
|
|
|
-#endif
|
|
|
icv[0] = crc;
|
|
|
icv[1] = crc >> 8;
|
|
|
icv[2] = crc >> 16;
|
|
@@ -605,52 +519,6 @@ if( ((u16*)skb->data)[0] & 0x4000){
|
|
|
return keyidx;
|
|
|
}
|
|
|
|
|
|
-#if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!IN_OPENSUSE_SLED))
|
|
|
-static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr,
|
|
|
- u8 *data, size_t data_len, u8 *mic)
|
|
|
-{
|
|
|
- struct scatterlist sg[2];
|
|
|
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
|
|
|
- struct hash_desc desc;
|
|
|
- int ret=0;
|
|
|
-#endif
|
|
|
- if (tkey->tfm_michael == NULL) {
|
|
|
- printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
- sg[0].page = virt_to_page(hdr);
|
|
|
- sg[0].offset = offset_in_page(hdr);
|
|
|
- sg[0].length = 16;
|
|
|
-
|
|
|
- sg[1].page = virt_to_page(data);
|
|
|
- sg[1].offset = offset_in_page(data);
|
|
|
- sg[1].length = data_len;
|
|
|
-
|
|
|
- //crypto_digest_init(tkey->tfm_michael);
|
|
|
- //crypto_digest_setkey(tkey->tfm_michael, key, 8);
|
|
|
- //crypto_digest_update(tkey->tfm_michael, sg, 2);
|
|
|
- //crypto_digest_final(tkey->tfm_michael, mic);
|
|
|
-
|
|
|
- //return 0;
|
|
|
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
|
|
|
- crypto_digest_init(tkey->tfm_michael);
|
|
|
- crypto_digest_setkey(tkey->tfm_michael, key, 8);
|
|
|
- crypto_digest_update(tkey->tfm_michael, sg, 2);
|
|
|
- crypto_digest_final(tkey->tfm_michael, mic);
|
|
|
-
|
|
|
- return 0;
|
|
|
-#else
|
|
|
-if (crypto_hash_setkey(tkey->tfm_michael, key, 8))
|
|
|
- return -1;
|
|
|
-
|
|
|
-// return 0;
|
|
|
- desc.tfm = tkey->tfm_michael;
|
|
|
- desc.flags = 0;
|
|
|
- ret = crypto_hash_digest(&desc, sg, data_len + 16, mic);
|
|
|
- return ret;
|
|
|
-#endif
|
|
|
-}
|
|
|
-#else
|
|
|
static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr,
|
|
|
u8 * data, size_t data_len, u8 * mic)
|
|
|
{
|
|
@@ -661,18 +529,10 @@ static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr,
|
|
|
printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
|
|
|
return -1;
|
|
|
}
|
|
|
- #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
|
|
|
- sg[0].page = virt_to_page(hdr);
|
|
|
- sg[0].offset = offset_in_page(hdr);
|
|
|
- sg[0].length = 16;
|
|
|
- sg[1].page = virt_to_page(data);
|
|
|
- sg[1].offset = offset_in_page(data);
|
|
|
- sg[1].length = data_len;
|
|
|
- #else
|
|
|
- sg_init_table(sg, 2);
|
|
|
- sg_set_buf(&sg[0], hdr, 16);
|
|
|
- sg_set_buf(&sg[1], data, data_len);
|
|
|
- #endif
|
|
|
+
|
|
|
+ sg_init_table(sg, 2);
|
|
|
+ sg_set_buf(&sg[0], hdr, 16);
|
|
|
+ sg_set_buf(&sg[1], data, data_len);
|
|
|
|
|
|
if (crypto_hash_setkey(tfm_michael, key, 8))
|
|
|
return -1;
|
|
@@ -681,9 +541,6 @@ static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr,
|
|
|
desc.flags = 0;
|
|
|
return crypto_hash_digest(&desc, sg, data_len + 16, mic);
|
|
|
}
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
|
|
|
static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr)
|
|
|
{
|
|
@@ -740,13 +597,9 @@ static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *pri
|
|
|
}
|
|
|
// }
|
|
|
pos = skb_put(skb, 8);
|
|
|
- #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr,
|
|
|
+
|
|
|
+ if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
|
|
|
skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
|
|
|
- #else
|
|
|
- if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
|
|
|
- skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
|
|
|
- #endif
|
|
|
return -1;
|
|
|
|
|
|
return 0;
|
|
@@ -818,14 +671,11 @@ static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
|
|
|
tkey->rx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
|
|
|
}
|
|
|
// }
|
|
|
- #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr,
|
|
|
- skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
|
|
|
- #else
|
|
|
+
|
|
|
if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
|
|
|
- skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
|
|
|
- #endif
|
|
|
- return -1;
|
|
|
+ skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
|
|
|
+ return -1;
|
|
|
+
|
|
|
if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
|
|
|
struct ieee80211_hdr *hdr;
|
|
|
hdr = (struct ieee80211_hdr *) skb->data;
|
|
@@ -854,29 +704,19 @@ static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv)
|
|
|
{
|
|
|
struct ieee80211_tkip_data *tkey = priv;
|
|
|
int keyidx;
|
|
|
- #if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- struct crypto_tfm *tfm = tkey->tfm_michael;
|
|
|
- struct crypto_tfm *tfm2 = tkey->tfm_arc4;
|
|
|
- #else
|
|
|
struct crypto_hash *tfm = tkey->tx_tfm_michael;
|
|
|
struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4;
|
|
|
struct crypto_hash *tfm3 = tkey->rx_tfm_michael;
|
|
|
struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4;
|
|
|
- #endif
|
|
|
|
|
|
keyidx = tkey->key_idx;
|
|
|
memset(tkey, 0, sizeof(*tkey));
|
|
|
tkey->key_idx = keyidx;
|
|
|
|
|
|
- #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED))
|
|
|
- tkey->tfm_michael = tfm;
|
|
|
- tkey->tfm_arc4 = tfm2;
|
|
|
- #else
|
|
|
tkey->tx_tfm_michael = tfm;
|
|
|
tkey->tx_tfm_arc4 = tfm2;
|
|
|
tkey->rx_tfm_michael = tfm3;
|
|
|
tkey->rx_tfm_arc4 = tfm4;
|
|
|
- #endif
|
|
|
|
|
|
if (len == TKIP_KEY_LEN) {
|
|
|
memcpy(tkey->key, key, TKIP_KEY_LEN);
|
|
@@ -989,11 +829,7 @@ void ieee80211_tkip_null(void)
|
|
|
}
|
|
|
|
|
|
#if 0
|
|
|
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
|
|
|
EXPORT_SYMBOL(ieee80211_tkip_null);
|
|
|
-#else
|
|
|
-EXPORT_SYMBOL_NOVERS(ieee80211_tkip_null);
|
|
|
-#endif
|
|
|
#endif
|
|
|
|
|
|
|