Measure kernel and initrd on BIOS systems

Measure the kernel and initrd when loaded on BIOS systems
This commit is contained in:
Matthew Garrett 2015-08-09 16:28:29 -07:00
parent 738f6f09b3
commit 20e355fd5a
3 changed files with 10 additions and 0 deletions

View file

@ -35,6 +35,7 @@
#include <grub/i18n.h> #include <grub/i18n.h>
#include <grub/lib/cmdline.h> #include <grub/lib/cmdline.h>
#include <grub/linux.h> #include <grub/linux.h>
#include <grub/tpm.h>
#include "verity-hash.h" #include "verity-hash.h"
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@ -717,7 +718,10 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
goto fail; goto fail;
} }
grub_tpm_measure (kernel, len, GRUB_KERNEL_PCR, "Linux Kernel");
grub_memcpy (&lh, kernel, sizeof (lh)); grub_memcpy (&lh, kernel, sizeof (lh));
kernel_offset = sizeof (lh); kernel_offset = sizeof (lh);
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55)) if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
@ -1027,6 +1031,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
grub_pass_verity_hash(&lh, linux_cmdline); grub_pass_verity_hash(&lh, linux_cmdline);
len = prot_file_size; len = prot_file_size;
grub_memcpy (prot_mode_mem, kernel + kernel_offset, len); grub_memcpy (prot_mode_mem, kernel + kernel_offset, len);
kernel_offset += len;
if (grub_errno == GRUB_ERR_NONE) if (grub_errno == GRUB_ERR_NONE)
{ {

View file

@ -35,6 +35,7 @@
#include <grub/i386/floppy.h> #include <grub/i386/floppy.h>
#include <grub/lib/cmdline.h> #include <grub/lib/cmdline.h>
#include <grub/linux.h> #include <grub/linux.h>
#include <grub/tpm.h>
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@ -160,6 +161,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
goto fail; goto fail;
} }
grub_tpm_measure (kernel, len, GRUB_KERNEL_PCR, "BIOS Linux Kernel");
grub_memcpy (&lh, kernel, sizeof (lh)); grub_memcpy (&lh, kernel, sizeof (lh));
kernel_offset = sizeof (lh); kernel_offset = sizeof (lh);

View file

@ -4,6 +4,7 @@
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/file.h> #include <grub/file.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/tpm.h>
struct newc_head struct newc_head
{ {
@ -288,6 +289,7 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
grub_initrd_close (initrd_ctx); grub_initrd_close (initrd_ctx);
return grub_errno; return grub_errno;
} }
grub_tpm_measure (ptr, cursize, GRUB_INITRD_PCR, "Linux Initrd");
ptr += cursize; ptr += cursize;
} }
if (newc) if (newc)