]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
lib/crypto: powerpc/md5: Migrate optimized code into library
authorEric Biggers <ebiggers@kernel.org>
Tue, 5 Aug 2025 22:28:52 +0000 (15:28 -0700)
committerEric Biggers <ebiggers@kernel.org>
Tue, 26 Aug 2025 16:52:28 +0000 (12:52 -0400)
Instead of exposing the powerpc-optimized MD5 code via powerpc-specific
crypto_shash algorithms, instead just implement the md5_blocks() library
function.  This is much simpler, it makes the MD5 library functions be
powerpc-optimized, and it fixes the longstanding issue where the
powerpc-optimized MD5 code was disabled by default.  MD5 still remains
available through crypto_shash, but individual architectures no longer
need to handle it.

Link: https://lore.kernel.org/r/20250805222855.10362-5-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
arch/powerpc/configs/powernv_defconfig
arch/powerpc/configs/ppc64_defconfig
arch/powerpc/crypto/Kconfig
arch/powerpc/crypto/Makefile
arch/powerpc/crypto/md5-glue.c [deleted file]
lib/crypto/Kconfig
lib/crypto/Makefile
lib/crypto/powerpc/md5-asm.S [moved from arch/powerpc/crypto/md5-asm.S with 100% similarity]
lib/crypto/powerpc/md5.h [new file with mode: 0644]

index d06388b0f66e31d75c49adae10255c1eade59484..bd4685612de6dd739a6c354ae5d40dbabad16bf0 100644 (file)
@@ -320,7 +320,6 @@ CONFIG_XMON=y
 CONFIG_CRYPTO_BENCHMARK=m
 CONFIG_CRYPTO_PCBC=m
 CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_MD5_PPC=m
 CONFIG_CRYPTO_MICHAEL_MIC=m
 CONFIG_CRYPTO_SHA256=y
 CONFIG_CRYPTO_WP512=m
index ce34597e9f3e1408730f4a9f2ea8c5916f03dc32..2d92c11eea7e47ca81865fc41472c755c0a06e3b 100644 (file)
@@ -387,7 +387,6 @@ CONFIG_CRYPTO_MICHAEL_MIC=m
 CONFIG_CRYPTO_SHA256=y
 CONFIG_CRYPTO_WP512=m
 CONFIG_CRYPTO_LZO=m
-CONFIG_CRYPTO_MD5_PPC=m
 CONFIG_CRYPTO_AES_GCM_P10=m
 CONFIG_CRYPTO_DEV_NX=y
 CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
index cfe39fc221cf81fe54dec028ec445a973bf72929..f4b779c7352de966789024dbcb341bd4b01083e5 100644 (file)
@@ -15,14 +15,6 @@ config CRYPTO_CURVE25519_PPC64
          Architecture: PowerPC64
          - Little-endian
 
-config CRYPTO_MD5_PPC
-       tristate "Digests: MD5"
-       select CRYPTO_HASH
-       help
-         MD5 message digest algorithm (RFC1321)
-
-         Architecture: powerpc
-
 config CRYPTO_AES_PPC_SPE
        tristate "Ciphers: AES, modes: ECB/CBC/CTR/XTS (SPE)"
        depends on SPE
index bc8fd27344b8bbe0a1992416c3b850c98fa26bdb..9eb59dce67f3677f24db771b240c3d7a357649d5 100644 (file)
@@ -6,13 +6,11 @@
 #
 
 obj-$(CONFIG_CRYPTO_AES_PPC_SPE) += aes-ppc-spe.o
-obj-$(CONFIG_CRYPTO_MD5_PPC) += md5-ppc.o
 obj-$(CONFIG_CRYPTO_AES_GCM_P10) += aes-gcm-p10-crypto.o
 obj-$(CONFIG_CRYPTO_DEV_VMX_ENCRYPT) += vmx-crypto.o
 obj-$(CONFIG_CRYPTO_CURVE25519_PPC64) += curve25519-ppc64le.o
 
 aes-ppc-spe-y := aes-spe-core.o aes-spe-keys.o aes-tab-4k.o aes-spe-modes.o aes-spe-glue.o
-md5-ppc-y := md5-asm.o md5-glue.o
 aes-gcm-p10-crypto-y := aes-gcm-p10-glue.o aes-gcm-p10.o ghashp10-ppc.o aesp10-ppc.o
 vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o
 curve25519-ppc64le-y := curve25519-ppc64le-core.o curve25519-ppc64le_asm.o
diff --git a/arch/powerpc/crypto/md5-glue.c b/arch/powerpc/crypto/md5-glue.c
deleted file mode 100644 (file)
index 204440a..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Glue code for MD5 implementation for PPC assembler
- *
- * Based on generic implementation.
- *
- * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
- */
-
-#include <crypto/internal/hash.h>
-#include <crypto/md5.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/string.h>
-
-extern void ppc_md5_transform(u32 *state, const u8 *src, u32 blocks);
-
-static int ppc_md5_init(struct shash_desc *desc)
-{
-       struct md5_state *sctx = shash_desc_ctx(desc);
-
-       sctx->hash[0] = MD5_H0;
-       sctx->hash[1] = MD5_H1;
-       sctx->hash[2] = MD5_H2;
-       sctx->hash[3] = MD5_H3;
-       sctx->byte_count = 0;
-
-       return 0;
-}
-
-static int ppc_md5_update(struct shash_desc *desc, const u8 *data,
-                       unsigned int len)
-{
-       struct md5_state *sctx = shash_desc_ctx(desc);
-
-       sctx->byte_count += round_down(len, MD5_HMAC_BLOCK_SIZE);
-       ppc_md5_transform(sctx->hash, data, len >> 6);
-       return len - round_down(len, MD5_HMAC_BLOCK_SIZE);
-}
-
-static int ppc_md5_finup(struct shash_desc *desc, const u8 *src,
-                        unsigned int offset, u8 *out)
-{
-       struct md5_state *sctx = shash_desc_ctx(desc);
-       __le64 block[MD5_BLOCK_WORDS] = {};
-       u8 *p = memcpy(block, src, offset);
-       __le32 *dst = (__le32 *)out;
-       __le64 *pbits;
-
-       src = p;
-       p += offset;
-       *p++ = 0x80;
-       sctx->byte_count += offset;
-       pbits = &block[(MD5_BLOCK_WORDS / (offset > 55 ? 1 : 2)) - 1];
-       *pbits = cpu_to_le64(sctx->byte_count << 3);
-       ppc_md5_transform(sctx->hash, src, (pbits - block + 1) / 8);
-       memzero_explicit(block, sizeof(block));
-
-       dst[0] = cpu_to_le32(sctx->hash[0]);
-       dst[1] = cpu_to_le32(sctx->hash[1]);
-       dst[2] = cpu_to_le32(sctx->hash[2]);
-       dst[3] = cpu_to_le32(sctx->hash[3]);
-       return 0;
-}
-
-static struct shash_alg alg = {
-       .digestsize     =       MD5_DIGEST_SIZE,
-       .init           =       ppc_md5_init,
-       .update         =       ppc_md5_update,
-       .finup          =       ppc_md5_finup,
-       .descsize       =       MD5_STATE_SIZE,
-       .base           =       {
-               .cra_name       =       "md5",
-               .cra_driver_name=       "md5-ppc",
-               .cra_priority   =       200,
-               .cra_flags      =       CRYPTO_AHASH_ALG_BLOCK_ONLY,
-               .cra_blocksize  =       MD5_HMAC_BLOCK_SIZE,
-               .cra_module     =       THIS_MODULE,
-       }
-};
-
-static int __init ppc_md5_mod_init(void)
-{
-       return crypto_register_shash(&alg);
-}
-
-static void __exit ppc_md5_mod_fini(void)
-{
-       crypto_unregister_shash(&alg);
-}
-
-module_init(ppc_md5_mod_init);
-module_exit(ppc_md5_mod_fini);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("MD5 Secure Hash Algorithm, PPC assembler");
-
-MODULE_ALIAS_CRYPTO("md5");
-MODULE_ALIAS_CRYPTO("md5-ppc");
index 7b4e47ce37bbe45688282304e8b52a0db83e6a40..7334ddc70e599b4e6268057d530c8eb417aee95c 100644 (file)
@@ -111,6 +111,7 @@ config CRYPTO_LIB_MD5_ARCH
        bool
        depends on CRYPTO_LIB_MD5 && !UML
        default y if MIPS && CPU_CAVIUM_OCTEON
+       default y if PPC
 
 config CRYPTO_LIB_POLY1305_RSIZE
        int
index 429573e8f8b36bbe15ad8f848078218d9629b2d0..b3986dde676b3d43f9a92b371b003aa6f375611e 100644 (file)
@@ -65,6 +65,7 @@ obj-$(CONFIG_CRYPTO_LIB_MD5) += libmd5.o
 libmd5-y := md5.o
 ifeq ($(CONFIG_CRYPTO_LIB_MD5_ARCH),y)
 CFLAGS_md5.o += -I$(src)/$(SRCARCH)
+libmd5-$(CONFIG_PPC) += powerpc/md5-asm.o
 endif # CONFIG_CRYPTO_LIB_MD5_ARCH
 
 ################################################################################
diff --git a/lib/crypto/powerpc/md5.h b/lib/crypto/powerpc/md5.h
new file mode 100644 (file)
index 0000000..540b08e
--- /dev/null
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * MD5 optimized for PowerPC
+ */
+
+void ppc_md5_transform(u32 *state, const u8 *data, size_t nblocks);
+
+static void md5_blocks(struct md5_block_state *state,
+                      const u8 *data, size_t nblocks)
+{
+       ppc_md5_transform(state->h, data, nblocks);
+}