xref: /OK3568_Linux_fs/kernel/arch/s390/purgatory/purgatory.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Purgatory code running between two kernels.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright IBM Corp. 2018
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author(s): Philipp Rudo <prudo@linux.vnet.ibm.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/kexec.h>
11*4882a593Smuzhiyun #include <linux/string.h>
12*4882a593Smuzhiyun #include <crypto/sha.h>
13*4882a593Smuzhiyun #include <asm/purgatory.h>
14*4882a593Smuzhiyun 
verify_sha256_digest(void)15*4882a593Smuzhiyun int verify_sha256_digest(void)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun 	struct kexec_sha_region *ptr, *end;
18*4882a593Smuzhiyun 	u8 digest[SHA256_DIGEST_SIZE];
19*4882a593Smuzhiyun 	struct sha256_state sctx;
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun 	sha256_init(&sctx);
22*4882a593Smuzhiyun 	end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 	for (ptr = purgatory_sha_regions; ptr < end; ptr++)
25*4882a593Smuzhiyun 		sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len);
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	sha256_final(&sctx, digest);
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	if (memcmp(digest, purgatory_sha256_digest, sizeof(digest)))
30*4882a593Smuzhiyun 		return 1;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	return 0;
33*4882a593Smuzhiyun }
34