On Thu, Jul 10, 2025 at 08:24:46PM +0530, Sudhakar Kuppusamy wrote:
> 
> 
> > On 8 Jul 2025, at 2:01 PM, Gary Lin via Grub-devel <grub-devel@gnu.org> 
> > wrote:
> > 
> > The TPM2_PCR_Event command is introduced to tss2 to allow the user to
> > extend a specific PCR. The related data structure and unmarshal function
> > are also introduced.
> > 
> > However, simply invoking TPM2_PCR_Event does not automatically record
> > the event into the TPM event log. The TPM event log is primarily
> > maintained by the system firmware (e.g., BIOS/UEFI). Therefore, for most
> > standard use cases, the recommended method for extending PCRs and
> > ensuring proper event logging is to utilize the system firmware
> > functions.
> > 
> > There are specific scenarios where direct use of TPM2_PCR_Event becomes
> > necessary. For instance, in environments lacking system firmware support
> > for PCR extension, such as the grub-emu, TPM2_PCR_Event serves as the
> > only available method to extend PCRs.
> > 
> > Signed-off-by: Gary Lin <g...@suse.com>
> > ---
> > grub-core/lib/tss2/tpm2_cmd.c     | 51 +++++++++++++++++++++++++++++++
> > grub-core/lib/tss2/tpm2_cmd.h     |  7 +++++
> > grub-core/lib/tss2/tss2_mu.c      | 18 +++++++++++
> > grub-core/lib/tss2/tss2_mu.h      |  4 +++
> > grub-core/lib/tss2/tss2_structs.h |  7 +++++
> > grub-core/lib/tss2/tss2_types.h   |  1 +
> > 6 files changed, 88 insertions(+)
> > 
> > diff --git a/grub-core/lib/tss2/tpm2_cmd.c b/grub-core/lib/tss2/tpm2_cmd.c
> > index 6d25db1ab..37ca78aee 100644
> > --- a/grub-core/lib/tss2/tpm2_cmd.c
> > +++ b/grub-core/lib/tss2/tpm2_cmd.c
> > @@ -575,6 +575,57 @@ grub_tpm2_flushcontext (const TPMI_DH_CONTEXT_t handle)
> >   return TPM_RC_SUCCESS;
> > }
> > 
> > +extern TPM_RC_t
> Do you think the extern keyword is required for function definition as well?
> 
Oops, that's a mistake.

> > +grub_tpm2_pcr_event (const TPMI_DH_PCR_t pcrHandle,
> > +                const TPMS_AUTH_COMMAND_t *authCommand,
> > +                const TPM2B_EVENT_t *eventData,
> > +                TPML_DIGEST_VALUES_t *digests,
> > +                TPMS_AUTH_RESPONSE_t *authResponse)
> > +{
> > +  TPM_RC_t rc;
> > +  struct grub_tpm2_buffer in;
> > +  struct grub_tpm2_buffer out;
> > +  TPML_DIGEST_VALUES_t digestsTmp;
> > +  TPMS_AUTH_RESPONSE_t authResponseTmp;
> > +  TPM_RC_t responseCode;
> > +  grub_uint32_t parameterSize;
> > +
> > +  if (eventData == NULL)
> > +    return TPM_RC_VALUE;
> > +  if (authCommand == NULL)
> > +    return TPM_RC_VALUE;
> > +
> > +  if (digests == NULL)
> > +    digests = &digestsTmp;
> > +  if (authResponse == NULL)
> > +    authResponse = &authResponseTmp;
> > +
> > +  /* Marshal */
> > +  grub_tpm2_buffer_init (&in);
> > +  grub_tpm2_buffer_pack_u32 (&in, pcrHandle);
> > +  grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand);
> > +  grub_Tss2_MU_TPM2B_Marshal (&in, eventData->size, eventData->buffer);
> > +  if (in.error != 0)
> 
> It would be better to use true/false for boolean.  
> 
> if (in.error == true)
> 
Will fix it in v2.

> > +    return TPM_RC_FAILURE;
> > +
> > +  /* Submit */
> > +  grub_tpm2_buffer_init (&out);
> > +  rc = tpm2_submit_command (TPM_ST_SESSIONS, TPM_CC_PCR_Event, 
> > &responseCode, &in, &out);
> > +  if (rc != TPM_RC_SUCCESS)
> > +    return rc;
> > +  if (responseCode != TPM_RC_SUCCESS)
> > +    return responseCode;
> > +
> > +  /* Unmarshal */
> > +  grub_tpm2_buffer_unpack_u32 (&out, &parameterSize);
> > +  grub_Tss2_MU_TPML_DIGEST_VALUE_Unmarshal (&out, digests);
> > +  grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse);
> > +  if (out.error != 0)
> 
> It would be better to use true/false for boolean.  
> 
> if (out.error == true)
> 
Ditto.

> > +    return TPM_RC_FAILURE;
> > +
> > +  return TPM_RC_SUCCESS;
> > +}
> > +
> > TPM_RC_t
> > grub_tpm2_pcr_read (const TPMS_AUTH_COMMAND_t *authCommand,
> >                 const TPML_PCR_SELECTION_t *pcrSelectionIn,
> > diff --git a/grub-core/lib/tss2/tpm2_cmd.h b/grub-core/lib/tss2/tpm2_cmd.h
> > index 90b42efec..d7ad962ab 100644
> > --- a/grub-core/lib/tss2/tpm2_cmd.h
> > +++ b/grub-core/lib/tss2/tpm2_cmd.h
> > @@ -89,6 +89,13 @@ grub_tpm2_unseal (const TPMI_DH_OBJECT_t item_handle,
> > extern TPM_RC_t
> > grub_tpm2_flushcontext (const TPMI_DH_CONTEXT_t handle);
> > 
> > +extern TPM_RC_t
> > +grub_tpm2_pcr_event (const TPMI_DH_PCR_t pcrHandle,
> > +                const TPMS_AUTH_COMMAND_t *authCommand,
> > +                const TPM2B_EVENT_t *eventData,
> > +                TPML_DIGEST_VALUES_t *digests,
> > +                TPMS_AUTH_RESPONSE_t *authResponse);
> > +
> > extern TPM_RC_t
> > grub_tpm2_pcr_read (const TPMS_AUTH_COMMAND_t *authCommand,
> >                 const TPML_PCR_SELECTION_t *pcrSelectionIn,
> > diff --git a/grub-core/lib/tss2/tss2_mu.c b/grub-core/lib/tss2/tss2_mu.c
> > index 816e5b37f..675a0009a 100644
> > --- a/grub-core/lib/tss2/tss2_mu.c
> > +++ b/grub-core/lib/tss2/tss2_mu.c
> > @@ -1118,6 +1118,24 @@ grub_Tss2_MU_TPML_DIGEST_Unmarshal 
> > (grub_tpm2_buffer_t buffer,
> >     grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &digest->digests[i]);
> > }
> > 
> > +void
> > +grub_Tss2_MU_TPML_DIGEST_VALUE_Unmarshal (grub_tpm2_buffer_t buffer,
> > +                                     TPML_DIGEST_VALUES_t *digests)
> > +{
> > +  grub_uint32_t i;
> > +
> > +  grub_tpm2_buffer_unpack_u32 (buffer, &digests->count);
> > +
> > +  if (digests->count > TPM_NUM_PCR_BANKS)
> > +    {
> > +      buffer->error = 1;
> 
> It would be better to use true/false for boolean.
> buffer->error = true;
> 
Will fix it in v2.

Thanks,

Gary Lin

> Thanks,
> Sudhakar
> 
> > +      return;
> > +    }
> > +
> > +  for (i = 0; i < digests->count; i++)
> > +    grub_Tss2_MU_TPMT_HA_Unmarshal (buffer, &digests->digests[i]);
> > +}
> > +
> > void
> > grub_Tss2_MU_TPMS_SIGNATURE_RSA_Unmarshal (grub_tpm2_buffer_t buffer,
> >                                            TPMS_SIGNATURE_RSA_t *rsa)
> > diff --git a/grub-core/lib/tss2/tss2_mu.h b/grub-core/lib/tss2/tss2_mu.h
> > index 6440de57c..76eebc994 100644
> > --- a/grub-core/lib/tss2/tss2_mu.h
> > +++ b/grub-core/lib/tss2/tss2_mu.h
> > @@ -380,6 +380,10 @@ extern void
> > grub_Tss2_MU_TPML_DIGEST_Unmarshal (grub_tpm2_buffer_t buffer,
> >                                 TPML_DIGEST_t *digest);
> > 
> > +extern void
> > +grub_Tss2_MU_TPML_DIGEST_VALUE_Unmarshal (grub_tpm2_buffer_t buffer,
> > +                                     TPML_DIGEST_VALUES_t *digests);
> > +
> > extern void
> > grub_Tss2_MU_TPMS_SIGNATURE_RSA_Unmarshal (grub_tpm2_buffer_t buffer,
> >                                            TPMS_SIGNATURE_RSA_t *p);
> > diff --git a/grub-core/lib/tss2/tss2_structs.h 
> > b/grub-core/lib/tss2/tss2_structs.h
> > index 2eefba87c..0ac09f50f 100644
> > --- a/grub-core/lib/tss2/tss2_structs.h
> > +++ b/grub-core/lib/tss2/tss2_structs.h
> > @@ -144,6 +144,13 @@ typedef struct TPML_DIGEST TPML_DIGEST_t;
> > /* TPM2B_NONCE Type */
> > typedef TPM2B_DIGEST_t TPM2B_NONCE_t;
> > 
> > +/* TPM2B_EVENT Structure */
> > +struct TPM2B_EVENT {
> > +    grub_uint16_t size;
> > +    grub_uint8_t buffer[1024];
> > +};
> > +typedef struct TPM2B_EVENT TPM2B_EVENT_t;
> > +
> > /* TPMA_SESSION Structure */
> > struct TPMA_SESSION
> > {
> > diff --git a/grub-core/lib/tss2/tss2_types.h 
> > b/grub-core/lib/tss2/tss2_types.h
> > index bddde7191..52d304b90 100644
> > --- a/grub-core/lib/tss2/tss2_types.h
> > +++ b/grub-core/lib/tss2/tss2_types.h
> > @@ -343,6 +343,7 @@ typedef grub_uint32_t TPM_CC_t;
> > #define TPM_CC_NV_Write         ((TPM_CC_t) 0x00000137)
> > #define TPM_CC_NV_UndefineSpace ((TPM_CC_t) 0x00000122)
> > #define TPM_CC_GetCapability    ((TPM_CC_t) 0x0000017a)
> > +#define TPM_CC_PCR_Event        ((TPM_CC_t) 0x0000013c)
> > #define TPM_CC_PCR_Read         ((TPM_CC_t) 0x0000017e)
> > #define TPM_CC_Load             ((TPM_CC_t) 0x00000157)
> > #define TPM_CC_LoadExternal     ((TPM_CC_t) 0x00000167)
> > -- 
> > 2.43.0
> > 
> > 
> > _______________________________________________
> > Grub-devel mailing list
> > Grub-devel@gnu.org
> > https://lists.gnu.org/mailman/listinfo/grub-devel
> 

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to