0001
0002
0003
0004
0005
0006
0007
0008 #include <crypto/internal/hash.h>
0009 #include <crypto/internal/simd.h>
0010 #include <crypto/sha2.h>
0011 #include <crypto/sha512_base.h>
0012 #include <linux/crypto.h>
0013 #include <linux/module.h>
0014
0015 #include <asm/simd.h>
0016 #include <asm/neon.h>
0017
0018 #include "sha512.h"
0019
0020 MODULE_ALIAS_CRYPTO("sha384-neon");
0021 MODULE_ALIAS_CRYPTO("sha512-neon");
0022
0023 asmlinkage void sha512_block_data_order_neon(u64 *state, u8 const *src,
0024 int blocks);
0025
0026 static int sha512_neon_update(struct shash_desc *desc, const u8 *data,
0027 unsigned int len)
0028 {
0029 struct sha512_state *sctx = shash_desc_ctx(desc);
0030
0031 if (!crypto_simd_usable() ||
0032 (sctx->count[0] % SHA512_BLOCK_SIZE) + len < SHA512_BLOCK_SIZE)
0033 return sha512_arm_update(desc, data, len);
0034
0035 kernel_neon_begin();
0036 sha512_base_do_update(desc, data, len,
0037 (sha512_block_fn *)sha512_block_data_order_neon);
0038 kernel_neon_end();
0039
0040 return 0;
0041 }
0042
0043 static int sha512_neon_finup(struct shash_desc *desc, const u8 *data,
0044 unsigned int len, u8 *out)
0045 {
0046 if (!crypto_simd_usable())
0047 return sha512_arm_finup(desc, data, len, out);
0048
0049 kernel_neon_begin();
0050 if (len)
0051 sha512_base_do_update(desc, data, len,
0052 (sha512_block_fn *)sha512_block_data_order_neon);
0053 sha512_base_do_finalize(desc,
0054 (sha512_block_fn *)sha512_block_data_order_neon);
0055 kernel_neon_end();
0056
0057 return sha512_base_finish(desc, out);
0058 }
0059
0060 static int sha512_neon_final(struct shash_desc *desc, u8 *out)
0061 {
0062 return sha512_neon_finup(desc, NULL, 0, out);
0063 }
0064
0065 struct shash_alg sha512_neon_algs[] = { {
0066 .init = sha384_base_init,
0067 .update = sha512_neon_update,
0068 .final = sha512_neon_final,
0069 .finup = sha512_neon_finup,
0070 .descsize = sizeof(struct sha512_state),
0071 .digestsize = SHA384_DIGEST_SIZE,
0072 .base = {
0073 .cra_name = "sha384",
0074 .cra_driver_name = "sha384-neon",
0075 .cra_priority = 300,
0076 .cra_blocksize = SHA384_BLOCK_SIZE,
0077 .cra_module = THIS_MODULE,
0078
0079 }
0080 }, {
0081 .init = sha512_base_init,
0082 .update = sha512_neon_update,
0083 .final = sha512_neon_final,
0084 .finup = sha512_neon_finup,
0085 .descsize = sizeof(struct sha512_state),
0086 .digestsize = SHA512_DIGEST_SIZE,
0087 .base = {
0088 .cra_name = "sha512",
0089 .cra_driver_name = "sha512-neon",
0090 .cra_priority = 300,
0091 .cra_blocksize = SHA512_BLOCK_SIZE,
0092 .cra_module = THIS_MODULE,
0093 }
0094 } };