18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Cryptographic API. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * SHA1 Secure Hash Algorithm. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Derived from cryptoapi implementation, adapted for in-place 88c2ecf20Sopenharmony_ci * scatterlist interface. 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * Copyright (c) Alan Smithee. 118c2ecf20Sopenharmony_ci * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> 128c2ecf20Sopenharmony_ci * Copyright (c) Jean-Francois Dive <jef@linuxbe.org> 138c2ecf20Sopenharmony_ci */ 148c2ecf20Sopenharmony_ci#include <crypto/internal/hash.h> 158c2ecf20Sopenharmony_ci#include <linux/init.h> 168c2ecf20Sopenharmony_ci#include <linux/module.h> 178c2ecf20Sopenharmony_ci#include <linux/mm.h> 188c2ecf20Sopenharmony_ci#include <linux/types.h> 198c2ecf20Sopenharmony_ci#include <crypto/sha.h> 208c2ecf20Sopenharmony_ci#include <crypto/sha1_base.h> 218c2ecf20Sopenharmony_ci#include <asm/byteorder.h> 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ciconst u8 sha1_zero_message_hash[SHA1_DIGEST_SIZE] = { 248c2ecf20Sopenharmony_ci 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 258c2ecf20Sopenharmony_ci 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 268c2ecf20Sopenharmony_ci 0xaf, 0xd8, 0x07, 0x09 278c2ecf20Sopenharmony_ci}; 288c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(sha1_zero_message_hash); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistatic void sha1_generic_block_fn(struct sha1_state *sst, u8 const *src, 318c2ecf20Sopenharmony_ci int blocks) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci u32 temp[SHA1_WORKSPACE_WORDS]; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci while (blocks--) { 368c2ecf20Sopenharmony_ci sha1_transform(sst->state, src, temp); 378c2ecf20Sopenharmony_ci src += SHA1_BLOCK_SIZE; 388c2ecf20Sopenharmony_ci } 398c2ecf20Sopenharmony_ci memzero_explicit(temp, sizeof(temp)); 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ciint crypto_sha1_update(struct shash_desc *desc, const u8 *data, 438c2ecf20Sopenharmony_ci unsigned int len) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci return sha1_base_do_update(desc, data, len, sha1_generic_block_fn); 468c2ecf20Sopenharmony_ci} 478c2ecf20Sopenharmony_ciEXPORT_SYMBOL(crypto_sha1_update); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistatic int sha1_final(struct shash_desc *desc, u8 *out) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci sha1_base_do_finalize(desc, sha1_generic_block_fn); 528c2ecf20Sopenharmony_ci return sha1_base_finish(desc, out); 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ciint crypto_sha1_finup(struct shash_desc *desc, const u8 *data, 568c2ecf20Sopenharmony_ci unsigned int len, u8 *out) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci sha1_base_do_update(desc, data, len, sha1_generic_block_fn); 598c2ecf20Sopenharmony_ci return sha1_final(desc, out); 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ciEXPORT_SYMBOL(crypto_sha1_finup); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistatic struct shash_alg alg = { 648c2ecf20Sopenharmony_ci .digestsize = SHA1_DIGEST_SIZE, 658c2ecf20Sopenharmony_ci .init = sha1_base_init, 668c2ecf20Sopenharmony_ci .update = crypto_sha1_update, 678c2ecf20Sopenharmony_ci .final = sha1_final, 688c2ecf20Sopenharmony_ci .finup = crypto_sha1_finup, 698c2ecf20Sopenharmony_ci .descsize = sizeof(struct sha1_state), 708c2ecf20Sopenharmony_ci .base = { 718c2ecf20Sopenharmony_ci .cra_name = "sha1", 728c2ecf20Sopenharmony_ci .cra_driver_name= "sha1-generic", 738c2ecf20Sopenharmony_ci .cra_priority = 100, 748c2ecf20Sopenharmony_ci .cra_blocksize = SHA1_BLOCK_SIZE, 758c2ecf20Sopenharmony_ci .cra_module = THIS_MODULE, 768c2ecf20Sopenharmony_ci } 778c2ecf20Sopenharmony_ci}; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistatic int __init sha1_generic_mod_init(void) 808c2ecf20Sopenharmony_ci{ 818c2ecf20Sopenharmony_ci return crypto_register_shash(&alg); 828c2ecf20Sopenharmony_ci} 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistatic void __exit sha1_generic_mod_fini(void) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci crypto_unregister_shash(&alg); 878c2ecf20Sopenharmony_ci} 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_cisubsys_initcall(sha1_generic_mod_init); 908c2ecf20Sopenharmony_cimodule_exit(sha1_generic_mod_fini); 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 938c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1"); 968c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1-generic"); 97