]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: simd - reject compat registrations without __ prefixes
authorWesley Atwell <atwellwea@gmail.com>
Mon, 9 Mar 2026 04:31:43 +0000 (22:31 -0600)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 21 Mar 2026 08:34:30 +0000 (17:34 +0900)
simd_register_skciphers_compat() and simd_register_aeads_compat()
derive the wrapper algorithm names by stripping the __ prefix from the
internal algorithm names.

Currently they only WARN if cra_name or cra_driver_name lacks that prefix,
but they still continue and unconditionally add 2 to both strings. That
registers wrapper algorithms with incorrectly truncated names after a
violated precondition.

Reject such inputs with -EINVAL before registering anything, while keeping
the warning so invalid internal API usage is still visible.

Fixes: d14f0a1fc488 ("crypto: simd - allow registering multiple algorithms at once")
Fixes: 1661131a0479 ("crypto: simd - support wrapping AEAD algorithms")
Assisted-by: Codex:GPT-5
Signed-off-by: Wesley Atwell <atwellwea@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/simd.c

index f71c4a334c7d0ed610622d369f303c87657c31b1..4e6f437e9e778a380833c33a73eea0cb524d9f45 100644 (file)
@@ -214,13 +214,17 @@ int simd_register_skciphers_compat(struct skcipher_alg *algs, int count,
        const char *basename;
        struct simd_skcipher_alg *simd;
 
+       for (i = 0; i < count; i++) {
+               if (WARN_ON(strncmp(algs[i].base.cra_name, "__", 2) ||
+                           strncmp(algs[i].base.cra_driver_name, "__", 2)))
+                       return -EINVAL;
+       }
+
        err = crypto_register_skciphers(algs, count);
        if (err)
                return err;
 
        for (i = 0; i < count; i++) {
-               WARN_ON(strncmp(algs[i].base.cra_name, "__", 2));
-               WARN_ON(strncmp(algs[i].base.cra_driver_name, "__", 2));
                algname = algs[i].base.cra_name + 2;
                drvname = algs[i].base.cra_driver_name + 2;
                basename = algs[i].base.cra_driver_name;
@@ -437,13 +441,17 @@ int simd_register_aeads_compat(struct aead_alg *algs, int count,
        const char *basename;
        struct simd_aead_alg *simd;
 
+       for (i = 0; i < count; i++) {
+               if (WARN_ON(strncmp(algs[i].base.cra_name, "__", 2) ||
+                           strncmp(algs[i].base.cra_driver_name, "__", 2)))
+                       return -EINVAL;
+       }
+
        err = crypto_register_aeads(algs, count);
        if (err)
                return err;
 
        for (i = 0; i < count; i++) {
-               WARN_ON(strncmp(algs[i].base.cra_name, "__", 2));
-               WARN_ON(strncmp(algs[i].base.cra_driver_name, "__", 2));
                algname = algs[i].base.cra_name + 2;
                drvname = algs[i].base.cra_driver_name + 2;
                basename = algs[i].base.cra_driver_name;