Thanks Tycho

On Thu, 29 Oct 2026 at 17:09, Tycho Kirchner <[email protected]> wrote:
>
> TPM2_PCR_Allocate may return TPM_RC_SUCCESS without performing the new
> allocation, e.g. if the TPM lacks the memory for it. This is only
> reported in the allocationSuccess field of the response, see the
> TPM 2.0 Library Specification, Part 3: Commands, TPM2_PCR_Allocate.
> U-Boot ignores this field, so a refused allocation goes unnoticed and
> the board reboots into the unchanged allocation over and over again.
>
> Check allocationSuccess and return an error if the TPM refused the
> allocation.
>
> Fixes: 9d2bc92ba7bb ("tpm: add TPM2_PCR_Allocate command")
> Signed-off-by: Tycho Kirchner <[email protected]>
> ---

Reviewed-by: Ilias Apalodimas <[email protected]>

>  lib/tpm-v2.c | 22 +++++++++++++++++++---
>  1 file changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/lib/tpm-v2.c b/lib/tpm-v2.c
> index 4c7dfc55650..137bbbd9593 100644
> --- a/lib/tpm-v2.c
> +++ b/lib/tpm-v2.c
> @@ -596,6 +596,7 @@ u32 tpm2_send_pcr_allocate(struct udevice *dev, const 
> char *pw,
>         };
>         u8 response[COMMAND_BUFFER_SIZE];
>         size_t response_len = COMMAND_BUFFER_SIZE;
> +       u8 success;
>         u32 i;
>         int ret;
>
> @@ -642,10 +643,25 @@ u32 tpm2_send_pcr_allocate(struct udevice *dev, const 
> char *pw,
>         }
>
>         ret = tpm_sendrecv_command(dev, command_v2, response, &response_len);
> -       if (!ret)
> -               tpm_init(dev);
> +       if (ret)
> +               return ret;
> +
> +       /*
> +        * The TPM may refuse the new allocation without returning an error
> +        * code, e.g. if it lacks the memory for it. Check allocationSuccess,
> +        * located after the response header and the parameterSize field.
> +        */
> +       if (unpack_byte_string(response, response_len, "b",
> +                              TPM2_HDR_LEN + sizeof(u32), &success))
> +               return TPM_LIB_ERROR;
> +       if (success != TPMI_YES) {
> +               log_err("TPM refused the PCR allocation\n");
> +               return TPM_LIB_ERROR;
> +       }
>
> -       return ret;
> +       tpm_init(dev);
> +
> +       return 0;
>  }
>
>  static int tpm2_get_num_pcr(struct udevice *dev, u32 *num_pcr)
> --
> 2.47.3
>

Reply via email to