> 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?
> +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) > + 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, ¶meterSize); > + 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) > + 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; 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