12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2ad5d2789SSebastian Siewior /* 3ad5d2789SSebastian Siewior * Cryptographic API. 4ad5d2789SSebastian Siewior * 5ad5d2789SSebastian Siewior * SHA1 Secure Hash Algorithm. 6ad5d2789SSebastian Siewior * 7ad5d2789SSebastian Siewior * Derived from cryptoapi implementation, adapted for in-place 8ad5d2789SSebastian Siewior * scatterlist interface. 9ad5d2789SSebastian Siewior * 10ad5d2789SSebastian Siewior * Copyright (c) Alan Smithee. 11ad5d2789SSebastian Siewior * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> 12ad5d2789SSebastian Siewior * Copyright (c) Jean-Francois Dive <jef@linuxbe.org> 13ad5d2789SSebastian Siewior */ 1454ccb367SAdrian-Ken Rueegsegger #include <crypto/internal/hash.h> 15ad5d2789SSebastian Siewior #include <linux/init.h> 16ad5d2789SSebastian Siewior #include <linux/module.h> 17ad5d2789SSebastian Siewior #include <linux/mm.h> 18ad5d2789SSebastian Siewior #include <linux/cryptohash.h> 19ad5d2789SSebastian Siewior #include <linux/types.h> 205265eeb2SJan Glauber #include <crypto/sha.h> 217c71f0f7SArd Biesheuvel #include <crypto/sha1_base.h> 22ad5d2789SSebastian Siewior #include <asm/byteorder.h> 23ad5d2789SSebastian Siewior 240c4c78deSLABBE Corentin const u8 sha1_zero_message_hash[SHA1_DIGEST_SIZE] = { 250c4c78deSLABBE Corentin 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 260c4c78deSLABBE Corentin 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 270c4c78deSLABBE Corentin 0xaf, 0xd8, 0x07, 0x09 280c4c78deSLABBE Corentin }; 290c4c78deSLABBE Corentin EXPORT_SYMBOL_GPL(sha1_zero_message_hash); 300c4c78deSLABBE Corentin 317c71f0f7SArd Biesheuvel static void sha1_generic_block_fn(struct sha1_state *sst, u8 const *src, 327c71f0f7SArd Biesheuvel int blocks) 33ad5d2789SSebastian Siewior { 347c71f0f7SArd Biesheuvel u32 temp[SHA_WORKSPACE_WORDS]; 3554ccb367SAdrian-Ken Rueegsegger 367c71f0f7SArd Biesheuvel while (blocks--) { 377c71f0f7SArd Biesheuvel sha_transform(sst->state, src, temp); 387c71f0f7SArd Biesheuvel src += SHA1_BLOCK_SIZE; 397c71f0f7SArd Biesheuvel } 407c71f0f7SArd Biesheuvel memzero_explicit(temp, sizeof(temp)); 41ad5d2789SSebastian Siewior } 42ad5d2789SSebastian Siewior 437c390170SMathias Krause int crypto_sha1_update(struct shash_desc *desc, const u8 *data, 44ad5d2789SSebastian Siewior unsigned int len) 45ad5d2789SSebastian Siewior { 467c71f0f7SArd Biesheuvel return sha1_base_do_update(desc, data, len, sha1_generic_block_fn); 47ad5d2789SSebastian Siewior } 487c390170SMathias Krause EXPORT_SYMBOL(crypto_sha1_update); 49ad5d2789SSebastian Siewior 5054ccb367SAdrian-Ken Rueegsegger static int sha1_final(struct shash_desc *desc, u8 *out) 51ad5d2789SSebastian Siewior { 527c71f0f7SArd Biesheuvel sha1_base_do_finalize(desc, sha1_generic_block_fn); 537c71f0f7SArd Biesheuvel return sha1_base_finish(desc, out); 54ad5d2789SSebastian Siewior } 55ad5d2789SSebastian Siewior 567c71f0f7SArd Biesheuvel int crypto_sha1_finup(struct shash_desc *desc, const u8 *data, 577c71f0f7SArd Biesheuvel unsigned int len, u8 *out) 58e2a7ce4eSHerbert Xu { 597c71f0f7SArd Biesheuvel sha1_base_do_update(desc, data, len, sha1_generic_block_fn); 607c71f0f7SArd Biesheuvel return sha1_final(desc, out); 61e2a7ce4eSHerbert Xu } 627c71f0f7SArd Biesheuvel EXPORT_SYMBOL(crypto_sha1_finup); 63e2a7ce4eSHerbert Xu 6454ccb367SAdrian-Ken Rueegsegger static struct shash_alg alg = { 6554ccb367SAdrian-Ken Rueegsegger .digestsize = SHA1_DIGEST_SIZE, 667c71f0f7SArd Biesheuvel .init = sha1_base_init, 677c390170SMathias Krause .update = crypto_sha1_update, 6854ccb367SAdrian-Ken Rueegsegger .final = sha1_final, 697c71f0f7SArd Biesheuvel .finup = crypto_sha1_finup, 70e2a7ce4eSHerbert Xu .descsize = sizeof(struct sha1_state), 7154ccb367SAdrian-Ken Rueegsegger .base = { 72ad5d2789SSebastian Siewior .cra_name = "sha1", 73ad5d2789SSebastian Siewior .cra_driver_name= "sha1-generic", 7490ef3e48SEric Biggers .cra_priority = 100, 755265eeb2SJan Glauber .cra_blocksize = SHA1_BLOCK_SIZE, 76ad5d2789SSebastian Siewior .cra_module = THIS_MODULE, 7754ccb367SAdrian-Ken Rueegsegger } 78ad5d2789SSebastian Siewior }; 79ad5d2789SSebastian Siewior 803af5b90bSKamalesh Babulal static int __init sha1_generic_mod_init(void) 81ad5d2789SSebastian Siewior { 8254ccb367SAdrian-Ken Rueegsegger return crypto_register_shash(&alg); 83ad5d2789SSebastian Siewior } 84ad5d2789SSebastian Siewior 853af5b90bSKamalesh Babulal static void __exit sha1_generic_mod_fini(void) 86ad5d2789SSebastian Siewior { 8754ccb367SAdrian-Ken Rueegsegger crypto_unregister_shash(&alg); 88ad5d2789SSebastian Siewior } 89ad5d2789SSebastian Siewior 90c4741b23SEric Biggers subsys_initcall(sha1_generic_mod_init); 913af5b90bSKamalesh Babulal module_exit(sha1_generic_mod_fini); 92ad5d2789SSebastian Siewior 93ad5d2789SSebastian Siewior MODULE_LICENSE("GPL"); 94ad5d2789SSebastian Siewior MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); 95ad5d2789SSebastian Siewior 965d26a105SKees Cook MODULE_ALIAS_CRYPTO("sha1"); 973e14dcf7SMathias Krause MODULE_ALIAS_CRYPTO("sha1-generic"); 98