]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: ipw2x00: Use michael_mic() from cfg80211
authorEric Biggers <ebiggers@kernel.org>
Wed, 8 Apr 2026 03:06:50 +0000 (20:06 -0700)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 8 Apr 2026 06:55:16 +0000 (08:55 +0200)
Just use the michael_mic() function from cfg80211 instead of a local
implementation of it using the crypto_shash API.

Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Link: https://patch.msgid.link/20260408030651.80336-6-ebiggers@kernel.org
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/ipw2x00/Kconfig
drivers/net/wireless/intel/ipw2x00/libipw_crypto_tkip.c

index b92df91adb3a4937e69b2e8ffc16dfea14a8548c..b508f14542d5d74d667add622c66f7dab2071888 100644 (file)
@@ -154,7 +154,6 @@ config LIBIPW
        depends on PCI && CFG80211
        select WIRELESS_EXT
        select CRYPTO
-       select CRYPTO_MICHAEL_MIC
        select CRYPTO_LIB_ARC4
        select CRC32
        help
index c2cd6808fd0fe10e16977d1c0330e31b3ccff08b..24bb28ab7a49bd75c4438d7aaf43a19151e25289 100644 (file)
@@ -25,8 +25,6 @@
 #include <linux/ieee80211.h>
 #include <net/iw_handler.h>
 #include <crypto/arc4.h>
-#include <crypto/hash.h>
-#include <linux/crypto.h>
 #include <linux/crc32.h>
 #include "libipw.h"
 
@@ -57,11 +55,6 @@ struct libipw_tkip_data {
 
        struct arc4_ctx rx_ctx_arc4;
        struct arc4_ctx tx_ctx_arc4;
-       struct crypto_shash *rx_tfm_michael;
-       struct crypto_shash *tx_tfm_michael;
-
-       /* scratch buffers for virt_to_page() (crypto API) */
-       u8 rx_hdr[16], tx_hdr[16];
 
        unsigned long flags;
 };
@@ -89,41 +82,14 @@ static void *libipw_tkip_init(int key_idx)
 
        priv = kzalloc_obj(*priv, GFP_ATOMIC);
        if (priv == NULL)
-               goto fail;
+               return priv;
 
        priv->key_idx = key_idx;
-
-       priv->tx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
-       if (IS_ERR(priv->tx_tfm_michael)) {
-               priv->tx_tfm_michael = NULL;
-               goto fail;
-       }
-
-       priv->rx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
-       if (IS_ERR(priv->rx_tfm_michael)) {
-               priv->rx_tfm_michael = NULL;
-               goto fail;
-       }
-
        return priv;
-
-      fail:
-       if (priv) {
-               crypto_free_shash(priv->tx_tfm_michael);
-               crypto_free_shash(priv->rx_tfm_michael);
-               kfree(priv);
-       }
-
-       return NULL;
 }
 
 static void libipw_tkip_deinit(void *priv)
 {
-       struct libipw_tkip_data *_priv = priv;
-       if (_priv) {
-               crypto_free_shash(_priv->tx_tfm_michael);
-               crypto_free_shash(_priv->rx_tfm_michael);
-       }
        kfree_sensitive(priv);
 }
 
@@ -464,73 +430,6 @@ static int libipw_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
        return keyidx;
 }
 
-static int libipw_michael_mic(struct crypto_shash *tfm_michael, u8 *key, u8 *hdr,
-                      u8 *data, size_t data_len, u8 *mic)
-{
-       SHASH_DESC_ON_STACK(desc, tfm_michael);
-       int err;
-
-       if (tfm_michael == NULL) {
-               pr_warn("%s(): tfm_michael == NULL\n", __func__);
-               return -1;
-       }
-
-       desc->tfm = tfm_michael;
-
-       if (crypto_shash_setkey(tfm_michael, key, 8))
-               return -1;
-
-       err = crypto_shash_init(desc);
-       if (err)
-               goto out;
-       err = crypto_shash_update(desc, hdr, 16);
-       if (err)
-               goto out;
-       err = crypto_shash_update(desc, data, data_len);
-       if (err)
-               goto out;
-       err = crypto_shash_final(desc, mic);
-
-out:
-       shash_desc_zero(desc);
-       return err;
-}
-
-static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr)
-{
-       struct ieee80211_hdr *hdr11;
-
-       hdr11 = (struct ieee80211_hdr *)skb->data;
-
-       switch (le16_to_cpu(hdr11->frame_control) &
-               (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
-       case IEEE80211_FCTL_TODS:
-               memcpy(hdr, hdr11->addr3, ETH_ALEN);    /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
-               break;
-       case IEEE80211_FCTL_FROMDS:
-               memcpy(hdr, hdr11->addr1, ETH_ALEN);    /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
-               break;
-       case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
-               memcpy(hdr, hdr11->addr3, ETH_ALEN);    /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
-               break;
-       default:
-               memcpy(hdr, hdr11->addr1, ETH_ALEN);    /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
-               break;
-       }
-
-       if (ieee80211_is_data_qos(hdr11->frame_control)) {
-               hdr[12] = le16_to_cpu(*((__le16 *)ieee80211_get_qos_ctl(hdr11)))
-                       & IEEE80211_QOS_CTL_TID_MASK;
-       } else
-               hdr[12] = 0;            /* priority */
-
-       hdr[13] = hdr[14] = hdr[15] = 0;        /* reserved */
-}
-
 static int libipw_michael_mic_add(struct sk_buff *skb, int hdr_len,
                                     void *priv)
 {
@@ -544,12 +443,9 @@ static int libipw_michael_mic_add(struct sk_buff *skb, int hdr_len,
                return -1;
        }
 
-       michael_mic_hdr(skb, tkey->tx_hdr);
        pos = skb_put(skb, 8);
-       if (libipw_michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
-                       skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
-               return -1;
-
+       michael_mic(&tkey->key[16], (struct ieee80211_hdr *)skb->data,
+                   skb->data + hdr_len, skb->len - 8 - hdr_len, pos);
        return 0;
 }
 
@@ -583,10 +479,8 @@ static int libipw_michael_mic_verify(struct sk_buff *skb, int keyidx,
        if (!tkey->key_set)
                return -1;
 
-       michael_mic_hdr(skb, tkey->rx_hdr);
-       if (libipw_michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
-                       skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
-               return -1;
+       michael_mic(&tkey->key[24], (struct ieee80211_hdr *)skb->data,
+                   skb->data + hdr_len, skb->len - 8 - hdr_len, mic);
        if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
                struct ieee80211_hdr *hdr;
                hdr = (struct ieee80211_hdr *)skb->data;
@@ -614,17 +508,13 @@ static int libipw_tkip_set_key(void *key, int len, u8 * seq, void *priv)
 {
        struct libipw_tkip_data *tkey = priv;
        int keyidx;
-       struct crypto_shash *tfm = tkey->tx_tfm_michael;
        struct arc4_ctx *tfm2 = &tkey->tx_ctx_arc4;
-       struct crypto_shash *tfm3 = tkey->rx_tfm_michael;
        struct arc4_ctx *tfm4 = &tkey->rx_ctx_arc4;
 
        keyidx = tkey->key_idx;
        memset(tkey, 0, sizeof(*tkey));
        tkey->key_idx = keyidx;
-       tkey->tx_tfm_michael = tfm;
        tkey->tx_ctx_arc4 = *tfm2;
-       tkey->rx_tfm_michael = tfm3;
        tkey->rx_ctx_arc4 = *tfm4;
        if (len == TKIP_KEY_LEN) {
                memcpy(tkey->key, key, TKIP_KEY_LEN);