Re: [PATCH v8 4/8] image-fit-sig: Optionally require signatures

Jonas Karlman <[email protected]>
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <66a3267d-1980-4b86-be3a-791707373554__5804.35980098031$1787352552$gmane$org@kwiboo.se>
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
>  -------
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.