[SLOF] [PATCH v2 2/3] tcgbios: Implement tpm_hash_log_extend_event_buffer

Alexey Kardashevskiy aik at ozlabs.ru
Fri May 8 11:11:05 AEST 2020



On 02/04/2020 01:57, Stefan Berger wrote:
> From: Stefan Berger <stefanb at linux.ibm.com>
> 
> Implement tpm_hash_log_extend_event_buffer() that allows to measure
> the contents of a buffer into a given PCR and log it with the
> given event type and description. The caller may choose to have
> the size of an ELF image file detected so that only data from the
> ELF image are hashed rather than the much larger buffer.
> 
> Besides using this function call now for measuring the bootloader
> read from a GPT partition, we also intend to use it for calls from
> the firmware API that allow us to measure and log data from a boot
> loader, such as grub. Grub will then invoke this function with a
> buffer whose size it knows and will not need the ELF file size
> detection.
> 
> Signed-off-by: Stefan Berger <stefanb at linux.ibm.com>
> ---
>  lib/libtpm/tcgbios.c | 47 ++++++++++++++++++++++++++++++++++++++++++++
>  lib/libtpm/tcgbios.h |  5 +++++
>  lib/libtpm/tpm.code  | 19 ++++++++++++++++++
>  lib/libtpm/tpm.in    |  1 +
>  4 files changed, 72 insertions(+)
> 
> diff --git a/lib/libtpm/tcgbios.c b/lib/libtpm/tcgbios.c
> index be6c3d1..7dcf57c 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,52 @@ static uint32_t tpm_add_measurement_to_log(uint32_t pcrindex,
>  	return tpm_log_event_long(&le.hdr, digest_len, info, infolen);
>  }
>  
> +/*
> + * Measure the contents of a buffer 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 in the buffer 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 error.
> + *
> + * Input parameters:
> + *  @pcrindex : PCR to extend
> + *  @eventtype : type of event
> + *  @data: the buffer to measure
> + *  @datalen: length of the buffer
> + *  @desc: The description to log
> + *  @desclen: The length of the description
> + *  @is_elf: Whether data buffer holds an ELF file and we should determine
> + *           the original file size.
> + *
> + *  Returns 0 on success, an error code otherwise.
> + */
> +uint32_t tpm_hash_log_extend_event_buffer(uint32_t pcrindex, uint32_t eventtype,
> +					  const void *data, uint64_t datalen,
> +					  const char *desc, uint32_t desclen,
> +					  bool is_elf)
> +{
> +	long len;
> +	char buf[256];
> +	int n;
> +
> +	if (is_elf) {
> +		len = elf_get_file_size(data, datalen);
> +		if (len > 0) {
> +			datalen = len;
> +		} else {
> +			n = snprintf(buf, sizeof(buf) - 1,
> +			             "BAD ELF FILE: %s", desc);
> +			buf[n] = 0;


The SLOF's snprintf always writes 0 in the end.



> +			return tpm_add_measurement_to_log(pcrindex, eventtype,
> +					  buf, strlen(buf),
> +					  (uint8_t *)buf, strlen(buf));
> +		}
> +	}
> +	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..0e7fb8c 100644
> --- a/lib/libtpm/tcgbios.h
> +++ b/lib/libtpm/tcgbios.h
> @@ -32,5 +32,10 @@ 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_buffer(uint32_t pcrindex,
> +					  uint32_t eventtype,
> +					  const void *data, uint64_t datalen,
> +					  const char *desc, uint32_t desclen,
> +					  bool is_elf);
>  
>  #endif /* TCGBIOS_H */
> diff --git a/lib/libtpm/tpm.code b/lib/libtpm/tpm.code
> index 205c608..d67d2c3 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
> +

Unrelated.

> +/***********************************************************************************************************/
> +/* Firmware API                                                                                            */
> +/* SLOF:   tpm-hash-log-extend-event-buffer ( pcr evt data-ptr data-len desc-ptr desclen is_elf -- errcode ) */
> +/* LIBTPM: errcode = tpm-hash-log-extend-event-buffer                                                        */
> +/***********************************************************************************************************/
> +PRIM(tpm_X2d_hash_X2d_log_X2d_extend_X2d_event_X2d_buffer)
> +	uint32_t is_elf  = TOS.u; POP;
> +	uint32_t desclen = TOS.u; POP;
> +	const char *desc = TOS.a; POP;
> +	uint64_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_buffer(pcrindex, eventtype,
> +					         data, datalen,
> +					         desc, desclen, is_elf);
> +MIRP
> diff --git a/lib/libtpm/tpm.in b/lib/libtpm/tpm.in
> index bdbc47d..fb54754 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-buffer)
> 

-- 
Alexey


More information about the SLOF mailing list