Looks good to me, thank you.

Reviewed-by: Andrew Hamilton <adham...@gmail.com>




On Sat, Sep 20, 2025 at 8:18 AM <luca.bocca...@gmail.com> wrote:
>
> From: Luca Boccassi <luca.bocca...@gmail.com>
>
> The call was added in the 1.1 revision of the spec, 1.0 does
> not have it, and there are some machines out there with a TPM2
> and a UEFI firmware that only supports version 1.0, so the
> call fails in those cases.
> Check the reported version before calling get_active_pcr_banks().
>
> See Table 4 in section 6.2 of the TCG EFI Protocol Specification:
>
> https://trustedcomputinggroup.org/wp-content/uploads/EFI-Protocol-Specification-rev13-160330final.pdf
>
> Follow-up for f326c5c4753c36a9068ba66036566229a0975908
>
> Signed-off-by: Luca Boccassi <luca.bocca...@gmail.com>
> ---
> Found out the hard way: https://github.com/systemd/systemd/issues/38932
>
>  grub-core/commands/efi/tpm.c | 31 ++++++++++++++++++++++++++++++-
>  1 file changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/grub-core/commands/efi/tpm.c b/grub-core/commands/efi/tpm.c
> index 59d0b6708..7b493c890 100644
> --- a/grub-core/commands/efi/tpm.c
> +++ b/grub-core/commands/efi/tpm.c
> @@ -39,6 +39,7 @@ static grub_uint8_t grub_tpm_version;
>
>  static grub_int8_t tpm1_present = -1;
>  static grub_int8_t tpm2_present = -1;
> +static grub_int8_t tpm2_pcr_banks_reporting_present = -1;
>
>  static grub_efi_boolean_t
>  grub_tpm1_present (grub_efi_tpm_protocol_t *tpm)
> @@ -89,6 +90,34 @@ grub_tpm2_present (grub_efi_tpm2_protocol_t *tpm)
>    return (grub_efi_boolean_t) tpm2_present;
>  }
>
> +static grub_efi_boolean_t
> +grub_tpm2_pcr_banks_reporting_present (grub_efi_tpm2_protocol_t *tpm)
> +{
> +  grub_efi_status_t status;
> +  EFI_TCG2_BOOT_SERVICE_CAPABILITY caps;
> +
> +  caps.Size = (grub_uint8_t) sizeof (caps);
> +
> +  if (tpm2_pcr_banks_reporting_present != -1)
> +    return (grub_efi_boolean_t) tpm2_pcr_banks_reporting_present;
> +
> +  if (!grub_tpm2_present (tpm))
> +    return (grub_efi_boolean_t) (tpm2_pcr_banks_reporting_present = 0);
> +
> +  status = tpm->get_capability (tpm, &caps);
> +
> +  if (status != GRUB_EFI_SUCCESS || caps.StructureVersion.Major < 1
> +      || (caps.StructureVersion.Major == 1 && caps.StructureVersion.Minor < 
> 1))
> +    tpm2_pcr_banks_reporting_present = 0;
> +  else
> +    tpm2_pcr_banks_reporting_present = 1;
> +
> +  grub_dprintf ("tpm", "tpm2 PCR banks reporting%s present\n",
> +               tpm2_pcr_banks_reporting_present ? "" : " NOT");
> +
> +  return (grub_efi_boolean_t) tpm2_pcr_banks_reporting_present;
> +}
> +
>  static grub_efi_boolean_t
>  grub_tpm_handle_find (grub_efi_handle_t *tpm_handle,
>                       grub_efi_uint8_t *protocol_version)
> @@ -355,7 +384,7 @@ grub_tpm2_active_pcr_banks (void)
>        return 0;
>      }
>
> -  if (grub_tpm2_present (tpm))
> +  if (grub_tpm2_pcr_banks_reporting_present (tpm))
>      {
>        grub_efi_status_t status = tpm->get_active_pcr_banks (tpm, 
> &active_pcr_banks);
>
> --
> 2.47.3
>
>
> _______________________________________________
> 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