* [PATCH v4] Add support for OpenSSL Provider API
@ 2026-04-29 18:02 Eddie Kovsky
2026-04-30 7:54 ` Mattijs Korpershoek
2026-05-12 10:17 ` Quentin Schulz
0 siblings, 2 replies; 3+ messages in thread
From: Eddie Kovsky @ 2026-04-29 18:02 UTC (permalink / raw)
To: Tom Rini, Tobias Olausson, Paul HENRYS, Simon Glass, Jan Stancek,
Enric Balletbo i Serra, a.fatoum, mark.kettenis,
Mattijs Korpershoek
Cc: u-boot
The Engine API has been deprecated since the release of OpenSSL 3.0. End
users have been advised to migrate to the new Provider interface.
Several distributions have already removed support for engines, which is
preventing U-Boot from being compiled in those environments.
Add support for the Provider API while continuing to support the existing
Engine API on distros shipping older releases of OpenSSL.
This is based on similar work contributed by Jan Stancek updating Linux
to use the Provider interface.
commit 558bdc45dfb2669e1741384a0c80be9c82fa052c
Author: Jan Stancek <jstancek@redhat.com>
Date: Fri Sep 20 19:52:48 2024 +0300
sign-file,extract-cert: use pkcs11 provider for OPENSSL MAJOR >= 3
The changes have been tested with the FIT signature verification vboot
tests on Fedora 42 and Debian 13. All 30 tests pass with both the legacy
Engine library installed and with the Provider API.
Tested-by Enric Balletbo i Serra <eballetb@redhat.com>
Tested-by Mark Kettenis <mark.kettenis@xs4all.nl>
Signed-off-by: Eddie Kovsky <ekovsky@redhat.com>
---
Changes in v4:
- Add comment that @engine pointer is null when using pkcs11 provider
- Remove extra line break
- Add pkcs11-provider package to build dependencies
v3: https://lore.kernel.org/u-boot/20260120164524.253188-1-ekovsky@redhat.com/
Changes in v3:
- Removed Kconfig option
- Changed macro symbol from CONFIG_OPENSSL_NO_DEPRECATED to
USE_PKCS11_PROVIDER or USE_PKCS11_ENGINE
v2: https://lore.kernel.org/u-boot/20251027195834.71109-1-ekovsky@redhat.com/
Changes in v2:
- Remove default for new Kconfig option
- Use #ifdef instead of IS_ENABLED macro
- Remove comment after #endif
- Remove unrelated checkpatch cleanup of 'sslErr' variable name
v1: https://lore.kernel.org/u-boot/20251017171329.255689-1-ekovsky@redhat.com/
---
doc/build/gcc.rst | 4 +-
lib/aes/aes-encrypt.c | 4 +-
lib/rsa/rsa-sign.c | 102 ++++++++++++++++++++++++++++++++++++++--
tools/docker/Dockerfile | 1 +
4 files changed, 103 insertions(+), 8 deletions(-)
diff --git a/doc/build/gcc.rst b/doc/build/gcc.rst
index 1fef718ceecb..29a6a632e7e3 100644
--- a/doc/build/gcc.rst
+++ b/doc/build/gcc.rst
@@ -25,8 +25,8 @@ Depending on the build targets further packages maybe needed
sudo apt-get install bc bison build-essential coccinelle \
device-tree-compiler dfu-util efitools flex gdisk graphviz imagemagick \
- libgnutls28-dev libguestfs-tools libncurses-dev \
- libpython3-dev libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl \
+ libgnutls28-dev libguestfs-tools libncurses-dev libpython3-dev \
+ libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl pkcs11-provider \
pkg-config python3 python3-asteval python3-coverage python3-filelock \
python3-pkg-resources python3-pycryptodome python3-pyelftools \
python3-pytest python3-pytest-xdist python3-sphinxcontrib.apidoc \
diff --git a/lib/aes/aes-encrypt.c b/lib/aes/aes-encrypt.c
index 90e1407b4f09..4fc4ce232478 100644
--- a/lib/aes/aes-encrypt.c
+++ b/lib/aes/aes-encrypt.c
@@ -16,7 +16,9 @@
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <openssl/evp.h>
-#include <openssl/engine.h>
+#if !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
+# include <openssl/engine.h>
+#endif
#include <uboot_aes.h>
#if OPENSSL_VERSION_NUMBER >= 0x10000000L
diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c
index 0e38c9e802fd..f456f3c58e65 100644
--- a/lib/rsa/rsa-sign.c
+++ b/lib/rsa/rsa-sign.c
@@ -19,7 +19,47 @@
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <openssl/evp.h>
-#include <openssl/engine.h>
+#if OPENSSL_VERSION_MAJOR >= 3
+# define USE_PKCS11_PROVIDER
+# include <err.h>
+# include <openssl/provider.h>
+# include <openssl/store.h>
+#else
+# if !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
+# define USE_PKCS11_ENGINE
+# include <openssl/engine.h>
+# endif
+#endif
+
+#ifdef USE_PKCS11_PROVIDER
+#define ERR(cond, fmt, ...) \
+ do { \
+ bool __cond = (cond); \
+ drain_openssl_errors(__LINE__, 0); \
+ if (__cond) { \
+ errx(1, fmt, ## __VA_ARGS__); \
+ } \
+ } while (0)
+
+static void drain_openssl_errors(int l, int silent)
+{
+ const char *file;
+ char buf[120];
+ int e, line;
+
+ if (ERR_peek_error() == 0)
+ return;
+ if (!silent)
+ fprintf(stderr, "At main.c:%d:\n", l);
+
+ while ((e = ERR_peek_error_line(&file, &line))) {
+ ERR_error_string(e, buf);
+ if (!silent)
+ fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line);
+ ERR_get_error();
+ }
+}
+#endif
static int rsa_err(const char *msg)
{
@@ -94,10 +134,11 @@ err_cert:
*
* @keydir: Key prefix
* @name Name of key
- * @engine Engine to use
+ * @engine Engine to use or NULL when using pkcs11 provider
* @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)
*/
+#ifdef USE_PKCS11_ENGINE
static int rsa_engine_get_pub_key(const char *keydir, const char *name,
ENGINE *engine, EVP_PKEY **evpp)
{
@@ -157,21 +198,24 @@ static int rsa_engine_get_pub_key(const char *keydir, const char *name,
return 0;
}
+#endif
/**
* rsa_get_pub_key() - read a public key
*
* @keydir: Directory containing the key (PEM file) or key prefix (engine)
* @name Name of key file (will have a .crt extension)
- * @engine Engine to use
+ * @engine Engine to use or NULL when using pkcs11 provider
* @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_get_pub_key(const char *keydir, const char *name,
ENGINE *engine, EVP_PKEY **evpp)
{
+#ifdef USE_PKCS11_ENGINE
if (engine)
return rsa_engine_get_pub_key(keydir, name, engine, evpp);
+#endif
return rsa_pem_get_pub_key(keydir, name, evpp);
}
@@ -207,13 +251,44 @@ static int rsa_pem_get_priv_key(const char *keydir, const char *name,
return -ENOENT;
}
+#ifdef USE_PKCS11_PROVIDER
+ EVP_PKEY *private_key = NULL;
+ OSSL_STORE_CTX *store;
+
+ if (!OSSL_PROVIDER_try_load(NULL, "pkcs11", true))
+ ERR(1, "OSSL_PROVIDER_try_load(pkcs11)");
+ if (!OSSL_PROVIDER_try_load(NULL, "default", true))
+ ERR(1, "OSSL_PROVIDER_try_load(default)");
+
+ store = OSSL_STORE_open(path, NULL, NULL, NULL, NULL);
+ ERR(!store, "OSSL_STORE_open");
+
+ while (!OSSL_STORE_eof(store)) {
+ OSSL_STORE_INFO *info = OSSL_STORE_load(store);
+
+ if (!info) {
+ drain_openssl_errors(__LINE__, 0);
+ continue;
+ }
+ if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_PKEY) {
+ private_key = OSSL_STORE_INFO_get1_PKEY(info);
+ ERR(!private_key, "OSSL_STORE_INFO_get1_PKEY");
+ }
+ OSSL_STORE_INFO_free(info);
+ if (private_key)
+ break;
+ }
+ OSSL_STORE_close(store);
+
+ *evpp = private_key;
+#else
if (!PEM_read_PrivateKey(f, evpp, NULL, path)) {
rsa_err("Failure reading private key");
fclose(f);
return -EPROTO;
}
fclose(f);
-
+#endif
return 0;
}
@@ -226,6 +301,7 @@ static int rsa_pem_get_priv_key(const char *keydir, const char *name,
* @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)
*/
+#ifdef USE_PKCS11_ENGINE
static int rsa_engine_get_priv_key(const char *keydir, const char *name,
const char *keyfile,
ENGINE *engine, EVP_PKEY **evpp)
@@ -293,22 +369,25 @@ static int rsa_engine_get_priv_key(const char *keydir, const char *name,
return 0;
}
+#endif
/**
* rsa_get_priv_key() - read a private key
*
* @keydir: Directory containing the key (PEM file) or key prefix (engine)
* @name Name of key
- * @engine Engine to use for signing
+ * @engine Engine to use or NULL when using pkcs11 provider
* @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_get_priv_key(const char *keydir, const char *name,
const char *keyfile, ENGINE *engine, EVP_PKEY **evpp)
{
+#ifdef USE_PKCS11_ENGINE
if (engine)
return rsa_engine_get_priv_key(keydir, name, keyfile, engine,
evpp);
+#endif
return rsa_pem_get_priv_key(keydir, name, keyfile, evpp);
}
@@ -325,6 +404,7 @@ static int rsa_init(void)
return 0;
}
+#ifdef USE_PKCS11_ENGINE
static int rsa_engine_init(const char *engine_id, ENGINE **pe)
{
const char *key_pass;
@@ -380,6 +460,7 @@ static void rsa_engine_remove(ENGINE *e)
ENGINE_free(e);
}
}
+#endif
static int rsa_sign_with_key(EVP_PKEY *pkey, struct padding_algo *padding_algo,
struct checksum_algo *checksum_algo,
@@ -480,11 +561,13 @@ int rsa_sign(struct image_sign_info *info,
if (ret)
return ret;
+#ifdef USE_PKCS11_ENGINE
if (info->engine_id) {
ret = rsa_engine_init(info->engine_id, &e);
if (ret)
return ret;
}
+#endif
ret = rsa_get_priv_key(info->keydir, info->keyname, info->keyfile,
e, &pkey);
@@ -496,16 +579,21 @@ int rsa_sign(struct image_sign_info *info,
goto err_sign;
EVP_PKEY_free(pkey);
+
+#ifdef USE_PKCS11_ENGINE
if (info->engine_id)
rsa_engine_remove(e);
+#endif
return ret;
err_sign:
EVP_PKEY_free(pkey);
err_priv:
+#ifdef USE_PKCS11_ENGINE
if (info->engine_id)
rsa_engine_remove(e);
+#endif
return ret;
}
@@ -645,11 +733,13 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
ENGINE *e = NULL;
debug("%s: Getting verification data\n", __func__);
+#ifdef USE_PKCS11_ENGINE
if (info->engine_id) {
ret = rsa_engine_init(info->engine_id, &e);
if (ret)
return ret;
}
+#endif
ret = rsa_get_pub_key(info->keydir, info->keyname, e, &pkey);
if (ret)
goto err_get_pub_key;
@@ -726,8 +816,10 @@ done:
err_get_params:
EVP_PKEY_free(pkey);
err_get_pub_key:
+#ifdef USE_PKCS11_ENGINE
if (info->engine_id)
rsa_engine_remove(e);
+#endif
if (ret)
return ret;
diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile
index 73bf6cdd2c52..50e98e83dc20 100644
--- a/tools/docker/Dockerfile
+++ b/tools/docker/Dockerfile
@@ -122,6 +122,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
openssl \
picocom \
parted \
+ pkcs11-provider \
pkg-config \
python-is-python3 \
python3 \
--
2.53.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v4] Add support for OpenSSL Provider API
2026-04-29 18:02 [PATCH v4] Add support for OpenSSL Provider API Eddie Kovsky
@ 2026-04-30 7:54 ` Mattijs Korpershoek
2026-05-12 10:17 ` Quentin Schulz
1 sibling, 0 replies; 3+ messages in thread
From: Mattijs Korpershoek @ 2026-04-30 7:54 UTC (permalink / raw)
To: Eddie Kovsky, Tom Rini, Tobias Olausson, Paul HENRYS, Simon Glass,
Jan Stancek, Enric Balletbo i Serra, a.fatoum, mark.kettenis,
Mattijs Korpershoek
Cc: u-boot
Hi Eddie,
Thank you for the patch.
On Wed, Apr 29, 2026 at 12:02, Eddie Kovsky <ekovsky@redhat.com> wrote:
> The Engine API has been deprecated since the release of OpenSSL 3.0. End
> users have been advised to migrate to the new Provider interface.
> Several distributions have already removed support for engines, which is
> preventing U-Boot from being compiled in those environments.
>
> Add support for the Provider API while continuing to support the existing
> Engine API on distros shipping older releases of OpenSSL.
>
> This is based on similar work contributed by Jan Stancek updating Linux
> to use the Provider interface.
>
> commit 558bdc45dfb2669e1741384a0c80be9c82fa052c
> Author: Jan Stancek <jstancek@redhat.com>
> Date: Fri Sep 20 19:52:48 2024 +0300
>
> sign-file,extract-cert: use pkcs11 provider for OPENSSL MAJOR >= 3
>
> The changes have been tested with the FIT signature verification vboot
> tests on Fedora 42 and Debian 13. All 30 tests pass with both the legacy
> Engine library installed and with the Provider API.
>
> Tested-by Enric Balletbo i Serra <eballetb@redhat.com>
> Tested-by Mark Kettenis <mark.kettenis@xs4all.nl>
> Signed-off-by: Eddie Kovsky <ekovsky@redhat.com>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
> ---
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v4] Add support for OpenSSL Provider API
2026-04-29 18:02 [PATCH v4] Add support for OpenSSL Provider API Eddie Kovsky
2026-04-30 7:54 ` Mattijs Korpershoek
@ 2026-05-12 10:17 ` Quentin Schulz
1 sibling, 0 replies; 3+ messages in thread
From: Quentin Schulz @ 2026-05-12 10:17 UTC (permalink / raw)
To: Eddie Kovsky, Tom Rini, Tobias Olausson, Paul HENRYS, Simon Glass,
Jan Stancek, Enric Balletbo i Serra, a.fatoum, mark.kettenis,
Mattijs Korpershoek
Cc: u-boot
Hi Eddie,
On 4/29/26 8:02 PM, Eddie Kovsky wrote:
> The Engine API has been deprecated since the release of OpenSSL 3.0. End
> users have been advised to migrate to the new Provider interface.
> Several distributions have already removed support for engines, which is
> preventing U-Boot from being compiled in those environments.
>
> Add support for the Provider API while continuing to support the existing
> Engine API on distros shipping older releases of OpenSSL.
>
> This is based on similar work contributed by Jan Stancek updating Linux
> to use the Provider interface.
>
> commit 558bdc45dfb2669e1741384a0c80be9c82fa052c
> Author: Jan Stancek <jstancek@redhat.com>
> Date: Fri Sep 20 19:52:48 2024 +0300
>
> sign-file,extract-cert: use pkcs11 provider for OPENSSL MAJOR >= 3
>
> The changes have been tested with the FIT signature verification vboot
> tests on Fedora 42 and Debian 13. All 30 tests pass with both the legacy
> Engine library installed and with the Provider API.
>
But does it actually use a provider or an engine to begin with? I don't
see test/py/tests/test_vboot.py calling mkimage with the -N argument.
What are the tests (or command) you ran to validate this? I briefly saw
the CI failed in v3 because a package was missing, but wasn't it simply
because the headers or provider libraries which are now necessary for
building lib/rsa/rsa-sign.c were not present? The logs aren't available
anymore unfortunately. If that's the case, then that's also an issue. We
shouldn't need to install providers if we aren't going to use any? Yes,
I know that we currently cannot compile if we don't have
openssl-devel-engine (on Fedora), but if we can improve the situation,
we should.
How did you test (locally is fine) with providers?
> Tested-by Enric Balletbo i Serra <eballetb@redhat.com>
> Tested-by Mark Kettenis <mark.kettenis@xs4all.nl>
Please do not forget to add the colon after Tested-by so it actually
makes it a git trailer instead of just text.
> Signed-off-by: Eddie Kovsky <ekovsky@redhat.com>
> ---
> Changes in v4:
> - Add comment that @engine pointer is null when using pkcs11 provider
> - Remove extra line break
> - Add pkcs11-provider package to build dependencies
> v3: https://lore.kernel.org/u-boot/20260120164524.253188-1-ekovsky@redhat.com/
>
> Changes in v3:
> - Removed Kconfig option
> - Changed macro symbol from CONFIG_OPENSSL_NO_DEPRECATED to
> USE_PKCS11_PROVIDER or USE_PKCS11_ENGINE
> v2: https://lore.kernel.org/u-boot/20251027195834.71109-1-ekovsky@redhat.com/
>
> Changes in v2:
> - Remove default for new Kconfig option
> - Use #ifdef instead of IS_ENABLED macro
> - Remove comment after #endif
> - Remove unrelated checkpatch cleanup of 'sslErr' variable name
> v1: https://lore.kernel.org/u-boot/20251017171329.255689-1-ekovsky@redhat.com/
> ---
> doc/build/gcc.rst | 4 +-
> lib/aes/aes-encrypt.c | 4 +-
> lib/rsa/rsa-sign.c | 102 ++++++++++++++++++++++++++++++++++++++--
> tools/docker/Dockerfile | 1 +
> 4 files changed, 103 insertions(+), 8 deletions(-)
>
> diff --git a/doc/build/gcc.rst b/doc/build/gcc.rst
> index 1fef718ceecb..29a6a632e7e3 100644
> --- a/doc/build/gcc.rst
> +++ b/doc/build/gcc.rst
> @@ -25,8 +25,8 @@ Depending on the build targets further packages maybe needed
>
> sudo apt-get install bc bison build-essential coccinelle \
> device-tree-compiler dfu-util efitools flex gdisk graphviz imagemagick \
> - libgnutls28-dev libguestfs-tools libncurses-dev \
> - libpython3-dev libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl \
> + libgnutls28-dev libguestfs-tools libncurses-dev libpython3-dev \
> + libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl pkcs11-provider \
> pkg-config python3 python3-asteval python3-coverage python3-filelock \
> python3-pkg-resources python3-pycryptodome python3-pyelftools \
> python3-pytest python3-pytest-xdist python3-sphinxcontrib.apidoc \
> diff --git a/lib/aes/aes-encrypt.c b/lib/aes/aes-encrypt.c
> index 90e1407b4f09..4fc4ce232478 100644
> --- a/lib/aes/aes-encrypt.c
> +++ b/lib/aes/aes-encrypt.c
> @@ -16,7 +16,9 @@
> #include <openssl/err.h>
> #include <openssl/ssl.h>
> #include <openssl/evp.h>
> -#include <openssl/engine.h>
> +#if !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
> +# include <openssl/engine.h>
> +#endif
Considering there are no other changes in this file, is this include
actually needed?
> #include <uboot_aes.h>
>
> #if OPENSSL_VERSION_NUMBER >= 0x10000000L
> diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c
> index 0e38c9e802fd..f456f3c58e65 100644
> --- a/lib/rsa/rsa-sign.c
> +++ b/lib/rsa/rsa-sign.c
> @@ -19,7 +19,47 @@
> #include <openssl/err.h>
> #include <openssl/ssl.h>
> #include <openssl/evp.h>
> -#include <openssl/engine.h>
> +#if OPENSSL_VERSION_MAJOR >= 3
> +# define USE_PKCS11_PROVIDER
> +# include <err.h>
> +# include <openssl/provider.h>
> +# include <openssl/store.h>
> +#else
> +# if !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
> +# define USE_PKCS11_ENGINE
> +# include <openssl/engine.h>
> +# endif
> +#endif
> +
Sorry but that's a NACK.
As far as I can tell, this effectively disables using engines when your
host openssl version is 3.0+, which we currently support (and I
currently use it). You can have this for 4.0+ as engine support has been
removed, but not for 3.x.
> +#ifdef USE_PKCS11_PROVIDER
> +#define ERR(cond, fmt, ...) \
> + do { \
> + bool __cond = (cond); \
> + drain_openssl_errors(__LINE__, 0); \
> + if (__cond) { \
> + errx(1, fmt, ## __VA_ARGS__); \
> + } \
> + } while (0)
> +
Is this really related to the PKCS11 provider? I think there's a mix
between "using the provider API" and "using the pkcs11 provider".
> +static void drain_openssl_errors(int l, int silent)
> +{
> + const char *file;
> + char buf[120];
> + int e, line;
> +
> + if (ERR_peek_error() == 0)
> + return;
> + if (!silent)
> + fprintf(stderr, "At main.c:%d:\n", l);
> +
main.c?
> + while ((e = ERR_peek_error_line(&file, &line))) {
> + ERR_error_string(e, buf);
> + if (!silent)
> + fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line);
> + ERR_get_error();
> + }
> +}
> +#endif
>
> static int rsa_err(const char *msg)
> {
> @@ -94,10 +134,11 @@ err_cert:
> *
> * @keydir: Key prefix
> * @name Name of key
> - * @engine Engine to use
> + * @engine Engine to use or NULL when using pkcs11 provider
> * @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)
> */
> +#ifdef USE_PKCS11_ENGINE
> static int rsa_engine_get_pub_key(const char *keydir, const char *name,
> ENGINE *engine, EVP_PKEY **evpp)
> {
> @@ -157,21 +198,24 @@ static int rsa_engine_get_pub_key(const char *keydir, const char *name,
>
> return 0;
> }
> +#endif
>
> /**
> * rsa_get_pub_key() - read a public key
> *
> * @keydir: Directory containing the key (PEM file) or key prefix (engine)
> * @name Name of key file (will have a .crt extension)
> - * @engine Engine to use
> + * @engine Engine to use or NULL when using pkcs11 provider
> * @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_get_pub_key(const char *keydir, const char *name,
> ENGINE *engine, EVP_PKEY **evpp)
> {
> +#ifdef USE_PKCS11_ENGINE
> if (engine)
> return rsa_engine_get_pub_key(keydir, name, engine, evpp);
> +#endif
We should probably at least print something when engines aren't
supported but the engine parameter is passed, or maybe even fail as
that's an incorrect configuration.
> return rsa_pem_get_pub_key(keydir, name, evpp);
> }
>
> @@ -207,13 +251,44 @@ static int rsa_pem_get_priv_key(const char *keydir, const char *name,
> return -ENOENT;
> }
>
> +#ifdef USE_PKCS11_PROVIDER
> + EVP_PKEY *private_key = NULL;
> + OSSL_STORE_CTX *store;
> +
> + if (!OSSL_PROVIDER_try_load(NULL, "pkcs11", true))
> + ERR(1, "OSSL_PROVIDER_try_load(pkcs11)");
> + if (!OSSL_PROVIDER_try_load(NULL, "default", true))
> + ERR(1, "OSSL_PROVIDER_try_load(default)");
> +
Why are we unconditionally loading providers and specifically the pkcs11
one? As far as I could tell we should know from the URI whether a key
from a provider is requested by checking if a colon is in the URI. And
we can automatically load the requested provider based on that?
Otherwise the easiest answer to this could simply be: "let the user
configure this externally via OPENSSL_CONF environment variable".
Do we also need to update tools/mkimage.c (and doc/mkimage.1) to remove
-N engine from usage if the tool doesn't support it? Do we also need to
update doc/usage/fit/signature.rst to explain how to use pkcs11 provider?
FYI, we (my employer) are migrating from engines to providers for
signing FIT images with binman so I'm starting to have a look on how to
do this now.
Cheers,
Quentin
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-05-12 10:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-29 18:02 [PATCH v4] Add support for OpenSSL Provider API Eddie Kovsky
2026-04-30 7:54 ` Mattijs Korpershoek
2026-05-12 10:17 ` Quentin Schulz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox