Re: [PATCH wireless-next 0/6] Consolidate Michael MIC code into mac80211
From: Eric Biggers
Date: Mon Apr 06 2026 - 12:03:51 EST
On Mon, Apr 06, 2026 at 08:59:43AM -0700, Jeff Johnson wrote:
> On 4/4/2026 10:27 PM, Eric Biggers wrote:
> > Michael MIC is an inherently weak algorithm that is specific to WPA
> > TKIP, which itself was an interim security solution to replace the
> > broken WEP standard.
> >
> > Currently, the primary implementation of Michael MIC in the kernel is
> > the one in the mac80211 module. But there's also a duplicate
> > implementation in crypto/michael_mic.c which is exposed via the
> > crypto_shash API. It's used only by a few wireless drivers.
> >
> > Seeing as Michael MIC is specific to WPA TKIP and should never be used
> > elsewhere, this series migrates those few drivers to the mac80211
> > implementation of Michael MIC, then removes the crypto implementation of
> > Michael MIC. This consolidates duplicate code and prevents other kernel
> > subsystems from accidentally using this insecure algorithm.
> >
> > This series is targeting wireless-next.
> >
> > Eric Biggers (6):
> > wifi: mac80211: Export michael_mic()
> > wifi: ath11k: Use michael_mic() from mac80211
> > wifi: ath12k: Use michael_mic() from mac80211
> > wifi: ipw2x00: Depend on MAC80211
> > wifi: ipw2x00: Use michael_mic() from mac80211
> > crypto: Remove michael_mic from crypto_shash API
> >
> > arch/arm/configs/omap2plus_defconfig | 1 -
> > arch/arm/configs/spitz_defconfig | 1 -
> > arch/arm64/configs/defconfig | 1 -
> > arch/m68k/configs/amiga_defconfig | 1 -
> > arch/m68k/configs/apollo_defconfig | 1 -
> > arch/m68k/configs/atari_defconfig | 1 -
> > arch/m68k/configs/bvme6000_defconfig | 1 -
> > arch/m68k/configs/hp300_defconfig | 1 -
> > arch/m68k/configs/mac_defconfig | 1 -
> > arch/m68k/configs/multi_defconfig | 1 -
> > arch/m68k/configs/mvme147_defconfig | 1 -
> > arch/m68k/configs/mvme16x_defconfig | 1 -
> > arch/m68k/configs/q40_defconfig | 1 -
> > arch/m68k/configs/sun3_defconfig | 1 -
> > arch/m68k/configs/sun3x_defconfig | 1 -
> > arch/mips/configs/bigsur_defconfig | 1 -
> > arch/mips/configs/decstation_64_defconfig | 1 -
> > arch/mips/configs/decstation_defconfig | 1 -
> > arch/mips/configs/decstation_r4k_defconfig | 1 -
> > arch/mips/configs/gpr_defconfig | 1 -
> > arch/mips/configs/ip32_defconfig | 1 -
> > arch/mips/configs/lemote2f_defconfig | 1 -
> > arch/mips/configs/malta_qemu_32r6_defconfig | 1 -
> > arch/mips/configs/maltaaprp_defconfig | 1 -
> > arch/mips/configs/maltasmvp_defconfig | 1 -
> > arch/mips/configs/maltasmvp_eva_defconfig | 1 -
> > arch/mips/configs/maltaup_defconfig | 1 -
> > arch/mips/configs/mtx1_defconfig | 1 -
> > arch/mips/configs/rm200_defconfig | 1 -
> > arch/mips/configs/sb1250_swarm_defconfig | 1 -
> > arch/parisc/configs/generic-32bit_defconfig | 1 -
> > arch/parisc/configs/generic-64bit_defconfig | 1 -
> > arch/powerpc/configs/g5_defconfig | 1 -
> > arch/powerpc/configs/linkstation_defconfig | 1 -
> > arch/powerpc/configs/mvme5100_defconfig | 1 -
> > arch/powerpc/configs/powernv_defconfig | 1 -
> > arch/powerpc/configs/ppc64_defconfig | 1 -
> > arch/powerpc/configs/ppc64e_defconfig | 1 -
> > arch/powerpc/configs/ppc6xx_defconfig | 1 -
> > arch/powerpc/configs/ps3_defconfig | 1 -
> > arch/s390/configs/debug_defconfig | 1 -
> > arch/s390/configs/defconfig | 1 -
> > arch/sh/configs/sh2007_defconfig | 1 -
> > arch/sh/configs/titan_defconfig | 1 -
> > arch/sh/configs/ul2_defconfig | 1 -
> > arch/sparc/configs/sparc32_defconfig | 1 -
> > arch/sparc/configs/sparc64_defconfig | 1 -
> > crypto/Kconfig | 12 --
> > crypto/Makefile | 1 -
> > crypto/michael_mic.c | 176 ------------------
> > crypto/tcrypt.c | 4 -
> > crypto/testmgr.c | 6 -
> > crypto/testmgr.h | 50 -----
> > drivers/net/wireless/ath/ath11k/Kconfig | 1 -
> > drivers/net/wireless/ath/ath11k/dp.c | 2 -
> > drivers/net/wireless/ath/ath11k/dp_rx.c | 60 +-----
> > drivers/net/wireless/ath/ath11k/peer.h | 1 -
> > drivers/net/wireless/ath/ath12k/Kconfig | 1 -
> > drivers/net/wireless/ath/ath12k/dp.c | 2 -
> > drivers/net/wireless/ath/ath12k/dp_peer.h | 1 -
> > drivers/net/wireless/ath/ath12k/dp_rx.c | 55 +-----
> > drivers/net/wireless/ath/ath12k/dp_rx.h | 4 -
> > drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c | 7 +-
> > drivers/net/wireless/intel/ipw2x00/Kconfig | 7 +-
> > .../intel/ipw2x00/libipw_crypto_tkip.c | 120 +-----------
> > include/linux/ieee80211.h | 5 +
> > net/mac80211/michael.c | 5 +-
> > net/mac80211/michael.h | 22 ---
> > net/mac80211/wpa.c | 1 -
> > 69 files changed, 32 insertions(+), 558 deletions(-)
> > delete mode 100644 crypto/michael_mic.c
> > delete mode 100644 net/mac80211/michael.h
> >
> >
> > base-commit: dbd94b9831bc52a1efb7ff3de841ffc3457428ce
>
> Note this series does not bisect cleanly since the introduction of the export
> in 1/6 causes build failures:
>
> ../drivers/net/wireless/intel/ipw2x00/libipw_crypto_tkip.c:467:12: error: conflicting types for 'michael_mic'; have 'int(struct crypto_shash *, u8 *, u8 *, u8 *, size_t, u8 *)' {aka 'int(struct crypto_shash *, unsigned char *, unsigned char *, unsigned char *, long unsigned int, unsigned char *)'}
> 467 | static int michael_mic(struct crypto_shash *tfm_michael, u8 *key, u8 *hdr,
> | ^~~~~~~~~~~
> In file included from ../drivers/net/wireless/intel/ipw2x00/libipw_crypto_tkip.c:25:
> ../include/linux/ieee80211.h:1926:6: note: previous declaration of 'michael_mic' with type 'void(const u8 *, struct ieee80211_hdr *, const u8 *, size_t, u8 *)' {aka 'void(const unsigned char *, struct ieee80211_hdr *, const unsigned char *, long unsigned int, unsigned char *)'}
> 1926 | void michael_mic(const u8 *key, struct ieee80211_hdr *hdr,
Thanks! I'll add a preparatory patch that temporarily renames the
michael_mic() in libipw_crypto_tkip.c.
- Eric