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 237918ecefSArd Biesheuvel asmlinkage void sha512_block_data_order(u32 *digest, const void *data, 247918ecefSArd Biesheuvel unsigned int num_blks); 25fb87127bSArd Biesheuvel EXPORT_SYMBOL(sha512_block_data_order); 267918ecefSArd Biesheuvel 277918ecefSArd Biesheuvel static int sha512_update(struct shash_desc *desc, const u8 *data, 287918ecefSArd Biesheuvel unsigned int len) 297918ecefSArd Biesheuvel { 307918ecefSArd Biesheuvel return sha512_base_do_update(desc, data, len, 317918ecefSArd Biesheuvel (sha512_block_fn *)sha512_block_data_order); 327918ecefSArd Biesheuvel } 337918ecefSArd Biesheuvel 347918ecefSArd Biesheuvel static int sha512_finup(struct shash_desc *desc, const u8 *data, 357918ecefSArd Biesheuvel unsigned int len, u8 *out) 367918ecefSArd Biesheuvel { 377918ecefSArd Biesheuvel if (len) 387918ecefSArd Biesheuvel sha512_base_do_update(desc, data, len, 397918ecefSArd Biesheuvel (sha512_block_fn *)sha512_block_data_order); 407918ecefSArd Biesheuvel sha512_base_do_finalize(desc, 417918ecefSArd Biesheuvel (sha512_block_fn *)sha512_block_data_order); 427918ecefSArd Biesheuvel 437918ecefSArd Biesheuvel return sha512_base_finish(desc, out); 447918ecefSArd Biesheuvel } 457918ecefSArd Biesheuvel 467918ecefSArd Biesheuvel static int sha512_final(struct shash_desc *desc, u8 *out) 477918ecefSArd Biesheuvel { 487918ecefSArd Biesheuvel return sha512_finup(desc, NULL, 0, out); 497918ecefSArd Biesheuvel } 507918ecefSArd Biesheuvel 517918ecefSArd Biesheuvel static struct shash_alg algs[] = { { 527918ecefSArd Biesheuvel .digestsize = SHA512_DIGEST_SIZE, 537918ecefSArd Biesheuvel .init = sha512_base_init, 547918ecefSArd Biesheuvel .update = sha512_update, 557918ecefSArd Biesheuvel .final = sha512_final, 567918ecefSArd Biesheuvel .finup = sha512_finup, 577918ecefSArd Biesheuvel .descsize = sizeof(struct sha512_state), 587918ecefSArd Biesheuvel .base.cra_name = "sha512", 597918ecefSArd Biesheuvel .base.cra_driver_name = "sha512-arm64", 607918ecefSArd Biesheuvel .base.cra_priority = 150, 617918ecefSArd Biesheuvel .base.cra_blocksize = SHA512_BLOCK_SIZE, 627918ecefSArd Biesheuvel .base.cra_module = THIS_MODULE, 637918ecefSArd Biesheuvel }, { 647918ecefSArd Biesheuvel .digestsize = SHA384_DIGEST_SIZE, 657918ecefSArd Biesheuvel .init = sha384_base_init, 667918ecefSArd Biesheuvel .update = sha512_update, 677918ecefSArd Biesheuvel .final = sha512_final, 687918ecefSArd Biesheuvel .finup = sha512_finup, 697918ecefSArd Biesheuvel .descsize = sizeof(struct sha512_state), 707918ecefSArd Biesheuvel .base.cra_name = "sha384", 717918ecefSArd Biesheuvel .base.cra_driver_name = "sha384-arm64", 727918ecefSArd Biesheuvel .base.cra_priority = 150, 737918ecefSArd Biesheuvel .base.cra_blocksize = SHA384_BLOCK_SIZE, 747918ecefSArd Biesheuvel .base.cra_module = THIS_MODULE, 757918ecefSArd Biesheuvel } }; 767918ecefSArd Biesheuvel 777918ecefSArd Biesheuvel static int __init sha512_mod_init(void) 787918ecefSArd Biesheuvel { 797918ecefSArd Biesheuvel return crypto_register_shashes(algs, ARRAY_SIZE(algs)); 807918ecefSArd Biesheuvel } 817918ecefSArd Biesheuvel 827918ecefSArd Biesheuvel static void __exit sha512_mod_fini(void) 837918ecefSArd Biesheuvel { 847918ecefSArd Biesheuvel crypto_unregister_shashes(algs, ARRAY_SIZE(algs)); 857918ecefSArd Biesheuvel } 867918ecefSArd Biesheuvel 877918ecefSArd Biesheuvel module_init(sha512_mod_init); 887918ecefSArd Biesheuvel module_exit(sha512_mod_fini); 89