diff mbox series

[U-Boot,RFC] spl: vboot: Verify content before using load_addr

Message ID 20180605210857.688122cf3f44bbd0e5bfa152@gmail.com
State Deferred
Delegated to: Tom Rini
Headers show
Series [U-Boot,RFC] spl: vboot: Verify content before using load_addr | expand

Commit Message

Teddy Reed June 6, 2018, 1:08 a.m. UTC
When using verified-boot in the SPL, the FIT content must be
verified before it can be used.

Currently the load_addr FIT property is read and used as input to
memcpy before the property is verified.

Signed-off-by: Teddy Reed <teddy.reed@gmail.com>
---
 common/spl/spl_fit.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

Comments

Jun Nie June 6, 2018, 8:35 a.m. UTC | #1
2018-06-06 9:08 GMT+08:00 Teddy Reed <teddy.reed@gmail.com>:
> When using verified-boot in the SPL, the FIT content must be
> verified before it can be used.
>
> Currently the load_addr FIT property is read and used as input to
> memcpy before the property is verified.
>
> Signed-off-by: Teddy Reed <teddy.reed@gmail.com>
> ---

Reviewed-by: Jun Nie <jun.nie@linaro.org>
Teddy Reed June 6, 2018, 3:32 p.m. UTC | #2
On Wed, Jun 6, 2018 at 4:35 AM, Jun Nie <jun.nie@linaro.org> wrote:
> 2018-06-06 9:08 GMT+08:00 Teddy Reed <teddy.reed@gmail.com>:
>> When using verified-boot in the SPL, the FIT content must be
>> verified before it can be used.
>>
>> Currently the load_addr FIT property is read and used as input to
>> memcpy before the property is verified.
>>
>> Signed-off-by: Teddy Reed <teddy.reed@gmail.com>
>> ---
>
> Reviewed-by: Jun Nie <jun.nie@linaro.org>

Thanks for taking a look Jun! I did not see any sandbox tests
exercising the SPL/signature checking so I included 'RFC'. I know you
are familiar with using the signature checking within the SPL, and you
helped make it possible in the first place.

The three minor concerns I had when moving the validation earlier are:
(1) the signature was originally calculated on the potentially
uncompressed version, but this seems unlikely; similarly (2) the post
process board-specific methods can mutate the signed content; and (3)
now using the src address means reading directly from storage / etc
instead of potentially SRAM/DRAM.

For (1) see that line 256 was uncompressing the data before signature
checking. Then the signature check was applied to the uncompressed
region. To be clear I think this patch is the correct approach, and
the signature check should apply to the compressed content.

For (2) see that line 248 is board-specific, I am assuming that can
mutate the content. Thus the signature check should be placed before
that call.

Thanks again!
diff mbox series

Patch

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 2321ebb0dde..a35c6092cee 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -244,6 +244,16 @@  static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
 		src = (void *)data;
 	}
 
+#ifdef CONFIG_SPL_FIT_SIGNATURE
+	printf("## Checking hash(es) for Image %s ...\n",
+	       fit_get_name(fit, node, NULL));
+	ret = fit_image_verify_with_data(fit, node,
+					 (const void *)src, length);
+	printf("\n");
+	if (!ret)
+		return 1;
+#endif
+
 #ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
 	board_fit_image_post_process(&src, &length);
 #endif
@@ -269,16 +279,7 @@  static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
 		image_info->entry_point = fdt_getprop_u32(fit, node, "entry");
 	}
 
-#ifdef CONFIG_SPL_FIT_SIGNATURE
-	printf("## Checking hash(es) for Image %s ...\n",
-	       fit_get_name(fit, node, NULL));
-	ret = fit_image_verify_with_data(fit, node,
-					 (const void *)load_addr, length);
-	printf("\n");
-	return !ret;
-#else
 	return 0;
-#endif
 }
 
 static int spl_fit_append_fdt(struct spl_image_info *spl_image,