On Thu, Oct 17, 2024 at 07:57:11PM +0200, Daniel Kiper wrote: > On Fri, Sep 06, 2024 at 05:11:22PM +0800, Gary Lin via Grub-devel wrote: > > 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 share the emulated TPM device with > > the host. > > s/can share the emulated TPM device with/can access an emulated TPM device > from/? > > > Since grub-emu can directly access the device node on host, it's easy to > > s/device node/device/ > Will fix them in the next version.
> > 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 <g...@suse.com> > > Reviewed-by: Stefan Berger <stef...@linux.ibm.com> > > Otherwise Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>... > > ... and three nits below... > > > --- > > 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 | 54 +++++++++++++++++++++++++++++++++++ > > include/grub/emu/misc.h | 5 ++++ > > 5 files changed, 123 insertions(+), 1 deletion(-) > > create mode 100644 grub-core/lib/tss2/tcg2_emu.c > > > > diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def > > index 97ae4e49b..40427165e 100644 > > --- a/grub-core/Makefile.core.def > > +++ b/grub-core/Makefile.core.def > > @@ -2574,7 +2574,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'; > > }; > > > > @@ -2586,6 +2588,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 -I$(srcdir)/lib/libtasn1-grub'; > > }; > > > > diff --git a/grub-core/kern/emu/main.c b/grub-core/kern/emu/main.c > > index 855b11c3d..c10838613 100644 > > --- a/grub-core/kern/emu/main.c > > +++ b/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}, > > s/Set/set/? It looks all messages start with lowercase... > Oh, yes, it should start with lowercase. > > { 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); > > > > diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c > > index 521220b49..1db24fde7 100644 > > --- a/grub-core/kern/emu/misc.c > > +++ b/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); > > +} > > diff --git a/grub-core/lib/tss2/tcg2_emu.c b/grub-core/lib/tss2/tcg2_emu.c > > new file mode 100644 > > index 000000000..6bf4195d7 > > --- /dev/null > > +++ b/grub-core/lib/tss2/tcg2_emu.c > > @@ -0,0 +1,54 @@ > > +/* > > + * 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/efi/api.h> > > +#include <grub/efi/efi.h> > > +#include <grub/efi/tpm.h> > > Hmmm... Do we really need that stuff for grub-emu? > Ah, those headers are not necessary. > > +#include <grub/mm.h> > > +#include <grub/emu/misc.h> > > + > > +#include <tss2_buffer.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) > > +{ > > + static const grub_size_t header_size = sizeof (grub_uint16_t) + > > + (2 * sizeof(grub_uint32_t)); > > Missing space after "sizeof"... > Will fix them in the next version. Gary Lin _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel