mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-24 16:19:22 +00:00
tpm2_key_protector: Add grub-emu support
As a preparation to test tpm2_key_protector with grub-emu, the new option, --tpm-device, is introduced to specify the TPM device for grub-emu so that grub-emu can access an emulated TPM device from the host. Since grub-emu can directly access the device on host, it's easy to implement the essential TCG2 command submission function with the read/write functions and enable tpm2_key_protector module for grub-emu, so that we can further test TPM2 key unsealing with grub-emu. Signed-off-by: Gary Lin <glin@suse.com> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> Tested-by: Stefan Berger <stefanb@linux.ibm.com>
This commit is contained in:
1 parent
135e0bc886
commit
76a2bcb997
5 files changed
+118
-1
No files matched your search
@@ -55,7 +55,7 @@
|
||||
static jmp_buf main_env;
|
||||
|
||||
/* Store the prefix specified by an argument. */
|
||||
static char *root_dev = NULL, *dir = NULL;
|
||||
static char *root_dev = NULL, *dir = NULL, *tpm_dev = NULL;
|
||||
|
||||
grub_addr_t grub_modbase = 0;
|
||||
|
||||
@@ -108,6 +108,7 @@ static struct argp_option options[] = {
|
||||
{"verbose", 'v', 0, 0, N_("print verbose messages."), 0},
|
||||
{"hold", 'H', N_("SECS"), OPTION_ARG_OPTIONAL, N_("wait until a debugger will attach"), 0},
|
||||
{"kexec", 'X', 0, 0, N_("use kexec to boot Linux kernels via systemctl (pass twice to enable dangerous fallback to non-systemctl)."), 0},
|
||||
{"tpm-device", 't', N_("DEV"), 0, N_("set TPM device."), 0},
|
||||
{ 0, 0, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
@@ -168,6 +169,10 @@ argp_parser (int key, char *arg, struct argp_state *state)
|
||||
case 'X':
|
||||
grub_util_set_kexecute ();
|
||||
break;
|
||||
case 't':
|
||||
free (tpm_dev);
|
||||
tpm_dev = xstrdup (arg);
|
||||
break;
|
||||
|
||||
case ARGP_KEY_ARG:
|
||||
{
|
||||
@@ -276,6 +281,9 @@ main (int argc, char *argv[])
|
||||
|
||||
dir = xstrdup (dir);
|
||||
|
||||
if (tpm_dev)
|
||||
grub_util_tpm_open (tpm_dev);
|
||||
|
||||
/* Start GRUB! */
|
||||
if (setjmp (main_env) == 0)
|
||||
grub_main ();
|
||||
@@ -283,6 +291,7 @@ main (int argc, char *argv[])
|
||||
grub_fini_all ();
|
||||
grub_hostfs_fini ();
|
||||
grub_host_fini ();
|
||||
grub_util_tpm_close ();
|
||||
|
||||
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <grub/mm.h>
|
||||
#include <grub/err.h>
|
||||
@@ -41,6 +43,8 @@
|
||||
int verbosity;
|
||||
int kexecute;
|
||||
|
||||
static int grub_util_tpm_fd = -1;
|
||||
|
||||
void
|
||||
grub_util_warn (const char *fmt, ...)
|
||||
{
|
||||
@@ -230,3 +234,50 @@ grub_util_get_kexecute (void)
|
||||
{
|
||||
return kexecute;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_util_tpm_open (const char *tpm_dev)
|
||||
{
|
||||
if (grub_util_tpm_fd != -1)
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
grub_util_tpm_fd = open (tpm_dev, O_RDWR);
|
||||
if (grub_util_tpm_fd == -1)
|
||||
grub_util_error (_("cannot open TPM device '%s': %s"), tpm_dev, strerror (errno));
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_util_tpm_close (void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (grub_util_tpm_fd == -1)
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
err = close (grub_util_tpm_fd);
|
||||
if (err != GRUB_ERR_NONE)
|
||||
grub_util_error (_("cannot close TPM device: %s"), strerror (errno));
|
||||
|
||||
grub_util_tpm_fd = -1;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_size_t
|
||||
grub_util_tpm_read (void *output, grub_size_t size)
|
||||
{
|
||||
if (grub_util_tpm_fd == -1)
|
||||
return -1;
|
||||
|
||||
return read (grub_util_tpm_fd, output, size);
|
||||
}
|
||||
|
||||
grub_size_t
|
||||
grub_util_tpm_write (const void *input, grub_size_t size)
|
||||
{
|
||||
if (grub_util_tpm_fd == -1)
|
||||
return -1;
|
||||
|
||||
return write (grub_util_tpm_fd, input, size);
|
||||
}
|
||||
Reference in new issue
Block a user