On Tue, Jul 08, 2025 at 11:52:48AM -0400, Stefan Berger wrote:
>
>
> On 7/8/25 4:31 AM, Gary Lin wrote:
> > This commit implements grub_tcg2_cap_pcr() for ieee1275 with the
> > firmware function, 2hash-ext-log, to extend the target PCR with a
> > SEPARATOR event and record the event into the TPM event log.
> >
> > To avoid duplicate code, ibmvtpm_2hash_ext_log() is moved to tcg2.c
> > and exported as a global function.
> >
> > Signed-off-by: Gary Lin <[email protected]>
> > ---
> > grub-core/commands/ieee1275/ibmvtpm.c | 52 ++-------------------
> > grub-core/lib/ieee1275/tcg2.c | 66 +++++++++++++++++++++++++++
> > include/grub/ieee1275/tpm.h | 5 ++
> > 3 files changed, 74 insertions(+), 49 deletions(-)
> >
> > diff --git a/grub-core/commands/ieee1275/ibmvtpm.c
> > b/grub-core/commands/ieee1275/ibmvtpm.c
> > index 4958b04a9..d0ddc06b0 100644
> > --- a/grub-core/commands/ieee1275/ibmvtpm.c
> > +++ b/grub-core/commands/ieee1275/ibmvtpm.c
> > @@ -27,52 +27,6 @@
> > #include <grub/mm.h>
> > #include <grub/misc.h>
> > -static int
> > -ibmvtpm_2hash_ext_log (grub_uint8_t pcrindex,
> > - grub_uint32_t eventtype,
> > - const char *description,
> > - grub_size_t description_size,
> > - void *buf, grub_size_t size)
> > -{
> > - struct tpm_2hash_ext_log
> > - {
> > - struct grub_ieee1275_common_hdr common;
> > - grub_ieee1275_cell_t method;
> > - grub_ieee1275_cell_t ihandle;
> > - grub_ieee1275_cell_t size;
> > - grub_ieee1275_cell_t buf;
> > - grub_ieee1275_cell_t description_size;
> > - grub_ieee1275_cell_t description;
> > - grub_ieee1275_cell_t eventtype;
> > - grub_ieee1275_cell_t pcrindex;
> > - grub_ieee1275_cell_t catch_result;
> > - grub_ieee1275_cell_t rc;
> > - };
> > - struct tpm_2hash_ext_log args;
> > -
> > - INIT_IEEE1275_COMMON (&args.common, "call-method", 8, 2);
> > - args.method = (grub_ieee1275_cell_t) "2hash-ext-log";
> > - args.ihandle = grub_ieee1275_tpm_ihandle;
> > - args.pcrindex = pcrindex;
> > - args.eventtype = eventtype;
> > - args.description = (grub_ieee1275_cell_t) description;
> > - args.description_size = description_size;
> > - args.buf = (grub_ieee1275_cell_t) buf;
> > - args.size = (grub_ieee1275_cell_t) size;
> > -
> > - if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
> > - return -1;
> > -
> > - /*
> > - * catch_result is set if firmware does not support 2hash-ext-log
> > - * rc is GRUB_IEEE1275_CELL_FALSE (0) on failure
> > - */
> > - if ((args.catch_result) || args.rc == GRUB_IEEE1275_CELL_FALSE)
> > - return -1;
> > -
> > - return 0;
> > -}
> > -
> > static grub_err_t
> > tpm2_log_event (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
> > const char *description)
> > @@ -80,9 +34,9 @@ tpm2_log_event (unsigned char *buf, grub_size_t size,
> > grub_uint8_t pcr,
> > static int error_displayed = 0;
> > int rc;
> > - rc = ibmvtpm_2hash_ext_log (pcr, EV_IPL,
> > - description, grub_strlen(description) + 1,
> > - buf, size);
> > + rc = grub_ieee1275_ibmvtpm_2hash_ext_log (pcr, EV_IPL,
> > + description,
> > grub_strlen(description) + 1,
> > + buf, size);
> > if (rc && !error_displayed)
> > {
> > error_displayed++;
> > diff --git a/grub-core/lib/ieee1275/tcg2.c b/grub-core/lib/ieee1275/tcg2.c
> > index 40161c2f9..945a3469b 100644
> > --- a/grub-core/lib/ieee1275/tcg2.c
> > +++ b/grub-core/lib/ieee1275/tcg2.c
> > @@ -56,6 +56,52 @@ grub_ieee1275_tpm_init (void)
> > return GRUB_ERR_NONE;
> > }
> > +int
> > +grub_ieee1275_ibmvtpm_2hash_ext_log (grub_uint8_t pcrindex,
> > + grub_uint32_t eventtype,
> > + const char *description,
> > + grub_size_t description_size,
> > + void *buf, grub_size_t size)
> > +{
> > + struct tpm_2hash_ext_log
> > + {
> > + struct grub_ieee1275_common_hdr common;
> > + grub_ieee1275_cell_t method;
> > + grub_ieee1275_cell_t ihandle;
> > + grub_ieee1275_cell_t size;
> > + grub_ieee1275_cell_t buf;
> > + grub_ieee1275_cell_t description_size;
> > + grub_ieee1275_cell_t description;
> > + grub_ieee1275_cell_t eventtype;
> > + grub_ieee1275_cell_t pcrindex;
> > + grub_ieee1275_cell_t catch_result;
> > + grub_ieee1275_cell_t rc;
> > + };
> > + struct tpm_2hash_ext_log args;
> > +
> > + INIT_IEEE1275_COMMON (&args.common, "call-method", 8, 2);
> > + args.method = (grub_ieee1275_cell_t) "2hash-ext-log";
> > + args.ihandle = grub_ieee1275_tpm_ihandle;
> > + args.pcrindex = pcrindex;
> > + args.eventtype = eventtype;
> > + args.description = (grub_ieee1275_cell_t) description;
> > + args.description_size = description_size;
> > + args.buf = (grub_ieee1275_cell_t) buf;
> > + args.size = (grub_ieee1275_cell_t) size;
> > +
> > + if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
> > + return -1;
> > +
> > + /*
> > + * catch_result is set if firmware does not support 2hash-ext-log
> > + * rc is GRUB_IEEE1275_CELL_FALSE (0) on failure
> > + */
> > + if ((args.catch_result) || args.rc == GRUB_IEEE1275_CELL_FALSE)
> > + return -1;
>
> Now there are two callers of this function that each would create an error
> hinting at the firmware being too old if the firmware call fails. It's
> probably worth putting the grub_error call into this function here to avoid
> replication.
>
Ok, I'll update the function to return a proper grub_err.
> The rest looks good.
Thanks!
Gary Lin
>
> > +
> > + return 0;
> > +}
> > +
> > grub_err_t
> > grub_tcg2_get_max_output_size (grub_size_t *size)
> > {
> > @@ -155,3 +201,23 @@ grub_tcg2_submit_command (grub_size_t input_size,
> > return GRUB_ERR_NONE;
> > }
> > +
> > +grub_err_t
> > +grub_tcg2_cap_pcr (grub_uint8_t pcr)
> > +{
> > + grub_uint8_t separator[4] = {0};
> > + static int error_displayed = 0;
> > + int rc;
> > +
> > + rc = grub_ieee1275_ibmvtpm_2hash_ext_log (pcr, EV_SEPARATOR,
> > + separator, sizeof(separator),
> > + separator, sizeof(separator));
> > + if (rc && !error_displayed)
> > + {
> > + error_displayed++;
> > + return grub_error (GRUB_ERR_BAD_DEVICE,
> > + "2HASH-EXT-LOG failed: Firmware is likely too old.\n");
> > + }
> > +
> > + return GRUB_ERR_NONE;
> > +}
> > diff --git a/include/grub/ieee1275/tpm.h b/include/grub/ieee1275/tpm.h
> > index fe5cb4713..01065071b 100644
> > --- a/include/grub/ieee1275/tpm.h
> > +++ b/include/grub/ieee1275/tpm.h
> > @@ -27,4 +27,9 @@ extern grub_ieee1275_ihandle_t grub_ieee1275_tpm_ihandle;
> > extern grub_err_t grub_ieee1275_tpm_init (void);
> > +extern int grub_ieee1275_ibmvtpm_2hash_ext_log (grub_uint8_t pcrindex,
> > + grub_uint32_t eventtype,
> > + const char *description,
> > + grub_size_t description_size,
> > + void *buf, grub_size_t size);
> > #endif
>
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel