xref: /openbmc/linux/crypto/sha256_generic.c (revision 96ede30f)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2ad5d2789SSebastian Siewior /*
308c327f6SHans de Goede  * Crypto API wrapper for the generic SHA256 code from lib/crypto/sha256.c
4ad5d2789SSebastian Siewior  *
5ad5d2789SSebastian Siewior  * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com>
6ad5d2789SSebastian Siewior  * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
7ad5d2789SSebastian Siewior  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8cd12fb90SJonathan Lynch  * SHA224 Support Copyright 2007 Intel Corporation <jonathan.lynch@intel.com>
9ad5d2789SSebastian Siewior  */
1050e109b5SAdrian-Ken Rueegsegger #include <crypto/internal/hash.h>
11ad5d2789SSebastian Siewior #include <linux/init.h>
12ad5d2789SSebastian Siewior #include <linux/module.h>
13ad5d2789SSebastian Siewior #include <linux/mm.h>
14ad5d2789SSebastian Siewior #include <linux/types.h>
15a24d22b2SEric Biggers #include <crypto/sha2.h>
16a2e5ba4fSArd Biesheuvel #include <crypto/sha256_base.h>
17ad5d2789SSebastian Siewior #include <asm/byteorder.h>
18be34c4efSDavid S. Miller #include <asm/unaligned.h>
19ad5d2789SSebastian Siewior 
200c4c78deSLABBE Corentin const u8 sha224_zero_message_hash[SHA224_DIGEST_SIZE] = {
210c4c78deSLABBE Corentin 	0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47,
220c4c78deSLABBE Corentin 	0x61, 0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2,
230c4c78deSLABBE Corentin 	0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a, 0xc5, 0xb3, 0xe4,
240c4c78deSLABBE Corentin 	0x2f
250c4c78deSLABBE Corentin };
260c4c78deSLABBE Corentin EXPORT_SYMBOL_GPL(sha224_zero_message_hash);
270c4c78deSLABBE Corentin 
280c4c78deSLABBE Corentin const u8 sha256_zero_message_hash[SHA256_DIGEST_SIZE] = {
290c4c78deSLABBE Corentin 	0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
300c4c78deSLABBE Corentin 	0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
310c4c78deSLABBE Corentin 	0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
320c4c78deSLABBE Corentin 	0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
330c4c78deSLABBE Corentin };
340c4c78deSLABBE Corentin EXPORT_SYMBOL_GPL(sha256_zero_message_hash);
350c4c78deSLABBE Corentin 
crypto_sha256_update(struct shash_desc * desc,const u8 * data,unsigned int len)3635d2c9d0STim Chen int crypto_sha256_update(struct shash_desc *desc, const u8 *data,
37ad5d2789SSebastian Siewior 			  unsigned int len)
38ad5d2789SSebastian Siewior {
3913855fd8SEric Biggers 	sha256_update(shash_desc_ctx(desc), data, len);
4013855fd8SEric Biggers 	return 0;
41ad5d2789SSebastian Siewior }
4235d2c9d0STim Chen EXPORT_SYMBOL(crypto_sha256_update);
43ad5d2789SSebastian Siewior 
crypto_sha256_final(struct shash_desc * desc,u8 * out)4408c327f6SHans de Goede static int crypto_sha256_final(struct shash_desc *desc, u8 *out)
45ad5d2789SSebastian Siewior {
4608c327f6SHans de Goede 	if (crypto_shash_digestsize(desc->tfm) == SHA224_DIGEST_SIZE)
4713855fd8SEric Biggers 		sha224_final(shash_desc_ctx(desc), out);
4808c327f6SHans de Goede 	else
4913855fd8SEric Biggers 		sha256_final(shash_desc_ctx(desc), out);
5013855fd8SEric Biggers 	return 0;
51ad5d2789SSebastian Siewior }
52ad5d2789SSebastian Siewior 
crypto_sha256_finup(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * hash)53a2e5ba4fSArd Biesheuvel int crypto_sha256_finup(struct shash_desc *desc, const u8 *data,
54a2e5ba4fSArd Biesheuvel 			unsigned int len, u8 *hash)
55cd12fb90SJonathan Lynch {
5608c327f6SHans de Goede 	sha256_update(shash_desc_ctx(desc), data, len);
5708c327f6SHans de Goede 	return crypto_sha256_final(desc, hash);
58cd12fb90SJonathan Lynch }
59a2e5ba4fSArd Biesheuvel EXPORT_SYMBOL(crypto_sha256_finup);
609b2fda7bSHerbert Xu 
616aeb49bcSJussi Kivilinna static struct shash_alg sha256_algs[2] = { {
6250e109b5SAdrian-Ken Rueegsegger 	.digestsize	=	SHA256_DIGEST_SIZE,
63*96ede30fSTianjia Zhang 	.init		=	sha256_base_init,
6435d2c9d0STim Chen 	.update		=	crypto_sha256_update,
6508c327f6SHans de Goede 	.final		=	crypto_sha256_final,
66a2e5ba4fSArd Biesheuvel 	.finup		=	crypto_sha256_finup,
679b2fda7bSHerbert Xu 	.descsize	=	sizeof(struct sha256_state),
6850e109b5SAdrian-Ken Rueegsegger 	.base		=	{
69ad5d2789SSebastian Siewior 		.cra_name	=	"sha256",
70ad5d2789SSebastian Siewior 		.cra_driver_name=	"sha256-generic",
71b73b7ac0SEric Biggers 		.cra_priority	=	100,
725265eeb2SJan Glauber 		.cra_blocksize	=	SHA256_BLOCK_SIZE,
73ad5d2789SSebastian Siewior 		.cra_module	=	THIS_MODULE,
7450e109b5SAdrian-Ken Rueegsegger 	}
756aeb49bcSJussi Kivilinna }, {
7650e109b5SAdrian-Ken Rueegsegger 	.digestsize	=	SHA224_DIGEST_SIZE,
77*96ede30fSTianjia Zhang 	.init		=	sha224_base_init,
7835d2c9d0STim Chen 	.update		=	crypto_sha256_update,
7908c327f6SHans de Goede 	.final		=	crypto_sha256_final,
80a2e5ba4fSArd Biesheuvel 	.finup		=	crypto_sha256_finup,
819b2fda7bSHerbert Xu 	.descsize	=	sizeof(struct sha256_state),
8250e109b5SAdrian-Ken Rueegsegger 	.base		=	{
83cd12fb90SJonathan Lynch 		.cra_name	=	"sha224",
84cd12fb90SJonathan Lynch 		.cra_driver_name=	"sha224-generic",
85b73b7ac0SEric Biggers 		.cra_priority	=	100,
86cd12fb90SJonathan Lynch 		.cra_blocksize	=	SHA224_BLOCK_SIZE,
87cd12fb90SJonathan Lynch 		.cra_module	=	THIS_MODULE,
8850e109b5SAdrian-Ken Rueegsegger 	}
896aeb49bcSJussi Kivilinna } };
90cd12fb90SJonathan Lynch 
sha256_generic_mod_init(void)913af5b90bSKamalesh Babulal static int __init sha256_generic_mod_init(void)
92ad5d2789SSebastian Siewior {
936aeb49bcSJussi Kivilinna 	return crypto_register_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
94ad5d2789SSebastian Siewior }
95ad5d2789SSebastian Siewior 
sha256_generic_mod_fini(void)963af5b90bSKamalesh Babulal static void __exit sha256_generic_mod_fini(void)
97ad5d2789SSebastian Siewior {
986aeb49bcSJussi Kivilinna 	crypto_unregister_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
99ad5d2789SSebastian Siewior }
100ad5d2789SSebastian Siewior 
101c4741b23SEric Biggers subsys_initcall(sha256_generic_mod_init);
1023af5b90bSKamalesh Babulal module_exit(sha256_generic_mod_fini);
103ad5d2789SSebastian Siewior 
104ad5d2789SSebastian Siewior MODULE_LICENSE("GPL");
105cd12fb90SJonathan Lynch MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm");
106ad5d2789SSebastian Siewior 
1075d26a105SKees Cook MODULE_ALIAS_CRYPTO("sha224");
1083e14dcf7SMathias Krause MODULE_ALIAS_CRYPTO("sha224-generic");
1095d26a105SKees Cook MODULE_ALIAS_CRYPTO("sha256");
1103e14dcf7SMathias Krause MODULE_ALIAS_CRYPTO("sha256-generic");
111