purgatory.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * purgatory: Runs between two kernels
  4. *
  5. * Copyright (C) 2014 Red Hat Inc.
  6. *
  7. * Author:
  8. * Vivek Goyal <[email protected]>
  9. */
  10. #include <linux/bug.h>
  11. #include <linux/kernel.h>
  12. #include <linux/types.h>
  13. #include <crypto/sha2.h>
  14. #include <asm/purgatory.h>
  15. #include "../boot/string.h"
  16. u8 purgatory_sha256_digest[SHA256_DIGEST_SIZE] __section(".kexec-purgatory");
  17. struct kexec_sha_region purgatory_sha_regions[KEXEC_SEGMENT_MAX] __section(".kexec-purgatory");
  18. static int verify_sha256_digest(void)
  19. {
  20. struct kexec_sha_region *ptr, *end;
  21. u8 digest[SHA256_DIGEST_SIZE];
  22. struct sha256_state sctx;
  23. sha256_init(&sctx);
  24. end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions);
  25. for (ptr = purgatory_sha_regions; ptr < end; ptr++)
  26. sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len);
  27. sha256_final(&sctx, digest);
  28. if (memcmp(digest, purgatory_sha256_digest, sizeof(digest)))
  29. return 1;
  30. return 0;
  31. }
  32. void purgatory(void)
  33. {
  34. int ret;
  35. ret = verify_sha256_digest();
  36. if (ret) {
  37. /* loop forever */
  38. for (;;)
  39. ;
  40. }
  41. }
  42. /*
  43. * Defined in order to reuse memcpy() and memset() from
  44. * arch/x86/boot/compressed/string.c
  45. */
  46. void warn(const char *msg) {}