]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: chacha - centralize the skcipher wrappers for arch code
authorEric Biggers <ebiggers@google.com>
Sat, 5 Apr 2025 18:26:02 +0000 (11:26 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 7 Apr 2025 05:22:28 +0000 (13:22 +0800)
Following the example of the crc32 and crc32c code, make the crypto
subsystem register both generic and architecture-optimized chacha20,
xchacha20, and xchacha12 skcipher algorithms, all implemented on top of
the appropriate library functions.  This eliminates the need for every
architecture to implement the same skcipher glue code.

To register the architecture-optimized skciphers only when
architecture-optimized code is actually being used, add a function
chacha_is_arch_optimized() and make each arch implement it.  Change each
architecture's ChaCha module_init function to arch_initcall so that the
CPU feature detection is guaranteed to run before
chacha_is_arch_optimized() gets called by crypto/chacha.c.  In the case
of s390, remove the CPU feature based module autoloading, which is no
longer needed since the module just gets pulled in via function linkage.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm/crypto/chacha-glue.c
arch/arm64/crypto/chacha-neon-glue.c
arch/mips/crypto/chacha-glue.c
arch/powerpc/crypto/chacha-p10-glue.c
arch/riscv/crypto/chacha-riscv64-glue.c
arch/s390/crypto/chacha-glue.c
arch/x86/crypto/chacha_glue.c
crypto/Makefile
crypto/chacha.c [new file with mode: 0644]
crypto/chacha_generic.c [deleted file]
include/crypto/chacha.h

index 50e635512046e808dd0114a1b8edd6f3d1cbfe46..e1cb34d317712714843af989fd6fb6ddfe9750af 100644 (file)
@@ -287,6 +287,13 @@ static struct skcipher_alg neon_algs[] = {
        }
 };
 
+bool chacha_is_arch_optimized(void)
+{
+       /* We always can use at least the ARM scalar implementation. */
+       return true;
+}
+EXPORT_SYMBOL(chacha_is_arch_optimized);
+
 static int __init chacha_simd_mod_init(void)
 {
        int err = 0;
@@ -333,7 +340,7 @@ static void __exit chacha_simd_mod_fini(void)
        }
 }
 
-module_init(chacha_simd_mod_init);
+arch_initcall(chacha_simd_mod_init);
 module_exit(chacha_simd_mod_fini);
 
 MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (scalar and NEON accelerated)");
index 229876acfc581d45036741d985293add0fda19cd..bb9b52321bda7e774e56d1d2c2e2c6264438cdda 100644 (file)
@@ -206,6 +206,12 @@ static struct skcipher_alg algs[] = {
        }
 };
 
+bool chacha_is_arch_optimized(void)
+{
+       return static_key_enabled(&have_neon);
+}
+EXPORT_SYMBOL(chacha_is_arch_optimized);
+
 static int __init chacha_simd_mod_init(void)
 {
        if (!cpu_have_named_feature(ASIMD))
@@ -223,7 +229,7 @@ static void __exit chacha_simd_mod_fini(void)
                crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
 }
 
-module_init(chacha_simd_mod_init);
+arch_initcall(chacha_simd_mod_init);
 module_exit(chacha_simd_mod_fini);
 
 MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (NEON accelerated)");
index f6fc2e1079a19798b608565a9e1ad1ccb9573f56..64ccaeaeaa1e15f821c9d0be9dbd426f647357ab 100644 (file)
@@ -120,6 +120,12 @@ static struct skcipher_alg algs[] = {
        }
 };
 
+bool chacha_is_arch_optimized(void)
+{
+       return true;
+}
+EXPORT_SYMBOL(chacha_is_arch_optimized);
+
 static int __init chacha_simd_mod_init(void)
 {
        return IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) ?
@@ -132,7 +138,7 @@ static void __exit chacha_simd_mod_fini(void)
                crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
 }
 
-module_init(chacha_simd_mod_init);
+arch_initcall(chacha_simd_mod_init);
 module_exit(chacha_simd_mod_fini);
 
 MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (MIPS accelerated)");
index d8796decc1fb723e224a046eb7e9dd5ee18f2088..3355305b6c7f88ace8546ad317204a6c7a2d1e7a 100644 (file)
@@ -189,6 +189,12 @@ static struct skcipher_alg algs[] = {
        }
 };
 
+bool chacha_is_arch_optimized(void)
+{
+       return static_key_enabled(&have_p10);
+}
+EXPORT_SYMBOL(chacha_is_arch_optimized);
+
 static int __init chacha_p10_init(void)
 {
        if (!cpu_has_feature(CPU_FTR_ARCH_31))
@@ -207,7 +213,7 @@ static void __exit chacha_p10_exit(void)
        crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
 }
 
-module_init(chacha_p10_init);
+arch_initcall(chacha_p10_init);
 module_exit(chacha_p10_exit);
 
 MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (P10 accelerated)");
index 68caef7a3d50b43924421aefedea5be945f33781..ccaab0dea383ff81ad42e614b0ddfb6d518b2b34 100644 (file)
@@ -49,6 +49,12 @@ void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
 }
 EXPORT_SYMBOL(chacha_crypt_arch);
 
+bool chacha_is_arch_optimized(void)
+{
+       return static_key_enabled(&use_zvkb);
+}
+EXPORT_SYMBOL(chacha_is_arch_optimized);
+
 static int __init riscv64_chacha_mod_init(void)
 {
        if (riscv_isa_extension_available(NULL, ZVKB) &&
@@ -56,7 +62,7 @@ static int __init riscv64_chacha_mod_init(void)
                static_branch_enable(&use_zvkb);
        return 0;
 }
-module_init(riscv64_chacha_mod_init);
+arch_initcall(riscv64_chacha_mod_init);
 
 MODULE_DESCRIPTION("ChaCha stream cipher (RISC-V optimized)");
 MODULE_AUTHOR("Jerry Shih <jerry.shih@sifive.com>");
index 920e9f0941e75c4a0f8f55114b1f4e8908710b23..0c68191f2aa4c8fcd98f58b2b90407fa8a0d010a 100644 (file)
@@ -103,6 +103,12 @@ static struct skcipher_alg chacha_algs[] = {
        }
 };
 
+bool chacha_is_arch_optimized(void)
+{
+       return cpu_has_vx();
+}
+EXPORT_SYMBOL(chacha_is_arch_optimized);
+
 static int __init chacha_mod_init(void)
 {
        return IS_REACHABLE(CONFIG_CRYPTO_SKCIPHER) ?
@@ -115,7 +121,7 @@ static void __exit chacha_mod_fini(void)
                crypto_unregister_skciphers(chacha_algs, ARRAY_SIZE(chacha_algs));
 }
 
-module_cpu_feature_match(S390_CPU_FEATURE_VXRS, chacha_mod_init);
+arch_initcall(chacha_mod_init);
 module_exit(chacha_mod_fini);
 
 MODULE_DESCRIPTION("ChaCha20 stream cipher");
index 946c306f60cd45616e3092af968d8df8d8c711e3..8858de7b33e30daeefcc910b206c4257d3630338 100644 (file)
@@ -247,6 +247,12 @@ static struct skcipher_alg algs[] = {
        },
 };
 
+bool chacha_is_arch_optimized(void)
+{
+       return static_key_enabled(&chacha_use_simd);
+}
+EXPORT_SYMBOL(chacha_is_arch_optimized);
+
 static int __init chacha_simd_mod_init(void)
 {
        if (!boot_cpu_has(X86_FEATURE_SSSE3))
@@ -271,7 +277,7 @@ static void __exit chacha_simd_mod_fini(void)
                crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
 }
 
-module_init(chacha_simd_mod_init);
+arch_initcall(chacha_simd_mod_init);
 module_exit(chacha_simd_mod_fini);
 
 MODULE_LICENSE("GPL");
index 0e6ab5ffd3f77ca5e5efb95abd8666ae47deb166..98510a2aa0b1ec107c644ccb1259e6de6ee89cc2 100644 (file)
@@ -148,7 +148,8 @@ obj-$(CONFIG_CRYPTO_KHAZAD) += khazad.o
 obj-$(CONFIG_CRYPTO_ANUBIS) += anubis.o
 obj-$(CONFIG_CRYPTO_SEED) += seed.o
 obj-$(CONFIG_CRYPTO_ARIA) += aria_generic.o
-obj-$(CONFIG_CRYPTO_CHACHA20) += chacha_generic.o
+obj-$(CONFIG_CRYPTO_CHACHA20) += chacha.o
+CFLAGS_chacha.o += -DARCH=$(ARCH)
 obj-$(CONFIG_CRYPTO_POLY1305) += poly1305_generic.o
 obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o
 obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
diff --git a/crypto/chacha.c b/crypto/chacha.c
new file mode 100644 (file)
index 0000000..2009038
--- /dev/null
@@ -0,0 +1,227 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Crypto API wrappers for the ChaCha20, XChaCha20, and XChaCha12 stream ciphers
+ *
+ * Copyright (C) 2015 Martin Willi
+ * Copyright (C) 2018 Google LLC
+ */
+
+#include <linux/unaligned.h>
+#include <crypto/algapi.h>
+#include <crypto/internal/chacha.h>
+#include <crypto/internal/skcipher.h>
+#include <linux/module.h>
+
+static int chacha_stream_xor(struct skcipher_request *req,
+                            const struct chacha_ctx *ctx, const u8 *iv,
+                            bool arch)
+{
+       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, CHACHA_BLOCK_SIZE);
+
+               if (arch)
+                       chacha_crypt(state, walk.dst.virt.addr,
+                                    walk.src.virt.addr, nbytes, ctx->nrounds);
+               else
+                       chacha_crypt_generic(state, walk.dst.virt.addr,
+                                            walk.src.virt.addr, nbytes,
+                                            ctx->nrounds);
+               err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
+       }
+
+       return err;
+}
+
+static int crypto_chacha_crypt_generic(struct skcipher_request *req)
+{
+       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+       const struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+       return chacha_stream_xor(req, ctx, req->iv, false);
+}
+
+static int crypto_chacha_crypt_arch(struct skcipher_request *req)
+{
+       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+       const struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+       return chacha_stream_xor(req, ctx, req->iv, true);
+}
+
+static int crypto_xchacha_crypt(struct skcipher_request *req, bool arch)
+{
+       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+       const struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+       struct chacha_ctx subctx;
+       u32 state[16];
+       u8 real_iv[16];
+
+       /* Compute the subkey given the original key and first 128 nonce bits */
+       chacha_init(state, ctx->key, req->iv);
+       if (arch)
+               hchacha_block(state, subctx.key, ctx->nrounds);
+       else
+               hchacha_block_generic(state, subctx.key, ctx->nrounds);
+       subctx.nrounds = ctx->nrounds;
+
+       /* Build the real IV */
+       memcpy(&real_iv[0], req->iv + 24, 8); /* stream position */
+       memcpy(&real_iv[8], req->iv + 16, 8); /* remaining 64 nonce bits */
+
+       /* Generate the stream and XOR it with the data */
+       return chacha_stream_xor(req, &subctx, real_iv, arch);
+}
+
+static int crypto_xchacha_crypt_generic(struct skcipher_request *req)
+{
+       return crypto_xchacha_crypt(req, false);
+}
+
+static int crypto_xchacha_crypt_arch(struct skcipher_request *req)
+{
+       return crypto_xchacha_crypt(req, true);
+}
+
+static struct skcipher_alg algs[] = {
+       {
+               .base.cra_name          = "chacha20",
+               .base.cra_driver_name   = "chacha20-generic",
+               .base.cra_priority      = 100,
+               .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                = crypto_chacha_crypt_generic,
+               .decrypt                = crypto_chacha_crypt_generic,
+       },
+       {
+               .base.cra_name          = "xchacha20",
+               .base.cra_driver_name   = "xchacha20-generic",
+               .base.cra_priority      = 100,
+               .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                = crypto_xchacha_crypt_generic,
+               .decrypt                = crypto_xchacha_crypt_generic,
+       },
+       {
+               .base.cra_name          = "xchacha12",
+               .base.cra_driver_name   = "xchacha12-generic",
+               .base.cra_priority      = 100,
+               .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                = crypto_xchacha_crypt_generic,
+               .decrypt                = crypto_xchacha_crypt_generic,
+       },
+       {
+               .base.cra_name          = "chacha20",
+               .base.cra_driver_name   = "chacha20-" __stringify(ARCH),
+               .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                = crypto_chacha_crypt_arch,
+               .decrypt                = crypto_chacha_crypt_arch,
+       },
+       {
+               .base.cra_name          = "xchacha20",
+               .base.cra_driver_name   = "xchacha20-" __stringify(ARCH),
+               .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                = crypto_xchacha_crypt_arch,
+               .decrypt                = crypto_xchacha_crypt_arch,
+       },
+       {
+               .base.cra_name          = "xchacha12",
+               .base.cra_driver_name   = "xchacha12-" __stringify(ARCH),
+               .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                = crypto_xchacha_crypt_arch,
+               .decrypt                = crypto_xchacha_crypt_arch,
+       }
+};
+
+static unsigned int num_algs;
+
+static int __init crypto_chacha_mod_init(void)
+{
+       /* register the arch flavours only if they differ from generic */
+       num_algs = ARRAY_SIZE(algs);
+       BUILD_BUG_ON(ARRAY_SIZE(algs) % 2 != 0);
+       if (!chacha_is_arch_optimized())
+               num_algs /= 2;
+
+       return crypto_register_skciphers(algs, num_algs);
+}
+
+static void __exit crypto_chacha_mod_fini(void)
+{
+       crypto_unregister_skciphers(algs, num_algs);
+}
+
+subsys_initcall(crypto_chacha_mod_init);
+module_exit(crypto_chacha_mod_fini);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
+MODULE_DESCRIPTION("Crypto API wrappers for the ChaCha20, XChaCha20, and XChaCha12 stream ciphers");
+MODULE_ALIAS_CRYPTO("chacha20");
+MODULE_ALIAS_CRYPTO("chacha20-generic");
+MODULE_ALIAS_CRYPTO("chacha20-"  __stringify(ARCH));
+MODULE_ALIAS_CRYPTO("xchacha20");
+MODULE_ALIAS_CRYPTO("xchacha20-generic");
+MODULE_ALIAS_CRYPTO("xchacha20-"  __stringify(ARCH));
+MODULE_ALIAS_CRYPTO("xchacha12");
+MODULE_ALIAS_CRYPTO("xchacha12-generic");
+MODULE_ALIAS_CRYPTO("xchacha12-"  __stringify(ARCH));
diff --git a/crypto/chacha_generic.c b/crypto/chacha_generic.c
deleted file mode 100644 (file)
index 1fb9fbd..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * ChaCha and XChaCha stream ciphers, including ChaCha20 (RFC7539)
- *
- * Copyright (C) 2015 Martin Willi
- * Copyright (C) 2018 Google LLC
- */
-
-#include <linux/unaligned.h>
-#include <crypto/algapi.h>
-#include <crypto/internal/chacha.h>
-#include <crypto/internal/skcipher.h>
-#include <linux/module.h>
-
-static int chacha_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);
-
-       chacha_init(state, ctx->key, iv);
-
-       while (walk.nbytes > 0) {
-               unsigned int nbytes = walk.nbytes;
-
-               if (nbytes < walk.total)
-                       nbytes = round_down(nbytes, CHACHA_BLOCK_SIZE);
-
-               chacha_crypt_generic(state, walk.dst.virt.addr,
-                                    walk.src.virt.addr, nbytes, ctx->nrounds);
-               err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-       }
-
-       return err;
-}
-
-static int crypto_chacha_crypt(struct skcipher_request *req)
-{
-       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-       struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-
-       return chacha_stream_xor(req, ctx, req->iv);
-}
-
-static int crypto_xchacha_crypt(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];
-
-       /* Compute the subkey given the original key and first 128 nonce bits */
-       chacha_init(state, ctx->key, req->iv);
-       hchacha_block_generic(state, subctx.key, ctx->nrounds);
-       subctx.nrounds = ctx->nrounds;
-
-       /* Build the real IV */
-       memcpy(&real_iv[0], req->iv + 24, 8); /* stream position */
-       memcpy(&real_iv[8], req->iv + 16, 8); /* remaining 64 nonce bits */
-
-       /* Generate the stream and XOR it with the data */
-       return chacha_stream_xor(req, &subctx, real_iv);
-}
-
-static struct skcipher_alg algs[] = {
-       {
-               .base.cra_name          = "chacha20",
-               .base.cra_driver_name   = "chacha20-generic",
-               .base.cra_priority      = 100,
-               .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                = crypto_chacha_crypt,
-               .decrypt                = crypto_chacha_crypt,
-       }, {
-               .base.cra_name          = "xchacha20",
-               .base.cra_driver_name   = "xchacha20-generic",
-               .base.cra_priority      = 100,
-               .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                = crypto_xchacha_crypt,
-               .decrypt                = crypto_xchacha_crypt,
-       }, {
-               .base.cra_name          = "xchacha12",
-               .base.cra_driver_name   = "xchacha12-generic",
-               .base.cra_priority      = 100,
-               .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                = crypto_xchacha_crypt,
-               .decrypt                = crypto_xchacha_crypt,
-       }
-};
-
-static int __init chacha_generic_mod_init(void)
-{
-       return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
-}
-
-static void __exit chacha_generic_mod_fini(void)
-{
-       crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
-}
-
-subsys_initcall(chacha_generic_mod_init);
-module_exit(chacha_generic_mod_fini);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
-MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (generic)");
-MODULE_ALIAS_CRYPTO("chacha20");
-MODULE_ALIAS_CRYPTO("chacha20-generic");
-MODULE_ALIAS_CRYPTO("xchacha20");
-MODULE_ALIAS_CRYPTO("xchacha20-generic");
-MODULE_ALIAS_CRYPTO("xchacha12");
-MODULE_ALIAS_CRYPTO("xchacha12-generic");
index f8cc073bba41be3cfec5ac9a33f813988cce6c91..58129e18cc31d33702292f3ca17c328dc6ef6c7c 100644 (file)
@@ -99,4 +99,13 @@ static inline void chacha20_crypt(u32 *state, u8 *dst, const u8 *src,
        chacha_crypt(state, dst, src, bytes, 20);
 }
 
+#if IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA)
+bool chacha_is_arch_optimized(void);
+#else
+static inline bool chacha_is_arch_optimized(void)
+{
+       return false;
+}
+#endif
+
 #endif /* _CRYPTO_CHACHA_H */