12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 27918ecefSArd Biesheuvel /* 37918ecefSArd Biesheuvel * Linux/arm64 port of the OpenSSL SHA512 implementation for AArch64 47918ecefSArd Biesheuvel * 57918ecefSArd Biesheuvel * Copyright (c) 2016 Linaro Ltd. <ard.biesheuvel@linaro.org> 67918ecefSArd Biesheuvel */ 77918ecefSArd Biesheuvel 87918ecefSArd Biesheuvel #include <crypto/internal/hash.h> 97918ecefSArd Biesheuvel #include <linux/cryptohash.h> 107918ecefSArd Biesheuvel #include <linux/types.h> 117918ecefSArd Biesheuvel #include <linux/string.h> 127918ecefSArd Biesheuvel #include <crypto/sha.h> 137918ecefSArd Biesheuvel #include <crypto/sha512_base.h> 147918ecefSArd Biesheuvel #include <asm/neon.h> 157918ecefSArd Biesheuvel 167918ecefSArd Biesheuvel MODULE_DESCRIPTION("SHA-384/SHA-512 secure hash for arm64"); 177918ecefSArd Biesheuvel MODULE_AUTHOR("Andy Polyakov <appro@openssl.org>"); 187918ecefSArd Biesheuvel MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>"); 197918ecefSArd Biesheuvel MODULE_LICENSE("GPL v2"); 207918ecefSArd Biesheuvel MODULE_ALIAS_CRYPTO("sha384"); 217918ecefSArd Biesheuvel MODULE_ALIAS_CRYPTO("sha512"); 227918ecefSArd Biesheuvel 236320a15eSSami Tolvanen asmlinkage void sha512_block_data_order(u64 *digest, const void *data, 247918ecefSArd Biesheuvel unsigned int num_blks); 25fb87127bSArd Biesheuvel EXPORT_SYMBOL(sha512_block_data_order); 267918ecefSArd Biesheuvel 276320a15eSSami Tolvanen static void __sha512_block_data_order(struct sha512_state *sst, u8 const *src, 286320a15eSSami Tolvanen int blocks) 296320a15eSSami Tolvanen { 306320a15eSSami Tolvanen sha512_block_data_order(sst->state, src, blocks); 316320a15eSSami Tolvanen } 326320a15eSSami Tolvanen 337918ecefSArd Biesheuvel static int sha512_update(struct shash_desc *desc, const u8 *data, 347918ecefSArd Biesheuvel unsigned int len) 357918ecefSArd Biesheuvel { 367918ecefSArd Biesheuvel return sha512_base_do_update(desc, data, len, 376320a15eSSami Tolvanen __sha512_block_data_order); 387918ecefSArd Biesheuvel } 397918ecefSArd Biesheuvel 407918ecefSArd Biesheuvel static int sha512_finup(struct shash_desc *desc, const u8 *data, 417918ecefSArd Biesheuvel unsigned int len, u8 *out) 427918ecefSArd Biesheuvel { 437918ecefSArd Biesheuvel if (len) 447918ecefSArd Biesheuvel sha512_base_do_update(desc, data, len, 456320a15eSSami Tolvanen __sha512_block_data_order); 466320a15eSSami Tolvanen sha512_base_do_finalize(desc, __sha512_block_data_order); 477918ecefSArd Biesheuvel 487918ecefSArd Biesheuvel return sha512_base_finish(desc, out); 497918ecefSArd Biesheuvel } 507918ecefSArd Biesheuvel 517918ecefSArd Biesheuvel static int sha512_final(struct shash_desc *desc, u8 *out) 527918ecefSArd Biesheuvel { 537918ecefSArd Biesheuvel return sha512_finup(desc, NULL, 0, out); 547918ecefSArd Biesheuvel } 557918ecefSArd Biesheuvel 567918ecefSArd Biesheuvel static struct shash_alg algs[] = { { 577918ecefSArd Biesheuvel .digestsize = SHA512_DIGEST_SIZE, 587918ecefSArd Biesheuvel .init = sha512_base_init, 597918ecefSArd Biesheuvel .update = sha512_update, 607918ecefSArd Biesheuvel .final = sha512_final, 617918ecefSArd Biesheuvel .finup = sha512_finup, 627918ecefSArd Biesheuvel .descsize = sizeof(struct sha512_state), 637918ecefSArd Biesheuvel .base.cra_name = "sha512", 647918ecefSArd Biesheuvel .base.cra_driver_name = "sha512-arm64", 657918ecefSArd Biesheuvel .base.cra_priority = 150, 667918ecefSArd Biesheuvel .base.cra_blocksize = SHA512_BLOCK_SIZE, 677918ecefSArd Biesheuvel .base.cra_module = THIS_MODULE, 687918ecefSArd Biesheuvel }, { 697918ecefSArd Biesheuvel .digestsize = SHA384_DIGEST_SIZE, 707918ecefSArd Biesheuvel .init = sha384_base_init, 717918ecefSArd Biesheuvel .update = sha512_update, 727918ecefSArd Biesheuvel .final = sha512_final, 737918ecefSArd Biesheuvel .finup = sha512_finup, 747918ecefSArd Biesheuvel .descsize = sizeof(struct sha512_state), 757918ecefSArd Biesheuvel .base.cra_name = "sha384", 767918ecefSArd Biesheuvel .base.cra_driver_name = "sha384-arm64", 777918ecefSArd Biesheuvel .base.cra_priority = 150, 787918ecefSArd Biesheuvel .base.cra_blocksize = SHA384_BLOCK_SIZE, 797918ecefSArd Biesheuvel .base.cra_module = THIS_MODULE, 807918ecefSArd Biesheuvel } }; 817918ecefSArd Biesheuvel 827918ecefSArd Biesheuvel static int __init sha512_mod_init(void) 837918ecefSArd Biesheuvel { 847918ecefSArd Biesheuvel return crypto_register_shashes(algs, ARRAY_SIZE(algs)); 857918ecefSArd Biesheuvel } 867918ecefSArd Biesheuvel 877918ecefSArd Biesheuvel static void __exit sha512_mod_fini(void) 887918ecefSArd Biesheuvel { 897918ecefSArd Biesheuvel crypto_unregister_shashes(algs, ARRAY_SIZE(algs)); 907918ecefSArd Biesheuvel } 917918ecefSArd Biesheuvel 927918ecefSArd Biesheuvel module_init(sha512_mod_init); 937918ecefSArd Biesheuvel module_exit(sha512_mod_fini); 94