Hi Ludwig,

On 8/13/2026 8:09 AM, Ludwig Nussel via U-Boot wrote:
> If U-Boot is built with signature verification but no keys are
> included in the device tree, the boot would still continue.
> Introduce FIT_SIGNATURE_REQUIRED to avoid a fail-open setup.
> Defaults to off so existing setups are not affected; boards wanting
> fail-closed behaviour must enable it explicitly.
> 
> Consistently use log_err for errors in fit_config_verify_required_keys()
> while at it
> 
> Signed-off-by: Ludwig Nussel <[email protected]>
> Reviewed-by: Simon Glass <[email protected]>
> 
> Series-Changes: 7
> - mention CONFIG_FIT_REQUIRE_CONFIG_SIGS in documentation
> 
> ---
> 
> (no changes since v4)
> 
> Changes in v4:
> - reword Kconfig help text
> - rename option to FIT_REQUIRE_CONFIG_SIGS
> - introduce SPL_FIT_REQUIRE_CONFIG_SIGS
> 
> Changes in v3:
> - clarify error message when no keys were found
> - change printfs to log_err
> - reword Kconfig
> - keep FIT_SIGNATURE_REQUIRED off by default
> 
> Changes in v2:
> - introduce FIT_SIGNATURE_REQUIRED
> 
>  boot/Kconfig                | 22 ++++++++++++++++++++++
>  boot/image-fit-sig.c        | 22 ++++++++++++++--------
>  doc/usage/fit/signature.rst | 13 ++++++++++---
>  3 files changed, 46 insertions(+), 11 deletions(-)
> 
> diff --git a/boot/Kconfig b/boot/Kconfig
> index ae6f09a6ede..c36a403063e 100644
> --- a/boot/Kconfig
> +++ b/boot/Kconfig
> @@ -124,6 +124,23 @@ config FIT_SIGNATURE
>         format support in this case, enable it using
>         CONFIG_LEGACY_IMAGE_FORMAT.
>  
> +config FIT_REQUIRE_CONFIG_SIGS
> +     bool "Require configuration signature verification of FIT uImages"
> +     depends on FIT_SIGNATURE
> +     help
> +       This option requires that FIT uImages have configuration
> +       nodes that are signed or boot will fail.
> +       That means the U-Boot device tree must contain a
> +       "/signature" node and at least one public key with
> +       required="conf".
> +       All configuration sections of a FIT file must be signed
> +       using those keys based on "required-mode" policy.
> +       The option is useful to avoid fail-open situations so it
> +       is recommended to enable. The option currently defaults to
> +       off to avoid breaking existing setups. Keep it off if you
> +       need to reuse the same u-boot binary in setups without
> +       keys or rely on image node only signatures.
> +
>  config FIT_SIGNATURE_MAX_SIZE
>       hex "Max size of signed FIT structures"
>       depends on FIT_SIGNATURE
> @@ -224,6 +241,11 @@ config SPL_FIT_SIGNATURE_MAX_SIZE
>         device memory. Assure this size does not extend past expected storage
>         space.
>  
> +config SPL_FIT_REQUIRE_CONFIG_SIGS
> +     bool "Require signature verification of FIT firmware within SPL"
> +     depends on SPL_FIT_SIGNATURE
> +     select FIT_REQUIRE_CONFIG_SIGS
> +
>  config SPL_LOAD_FIT
>       bool "Enable SPL loading U-Boot as a FIT (basic fitImage features)"
>       depends on SPL
> diff --git a/boot/image-fit-sig.c b/boot/image-fit-sig.c
> index 433df20281f..dc38a2413b0 100644
> --- a/boot/image-fit-sig.c
> +++ b/boot/image-fit-sig.c
> @@ -632,15 +632,16 @@ static int fit_config_verify_required_keys(const void 
> *fit, int conf_noffset,
>        * name root but different @ suffix to be equal
>        */
>       if (strchr(name, '@')) {
> -             printf("Configuration node '%s' contains '@'\n", name);
> +             log_err("Configuration node '%s' contains '@'\n", name);
>               return -EPERM;
>       }
>  
>       /* Work out what we need to verify */
>       key_node = fdt_subnode_offset(key_blob, 0, FIT_SIG_NODENAME);
>       if (key_node < 0) {
> -             debug("%s: No signature node found: %s\n", __func__,
> -                   fdt_strerror(key_node));
> +             log_err("No signature node found: %s\n", 
> fdt_strerror(key_node));

This change is causing a verbose error messages on Rockchip where the
FIT_SIGNATURE feature it used to check image integrity during boot. The
config nodes is not expected to contain any signature, only hash(es) of
images.

With this series I now get following output, with a verbose error
message related to FDT_ERR_NOTFOUND:

  U-Boot SPL 2026.10-rc2-00527-g4110a512ca17 (Aug 21 2026 - 22:33:02 +0000)
  Trying to boot from RAM
  ## Checking hash(es) for config config-1 ... No signature node found: 
FDT_ERR_NOTFOUND
  OK
  ## Checking hash(es) for Image atf-1 ... sha256+ OK
  ## Checking hash(es) for Image u-boot ... sha256+ OK
  ## Checking hash(es) for Image fdt-1 ... sha256+ OK
  ## Checking hash(es) for Image atf-2 ... sha256+ OK
  ## Checking hash(es) for Image atf-3 ... sha256+ OK
  ## Checking hash(es) for Image atf-4 ... sha256+ OK

Prior to this series the output never printed any error message:

  Trying to boot from RAM
  ## Checking hash(es) for config config-1 ... OK
  ## Checking hash(es) for Image atf-1 ... sha256+ OK
  [...]

Regards,
Jonas

> +             if (CONFIG_IS_ENABLED(FIT_REQUIRE_CONFIG_SIGS))
> +                     return -EPERM;
>               return 0;
>       }
>  
> @@ -674,8 +675,8 @@ static int fit_config_verify_required_keys(const void 
> *fit, int conf_noffset,
>                                           noffset);
>               if (ret) {
>                       if (reqd_policy_all) {
> -                             printf("Failed to verify required signature 
> '%s'\n",
> -                                    fit_get_name(key_blob, noffset, NULL));
> +                             log_err("Failed to verify required signature 
> '%s'\n",
> +                                     fit_get_name(key_blob, noffset, NULL));
>                               return ret;
>                       }
>               } else {
> @@ -685,9 +686,14 @@ static int fit_config_verify_required_keys(const void 
> *fit, int conf_noffset,
>               }
>       }
>  
> -     if (reqd_sigs && !verified) {
> -             printf("Failed to verify 'any' of the required signature(s)\n");
> -             return -EPERM;
> +     if (!verified) {
> +             if (reqd_sigs) {
> +                     log_err("Failed to verify 'any' of the required 
> signature(s)\n");
> +                     return -EPERM;
> +             } else if (CONFIG_IS_ENABLED(FIT_REQUIRE_CONFIG_SIGS)) {
> +                     log_err("No suitable keys found for configuration 
> verification\n");
> +                     return -EPERM;
> +             }
>       }
>  
>       return 0;
> diff --git a/doc/usage/fit/signature.rst b/doc/usage/fit/signature.rst
> index da08cc75c3a..73153c97367 100644
> --- a/doc/usage/fit/signature.rst
> +++ b/doc/usage/fit/signature.rst
> @@ -420,11 +420,14 @@ below examples::
>  
>  Enabling FIT Verification
>  -------------------------
> -In addition to the options to enable FIT itself, the following CONFIGs must
> -be enabled:
> +In addition to the options to enable FIT itself, the following
> +settings configure signature verification support:
>  
>  CONFIG_FIT_SIGNATURE
> -    enable signing and verification in FITs
> +    required to enable signing and verification in FITs
> +
> +CONFIG_FIT_REQUIRE_CONFIG_SIGS
> +    make signature verification mandatory
>  
>  CONFIG_RSA
>      enable RSA algorithm for signing
> @@ -436,6 +439,10 @@ WARNING: When relying on signed FIT images with required 
> signature check
>  the legacy image format is default disabled by not defining
>  CONFIG_LEGACY_IMAGE_FORMAT
>  
> +WARNING: CONFIG_FIT_REQUIRE_CONFIG_SIGS is not set by default for
> +backwards compatibility. It is recommended to be turned on whenever
> +configuration signatures are used to avoid fail-open behavior
> +
>  
>  Testing
>  -------

Reply via email to