Allow mkimage -k to use a .key file when the ECDSA .pem file is absent.
Keep .pem precedence so existing key selection is preserved.

Signed-off-by: Ayoub Zaki <[email protected]>
---
Changes in v2:
- Report both attempted filenames when fallback fails.
- Rename pname to fallback_name.

 lib/ecdsa/ecdsa-libcrypto.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/lib/ecdsa/ecdsa-libcrypto.c b/lib/ecdsa/ecdsa-libcrypto.c
index 402c49cf61c..6ffd970a47c 100644
--- a/lib/ecdsa/ecdsa-libcrypto.c
+++ b/lib/ecdsa/ecdsa-libcrypto.c
@@ -218,12 +218,24 @@ static int default_password(char *buf, int size, int 
rwflag, void *u)
        return strlen(buf);
 }
 
-static int read_key(struct signer *ctx, const char *key_name)
+static int read_key(struct signer *ctx, const char *key_name,
+                   const char *fallback)
 {
        FILE *f = fopen(key_name, "r");
        const char *key_pass;
        int ret;
 
+       if (!f && errno == ENOENT && fallback) {
+               f = fopen(fallback, "r");
+               if (!f) {
+                       ret = -errno;
+                       fprintf(stderr, "Can not get key file '%s' or '%s': 
%s\n",
+                               key_name, fallback, strerror(-ret));
+                       return ret;
+               }
+               key_name = fallback;
+       }
+
        if (!f) {
                ret = -errno;
                fprintf(stderr, "Can not get key file '%s': %s\n",
@@ -326,7 +338,8 @@ check_key_len:
 static int prepare_ctx(struct signer *ctx, const struct image_sign_info *info)
 {
        int key_len_bytes, ret;
-       char kname[1024];
+       char kname[1024], fallback_name[1024];
+       const char *fallback = NULL;
 
        memset(ctx, 0, sizeof(*ctx));
 
@@ -337,6 +350,9 @@ static int prepare_ctx(struct signer *ctx, const struct 
image_sign_info *info)
        } else if (info->keydir && info->keyname) {
                snprintf(kname, sizeof(kname), "%s/%s.pem", info->keydir,
                         info->keyname);
+               snprintf(fallback_name, sizeof(fallback_name), "%s/%s.key", 
info->keydir,
+                        info->keyname);
+               fallback = fallback_name;
        } else {
                fprintf(stderr, "keyfile, keyname, or key-name-hint missing\n");
                return -EINVAL;
@@ -346,7 +362,7 @@ static int prepare_ctx(struct signer *ctx, const struct 
image_sign_info *info)
        if (ret)
                return ret;
 
-       ret = read_key(ctx, kname);
+       ret = read_key(ctx, kname, fallback);
        if (ret)
                return ret;
 
-- 
2.53.0

Reply via email to