blob: 5ee05c624a3f124b8d743be63711e1c64d0ef544 [file] [log] [blame]
#include <grub/err.h>
#include <grub/i18n.h>
#include <grub/misc.h>
#include <grub/mm.h>
#include <grub/tpm.h>
#include <grub/term.h>
#include <grub/verify.h>
#include <grub/dl.h>
GRUB_MOD_LICENSE ("GPLv3+")
grub_err_t
grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
const char *description)
{
return grub_tpm_log_event (buf, size, pcr, description);
}
static grub_err_t
grub_tpm_verify_init (grub_file_t io,
enum grub_file_type type __attribute__ ((unused)),
void **context, enum grub_verify_flags *flags)
{
*context = io->name;
*flags |= GRUB_VERIFY_FLAGS_SINGLE_CHUNK;
return GRUB_ERR_NONE;
}
static grub_err_t
grub_tpm_verify_write (void *context, void *buf, grub_size_t size)
{
return grub_tpm_measure (buf, size, 9, context);
}
static void
grub_tpm_verify_close (void *ctxt __attribute__ ((unused)))
{
return;
}
static grub_err_t
grub_tpm_verify_string (char *str, enum grub_verify_string_type type)
{
const char *prefix = NULL;
char *description;
grub_err_t status;
switch (type)
{
case GRUB_VERIFY_KERNEL_CMDLINE:
prefix = "kernel_cmdline: ";
break;
case GRUB_VERIFY_MODULE_CMDLINE:
prefix = "module_cmdline: ";
break;
case GRUB_VERIFY_COMMAND:
prefix = "grub_cmd: ";
break;
}
description = grub_malloc(grub_strlen(str) + grub_strlen(prefix) + 1);
if (!description)
return grub_errno;
grub_memcpy(description, prefix, grub_strlen(prefix));
grub_memcpy(description + grub_strlen(prefix), str, grub_strlen(str) + 1);
status = grub_tpm_measure ((unsigned char *) str, grub_strlen (str), 8,
description);
grub_free(description);
return status;
}
struct grub_file_verifier grub_tpm_verifier = {
.name = "tpm",
.init = grub_tpm_verify_init,
.write = grub_tpm_verify_write,
.close = grub_tpm_verify_close,
.verify_string = grub_tpm_verify_string,
};
GRUB_MOD_INIT(tpm)
{
grub_verifier_register (&grub_tpm_verifier);
}
GRUB_MOD_FINI(tpm)
{
grub_verifier_unregister (&grub_tpm_verifier);
}