crypto: arm/sha512-neon - Use API partial block handling
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 18 Apr 2025 03:00:29 +0000 (11:00 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 23 Apr 2025 07:52:46 +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/arm/crypto/sha512-neon-glue.c

index c6e58fe475acf94f32b96698f0e7ca0567304491..bd528077fefbfe106e189aed94e6720c7a4fe9cc 100644 (file)
@@ -5,16 +5,13 @@
  * Copyright (C) 2015 Linaro Ltd <ard.biesheuvel@linaro.org>
  */
 
+#include <asm/neon.h>
 #include <crypto/internal/hash.h>
-#include <crypto/internal/simd.h>
 #include <crypto/sha2.h>
 #include <crypto/sha512_base.h>
-#include <linux/crypto.h>
+#include <linux/kernel.h>
 #include <linux/module.h>
 
-#include <asm/simd.h>
-#include <asm/neon.h>
-
 #include "sha512.h"
 
 MODULE_ALIAS_CRYPTO("sha384-neon");
@@ -26,51 +23,36 @@ asmlinkage void sha512_block_data_order_neon(struct sha512_state *state,
 static int sha512_neon_update(struct shash_desc *desc, const u8 *data,
                              unsigned int len)
 {
-       struct sha512_state *sctx = shash_desc_ctx(desc);
-
-       if (!crypto_simd_usable() ||
-           (sctx->count[0] % SHA512_BLOCK_SIZE) + len < SHA512_BLOCK_SIZE)
-               return sha512_arm_update(desc, data, len);
+       int remain;
 
        kernel_neon_begin();
-       sha512_base_do_update(desc, data, len, sha512_block_data_order_neon);
+       remain = sha512_base_do_update_blocks(desc, data, len,
+                                             sha512_block_data_order_neon);
        kernel_neon_end();
-
-       return 0;
+       return remain;
 }
 
 static int sha512_neon_finup(struct shash_desc *desc, const u8 *data,
                             unsigned int len, u8 *out)
 {
-       if (!crypto_simd_usable())
-               return sha512_arm_finup(desc, data, len, out);
-
        kernel_neon_begin();
-       if (len)
-               sha512_base_do_update(desc, data, len,
-                                     sha512_block_data_order_neon);
-       sha512_base_do_finalize(desc, sha512_block_data_order_neon);
+       sha512_base_do_finup(desc, data, len, sha512_block_data_order_neon);
        kernel_neon_end();
-
        return sha512_base_finish(desc, out);
 }
 
-static int sha512_neon_final(struct shash_desc *desc, u8 *out)
-{
-       return sha512_neon_finup(desc, NULL, 0, out);
-}
-
 struct shash_alg sha512_neon_algs[] = { {
        .init                   = sha384_base_init,
        .update                 = sha512_neon_update,
-       .final                  = sha512_neon_final,
        .finup                  = sha512_neon_finup,
-       .descsize               = sizeof(struct sha512_state),
+       .descsize               = SHA512_STATE_SIZE,
        .digestsize             = SHA384_DIGEST_SIZE,
        .base                   = {
                .cra_name               = "sha384",
                .cra_driver_name        = "sha384-neon",
                .cra_priority           = 300,
+               .cra_flags              = CRYPTO_AHASH_ALG_BLOCK_ONLY |
+                                         CRYPTO_AHASH_ALG_FINUP_MAX,
                .cra_blocksize          = SHA384_BLOCK_SIZE,
                .cra_module             = THIS_MODULE,
 
@@ -78,14 +60,15 @@ struct shash_alg sha512_neon_algs[] = { {
 },  {
        .init                   = sha512_base_init,
        .update                 = sha512_neon_update,
-       .final                  = sha512_neon_final,
        .finup                  = sha512_neon_finup,
-       .descsize               = sizeof(struct sha512_state),
+       .descsize               = SHA512_STATE_SIZE,
        .digestsize             = SHA512_DIGEST_SIZE,
        .base                   = {
                .cra_name               = "sha512",
                .cra_driver_name        = "sha512-neon",
                .cra_priority           = 300,
+               .cra_flags              = CRYPTO_AHASH_ALG_BLOCK_ONLY |
+                                         CRYPTO_AHASH_ALG_FINUP_MAX,
                .cra_blocksize          = SHA512_BLOCK_SIZE,
                .cra_module             = THIS_MODULE,
        }