[PATCH 1/2] spl: Add CONFIG_SPL_FIT_SIGNATURE_STRICT
Alex G.
mr.nuke.me at gmail.com
Thu Sep 16 20:30:21 CEST 2021
Hi Oleksandr
On 9/16/21 8:09 AM, Oleksandr Suvorov wrote:
> From: Henry Beberman <hebeberm at microsoft.com>
>
> SPL FIT load checks the signature on loadable images but just continues
> in the case of a failure. This is undesirable behavior because the boot
> process depends on the authenticity of each loadable part.
>
> Adding CONFIG_SPL_FIT_SIGNATURE_STRICT to halt the platform when any
> image fails its signature check, including loadable parts.
This sounds very similar to what FIT config verification already does,
so I don't understand the motivation behind this patch.
> SPL already supports image signature verification but had no mechanism
> to check that the FIT's configuration block was signed correctly.
This statement is incorrect. This is exactly what required = "conf";
in u-boot's devicetree is intended to do.
NAK
> Add a check near the start of spl_load_simple_fit that verifies the
> FIT's configuration block, and fails if it's not present or the
> signature doesn't match what's stored in the SPL DTB.
>
> Signed-off-by: Henry Beberman <hebeberm at microsoft.com>
> Signed-off-by: Ricardo Salveti <ricardo at foundries.io>
> Co-developed-by: Oleksandr Suvorov <oleksandr.suvorov at foundries.io>
> Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov at foundries.io>
> ---
>
> common/Kconfig.boot | 7 +++++++
> common/spl/spl_fit.c | 21 ++++++++++++++++++++-
> 2 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/common/Kconfig.boot b/common/Kconfig.boot
> index 902a5b8fbea..6f95d009dfa 100644
> --- a/common/Kconfig.boot
> +++ b/common/Kconfig.boot
> @@ -166,6 +166,13 @@ config SPL_FIT_SIGNATURE
> select SPL_IMAGE_SIGN_INFO
> select SPL_FIT_FULL_CHECK
>
> +config SPL_FIT_SIGNATURE_STRICT
> + bool "Halt if loadables or firmware don't pass FIT signature verification"
> + select SPL_FIT_SIGNATURE
> + help
> + Strictly requires each loadable or firmware in a FIT image to be
> + passed verification. Halt if any loadable fails to be verified.
> +
> config SPL_LOAD_FIT
> bool "Enable SPL loading U-Boot as a FIT (basic fitImage features)"
> select SPL_FIT
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index f41abca0ccb..e7eaaa4cb9e 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -315,7 +315,12 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
> printf("## Checking hash(es) for Image %s ... ",
> fit_get_name(fit, node, NULL));
> if (!fit_image_verify_with_data(fit, node, src, length))
> - return -EPERM;
> + if (CONFIG_IS_ENABLED(FIT_SIGNATURE_STRICT)) {
> + puts("Invalid FIT signature found in a required image.\n");
> + hang();
hang() is rarely the appropriate thing to do. Once you get -EPERM you
could choose to either
a) drop to a lower privilege level
b) enter some sort of recovery mode
c) outright hang.
spl_load_fit_image() isn't the right place to decide (a) or (b), so by
extension, it's the wrong place to decide (c).
> + } else {
> + return -EPERM;
> + }
> puts("OK\n");
> }
>
> @@ -681,6 +686,20 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
> if (ret < 0)
> return ret;
>
> + if (CONFIG_IS_ENABLED(FIT_SIGNATURE_STRICT)) {
> + int cfg_noffset = fit_conf_get_node(fit, NULL);
> +
> + if (cfg_noffset >= 0) {
> + if (fit_config_verify(fit, cfg_noffset)) {
> + puts("Unable to verify the required FIT config.\n");
> + hang();
> + }
> + } else {
> + puts("SPL_FIT_SIGNATURE_STRICT needs a config node in FIT\n");
> + hang();
> + }
> + }
> +
> /* skip further processing if requested to enable load-only use cases */
> if (spl_load_simple_fit_skip_processing())
> return 0;
>
More information about the U-Boot
mailing list