crypto: arm/chacha - remove the redundant skcipher algorithms
authorEric Biggers <ebiggers@google.com>
Sat, 5 Apr 2025 18:26:03 +0000 (11:26 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 7 Apr 2025 05:22:28 +0000 (13:22 +0800)
Since crypto/chacha.c now registers chacha20-$(ARCH), xchacha20-$(ARCH),
and xchacha12-$(ARCH) skcipher algorithms that use the architecture's
ChaCha and HChaCha library functions, individual architectures no longer
need to do the same.  Therefore, remove the redundant skcipher
algorithms and leave just the library functions.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm/crypto/Kconfig
arch/arm/crypto/chacha-glue.c
arch/arm/crypto/chacha-neon-core.S

index be9c2e19f976ab46703356b8a5ba8650e7d2a545..332f2430beeca6682647c058e008f9cd104e6013 100644 (file)
@@ -214,15 +214,8 @@ config CRYPTO_AES_ARM_CE
 
 config CRYPTO_CHACHA20_NEON
        tristate
-       select CRYPTO_SKCIPHER
        select CRYPTO_ARCH_HAVE_LIB_CHACHA
        default CRYPTO_LIB_CHACHA_INTERNAL
-       help
-         Length-preserving ciphers: ChaCha20, XChaCha20, and XChaCha12
-         stream cipher algorithms
-
-         Architecture: arm using:
-         - NEON (Advanced SIMD) extensions
 
 endmenu
 
index e1cb34d317712714843af989fd6fb6ddfe9750af..3a5c75c95d43b69b456a600b39e71dd616844ef3 100644 (file)
@@ -1,16 +1,13 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * ARM NEON accelerated ChaCha and XChaCha stream ciphers,
- * including ChaCha20 (RFC7539)
+ * ChaCha and HChaCha functions (ARM optimized)
  *
  * Copyright (C) 2016-2019 Linaro, Ltd. <ard.biesheuvel@linaro.org>
  * Copyright (C) 2015 Martin Willi
  */
 
-#include <crypto/algapi.h>
-#include <crypto/internal/chacha.h>
+#include <crypto/chacha.h>
 #include <crypto/internal/simd.h>
-#include <crypto/internal/skcipher.h>
 #include <linux/jump_label.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -100,193 +97,6 @@ void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
 }
 EXPORT_SYMBOL(chacha_crypt_arch);
 
-static int chacha_stream_xor(struct skcipher_request *req,
-                            const struct chacha_ctx *ctx, const u8 *iv,
-                            bool neon)
-{
-       struct skcipher_walk walk;
-       u32 state[16];
-       int err;
-
-       err = skcipher_walk_virt(&walk, req, false);
-
-       chacha_init(state, ctx->key, iv);
-
-       while (walk.nbytes > 0) {
-               unsigned int nbytes = walk.nbytes;
-
-               if (nbytes < walk.total)
-                       nbytes = round_down(nbytes, walk.stride);
-
-               if (!IS_ENABLED(CONFIG_KERNEL_MODE_NEON) || !neon) {
-                       chacha_doarm(walk.dst.virt.addr, walk.src.virt.addr,
-                                    nbytes, state, ctx->nrounds);
-                       state[12] += DIV_ROUND_UP(nbytes, CHACHA_BLOCK_SIZE);
-               } else {
-                       kernel_neon_begin();
-                       chacha_doneon(state, walk.dst.virt.addr,
-                                     walk.src.virt.addr, nbytes, ctx->nrounds);
-                       kernel_neon_end();
-               }
-               err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-       }
-
-       return err;
-}
-
-static int do_chacha(struct skcipher_request *req, bool neon)
-{
-       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-       struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-
-       return chacha_stream_xor(req, ctx, req->iv, neon);
-}
-
-static int chacha_arm(struct skcipher_request *req)
-{
-       return do_chacha(req, false);
-}
-
-static int chacha_neon(struct skcipher_request *req)
-{
-       return do_chacha(req, neon_usable());
-}
-
-static int do_xchacha(struct skcipher_request *req, bool neon)
-{
-       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-       struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-       struct chacha_ctx subctx;
-       u32 state[16];
-       u8 real_iv[16];
-
-       chacha_init(state, ctx->key, req->iv);
-
-       if (!IS_ENABLED(CONFIG_KERNEL_MODE_NEON) || !neon) {
-               hchacha_block_arm(state, subctx.key, ctx->nrounds);
-       } else {
-               kernel_neon_begin();
-               hchacha_block_neon(state, subctx.key, ctx->nrounds);
-               kernel_neon_end();
-       }
-       subctx.nrounds = ctx->nrounds;
-
-       memcpy(&real_iv[0], req->iv + 24, 8);
-       memcpy(&real_iv[8], req->iv + 16, 8);
-       return chacha_stream_xor(req, &subctx, real_iv, neon);
-}
-
-static int xchacha_arm(struct skcipher_request *req)
-{
-       return do_xchacha(req, false);
-}
-
-static int xchacha_neon(struct skcipher_request *req)
-{
-       return do_xchacha(req, neon_usable());
-}
-
-static struct skcipher_alg arm_algs[] = {
-       {
-               .base.cra_name          = "chacha20",
-               .base.cra_driver_name   = "chacha20-arm",
-               .base.cra_priority      = 200,
-               .base.cra_blocksize     = 1,
-               .base.cra_ctxsize       = sizeof(struct chacha_ctx),
-               .base.cra_module        = THIS_MODULE,
-
-               .min_keysize            = CHACHA_KEY_SIZE,
-               .max_keysize            = CHACHA_KEY_SIZE,
-               .ivsize                 = CHACHA_IV_SIZE,
-               .chunksize              = CHACHA_BLOCK_SIZE,
-               .setkey                 = chacha20_setkey,
-               .encrypt                = chacha_arm,
-               .decrypt                = chacha_arm,
-       }, {
-               .base.cra_name          = "xchacha20",
-               .base.cra_driver_name   = "xchacha20-arm",
-               .base.cra_priority      = 200,
-               .base.cra_blocksize     = 1,
-               .base.cra_ctxsize       = sizeof(struct chacha_ctx),
-               .base.cra_module        = THIS_MODULE,
-
-               .min_keysize            = CHACHA_KEY_SIZE,
-               .max_keysize            = CHACHA_KEY_SIZE,
-               .ivsize                 = XCHACHA_IV_SIZE,
-               .chunksize              = CHACHA_BLOCK_SIZE,
-               .setkey                 = chacha20_setkey,
-               .encrypt                = xchacha_arm,
-               .decrypt                = xchacha_arm,
-       }, {
-               .base.cra_name          = "xchacha12",
-               .base.cra_driver_name   = "xchacha12-arm",
-               .base.cra_priority      = 200,
-               .base.cra_blocksize     = 1,
-               .base.cra_ctxsize       = sizeof(struct chacha_ctx),
-               .base.cra_module        = THIS_MODULE,
-
-               .min_keysize            = CHACHA_KEY_SIZE,
-               .max_keysize            = CHACHA_KEY_SIZE,
-               .ivsize                 = XCHACHA_IV_SIZE,
-               .chunksize              = CHACHA_BLOCK_SIZE,
-               .setkey                 = chacha12_setkey,
-               .encrypt                = xchacha_arm,
-               .decrypt                = xchacha_arm,
-       },
-};
-
-static struct skcipher_alg neon_algs[] = {
-       {
-               .base.cra_name          = "chacha20",
-               .base.cra_driver_name   = "chacha20-neon",
-               .base.cra_priority      = 300,
-               .base.cra_blocksize     = 1,
-               .base.cra_ctxsize       = sizeof(struct chacha_ctx),
-               .base.cra_module        = THIS_MODULE,
-
-               .min_keysize            = CHACHA_KEY_SIZE,
-               .max_keysize            = CHACHA_KEY_SIZE,
-               .ivsize                 = CHACHA_IV_SIZE,
-               .chunksize              = CHACHA_BLOCK_SIZE,
-               .walksize               = 4 * CHACHA_BLOCK_SIZE,
-               .setkey                 = chacha20_setkey,
-               .encrypt                = chacha_neon,
-               .decrypt                = chacha_neon,
-       }, {
-               .base.cra_name          = "xchacha20",
-               .base.cra_driver_name   = "xchacha20-neon",
-               .base.cra_priority      = 300,
-               .base.cra_blocksize     = 1,
-               .base.cra_ctxsize       = sizeof(struct chacha_ctx),
-               .base.cra_module        = THIS_MODULE,
-
-               .min_keysize            = CHACHA_KEY_SIZE,
-               .max_keysize            = CHACHA_KEY_SIZE,
-               .ivsize                 = XCHACHA_IV_SIZE,
-               .chunksize              = CHACHA_BLOCK_SIZE,
-               .walksize               = 4 * CHACHA_BLOCK_SIZE,
-               .setkey                 = chacha20_setkey,
-               .encrypt                = xchacha_neon,
-               .decrypt                = xchacha_neon,
-       }, {
-               .base.cra_name          = "xchacha12",
-               .base.cra_driver_name   = "xchacha12-neon",
-               .base.cra_priority      = 300,
-               .base.cra_blocksize     = 1,
-               .base.cra_ctxsize       = sizeof(struct chacha_ctx),
-               .base.cra_module        = THIS_MODULE,
-
-               .min_keysize            = CHACHA_KEY_SIZE,
-               .max_keysize            = CHACHA_KEY_SIZE,
-               .ivsize                 = XCHACHA_IV_SIZE,
-               .chunksize              = CHACHA_BLOCK_SIZE,
-               .walksize               = 4 * CHACHA_BLOCK_SIZE,
-               .setkey                 = chacha12_setkey,
-               .encrypt                = xchacha_neon,
-               .decrypt                = xchacha_neon,
-       }
-};
-
 bool chacha_is_arch_optimized(void)
 {
        /* We always can use at least the ARM scalar implementation. */
@@ -294,19 +104,9 @@ bool chacha_is_arch_optimized(void)
 }
 EXPORT_SYMBOL(chacha_is_arch_optimized);
 
-static int __init chacha_simd_mod_init(void)
+static int __init chacha_arm_mod_init(void)
 {
-       int err = 0;
-
-       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER)) {
-               err = crypto_register_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-               if (err)
-                       return err;
-       }
-
        if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON)) {
-               int i;
-
                switch (read_cpuid_part()) {
                case ARM_CPU_PART_CORTEX_A7:
                case ARM_CPU_PART_CORTEX_A5:
@@ -315,45 +115,15 @@ static int __init chacha_simd_mod_init(void)
                         * the NEON implementation but do incredibly with the
                         * scalar one and use less power.
                         */
-                       for (i = 0; i < ARRAY_SIZE(neon_algs); i++)
-                               neon_algs[i].base.cra_priority = 0;
                        break;
                default:
                        static_branch_enable(&use_neon);
                }
-
-               if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER)) {
-                       err = crypto_register_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-                       if (err)
-                               crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-               }
        }
-       return err;
+       return 0;
 }
+arch_initcall(chacha_arm_mod_init);
 
-static void __exit chacha_simd_mod_fini(void)
-{
-       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER)) {
-               crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-               if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON))
-                       crypto_unregister_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-       }
-}
-
-arch_initcall(chacha_simd_mod_init);
-module_exit(chacha_simd_mod_fini);
-
-MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (scalar and NEON accelerated)");
+MODULE_DESCRIPTION("ChaCha and HChaCha functions (ARM optimized)");
 MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
 MODULE_LICENSE("GPL v2");
-MODULE_ALIAS_CRYPTO("chacha20");
-MODULE_ALIAS_CRYPTO("chacha20-arm");
-MODULE_ALIAS_CRYPTO("xchacha20");
-MODULE_ALIAS_CRYPTO("xchacha20-arm");
-MODULE_ALIAS_CRYPTO("xchacha12");
-MODULE_ALIAS_CRYPTO("xchacha12-arm");
-#ifdef CONFIG_KERNEL_MODE_NEON
-MODULE_ALIAS_CRYPTO("chacha20-neon");
-MODULE_ALIAS_CRYPTO("xchacha20-neon");
-MODULE_ALIAS_CRYPTO("xchacha12-neon");
-#endif
index 13d12f672656bb8def4650f023ad4404005a1ec9..ddd62b6294a5717fac0dadcd763ec4d12f421cad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * ChaCha/XChaCha NEON helper functions
+ * ChaCha/HChaCha NEON helper functions
  *
  * Copyright (C) 2016 Linaro, Ltd. <ard.biesheuvel@linaro.org>
  *