1 // SPDX-License-Identifier: GPL-2.0-only
3 * sha512-neon-glue.c - accelerated SHA-384/512 for ARM NEON
5 * Copyright (C) 2015 Linaro Ltd <ard.biesheuvel@linaro.org>
8 #include <crypto/internal/hash.h>
9 #include <crypto/internal/simd.h>
10 #include <crypto/sha2.h>
11 #include <crypto/sha512_base.h>
12 #include <linux/crypto.h>
13 #include <linux/module.h>
20 MODULE_ALIAS_CRYPTO("sha384-neon");
21 MODULE_ALIAS_CRYPTO("sha512-neon");
23 asmlinkage
void sha512_block_data_order_neon(struct sha512_state
*state
,
24 const u8
*src
, int blocks
);
26 static int sha512_neon_update(struct shash_desc
*desc
, const u8
*data
,
29 struct sha512_state
*sctx
= shash_desc_ctx(desc
);
31 if (!crypto_simd_usable() ||
32 (sctx
->count
[0] % SHA512_BLOCK_SIZE
) + len
< SHA512_BLOCK_SIZE
)
33 return sha512_arm_update(desc
, data
, len
);
36 sha512_base_do_update(desc
, data
, len
, sha512_block_data_order_neon
);
42 static int sha512_neon_finup(struct shash_desc
*desc
, const u8
*data
,
43 unsigned int len
, u8
*out
)
45 if (!crypto_simd_usable())
46 return sha512_arm_finup(desc
, data
, len
, out
);
50 sha512_base_do_update(desc
, data
, len
,
51 sha512_block_data_order_neon
);
52 sha512_base_do_finalize(desc
, sha512_block_data_order_neon
);
55 return sha512_base_finish(desc
, out
);
58 static int sha512_neon_final(struct shash_desc
*desc
, u8
*out
)
60 return sha512_neon_finup(desc
, NULL
, 0, out
);
63 struct shash_alg sha512_neon_algs
[] = { {
64 .init
= sha384_base_init
,
65 .update
= sha512_neon_update
,
66 .final
= sha512_neon_final
,
67 .finup
= sha512_neon_finup
,
68 .descsize
= sizeof(struct sha512_state
),
69 .digestsize
= SHA384_DIGEST_SIZE
,
72 .cra_driver_name
= "sha384-neon",
74 .cra_blocksize
= SHA384_BLOCK_SIZE
,
75 .cra_module
= THIS_MODULE
,
79 .init
= sha512_base_init
,
80 .update
= sha512_neon_update
,
81 .final
= sha512_neon_final
,
82 .finup
= sha512_neon_finup
,
83 .descsize
= sizeof(struct sha512_state
),
84 .digestsize
= SHA512_DIGEST_SIZE
,
87 .cra_driver_name
= "sha512-neon",
89 .cra_blocksize
= SHA512_BLOCK_SIZE
,
90 .cra_module
= THIS_MODULE
,