[PATCH] mkimage: ecdsa: add signature/key nodes to dtb if missing
Peter Robinson
pbrobinson at gmail.com
Tue Aug 27 20:40:59 CEST 2024
On Tue, 27 Aug 2024 at 18:52, Matthias Pritschet <matthias at pritschet.eu> wrote:
>
> From: Matthias Pritschet <matthias.pritschet at itk-engineering.de>
>
> If the signature/key node(s) are not yet present in the U-Boot device
> tree, ecdsa_add_verify_data simply fails if it can't find the nodes.
> This behaviour differs from rsa_add_verify_data, wich does add the missing
> nodes and proceeds in that case.
>
> This change is mainly copy&paste from rsa_add_verify_data to add the
> same behaviour to ecdsa_add_verify_data.
Could the duplicated code be moved out into a function shared between
the two *_add_verify_data bits of code?
> Signed-off-by: Matthias Pritschet <matthias.pritschet at itk-engineering.de>
> ---
> lib/ecdsa/ecdsa-libcrypto.c | 36 +++++++++++++++++++++++++++++-------
> 1 file changed, 29 insertions(+), 7 deletions(-)
>
> diff --git a/lib/ecdsa/ecdsa-libcrypto.c b/lib/ecdsa/ecdsa-libcrypto.c
> index 5fa9be10b4..db0a828a29 100644
> --- a/lib/ecdsa/ecdsa-libcrypto.c
> +++ b/lib/ecdsa/ecdsa-libcrypto.c
> @@ -281,16 +281,35 @@ static int do_add(struct signer *ctx, void *fdt, const char *key_node_name)
> BIGNUM *x, *y;
>
> signature_node = fdt_subnode_offset(fdt, 0, FIT_SIG_NODENAME);
> - if (signature_node < 0) {
> - fprintf(stderr, "Could not find 'signature node: %s\n",
> + if (signature_node == -FDT_ERR_NOTFOUND) {
> + signature_node = fdt_add_subnode(fdt, 0, FIT_SIG_NODENAME);
> + if (signature_node < 0) {
> + if (signature_node != -FDT_ERR_NOSPACE) {
> + fprintf(stderr, "Couldn't create signature node: %s\n",
> + fdt_strerror(signature_node));
> + }
> + return signature_node;
> + }
> + } else if (signature_node < 0) {
> + fprintf(stderr, "Cannot select keys signature_node: %s\n",
> fdt_strerror(signature_node));
> return signature_node;
> }
>
> - key_node = fdt_add_subnode(fdt, signature_node, key_node_name);
> - if (key_node < 0) {
> - fprintf(stderr, "Could not create '%s' node: %s\n",
> - key_node_name, fdt_strerror(key_node));
> + /* Either create or overwrite the named key node */
> + key_node = fdt_subnode_offset(fdt, signature_node, key_node_name);
> + if (key_node == -FDT_ERR_NOTFOUND) {
> + key_node = fdt_add_subnode(fdt, signature_node, key_node_name);
> + if (key_node < 0) {
> + if (key_node != -FDT_ERR_NOSPACE) {
> + fprintf(stderr, "Could not create key subnode: %s\n",
> + fdt_strerror(key_node));
> + }
> + return key_node;
> + }
> + } else if (key_node < 0) {
> + fprintf(stderr, "Cannot select keys key_node: %s\n",
> + fdt_strerror(key_node));
> return key_node;
> }
>
> @@ -326,8 +345,11 @@ int ecdsa_add_verify_data(struct image_sign_info *info, void *fdt)
>
> fdt_key_name = info->keyname ? info->keyname : "default-key";
> ret = prepare_ctx(&ctx, info);
> - if (ret >= 0)
> + if (ret >= 0){
> ret = do_add(&ctx, fdt, fdt_key_name);
> + if (ret < 0)
> + ret = ret == -FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
> + }
>
> free_ctx(&ctx);
> return ret;
> --
> 2.34.1
>
More information about the U-Boot
mailing list