162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Purgatory code running between two kernels. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright IBM Corp. 2018 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author(s): Philipp Rudo <prudo@linux.vnet.ibm.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/kexec.h> 1162306a36Sopenharmony_ci#include <linux/string.h> 1262306a36Sopenharmony_ci#include <crypto/sha2.h> 1362306a36Sopenharmony_ci#include <asm/purgatory.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciint verify_sha256_digest(void) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci struct kexec_sha_region *ptr, *end; 1862306a36Sopenharmony_ci u8 digest[SHA256_DIGEST_SIZE]; 1962306a36Sopenharmony_ci struct sha256_state sctx; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci sha256_init(&sctx); 2262306a36Sopenharmony_ci end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci for (ptr = purgatory_sha_regions; ptr < end; ptr++) 2562306a36Sopenharmony_ci sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci sha256_final(&sctx, digest); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (memcmp(digest, purgatory_sha256_digest, sizeof(digest))) 3062306a36Sopenharmony_ci return 1; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci return 0; 3362306a36Sopenharmony_ci} 34