0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/bug.h>
0012 #include <linux/kernel.h>
0013 #include <linux/types.h>
0014 #include <crypto/sha2.h>
0015 #include <asm/purgatory.h>
0016
0017 #include "../boot/string.h"
0018
0019 u8 purgatory_sha256_digest[SHA256_DIGEST_SIZE] __section(".kexec-purgatory");
0020
0021 struct kexec_sha_region purgatory_sha_regions[KEXEC_SEGMENT_MAX] __section(".kexec-purgatory");
0022
0023 static int verify_sha256_digest(void)
0024 {
0025 struct kexec_sha_region *ptr, *end;
0026 u8 digest[SHA256_DIGEST_SIZE];
0027 struct sha256_state sctx;
0028
0029 sha256_init(&sctx);
0030 end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions);
0031
0032 for (ptr = purgatory_sha_regions; ptr < end; ptr++)
0033 sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len);
0034
0035 sha256_final(&sctx, digest);
0036
0037 if (memcmp(digest, purgatory_sha256_digest, sizeof(digest)))
0038 return 1;
0039
0040 return 0;
0041 }
0042
0043 void purgatory(void)
0044 {
0045 int ret;
0046
0047 ret = verify_sha256_digest();
0048 if (ret) {
0049
0050 for (;;)
0051 ;
0052 }
0053 }
0054
0055
0056
0057
0058
0059 void warn(const char *msg) {}