Mon, Feb 02, 2026 at 06:03:03PM +0100, Philippe Reynes wrote:
I have tested this code with sandbox, and I have
followed those steps:

0) build u-boot using sandbox_defconfig and adding those options:
CONFIG_ECDSA_SW=y
CONFIG_ECDSA_MBEDTLS=y
CONFIG_ECDSA=y
CONFIG_ECDSA_VERIFY=y

I believe that I was able to build an ECDSA signed fitImage of a Linux kernel. At least "dtc" shows that a signature is present, just like with my earlier attempt with RSA.

1) add a signature node to an its file
        signature-256 {
                algo = "sha256,ecdsa256";
                key-name-hint = "private-key-256";
        };

2) generate an ecdsa key
openssl ecparam -name prime256v1 -genkey -noout -out private-key-256.pem

3) create the itb file
./tools/mkimage -f <file.its> -k . -K arch/sandbox/dts/test.dtb <file.itb>

Step 1) is part of <file.its>, which specifies how a signed payload, such as a Linux kernel, is built in <file.itb>, right?

I assume that arch/sandbox/dts/test.dts is the source code for arch/sandbox/dts/test.dtb. Would this file correspond to the file u-boot.dtb in a non-sandbox environment (in my case, based on rpi_4_defconfig)?

For me, mkimage version 2025.01 (as shipped in Debian Sid) would crash if I ask it to write the public key to u-boot.dtb using the parameter "-K u-boot.dtb". The following statement in do_add() would hit SIGSEGV:

        ret = fdt_setprop_string(fdt, key_node, FIT_KEY_REQUIRED,
                                 info->require_keys);

The function do_add() is invoked by ecdsa_add_verify_data(). For my kernel build, I did not yet try a mkimage that is built from the latest u-boot. Should that make a difference?

For an earlier experiment with an RSA signed fitImage, I was able to do the following:

make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu- all u-boot.dtb

cp u-boot.dtb u-boot-pubkey.dtb
ALGO=$(scripts/dtc/dtc -I dtb /target/fitImage |grep -A10 signature|
sed -ne "s/\s*algo = \"\(.*\)\";/\1/p")
tools/fdt_add_pubkey -a "$ALGO" -n dev -k . -r conf u-boot-pubkey.dtb
tools/fit_check_sign -f /target/fitImage -k u-boot-pubkey.dtb

make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu- \
EXT_DTB=u-boot-pubkey.dtb

cp -L u-boot.img /target/

With CONFIG_ECDSA, fdt_add_pubkey would SIGSEGV (unrelated to these changes) and fit_check_sign does not appear to be built.

I would appreciate some help in embedding the ECDSA public key to the u-boot image, so that I can test this.

Best regards,

        Marko

Reply via email to