]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: x86/chacha - remove the skcipher algorithms
authorEric Biggers <ebiggers@google.com>
Sat, 5 Apr 2025 18:26:08 +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/x86/crypto/Kconfig
arch/x86/crypto/chacha_glue.c

index 2fae1674f75637bb652e566a2e205ad9f9aba2d8..0cec75926380e5723f77851f513d3dc1bba60d47 100644 (file)
@@ -339,18 +339,9 @@ config CRYPTO_ARIA_GFNI_AVX512_X86_64
 config CRYPTO_CHACHA20_X86_64
        tristate
        depends on X86 && 64BIT
-       select CRYPTO_SKCIPHER
        select CRYPTO_LIB_CHACHA_GENERIC
        select CRYPTO_ARCH_HAVE_LIB_CHACHA
        default CRYPTO_LIB_CHACHA_INTERNAL
-       help
-         Length-preserving ciphers: ChaCha20, XChaCha20, and XChaCha12
-         stream cipher algorithms
-
-         Architecture: x86_64 using:
-         - SSSE3 (Supplemental SSE3)
-         - AVX2 (Advanced Vector Extensions 2)
-         - AVX-512VL (Advanced Vector Extensions-512VL)
 
 config CRYPTO_AEGIS128_AESNI_SSE2
        tristate "AEAD ciphers: AEGIS-128 (AES-NI/SSE4.1)"
index 8858de7b33e30daeefcc910b206c4257d3630338..b7fd7a1f0e15cb94ed95f48bbdcffc04891808a7 100644 (file)
@@ -1,13 +1,11 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 /*
- * x64 SIMD accelerated ChaCha and XChaCha stream ciphers,
- * including ChaCha20 (RFC7539)
+ * ChaCha and HChaCha functions (x86_64 optimized)
  *
  * Copyright (C) 2015 Martin Willi
  */
 
-#include <crypto/internal/chacha.h>
-#include <crypto/internal/skcipher.h>
+#include <crypto/chacha.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/sizes.h>
@@ -142,114 +140,9 @@ void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
 }
 EXPORT_SYMBOL(chacha_crypt_arch);
 
-static int chacha_simd_stream_xor(struct skcipher_request *req,
-                                 const struct chacha_ctx *ctx, const u8 *iv)
-{
-       u32 state[CHACHA_STATE_WORDS] __aligned(8);
-       struct skcipher_walk walk;
-       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);
-
-               kernel_fpu_begin();
-               chacha_dosimd(state, walk.dst.virt.addr,
-                             walk.src.virt.addr, nbytes,
-                             ctx->nrounds);
-               kernel_fpu_end();
-               err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-       }
-
-       return err;
-}
-
-static int chacha_simd(struct skcipher_request *req)
-{
-       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-       struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-
-       return chacha_simd_stream_xor(req, ctx, req->iv);
-}
-
-static int xchacha_simd(struct skcipher_request *req)
-{
-       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-       struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-       u32 state[CHACHA_STATE_WORDS] __aligned(8);
-       struct chacha_ctx subctx;
-       u8 real_iv[16];
-
-       chacha_init(state, ctx->key, req->iv);
-
-       kernel_fpu_begin();
-       hchacha_block_ssse3(state, subctx.key, ctx->nrounds);
-       kernel_fpu_end();
-       subctx.nrounds = ctx->nrounds;
-
-       memcpy(&real_iv[0], req->iv + 24, 8);
-       memcpy(&real_iv[8], req->iv + 16, 8);
-       return chacha_simd_stream_xor(req, &subctx, real_iv);
-}
-
-static struct skcipher_alg algs[] = {
-       {
-               .base.cra_name          = "chacha20",
-               .base.cra_driver_name   = "chacha20-simd",
-               .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,
-               .setkey                 = chacha20_setkey,
-               .encrypt                = chacha_simd,
-               .decrypt                = chacha_simd,
-       }, {
-               .base.cra_name          = "xchacha20",
-               .base.cra_driver_name   = "xchacha20-simd",
-               .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,
-               .setkey                 = chacha20_setkey,
-               .encrypt                = xchacha_simd,
-               .decrypt                = xchacha_simd,
-       }, {
-               .base.cra_name          = "xchacha12",
-               .base.cra_driver_name   = "xchacha12-simd",
-               .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,
-               .setkey                 = chacha12_setkey,
-               .encrypt                = xchacha_simd,
-               .decrypt                = xchacha_simd,
-       },
-};
-
 bool chacha_is_arch_optimized(void)
 {
-       return static_key_enabled(&chacha_use_simd);
+       return true;
 }
 EXPORT_SYMBOL(chacha_is_arch_optimized);
 
@@ -267,25 +160,10 @@ static int __init chacha_simd_mod_init(void)
                    boot_cpu_has(X86_FEATURE_AVX512BW)) /* kmovq */
                        static_branch_enable(&chacha_use_avx512vl);
        }
-       return IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) ?
-               crypto_register_skciphers(algs, ARRAY_SIZE(algs)) : 0;
+       return 0;
 }
-
-static void __exit chacha_simd_mod_fini(void)
-{
-       if (IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) && boot_cpu_has(X86_FEATURE_SSSE3))
-               crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
-}
-
 arch_initcall(chacha_simd_mod_init);
-module_exit(chacha_simd_mod_fini);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
-MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (x64 SIMD accelerated)");
-MODULE_ALIAS_CRYPTO("chacha20");
-MODULE_ALIAS_CRYPTO("chacha20-simd");
-MODULE_ALIAS_CRYPTO("xchacha20");
-MODULE_ALIAS_CRYPTO("xchacha20-simd");
-MODULE_ALIAS_CRYPTO("xchacha12");
-MODULE_ALIAS_CRYPTO("xchacha12-simd");
+MODULE_DESCRIPTION("ChaCha and HChaCha functions (x86_64 optimized)");