crypto: arm64/sm3-neon - Use API partial block handling
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 18 Apr 2025 03:00:50 +0000 (11:00 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 23 Apr 2025 07:52:47 +0000 (15:52 +0800)
Use the Crypto API partial block handling.

Also remove the unnecessary SIMD fallback path.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm64/crypto/sm3-neon-glue.c

index 8dd71ce79b69bb937a096496dec66eb8b2b557ec..6c4611a503a345acf8b903f93e7d60aced237357 100644 (file)
@@ -6,14 +6,11 @@
  */
 
 #include <asm/neon.h>
-#include <asm/simd.h>
-#include <linux/unaligned.h>
 #include <crypto/internal/hash.h>
-#include <crypto/internal/simd.h>
 #include <crypto/sm3.h>
 #include <crypto/sm3_base.h>
 #include <linux/cpufeature.h>
-#include <linux/crypto.h>
+#include <linux/kernel.h>
 #include <linux/module.h>
 
 
@@ -23,50 +20,20 @@ asmlinkage void sm3_neon_transform(struct sm3_state *sst, u8 const *src,
 static int sm3_neon_update(struct shash_desc *desc, const u8 *data,
                           unsigned int len)
 {
-       if (!crypto_simd_usable()) {
-               sm3_update(shash_desc_ctx(desc), data, len);
-               return 0;
-       }
+       int remain;
 
        kernel_neon_begin();
-       sm3_base_do_update(desc, data, len, sm3_neon_transform);
+       remain = sm3_base_do_update_blocks(desc, data, len, sm3_neon_transform);
        kernel_neon_end();
-
-       return 0;
-}
-
-static int sm3_neon_final(struct shash_desc *desc, u8 *out)
-{
-       if (!crypto_simd_usable()) {
-               sm3_final(shash_desc_ctx(desc), out);
-               return 0;
-       }
-
-       kernel_neon_begin();
-       sm3_base_do_finalize(desc, sm3_neon_transform);
-       kernel_neon_end();
-
-       return sm3_base_finish(desc, out);
+       return remain;
 }
 
 static int sm3_neon_finup(struct shash_desc *desc, const u8 *data,
                          unsigned int len, u8 *out)
 {
-       if (!crypto_simd_usable()) {
-               struct sm3_state *sctx = shash_desc_ctx(desc);
-
-               if (len)
-                       sm3_update(sctx, data, len);
-               sm3_final(sctx, out);
-               return 0;
-       }
-
        kernel_neon_begin();
-       if (len)
-               sm3_base_do_update(desc, data, len, sm3_neon_transform);
-       sm3_base_do_finalize(desc, sm3_neon_transform);
+       sm3_base_do_finup(desc, data, len, sm3_neon_transform);
        kernel_neon_end();
-
        return sm3_base_finish(desc, out);
 }
 
@@ -74,11 +41,12 @@ static struct shash_alg sm3_alg = {
        .digestsize             = SM3_DIGEST_SIZE,
        .init                   = sm3_base_init,
        .update                 = sm3_neon_update,
-       .final                  = sm3_neon_final,
        .finup                  = sm3_neon_finup,
-       .descsize               = sizeof(struct sm3_state),
+       .descsize               = SM3_STATE_SIZE,
        .base.cra_name          = "sm3",
        .base.cra_driver_name   = "sm3-neon",
+       .base.cra_flags         = CRYPTO_AHASH_ALG_BLOCK_ONLY |
+                                 CRYPTO_AHASH_ALG_FINUP_MAX,
        .base.cra_blocksize     = SM3_BLOCK_SIZE,
        .base.cra_module        = THIS_MODULE,
        .base.cra_priority      = 200,