diff options
author | Christian Heim <phreak@gentoo.org> | 2006-10-13 12:22:10 +0000 |
---|---|---|
committer | Christian Heim <phreak@gentoo.org> | 2006-10-13 12:22:10 +0000 |
commit | 8971d0bf666a3f8ebb0edea789478cbf59de699c (patch) | |
tree | 82f004c30f3da2c470bd6282f88d4b4e845537ad /net-wireless/ieee80211/files | |
parent | Adust the irssi blockers. (diff) | |
download | historical-8971d0bf666a3f8ebb0edea789478cbf59de699c.tar.gz historical-8971d0bf666a3f8ebb0edea789478cbf59de699c.tar.bz2 historical-8971d0bf666a3f8ebb0edea789478cbf59de699c.zip |
Fixing ieee80211-1.1.13 for SMP-systems (see #150752 for reference). Thanks to Simon Koenig for reporting the issue and pointing me to the patch.
Package-Manager: portage-2.1.2_pre2-r9
Diffstat (limited to 'net-wireless/ieee80211/files')
-rw-r--r-- | net-wireless/ieee80211/files/ieee80211-1.1.13-tkip.patch | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/net-wireless/ieee80211/files/ieee80211-1.1.13-tkip.patch b/net-wireless/ieee80211/files/ieee80211-1.1.13-tkip.patch new file mode 100644 index 000000000000..9f21a9e724fa --- /dev/null +++ b/net-wireless/ieee80211/files/ieee80211-1.1.13-tkip.patch @@ -0,0 +1,188 @@ +Index: ieee80211-1.1.13/ieee80211_crypt_tkip.c +=================================================================== +--- ieee80211-1.1.13.orig/ieee80211_crypt_tkip.c ++++ ieee80211-1.1.13/ieee80211_crypt_tkip.c +@@ -53,8 +53,10 @@ struct ieee80211_tkip_data { + + int key_idx; + +- struct crypto_tfm *tfm_arc4; +- struct crypto_tfm *tfm_michael; ++ struct crypto_tfm *tx_tfm_arc4; ++ struct crypto_tfm *tx_tfm_michael; ++ struct crypto_tfm *rx_tfm_arc4; ++ struct crypto_tfm *rx_tfm_michael; + + /* scratch buffers for virt_to_page() (crypto API) */ + u8 rx_hdr[16], tx_hdr[16]; +@@ -86,15 +88,29 @@ static void *ieee80211_tkip_init(int key + + priv->key_idx = key_idx; + +- priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); +- if (priv->tfm_arc4 == NULL) { ++ priv->tx_tfm_arc4 = crypto_alloc_tfm("arc4", 0); ++ if (priv->tx_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) { ++ priv->tx_tfm_michael = crypto_alloc_tfm("michael_mic", 0); ++ if (priv->tx_tfm_michael == NULL) { ++ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " ++ "crypto API michael_mic\n"); ++ goto fail; ++ } ++ ++ priv->rx_tfm_arc4 = crypto_alloc_tfm("arc4", 0); ++ if (priv->rx_tfm_arc4 == NULL) { ++ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " ++ "crypto API arc4\n"); ++ goto fail; ++ } ++ ++ priv->rx_tfm_michael = crypto_alloc_tfm("michael_mic", 0); ++ if (priv->rx_tfm_michael == NULL) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + goto fail; +@@ -104,10 +120,14 @@ static void *ieee80211_tkip_init(int key + + fail: + if (priv) { +- if (priv->tfm_michael) +- crypto_free_tfm(priv->tfm_michael); +- if (priv->tfm_arc4) +- crypto_free_tfm(priv->tfm_arc4); ++ if (priv->tx_tfm_michael) ++ crypto_free_tfm(priv->tx_tfm_michael); ++ if (priv->tx_tfm_arc4) ++ crypto_free_tfm(priv->tx_tfm_arc4); ++ if (priv->rx_tfm_michael) ++ crypto_free_tfm(priv->rx_tfm_michael); ++ if (priv->rx_tfm_arc4) ++ crypto_free_tfm(priv->rx_tfm_arc4); + kfree(priv); + } + +@@ -117,10 +137,14 @@ static void *ieee80211_tkip_init(int key + static void ieee80211_tkip_deinit(void *priv) + { + struct ieee80211_tkip_data *_priv = priv; +- if (_priv && _priv->tfm_michael) +- crypto_free_tfm(_priv->tfm_michael); +- if (_priv && _priv->tfm_arc4) +- crypto_free_tfm(_priv->tfm_arc4); ++ if (_priv && _priv->tx_tfm_michael) ++ crypto_free_tfm(_priv->tx_tfm_michael); ++ if (_priv && _priv->tx_tfm_arc4) ++ crypto_free_tfm(_priv->tx_tfm_arc4); ++ if (_priv && _priv->rx_tfm_michael) ++ crypto_free_tfm(_priv->rx_tfm_michael); ++ if (_priv && _priv->rx_tfm_arc4) ++ crypto_free_tfm(_priv->rx_tfm_arc4); + kfree(priv); + } + +@@ -352,11 +376,11 @@ static int ieee80211_tkip_encrypt(struct + icv[2] = crc >> 16; + icv[3] = crc >> 24; + +- crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); ++ crypto_cipher_setkey(tkey->tx_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); ++ crypto_cipher_encrypt(tkey->tx_tfm_arc4, &sg, &sg, len + 4); + + return 0; + } +@@ -447,11 +471,11 @@ static int ieee80211_tkip_decrypt(struct + + plen = skb->len - hdr_len - 12; + +- crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); ++ crypto_cipher_setkey(tkey->rx_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); ++ crypto_cipher_decrypt(tkey->rx_tfm_arc4, &sg, &sg, plen + 4); + + crc = ~crc32_le(~0, pos, plen); + icv[0] = crc; +@@ -485,12 +509,12 @@ static int ieee80211_tkip_decrypt(struct + return keyidx; + } + +-static int michael_mic(struct ieee80211_tkip_data *tkey, u8 * key, u8 * hdr, ++static int michael_mic(struct crypto_tfm *tfm_michael, u8 * key, u8 * hdr, + u8 * data, size_t data_len, u8 * mic) + { + struct scatterlist sg[2]; + +- if (tkey->tfm_michael == NULL) { ++ if (tfm_michael == NULL) { + printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); + return -1; + } +@@ -502,10 +526,10 @@ static int michael_mic(struct ieee80211_ + 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); ++ crypto_digest_init(tfm_michael); ++ crypto_digest_setkey(tfm_michael, key, 8); ++ crypto_digest_update(tfm_michael, sg, 2); ++ crypto_digest_final(tfm_michael, mic); + + return 0; + } +@@ -563,7 +587,7 @@ static int ieee80211_michael_mic_add(str + + michael_mic_hdr(skb, tkey->tx_hdr); + pos = skb_put(skb, 8); +- 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)) + return -1; + +@@ -625,7 +649,7 @@ static int ieee80211_michael_mic_verify( + return -1; + + michael_mic_hdr(skb, tkey->rx_hdr); +- if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, ++ if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; + if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { +@@ -655,14 +679,18 @@ static int ieee80211_tkip_set_key(void * + { + struct ieee80211_tkip_data *tkey = priv; + int keyidx; +- struct crypto_tfm *tfm = tkey->tfm_michael; +- struct crypto_tfm *tfm2 = tkey->tfm_arc4; ++ struct crypto_tfm *tfm = tkey->tx_tfm_michael; ++ struct crypto_tfm *tfm2 = tkey->tx_tfm_arc4; ++ struct crypto_tfm *tfm3 = tkey->rx_tfm_michael; ++ struct crypto_tfm *tfm4 = tkey->rx_tfm_arc4; + + keyidx = tkey->key_idx; + memset(tkey, 0, sizeof(*tkey)); + tkey->key_idx = keyidx; +- tkey->tfm_michael = tfm; +- tkey->tfm_arc4 = tfm2; ++ tkey->tx_tfm_michael = tfm; ++ tkey->tx_tfm_arc4 = tfm2; ++ tkey->rx_tfm_michael = tfm3; ++ tkey->rx_tfm_arc4 = tfm4; + if (len == TKIP_KEY_LEN) { + memcpy(tkey->key, key, TKIP_KEY_LEN); + tkey->key_set = 1; |