[SLOF] [PATCH 2/3] tcgbios: Implement tpm_hash_log_extend_event_file

Alexey Kardashevskiy aik at ozlabs.ru
Wed Apr 1 15:31:50 AEDT 2020



On 27/03/2020 07:20, Stefan Berger wrote:
> From: Stefan Berger <stefanb at linux.ibm.com>
> 
> Implement tpm_hash_log_extend_event_file() that allows to measure
> the contents of a file into a given PCR and log it with the
> given event type and description. The caller may choose to have
> the size of the original ELF image detected so that only data
> from the ELF image are hashed.
> 
> Signed-off-by: Stefan Berger <stefanb at linux.ibm.com>
> ---
>  lib/libtpm/tcgbios.c | 35 +++++++++++++++++++++++++++++++++++
>  lib/libtpm/tcgbios.h |  4 ++++
>  lib/libtpm/tpm.code  | 19 +++++++++++++++++++
>  lib/libtpm/tpm.in    |  1 +
>  4 files changed, 59 insertions(+)
> 
> diff --git a/lib/libtpm/tcgbios.c b/lib/libtpm/tcgbios.c
> index be6c3d1..fa2ab2b 100644
> --- a/lib/libtpm/tcgbios.c
> +++ b/lib/libtpm/tcgbios.c
> @@ -33,6 +33,7 @@
>  #include "helpers.h"
>  #include "version.h"
>  #include "OF.h"
> +#include "libelf.h"
>  
>  #undef TCGBIOS_DEBUG
>  //#define TCGBIOS_DEBUG
> @@ -852,6 +853,40 @@ static uint32_t tpm_add_measurement_to_log(uint32_t pcrindex,
>  	return tpm_log_event_long(&le.hdr, digest_len, info, infolen);
>  }
>  
> +/*
> + * Measure a file into the given PCR and log it with the given
> + * eventtype. If is_elf is true, try to determine the size of the
> + * ELF file and use its size rather than the much larger data buffer
> + * it is held in. In case of failure to detect the ELF file size,
> + * log an additional error.
> + */
> +uint32_t tpm_hash_log_extend_event_file(uint32_t pcrindex, uint32_t eventtype,
> +					const void *data, uint32_t datalen,
> +					const char *desc, uint32_t desclen,
> +					bool is_elf)


This @is_elf flag does not seem useful, it is always "true".


> +{
> +	long len;
> +	const char *string;
> +	uint32_t ret;
> +
> +	if (is_elf) {
> +		len = elf_get_file_size(data, datalen);
> +		if (len > 0) {
> +			datalen = len;
> +		} else {
> +			string = "BAD ELF FILE";
> +			ret = tpm_add_measurement_to_log(pcrindex, eventtype,
> +					  string, strlen(string),
> +					  (uint8_t *)string, strlen(string));
> +			if (ret)
> +				return ret;


You logged "BAD ELF FILE" here and you still want to add measurement below?


> +		}
> +	}
> +	return tpm_add_measurement_to_log(pcrindex, eventtype,
> +					  desc, desclen,
> +					  data, datalen);
> +}
> +
>  /*
>   * Add an EV_ACTION measurement to the list of measurements
>   */
> diff --git a/lib/libtpm/tcgbios.h b/lib/libtpm/tcgbios.h
> index 8174d86..1ef72e9 100644
> --- a/lib/libtpm/tcgbios.h
> +++ b/lib/libtpm/tcgbios.h
> @@ -32,5 +32,9 @@ void tpm20_menu(void);
>  void tpm_gpt_set_lba1(const uint8_t *addr, uint32_t length);
>  void tpm_gpt_add_entry(const uint8_t *addr, uint32_t length);
>  uint32_t tpm_measure_gpt(void);
> +uint32_t tpm_hash_log_extend_event_file(uint32_t pcrindex, uint32_t eventtype,
> +					const void *data, uint32_t datalen,
> +					const char *desc, uint32_t desclen,
> +					bool is_elf);


This one and tpm-hash-log-extend-event-file return a code which nobody
looks at.

>  
>  #endif /* TCGBIOS_H */
> diff --git a/lib/libtpm/tpm.code b/lib/libtpm/tpm.code
> index 205c608..598280d 100644
> --- a/lib/libtpm/tpm.code
> +++ b/lib/libtpm/tpm.code
> @@ -169,3 +169,22 @@ PRIM(tpm_X2d_measure_X2d_gpt)
>  	PUSH;
>  	TOS.n = tpm_measure_gpt();
>  MIRP
> +
> +/*****************************************************************************************************/
> +/* Firmware API                                                                                      */
> +/* SLOF:   tpm-hash-log-extend-event-raw ( pcr evt data-ptr data-len desc-ptr desclen is_elf -- rc ) */


it is tpm-hash-log-extend-event-file now, not ...-raw. Thanks,


> +/* LIBTPM: errcode = tpm-hash-log-extend-event-raw                                                   */
> +/*****************************************************************************************************/
> +PRIM(tpm_X2d_hash_X2d_log_X2d_extend_X2d_event_X2d_file)
> +	uint32_t is_elf  = TOS.u; POP;
> +	uint32_t desclen = TOS.u; POP;
> +	const char *desc = TOS.a; POP;
> +	uint32_t datalen = TOS.u; POP;
> +	const void *data = TOS.a; POP;
> +	uint32_t eventtype = TOS.u; POP;
> +	uint32_t pcrindex = TOS.u;
> +
> +	TOS.n = tpm_hash_log_extend_event_file(pcrindex, eventtype,
> +					       data, datalen,
> +					       desc, desclen, is_elf);
> +MIRP
> diff --git a/lib/libtpm/tpm.in b/lib/libtpm/tpm.in
> index bdbc47d..db8bea0 100644
> --- a/lib/libtpm/tpm.in
> +++ b/lib/libtpm/tpm.in
> @@ -28,3 +28,4 @@ cod(tpm20-menu)
>  cod(tpm-gpt-set-lba1)
>  cod(tpm-gpt-add-entry)
>  cod(tpm-measure-gpt)
> +cod(tpm-hash-log-extend-event-file)
> 

-- 
Alexey


More information about the SLOF mailing list