crypto: powerpc/chacha - remove the skcipher algorithms
authorEric Biggers <ebiggers@google.com>
Sat, 5 Apr 2025 18:26:06 +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/powerpc/crypto/Kconfig
arch/powerpc/crypto/chacha-p10-glue.c

index 370db8192ce62d00e0de2c50af6eea977fbf2a96..47dccdd496374bd3af948c6f533d0282ce3c5f38 100644 (file)
@@ -95,17 +95,9 @@ config CRYPTO_AES_GCM_P10
 config CRYPTO_CHACHA20_P10
        tristate
        depends on PPC64 && CPU_LITTLE_ENDIAN && VSX
-       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: PowerPC64
-         - Power10 or later
-         - Little-endian
 
 config CRYPTO_POLY1305_P10
        tristate "Hash functions: Poly1305 (P10 or later)"
index 3355305b6c7f88ace8546ad317204a6c7a2d1e7a..9982929573add3fd734a8df3dbb85d22b6cac193 100644 (file)
@@ -1,15 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 /*
- * PowerPC P10 (ppc64le) accelerated ChaCha and XChaCha stream ciphers,
- * including ChaCha20 (RFC7539)
+ * ChaCha stream cipher (P10 accelerated)
  *
  * Copyright 2023- IBM Corp. All rights reserved.
  */
 
-#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/kernel.h>
 #include <linux/module.h>
 #include <linux/cpufeature.h>
@@ -78,117 +75,6 @@ void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
 }
 EXPORT_SYMBOL(chacha_crypt_arch);
 
-static int chacha_p10_stream_xor(struct skcipher_request *req,
-                                const struct chacha_ctx *ctx, const u8 *iv)
-{
-       struct skcipher_walk walk;
-       u32 state[16];
-       int err;
-
-       err = skcipher_walk_virt(&walk, req, false);
-       if (err)
-               return err;
-
-       chacha_init(state, ctx->key, iv);
-
-       while (walk.nbytes > 0) {
-               unsigned int nbytes = walk.nbytes;
-
-               if (nbytes < walk.total)
-                       nbytes = rounddown(nbytes, walk.stride);
-
-               if (!crypto_simd_usable()) {
-                       chacha_crypt_generic(state, walk.dst.virt.addr,
-                                            walk.src.virt.addr, nbytes,
-                                            ctx->nrounds);
-               } else {
-                       vsx_begin();
-                       chacha_p10_do_8x(state, walk.dst.virt.addr,
-                                     walk.src.virt.addr, nbytes, ctx->nrounds);
-                       vsx_end();
-               }
-               err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-               if (err)
-                       break;
-       }
-
-       return err;
-}
-
-static int chacha_p10(struct skcipher_request *req)
-{
-       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-       struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-
-       return chacha_p10_stream_xor(req, ctx, req->iv);
-}
-
-static int xchacha_p10(struct skcipher_request *req)
-{
-       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);
-       hchacha_block_arch(state, subctx.key, ctx->nrounds);
-       subctx.nrounds = ctx->nrounds;
-
-       memcpy(&real_iv[0], req->iv + 24, 8);
-       memcpy(&real_iv[8], req->iv + 16, 8);
-       return chacha_p10_stream_xor(req, &subctx, real_iv);
-}
-
-static struct skcipher_alg algs[] = {
-       {
-               .base.cra_name          = "chacha20",
-               .base.cra_driver_name   = "chacha20-p10",
-               .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_p10,
-               .decrypt                = chacha_p10,
-       }, {
-               .base.cra_name          = "xchacha20",
-               .base.cra_driver_name   = "xchacha20-p10",
-               .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_p10,
-               .decrypt                = xchacha_p10,
-       }, {
-               .base.cra_name          = "xchacha12",
-               .base.cra_driver_name   = "xchacha12-p10",
-               .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_p10,
-               .decrypt                = xchacha_p10,
-       }
-};
-
 bool chacha_is_arch_optimized(void)
 {
        return static_key_enabled(&have_p10);
@@ -197,31 +83,12 @@ EXPORT_SYMBOL(chacha_is_arch_optimized);
 
 static int __init chacha_p10_init(void)
 {
-       if (!cpu_has_feature(CPU_FTR_ARCH_31))
-               return 0;
-
-       static_branch_enable(&have_p10);
-
-       return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
-}
-
-static void __exit chacha_p10_exit(void)
-{
-       if (!static_branch_likely(&have_p10))
-               return;
-
-       crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
+       if (cpu_has_feature(CPU_FTR_ARCH_31))
+               static_branch_enable(&have_p10);
+       return 0;
 }
-
 arch_initcall(chacha_p10_init);
-module_exit(chacha_p10_exit);
 
-MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (P10 accelerated)");
+MODULE_DESCRIPTION("ChaCha stream cipher (P10 accelerated)");
 MODULE_AUTHOR("Danny Tsen <dtsen@linux.ibm.com>");
 MODULE_LICENSE("GPL v2");
-MODULE_ALIAS_CRYPTO("chacha20");
-MODULE_ALIAS_CRYPTO("chacha20-p10");
-MODULE_ALIAS_CRYPTO("xchacha20");
-MODULE_ALIAS_CRYPTO("xchacha20-p10");
-MODULE_ALIAS_CRYPTO("xchacha12");
-MODULE_ALIAS_CRYPTO("xchacha12-p10");