242 lines
7.1 KiB
Diff
242 lines
7.1 KiB
Diff
From 76a2bcb99754ee5b4159c35f66042e392139b815 Mon Sep 17 00:00:00 2001
|
|
From: Gary Lin <glin@suse.com>
|
|
Date: Fri, 15 Nov 2024 15:34:59 +0800
|
|
Subject: [PATCH] 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>
|
|
---
|
|
grub-core/Makefile.core.def | 3 +++
|
|
grub-core/kern/emu/main.c | 11 +++++++-
|
|
grub-core/kern/emu/misc.c | 51 +++++++++++++++++++++++++++++++++++
|
|
grub-core/lib/tss2/tcg2_emu.c | 49 +++++++++++++++++++++++++++++++++
|
|
include/grub/emu/misc.h | 5 ++++
|
|
5 files changed, 118 insertions(+), 1 deletion(-)
|
|
create mode 100644 grub-core/lib/tss2/tcg2_emu.c
|
|
|
|
Index: grub-2.12/grub-core/Makefile.core.def
|
|
===================================================================
|
|
--- grub-2.12.orig/grub-core/Makefile.core.def
|
|
+++ grub-2.12/grub-core/Makefile.core.def
|
|
@@ -2628,7 +2628,9 @@ module = {
|
|
common = lib/tss2/tpm2_cmd.c;
|
|
common = lib/tss2/tss2.c;
|
|
efi = lib/efi/tcg2.c;
|
|
+ emu = lib/tss2/tcg2_emu.c;
|
|
enable = efi;
|
|
+ enable = emu;
|
|
cppflags = '-I$(srcdir)/lib/tss2';
|
|
};
|
|
|
|
@@ -2640,6 +2642,7 @@ module = {
|
|
common = commands/tpm2_key_protector/tpm2key_asn1_tab.c;
|
|
/* The plaform support of tpm2_key_protector depends on the tcg2 implementation in tss2. */
|
|
enable = efi;
|
|
+ enable = emu;
|
|
cppflags = '-I$(srcdir)/lib/tss2';
|
|
};
|
|
|
|
Index: grub-2.12/grub-core/kern/emu/main.c
|
|
===================================================================
|
|
--- grub-2.12.orig/grub-core/kern/emu/main.c
|
|
+++ grub-2.12/grub-core/kern/emu/main.c
|
|
@@ -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
|
|
case 'X':
|
|
grub_util_set_kexecute ();
|
|
break;
|
|
+ case 't':
|
|
+ free (tpm_dev);
|
|
+ tpm_dev = xstrdup (arg);
|
|
+ break;
|
|
|
|
case ARGP_KEY_ARG:
|
|
{
|
|
@@ -282,6 +287,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 ();
|
|
@@ -289,6 +297,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);
|
|
|
|
Index: grub-2.12/grub-core/kern/emu/misc.c
|
|
===================================================================
|
|
--- grub-2.12.orig/grub-core/kern/emu/misc.c
|
|
+++ grub-2.12/grub-core/kern/emu/misc.c
|
|
@@ -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);
|
|
+}
|
|
Index: grub-2.12/grub-core/lib/tss2/tcg2_emu.c
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ grub-2.12/grub-core/lib/tss2/tcg2_emu.c
|
|
@@ -0,0 +1,49 @@
|
|
+/*
|
|
+ * GRUB -- GRand Unified Bootloader
|
|
+ * Copyright (C) 2024 SUSE LLC
|
|
+ * Copyright (C) 2024 Free Software Foundation, Inc.
|
|
+ *
|
|
+ * GRUB is free software: you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation, either version 3 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * GRUB is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
|
+ */
|
|
+
|
|
+#include <grub/mm.h>
|
|
+#include <grub/emu/misc.h>
|
|
+
|
|
+#include <tss2_buffer.h>
|
|
+#include <tss2_structs.h>
|
|
+#include <tcg2.h>
|
|
+
|
|
+grub_err_t
|
|
+grub_tcg2_get_max_output_size (grub_size_t *size)
|
|
+{
|
|
+ if (size == NULL)
|
|
+ return GRUB_ERR_BAD_ARGUMENT;
|
|
+
|
|
+ *size = GRUB_TPM2_BUFFER_CAPACITY;
|
|
+
|
|
+ return GRUB_ERR_NONE;
|
|
+}
|
|
+
|
|
+grub_err_t
|
|
+grub_tcg2_submit_command (grub_size_t input_size, grub_uint8_t *input,
|
|
+ grub_size_t output_size, grub_uint8_t *output)
|
|
+{
|
|
+ if (grub_util_tpm_write (input, input_size) != input_size)
|
|
+ return GRUB_ERR_BAD_DEVICE;
|
|
+
|
|
+ if (grub_util_tpm_read (output, output_size) < sizeof (TPM_RESPONSE_HEADER_t))
|
|
+ return GRUB_ERR_BAD_DEVICE;
|
|
+
|
|
+ return GRUB_ERR_NONE;
|
|
+}
|
|
Index: grub-2.12/include/grub/emu/misc.h
|
|
===================================================================
|
|
--- grub-2.12.orig/include/grub/emu/misc.h
|
|
+++ grub-2.12/include/grub/emu/misc.h
|
|
@@ -75,4 +75,9 @@ grub_util_fopen (const char *path, const
|
|
|
|
int grub_util_file_sync (FILE *f);
|
|
|
|
+grub_err_t grub_util_tpm_open (const char *tpm_dev);
|
|
+grub_err_t grub_util_tpm_close (void);
|
|
+grub_size_t EXPORT_FUNC(grub_util_tpm_read) (void *output, grub_size_t size);
|
|
+grub_size_t EXPORT_FUNC(grub_util_tpm_write) (const void *input, grub_size_t size);
|
|
+
|
|
#endif /* GRUB_EMU_MISC_H */
|