On Wed, 15 Jan 2025 at 22:02, Raymond Mao <raymond....@linaro.org> wrote:
>
> Get eventlog bank mask when parsing the eventlog from previous
> boot stage and invoke PCR allocate function based on it.
> PCR allocate will be proceeded if any dismatches observed among
> the active, supportted and eventlog bank masks to re-configurate
> the TPM with the proper algorithms and reboot the system.
>
> Signed-off-by: Raymond Mao <raymond....@linaro.org>
> ---
>  lib/tpm_tcg2.c | 52 +++++++++++++++++---------------------------------
>  1 file changed, 17 insertions(+), 35 deletions(-)
>
> diff --git a/lib/tpm_tcg2.c b/lib/tpm_tcg2.c
> index 2d9076f091..fd84045d8b 100644
> --- a/lib/tpm_tcg2.c
> +++ b/lib/tpm_tcg2.c
> @@ -360,12 +360,12 @@ static int tcg2_replay_eventlog(struct tcg2_event_log 
> *elog,
>         return 0;
>  }
>
> -static int tcg2_log_parse(struct udevice *dev, struct tcg2_event_log *elog)
> +static int tcg2_log_parse(struct udevice *dev, struct tcg2_event_log *elog,
> +                         u32 *log_active)
>  {
>         struct tpml_digest_values digest_list;
>         struct tcg_efi_spec_id_event *event;
>         struct tcg_pcr_event *log;
> -       u32 log_active;
>         u32 calc_size;
>         u32 active;
>         u32 count;
> @@ -376,6 +376,8 @@ static int tcg2_log_parse(struct udevice *dev, struct 
> tcg2_event_log *elog)
>         int rc;
>         u32 i;
>
> +       *log_active = 0;
> +
>         if (elog->log_size <= offsetof(struct tcg_pcr_event, event))
>                 return 0;
>
> @@ -421,7 +423,6 @@ static int tcg2_log_parse(struct udevice *dev, struct 
> tcg2_event_log *elog)
>          * algorithms, so just check the EvenLog against the TPM active ones.
>          */
>         digest_list.count = 0;
> -       log_active = 0;
>         for (i = 0; i < count; ++i) {
>                 algo = 
> get_unaligned_le16(&event->digest_sizes[i].algorithm_id);
>                 mask = tcg2_algorithm_to_mask(algo);
> @@ -447,17 +448,15 @@ static int tcg2_log_parse(struct udevice *dev, struct 
> tcg2_event_log *elog)
>                                 algo);
>                         return -1;
>                 }
> -               log_active |= mask;
> +               *log_active |= mask;
>         }
>
>         rc = tcg2_get_active_pcr_banks(dev, &active);
>         if (rc)
>                 return rc;
>         /* If the EventLog and active algorithms don't match exit */
> -       if (log_active != active) {
> -               log_err("EventLog doesn't contain all active PCR banks\n");
> -               return -1;
> -       }
> +       if (*log_active != active)
> +               return -ERESTARTSYS;
>
>         /* Read PCR0 to check if previous firmware extended the PCRs or not. 
> */
>         rc = tcg2_pcr_read(dev, 0, &digest_list);
> @@ -554,43 +553,21 @@ int tcg2_log_prepare_buffer(struct udevice *dev, struct 
> tcg2_event_log *elog,
>                             bool ignore_existing_log)
>  {
>         struct tcg2_event_log log;
> -       int rc, i;
> +       int rc;
> +       u32 log_active = 0;
>
>         elog->log_position = 0;
>         elog->found = false;
>
> -       /*
> -        * Make sure U-Boot is compiled with all the active PCRs
> -        * since we are about to create an EventLog and we won't
> -        * measure anything if the PCR banks don't match
> -        */
> -       if (!tpm2_check_active_banks(dev)) {
> -               log_err("Cannot create EventLog\n");
> -               log_err("Mismatch between U-Boot and TPM hash algos\n");
> -               log_info("TPM:\n");
> -               tpm2_print_active_banks(dev);
> -               log_info("U-Boot:\n");
> -               for (i = 0; i < ARRAY_SIZE(hash_algo_list); i++) {
> -                       const struct digest_info *algo = &hash_algo_list[i];
> -                       const char *str;
> -
> -                       if (!algo->supported)
> -                               continue;
> -
> -                       str = tpm2_algorithm_name(algo->hash_alg);
> -                       if (str)
> -                               log_info("%s\n", str);
> -               }
> -               return -EINVAL;
> -       }
> -
>         rc = tcg2_platform_get_log(dev, (void **)&log.log, &log.log_size);
>         if (!rc) {
>                 log.log_position = 0;
>                 log.found = false;
>
>                 if (!ignore_existing_log) {
> -                       rc = tcg2_log_parse(dev, &log);
> +                       rc = tcg2_log_parse(dev, &log, &log_active);
> +                       if (rc == -ERESTARTSYS && log_active)
> +                               goto pcr_allocate;
>                         if (rc)
>                                 return rc;
>                 }
> @@ -617,6 +594,11 @@ int tcg2_log_prepare_buffer(struct udevice *dev, struct 
> tcg2_event_log *elog,
>                 elog->found = log.found;
>         }
>
> +pcr_allocate:
> +       rc = tpm2_pcr_allocate(dev, log_active);
> +       if (rc)
> +               return rc;
> +
>         if (elog->found)
>                 return 0;
>
> --
> 2.25.1
>

With the naming changes on patch #3

Reviewed-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>

Reply via email to