18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Purgatory code running between two kernels. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2018 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Author(s): Philipp Rudo <prudo@linux.vnet.ibm.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/kexec.h> 118c2ecf20Sopenharmony_ci#include <linux/string.h> 128c2ecf20Sopenharmony_ci#include <crypto/sha.h> 138c2ecf20Sopenharmony_ci#include <asm/purgatory.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciint verify_sha256_digest(void) 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci struct kexec_sha_region *ptr, *end; 188c2ecf20Sopenharmony_ci u8 digest[SHA256_DIGEST_SIZE]; 198c2ecf20Sopenharmony_ci struct sha256_state sctx; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci sha256_init(&sctx); 228c2ecf20Sopenharmony_ci end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci for (ptr = purgatory_sha_regions; ptr < end; ptr++) 258c2ecf20Sopenharmony_ci sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len); 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci sha256_final(&sctx, digest); 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (memcmp(digest, purgatory_sha256_digest, sizeof(digest))) 308c2ecf20Sopenharmony_ci return 1; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci return 0; 338c2ecf20Sopenharmony_ci} 34