[PATCH v2 5/5] test: Add sandbox TPM boot measurement

Heinrich Schuchardt xypron.glpk at gmx.de
Tue Jan 10 00:13:19 CET 2023


On 1/9/23 22:55, Eddie James wrote:
> Use the sandbox TPM driver to measure some boot images in a unit
> test case.
>
> $ ./u-boot -T -c "ut measurement"
> Running 1 measurement tests
> Test: measure: measurement.c
> Failures: 0
>
> Signed-off-by: Eddie James <eajames at linux.ibm.com>
> ---
>   arch/sandbox/dts/test.dts | 12 +++++++
>   configs/sandbox_defconfig |  1 +
>   include/test/suites.h     |  1 +
>   test/boot/Makefile        |  1 +
>   test/boot/measurement.c   | 66 +++++++++++++++++++++++++++++++++++++++
>   test/cmd_ut.c             |  2 ++
>   6 files changed, 83 insertions(+)
>   create mode 100644 test/boot/measurement.c
>
> diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
> index dffe10adbf..ad90bf0541 100644
> --- a/arch/sandbox/dts/test.dts
> +++ b/arch/sandbox/dts/test.dts
> @@ -66,6 +66,17 @@
>   		osd0 = "/osd";
>   	};
>
> +	reserved-memory {
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		event_log: tcg_event_log at d0e000 {
> +			no-map;
> +			reg = <0x00d0e000 0x2000>;

This would limit the file loaded at $loadaddr = 0x0 to 13 MiB. Please,
choose a much higher address. Or change $loadaddr, e.g. use loadaddr =
kernel_addr_r = 0x1000000. I would prefer raising loadaddr.

Best regards

Heinrich

> +		};
> +	};
> +
>   	binman: binman {
>   	};
>
> @@ -1332,6 +1343,7 @@
>
>   	tpm2 {
>   		compatible = "sandbox,tpm2";
> +		memory-region = <&event_log>;
>   	};
>
>   	uart0: serial {
> diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
> index de799b5cea..5ac115f2d8 100644
> --- a/configs/sandbox_defconfig
> +++ b/configs/sandbox_defconfig
> @@ -335,3 +335,4 @@ CONFIG_TEST_FDTDEC=y
>   CONFIG_UNIT_TEST=y
>   CONFIG_UT_TIME=y
>   CONFIG_UT_DM=y
> +CONFIG_MEASURED_BOOT=y
> diff --git a/include/test/suites.h b/include/test/suites.h
> index a01000e127..f9284871b0 100644
> --- a/include/test/suites.h
> +++ b/include/test/suites.h
> @@ -43,6 +43,7 @@ int do_ut_font(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
>   int do_ut_lib(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
>   int do_ut_loadm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
>   int do_ut_log(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]);
> +int do_ut_measurement(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]);
>   int do_ut_mem(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
>   int do_ut_optee(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
>   int do_ut_overlay(struct cmd_tbl *cmdtp, int flag, int argc,
> diff --git a/test/boot/Makefile b/test/boot/Makefile
> index d724629d3b..24cc20bdff 100644
> --- a/test/boot/Makefile
> +++ b/test/boot/Makefile
> @@ -4,6 +4,7 @@
>
>   obj-$(CONFIG_BOOTSTD) += bootdev.o bootstd_common.o bootflow.o bootmeth.o
>   obj-$(CONFIG_FIT) += image.o
> +obj-$(CONFIG_MEASURED_BOOT) += measurement.o
>
>   ifdef CONFIG_OF_LIVE
>   obj-$(CONFIG_BOOTMETH_VBE_SIMPLE) += vbe_simple.o
> diff --git a/test/boot/measurement.c b/test/boot/measurement.c
> new file mode 100644
> index 0000000000..2155208894
> --- /dev/null
> +++ b/test/boot/measurement.c
> @@ -0,0 +1,66 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Test for measured boot functions
> + *
> + * Copyright 2023 IBM Corp.
> + * Written by Eddie James <eajames at linux.ibm.com>
> + */
> +
> +#include <common.h>
> +#include <bootm.h>
> +#include <malloc.h>
> +#include <test/suites.h>
> +#include <test/test.h>
> +#include <test/ut.h>
> +#include <asm/io.h>
> +
> +#define MEASUREMENT_TEST(_name, _flags)	\
> +	UNIT_TEST(_name, _flags, measurement_test)
> +
> +static int measure(struct unit_test_state *uts)
> +{
> +	struct bootm_headers images;
> +	const size_t size = 1024;
> +	u8 *kernel;
> +	u8 *initrd;
> +	size_t i;
> +
> +	kernel = malloc(size);
> +	initrd = malloc(size);
> +
> +	images.os.image_start = map_to_sysmem(kernel);
> +	images.os.image_len = size;
> +
> +	images.rd_start = map_to_sysmem(initrd);
> +	images.rd_end = images.rd_start + size;
> +
> +	images.ft_addr = malloc(size);
> +	images.ft_len = size;
> +
> +	env_set("bootargs", "measurement testing");
> +
> +	for (i = 0; i < size; ++i) {
> +		kernel[i] = (u8)(0xf0 | (i & 0xf));
> +		initrd[i] = (u8)((i & 0xf0) | 0xf);
> +		((u8 *)images.ft_addr)[i] = (u8)(i & 0xff);
> +	}
> +
> +	ut_assertok(bootm_measure(&images));
> +
> +	free(images.ft_addr);
> +	free(initrd);
> +	free(kernel);
> +
> +	return 0;
> +}
> +MEASUREMENT_TEST(measure, 0);
> +
> +int do_ut_measurement(struct cmd_tbl *cmdtp, int flag, int argc,
> +		      char *const argv[])
> +{
> +	struct unit_test *tests = UNIT_TEST_SUITE_START(measurement_test);
> +	const int n_ents = UNIT_TEST_SUITE_COUNT(measurement_test);
> +
> +	return cmd_ut_category("measurement", "measurement_test_", tests,
> +			       n_ents, argc, argv);
> +}
> diff --git a/test/cmd_ut.c b/test/cmd_ut.c
> index 2736582f11..819031c0f8 100644
> --- a/test/cmd_ut.c
> +++ b/test/cmd_ut.c
> @@ -100,6 +100,8 @@ static struct cmd_tbl cmd_ut_sub[] = {
>   			 "", ""),
>   	U_BOOT_CMD_MKENT(bloblist, CONFIG_SYS_MAXARGS, 1, do_ut_bloblist,
>   			 "", ""),
> +	U_BOOT_CMD_MKENT(measurement, CONFIG_SYS_MAXARGS, 1, do_ut_measurement,
> +			 "", ""),
>   	U_BOOT_CMD_MKENT(bootm, CONFIG_SYS_MAXARGS, 1, do_ut_bootm, "", ""),
>   #endif
>   	U_BOOT_CMD_MKENT(str, CONFIG_SYS_MAXARGS, 1, do_ut_str, "", ""),



More information about the U-Boot mailing list