All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: Donald Chan <hoiho@lab126.com>
Cc: Tom Rini <trini@konsulko.com>,
	U-Boot Mailing List <u-boot@lists.denx.de>,
	 Alexandru Gagniuc <mr.nuke.me@gmail.com>
Subject: Re: [PATCH] lib: rsa: Extract public key from private key if keyfile argument is used
Date: Sat, 31 Jul 2021 10:59:29 -0600	[thread overview]
Message-ID: <CAPnjgZ0OKbo5f8e9L-VsLSBjJk92M2yE1FD6qPb+pksFSFGuOA@mail.gmail.com> (raw)
In-Reply-To: <20210729003441.17428-1-hoiho@lab126.com>

Hi Donald,

On Wed, 28 Jul 2021 at 18:35, Donald Chan <hoiho@lab126.com> wrote:
>
> If the 'keyfile' (-G) argument is used, there is little value to require
> 'keydir' (-k) argument since the public key can also be extracted from the
> private key itself.
>
> Signed-off-by: Donald Chan <hoiho@lab126.com>
> ---
>  lib/rsa/rsa-sign.c | 28 +++++++++++++++++++++-------
>  1 file changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c
> index f4ed11e74a..f70f352311 100644
> --- a/lib/rsa/rsa-sign.c
> +++ b/lib/rsa/rsa-sign.c
> @@ -49,16 +49,16 @@ static int rsa_err(const char *msg)
>  }
>
>  /**
> - * rsa_pem_get_pub_key() - read a public key from a .crt file
> + * rsa_pem_get_pub_key() - read a public key from a private key file or .crt file
>   *
> - * @keydir:    Directory containins the key
> - * @name       Name of key file (will have a .crt extension)
> + * @keydir:    Directory containing the key, can be NULL
> + * @name       Name of key file (will apply a .crt extension if keydir is not NULL)
>   * @evpp       Returns EVP_PKEY object, or NULL on failure
>   * @return 0 if ok, -ve on error (in which case *evpp will be set to NULL)
>   */
>  static int rsa_pem_get_pub_key(const char *keydir, const char *name, EVP_PKEY **evpp)
>  {
> -       char path[1024];
> +       char path[1024] = {0};
>         EVP_PKEY *key = NULL;
>         X509 *cert;
>         FILE *f;
> @@ -68,7 +68,10 @@ static int rsa_pem_get_pub_key(const char *keydir, const char *name, EVP_PKEY **
>                 return -EINVAL;
>
>         *evpp = NULL;
> -       snprintf(path, sizeof(path), "%s/%s.crt", keydir, name);
> +       if (keydir && name)
> +               snprintf(path, sizeof(path), "%s/%s.crt", keydir, name);
> +       else if (name)
> +               snprintf(path, sizeof(path), "%s", name);
>         f = fopen(path, "r");
>         if (!f) {
>                 fprintf(stderr, "Couldn't open RSA certificate: '%s': %s\n",
> @@ -76,7 +79,13 @@ static int rsa_pem_get_pub_key(const char *keydir, const char *name, EVP_PKEY **
>                 return -EACCES;
>         }
>
> -       /* Read the certificate */
> +       /* See if it contains a PEM private key? */
> +       if (PEM_read_PrivateKey(f, evpp, NULL, path)) {
> +               fclose(f);
> +               return 0;
> +       }
> +
> +       /* Not a PEM private key, read the certificate */
>         cert = NULL;
>         if (!PEM_read_X509(f, &cert, NULL, NULL)) {
>                 rsa_err("Couldn't read certificate");
> @@ -672,7 +681,12 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
>                 if (ret)
>                         return ret;
>         }
> -       ret = rsa_get_pub_key(info->keydir, info->keyname, e, &pkey);
> +       if (info->keydir && info->keyname)
> +               ret = rsa_get_pub_key(info->keydir, info->keyname, e, &pkey);
> +       else if (info->keyfile)
> +               ret = rsa_get_pub_key(NULL, info->keyfile, e, &pkey);
> +       else
> +               ret = -EINVAL;
>         if (ret)
>                 goto err_get_pub_key;
>  #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
> --
> 2.16.6
>

Can we work this into a test somehow? The normal test is test_vboot.py
- you could modify that or add a new test into that file perhaps?

Regards,
Simon

  reply	other threads:[~2021-07-31 16:59 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-18 16:52 [PATCH] lib: rsa: Extract public key from private key if keyfile argument is used Chan, Donald
2021-07-28 18:33 ` Tom Rini
2021-07-28 20:17   ` Chan, Donald
2021-07-28 20:20     ` Tom Rini
2021-07-29  0:34       ` Donald Chan
2021-07-31 16:59         ` Simon Glass [this message]
2021-08-02 17:37           ` Chan, Donald
2021-09-01 22:31         ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAPnjgZ0OKbo5f8e9L-VsLSBjJk92M2yE1FD6qPb+pksFSFGuOA@mail.gmail.com \
    --to=sjg@chromium.org \
    --cc=hoiho@lab126.com \
    --cc=mr.nuke.me@gmail.com \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.