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(u64
*state
, u8
const *src
,
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
,
37 (sha512_block_fn
*)sha512_block_data_order_neon
);
43 static int sha512_neon_finup(struct shash_desc
*desc
, const u8
*data
,
44 unsigned int len
, u8
*out
)
46 if (!crypto_simd_usable())
47 return sha512_arm_finup(desc
, data
, len
, out
);
51 sha512_base_do_update(desc
, data
, len
,
52 (sha512_block_fn
*)sha512_block_data_order_neon
);
53 sha512_base_do_finalize(desc
,
54 (sha512_block_fn
*)sha512_block_data_order_neon
);
57 return sha512_base_finish(desc
, out
);
60 static int sha512_neon_final(struct shash_desc
*desc
, u8
*out
)
62 return sha512_neon_finup(desc
, NULL
, 0, out
);
65 struct shash_alg sha512_neon_algs
[] = { {
66 .init
= sha384_base_init
,
67 .update
= sha512_neon_update
,
68 .final
= sha512_neon_final
,
69 .finup
= sha512_neon_finup
,
70 .descsize
= sizeof(struct sha512_state
),
71 .digestsize
= SHA384_DIGEST_SIZE
,
74 .cra_driver_name
= "sha384-neon",
76 .cra_blocksize
= SHA384_BLOCK_SIZE
,
77 .cra_module
= THIS_MODULE
,
81 .init
= sha512_base_init
,
82 .update
= sha512_neon_update
,
83 .final
= sha512_neon_final
,
84 .finup
= sha512_neon_finup
,
85 .descsize
= sizeof(struct sha512_state
),
86 .digestsize
= SHA512_DIGEST_SIZE
,
89 .cra_driver_name
= "sha512-neon",
91 .cra_blocksize
= SHA512_BLOCK_SIZE
,
92 .cra_module
= THIS_MODULE
,