* How to use ECDSA for signature verification? @ 2025-10-13 18:36 Marko Mäkelä 2025-11-08 17:24 ` Marko Mäkelä 0 siblings, 1 reply; 5+ messages in thread From: Marko Mäkelä @ 2025-10-13 18:36 UTC (permalink / raw) To: u-boot Hi all, Yesterday, I successfully built the u-boot master branch with CONFIG_FIT_SIGNATURE=y and CONFIG_RSA=y and got the signature verification working with sha256,rsa2048. Today, I wanted to try out CONFIG_ECDSA=y, but I am facing some trouble. I am generating the key and trying to add its public part to the device tree blob as with fdt_add_pubkey as follows: openssl ecparam -name secp521r1 -genkey -noout -out dev-private.pem openssl ec -in dev-private.pem -pubout -out dev.pem cd u-boot make ... cp u-boot.dtb u-pubkey.dtb tools/fdt_add_pubkey -a sha512,secp521r1 -n dev -k .. -r conf u-pubkey.dtb The next step would be to run make EXT_DTB=u-pubkey.dtb ... so that the public key will be embedded and the signature verification will be enabled in the final u-boot.img. Alas, the fdt_add_pubkey command would crash in SIGSEGV in alloc_ctx(). I figured out that the hash algorithm is not being looked up and assigned. Maybe this is not necessary for the -a sha256,rsa2048 which I was successfully using previously. The following patch fixes the SIGSEGV: diff --git a/tools/fdt_add_pubkey.c b/tools/fdt_add_pubkey.c index 5582d7a8efe..4f7028cc15c 100644 --- a/tools/fdt_add_pubkey.c +++ b/tools/fdt_add_pubkey.c @@ -73,9 +73,10 @@ static void reset_info(struct image_sign_info *info) info->keyname = keyname; info->name = algo_name; info->require_keys = require_keys; + info->checksum = image_get_checksum_algo(algo_name); info->crypto = image_get_crypto_algo(algo_name); - if (!info->crypto) { + if (!info->checksum || !info->crypto) { fprintf(stderr, "Unsupported signature algorithm '%s'\n", algo_name); exit(EXIT_FAILURE); However, with the above patch applied, I am facing the next trouble: tools/fdt_add_pubkey -a sha512,secp521r1 -n dev -k .. -r conf u-boot-key.dtb Can not read key from '../dev.pem' tools/fdt_add_pubkey: Cannot add public key to FIT blob: Unknown error -5 In GDB, I can see that read_key() in lib/ecdsa/ecdsa-libcrypto.c would invoke PEM_read_PrivateKey(), which I assume will fail, because ../dev.pem only contains a public key. In the planned deployment, the private key would be private to a HSM or an external service. Moreover, I do not understand why fdt_add_pubkey would attempt to access a private key in the first place; that should only be needed for signing the fitImage. Both prepare_ctx() and ecdsa_add_verify_data() would return -5, which main() is reporting to stderr. Has some way of using ECDSA based signature verification been tested? The reason why I would like to avoid RSA is that it is not thought to be quantum-secure, or secure against a cryptalalytic attack by a quantum computer. With best regards, Marko Mäkelä ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: How to use ECDSA for signature verification? 2025-10-13 18:36 How to use ECDSA for signature verification? Marko Mäkelä @ 2025-11-08 17:24 ` Marko Mäkelä 2025-11-11 4:22 ` Anshul Dalal 0 siblings, 1 reply; 5+ messages in thread From: Marko Mäkelä @ 2025-11-08 17:24 UTC (permalink / raw) To: u-boot Hi all, I am new to u-boot, please bear with me. I got CONFIG_FIT_SIGNATURE=y to work with the RSA algorithm, but not with ECDSA. My two main questions are: Is CONFIG_ECDSA_VERIFY only implemented for the two targets: rom_api_ops in arch/arm/mach-stm32mp/ecdsa_romapi.c cptra_ecdsa_ops in drivers/crypto/aspeed/cptra_ecdsa.c. Is it feasible to support something more modern than RSA signatures on a reasonably high-end target, such as ARMv8? Are there any suggestions or git commits that you would suggest as a reference? Mon, Oct 13, 2025 at 09:36:50PM +0300, Marko Mäkelä wrote: >Hi all, > >Yesterday, I successfully built the u-boot master branch with >CONFIG_FIT_SIGNATURE=y and CONFIG_RSA=y and got the signature >verification working with sha256,rsa2048. > >Today, I wanted to try out CONFIG_ECDSA=y, but I am facing some >trouble. I am generating the key and trying to add its public part to >the device tree blob as with fdt_add_pubkey as follows: I got a bit further with this, using the algorithm sha256,ecdsa256. With a patch and some work-arounds, I think I understood the host-side workflow. However, the signature check on my target (TI Sitara am62x) is failing. Unlike with RSA, the mkimage command expects the ECDSA private key in a file like dev.pem, not dev.key. I successfully created a private key and constructed a signed FIT image with the following commands: openssl ecparam -name prime256v1 -genkey -noout -out dev.pem mkimage -k . -f fitImage.its fitImage I verified the presence of a signature by running the following command, which produced the signature in a "value" subnode: dtc -I dtb fitImage|grep -A10 signature For the algorithm sha256,ecdsa256 that I chose, the fdt_add_pubkey tool requires a patch to avoid SIGSEGV, which I am copying below from my previous message: diff --git a/tools/fdt_add_pubkey.c b/tools/fdt_add_pubkey.c index 5582d7a8efe..4f7028cc15c 100644 --- a/tools/fdt_add_pubkey.c +++ b/tools/fdt_add_pubkey.c @@ -73,9 +73,10 @@ static void reset_info(struct image_sign_info *info) info->keyname = keyname; info->name = algo_name; info->require_keys = require_keys; + info->checksum = image_get_checksum_algo(algo_name); info->crypto = image_get_crypto_algo(algo_name); - if (!info->crypto) { + if (!info->checksum || !info->crypto) { fprintf(stderr, "Unsupported signature algorithm '%s'\n", algo_name); exit(EXIT_FAILURE); Unlike with RSA, fdt_add_pubkey does not accept a public key: fdt_add_pubkey: Cannot add public key to FIT blob: Unknown error -5 I am able to work around this by invoking the tool on a _private_ key dev.pem that the fitImage had been signed with. I don't know if there is a cleaner way, but here's how I am embedding the public key to the image. I first build U-boot from the scratch, modify the generated u-boot.dtb, and finally rebuild to have the modified DTB included: make clean make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu- ... cp u-boot.dtb u-boot-pubkey.dtb fdt_add_pubkey -a sha256,ecdsa256 -n dev -k . -r conf u-boot-pubkey.dtb fit_check_sign -f fitImage -k u-boot-pubkey.dtb make EXT_DTB=u-boot-pubkey.dtb \ -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu- ... Even though fit_check_sign passes on the host system, the signature check would fail on the target system (TI AM62x) as follows: 8304957 bytes read in 346 ms (22.9 MiB/s) ## Executing script at 90000000 sha256,ecdsa256:dev- error! Unknown signature algorithm for '<NULL>' hash node in 'conf-1' config node Failed to verify required signature 'dev' Boot failed (err=1) It turns out that for ECDSA signature verification, at least three configuration options will be needed: CONFIG_FIT_SIGNATURE=y CONFIG_ECDSA=y CONFIG_ECDSA_VERIFY=y Rebuilding with CONFIG_ECDSA_VERIFY=y changed the error message to the following: sha256,ecdsa256:dev- error! Verification failed for '<NULL>' hash node in 'conf-1' config node Failed to verify required signature 'dev' I did not attach a debugger to the target, but I am rather sure that the verification fails because of the following: static int ecdsa_verify_hash(struct udevice *dev, const struct image_sign_info *info, const void *hash, const void *sig, uint sig_len) { const struct ecdsa_ops *ops = device_get_ops(dev); const struct checksum_algo *algo = info->checksum; struct ecdsa_public_key key; int sig_node, key_node, ret; if (!ops || !ops->verify) return -ENODEV; I found only two definitions of ecdsa_ops, and it does not look like either one should be available on my target system. The cosmetic error <NULL> in the error message occurs because the local variable "noffset" in fit_image_verify_sig() will only be valid if the for loop is executing "goto error". This bug is tricky to fix, because as far as I understand, we want to allow multiple signatures to be verified. One more thing that I noticed is that the function fit_check_sign() has an unused parameter: diff --git a/tools/fit_check_sign.c b/tools/fit_check_sign.c index ab3266aff20..3d1e66f2b58 100644 --- a/tools/fit_check_sign.c +++ b/tools/fit_check_sign.c @@ -80,7 +80,7 @@ int main(int argc, char **argv) return EXIT_FAILURE; } image_set_host_blob(key_blob); - ret = fit_check_sign(fit_blob, key_blob, config_name); + ret = fit_check_sign(fit_blob, NULL, config_name); if (!ret) { ret = EXIT_SUCCESS; fprintf(stderr, "Signature check OK\n"); The above patch shows the only caller of the function. It also shows that the caller is invoking image_set_host_blob() on that parameter, which is why the check is able to work. Maybe that call should be made part of fit_check_sign() itself? Anyway, this code does not execute on the target. With best regards, Marko Mäkelä ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: How to use ECDSA for signature verification? 2025-11-08 17:24 ` Marko Mäkelä @ 2025-11-11 4:22 ` Anshul Dalal 2025-11-11 15:56 ` Marko Mäkelä 0 siblings, 1 reply; 5+ messages in thread From: Anshul Dalal @ 2025-11-11 4:22 UTC (permalink / raw) To: Marko Mäkelä, u-boot Hello Marko, On Sat Nov 8, 2025 at 10:54 PM IST, Marko Mäkelä wrote: > Hi all, > > I am new to u-boot, please bear with me. I got CONFIG_FIT_SIGNATURE=y to > work with the RSA algorithm, but not with ECDSA. > > My two main questions are: > > Is CONFIG_ECDSA_VERIFY only implemented for the two targets: > rom_api_ops in arch/arm/mach-stm32mp/ecdsa_romapi.c > cptra_ecdsa_ops in drivers/crypto/aspeed/cptra_ecdsa.c. > Yes, those two seem to be the only one's implementing UCLASS_ECDSA. > Is it feasible to support something more modern than RSA signatures on a > reasonably high-end target, such as ARMv8? Are there any suggestions or > git commits that you would suggest as a reference? > Should be possible, you can look at the current implementaitons of RSA and lib/ecdsa/ecdsa-libcrypto.c for reference. > Mon, Oct 13, 2025 at 09:36:50PM +0300, Marko Mäkelä wrote: >>Hi all, >> >>Yesterday, I successfully built the u-boot master branch with >>CONFIG_FIT_SIGNATURE=y and CONFIG_RSA=y and got the signature >>verification working with sha256,rsa2048. >> >>Today, I wanted to try out CONFIG_ECDSA=y, but I am facing some >>trouble. I am generating the key and trying to add its public part to >>the device tree blob as with fdt_add_pubkey as follows: > > I got a bit further with this, using the algorithm sha256,ecdsa256. > > With a patch and some work-arounds, I think I understood the host-side > workflow. However, the signature check on my target (TI Sitara am62x) is > failing. > > Unlike with RSA, the mkimage command expects the ECDSA private key in a > file like dev.pem, not dev.key. I successfully created a private key and > constructed a signed FIT image with the following commands: > > openssl ecparam -name prime256v1 -genkey -noout -out dev.pem > mkimage -k . -f fitImage.its fitImage > > I verified the presence of a signature by running the following command, > which produced the signature in a "value" subnode: > > dtc -I dtb fitImage|grep -A10 signature > > For the algorithm sha256,ecdsa256 that I chose, the fdt_add_pubkey tool > requires a patch to avoid SIGSEGV, which I am copying below from my > previous message: > > diff --git a/tools/fdt_add_pubkey.c b/tools/fdt_add_pubkey.c > index 5582d7a8efe..4f7028cc15c 100644 > --- a/tools/fdt_add_pubkey.c > +++ b/tools/fdt_add_pubkey.c > @@ -73,9 +73,10 @@ static void reset_info(struct image_sign_info *info) > info->keyname = keyname; > info->name = algo_name; > info->require_keys = require_keys; > + info->checksum = image_get_checksum_algo(algo_name); > info->crypto = image_get_crypto_algo(algo_name); > > - if (!info->crypto) { > + if (!info->checksum || !info->crypto) { > fprintf(stderr, "Unsupported signature algorithm '%s'\n", > algo_name); > exit(EXIT_FAILURE); > > Unlike with RSA, fdt_add_pubkey does not accept a public key: > > fdt_add_pubkey: Cannot add public key to FIT blob: Unknown error -5 > > I am able to work around this by invoking the tool on a _private_ key > dev.pem that the fitImage had been signed with. > > I don't know if there is a cleaner way, but here's how I am embedding > the public key to the image. I first build U-boot from the scratch, > modify the generated u-boot.dtb, and finally rebuild to have the > modified DTB included: > > make clean > make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu- ... > cp u-boot.dtb u-boot-pubkey.dtb > fdt_add_pubkey -a sha256,ecdsa256 -n dev -k . -r conf u-boot-pubkey.dtb > fit_check_sign -f fitImage -k u-boot-pubkey.dtb > make EXT_DTB=u-boot-pubkey.dtb \ > -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu- ... > > Even though fit_check_sign passes on the host system, the signature > check would fail on the target system (TI AM62x) as follows: > > 8304957 bytes read in 346 ms (22.9 MiB/s) > ## Executing script at 90000000 > sha256,ecdsa256:dev- error! > Unknown signature algorithm for '<NULL>' hash node in 'conf-1' config node > Failed to verify required signature 'dev' > Boot failed (err=1) > > It turns out that for ECDSA signature verification, at least three > configuration options will be needed: > > CONFIG_FIT_SIGNATURE=y > CONFIG_ECDSA=y > CONFIG_ECDSA_VERIFY=y > > Rebuilding with CONFIG_ECDSA_VERIFY=y changed the error message to the > following: > > sha256,ecdsa256:dev- error! > Verification failed for '<NULL>' hash node in 'conf-1' config node > Failed to verify required signature 'dev' > This is probably due to U-Boot failing to find a driver with UCLASS_ECDSA, you can verify by adding a "#define DEBUG" to the top of lib/ecdsa/ecdsa-verify.c and check if the following error shows up: ECDSA: Could not find ECDSA implementation: -19 Regards, Anshul > I did not attach a debugger to the target, but I am rather sure that the > verification fails because of the following: > > static int ecdsa_verify_hash(struct udevice *dev, > const struct image_sign_info *info, > const void *hash, const void *sig, uint sig_len) > { > const struct ecdsa_ops *ops = device_get_ops(dev); > const struct checksum_algo *algo = info->checksum; > struct ecdsa_public_key key; > int sig_node, key_node, ret; > > if (!ops || !ops->verify) > return -ENODEV; > > I found only two definitions of ecdsa_ops, and it does not look like > either one should be available on my target system. > > The cosmetic error <NULL> in the error message occurs because the local > variable "noffset" in fit_image_verify_sig() will only be valid if the > for loop is executing "goto error". This bug is tricky to fix, because > as far as I understand, we want to allow multiple signatures to be > verified. > > One more thing that I noticed is that the function fit_check_sign() has > an unused parameter: > > diff --git a/tools/fit_check_sign.c b/tools/fit_check_sign.c > index ab3266aff20..3d1e66f2b58 100644 > --- a/tools/fit_check_sign.c > +++ b/tools/fit_check_sign.c > @@ -80,7 +80,7 @@ int main(int argc, char **argv) > return EXIT_FAILURE; > } > image_set_host_blob(key_blob); > - ret = fit_check_sign(fit_blob, key_blob, config_name); > + ret = fit_check_sign(fit_blob, NULL, config_name); > if (!ret) { > ret = EXIT_SUCCESS; > fprintf(stderr, "Signature check OK\n"); > > The above patch shows the only caller of the function. It also shows > that the caller is invoking image_set_host_blob() on that parameter, > which is why the check is able to work. Maybe that call should be made > part of fit_check_sign() itself? Anyway, this code does not execute on > the target. > > With best regards, > > Marko Mäkelä ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use ECDSA for signature verification? 2025-11-11 4:22 ` Anshul Dalal @ 2025-11-11 15:56 ` Marko Mäkelä 2026-02-03 5:32 ` Anshul Dalal 0 siblings, 1 reply; 5+ messages in thread From: Marko Mäkelä @ 2025-11-11 15:56 UTC (permalink / raw) To: Anshul Dalal; +Cc: u-boot Hello Anshul, Tue, Nov 11, 2025 at 09:52:51AM +0530, Anshul Dalal wrote: >Hello Marko, > >On Sat Nov 8, 2025 at 10:54 PM IST, Marko Mäkelä wrote: >> Hi all, >> >> I am new to u-boot, please bear with me. I got CONFIG_FIT_SIGNATURE=y to >> work with the RSA algorithm, but not with ECDSA. >> >> My two main questions are: >> >> Is CONFIG_ECDSA_VERIFY only implemented for the two targets: >> rom_api_ops in arch/arm/mach-stm32mp/ecdsa_romapi.c >> cptra_ecdsa_ops in drivers/crypto/aspeed/cptra_ecdsa.c. >> > >Yes, those two seem to be the only one's implementing UCLASS_ECDSA. > >> Is it feasible to support something more modern than RSA signatures on a >> reasonably high-end target, such as ARMv8? Are there any suggestions or >> git commits that you would suggest as a reference? >> > >Should be possible, you can look at the current implementaitons of RSA >and lib/ecdsa/ecdsa-libcrypto.c for reference. Thank you. I will look at that. [snip] >> Rebuilding with CONFIG_ECDSA_VERIFY=y changed the error message to >> the >> following: >> >> sha256,ecdsa256:dev- error! >> Verification failed for '<NULL>' hash node in 'conf-1' config node >> Failed to verify required signature 'dev' >> > >This is probably due to U-Boot failing to find a driver with >UCLASS_ECDSA, you can verify by adding a "#define DEBUG" to the top of >lib/ecdsa/ecdsa-verify.c and check if the following error shows up: > > ECDSA: Could not find ECDSA implementation: -19 Thank you for the tip. So, the #define DEBUG would enable the debug() statements. This indeed confirms my hypothesis: ## Executing script at 90000000 sha256,ecdsa256:devECDSA: Could not find ECDSA implementation: -19 - error! Verification failed for '<NULL>' hash node in 'conf-1' config node Failed to verify required signature 'dev' Boot failed (err=1) I'm working on this on a hobby basis for now, and it may take some time before I will submit any patches for review. Best regards, Marko ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use ECDSA for signature verification? 2025-11-11 15:56 ` Marko Mäkelä @ 2026-02-03 5:32 ` Anshul Dalal 0 siblings, 0 replies; 5+ messages in thread From: Anshul Dalal @ 2026-02-03 5:32 UTC (permalink / raw) To: Marko Mäkelä, Anshul Dalal; +Cc: u-boot On Tue Nov 11, 2025 at 9:26 PM IST, Marko Mäkelä wrote: > Hello Anshul, > > Tue, Nov 11, 2025 at 09:52:51AM +0530, Anshul Dalal wrote: >>Hello Marko, >> >>On Sat Nov 8, 2025 at 10:54 PM IST, Marko Mäkelä wrote: >>> Hi all, >>> >>> I am new to u-boot, please bear with me. I got CONFIG_FIT_SIGNATURE=y to >>> work with the RSA algorithm, but not with ECDSA. >>> >>> My two main questions are: >>> >>> Is CONFIG_ECDSA_VERIFY only implemented for the two targets: >>> rom_api_ops in arch/arm/mach-stm32mp/ecdsa_romapi.c >>> cptra_ecdsa_ops in drivers/crypto/aspeed/cptra_ecdsa.c. >>> >> >>Yes, those two seem to be the only one's implementing UCLASS_ECDSA. >> >>> Is it feasible to support something more modern than RSA signatures on a >>> reasonably high-end target, such as ARMv8? Are there any suggestions or >>> git commits that you would suggest as a reference? >>> >> >>Should be possible, you can look at the current implementaitons of RSA >>and lib/ecdsa/ecdsa-libcrypto.c for reference. FYI Phillippe Reynes has posted an RFC for the same[1], you can provide feedback there if interested :) [1]: https://lore.kernel.org/u-boot/20260202170307.217200-1-philippe.reynes@softathome.com/ > > Thank you. I will look at that. > > [snip] > >>> Rebuilding with CONFIG_ECDSA_VERIFY=y changed the error message to >>> the >>> following: >>> >>> sha256,ecdsa256:dev- error! >>> Verification failed for '<NULL>' hash node in 'conf-1' config node >>> Failed to verify required signature 'dev' >>> >> >>This is probably due to U-Boot failing to find a driver with >>UCLASS_ECDSA, you can verify by adding a "#define DEBUG" to the top of >>lib/ecdsa/ecdsa-verify.c and check if the following error shows up: >> >> ECDSA: Could not find ECDSA implementation: -19 > > Thank you for the tip. So, the #define DEBUG would enable the debug() > statements. This indeed confirms my hypothesis: > > ## Executing script at 90000000 > sha256,ecdsa256:devECDSA: Could not find ECDSA implementation: -19 > - error! > Verification failed for '<NULL>' hash node in 'conf-1' config node > Failed to verify required signature 'dev' > Boot failed (err=1) > > I'm working on this on a hobby basis for now, and it may take some time > before I will submit any patches for review. > > Best regards, > > Marko ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-02-03 5:33 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-10-13 18:36 How to use ECDSA for signature verification? Marko Mäkelä 2025-11-08 17:24 ` Marko Mäkelä 2025-11-11 4:22 ` Anshul Dalal 2025-11-11 15:56 ` Marko Mäkelä 2026-02-03 5:32 ` Anshul Dalal
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox