Hi Eddie,

I'm only a couple of months late to the party :)

On 11/21/25 7:16 PM, Eddie Kovsky wrote:
Hi Quentin

On 11/17/25, Quentin Schulz wrote:
Hi Eddie,

On 10/27/25 8:58 PM, Eddie Kovsky wrote:
[You don't often get email from [email protected]. Learn why this is important 
at https://aka.ms/LearnAboutSenderIdentification ]

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.


Which ones? How do I reproduce?


As you are probably aware, OpenSSL deprecated the Engine API with the
3.0 release, and engines are likely to be removed entirely when
OpenSSL 4.0 is released in 2026. [1][2]

[1] https://docs.openssl.org/3.0/man7/migration_guide/#engines-and-method-apis
[2] https://github.com/openssl/openssl/discussions/21832

I don't have a comprehensive list of all distros. Fedora, RHEL 10,
Arch, and Debian 13 are all shipping OpenSSL 3.5. If you try to build
U-Boot in those environments the compiler will not be able to resolve the
engine API symbols and the build will fail.


That does not seem to be true.

host$ podman run -it --rm --security-opt label=disable --userns keep-id -w $PWD -v $PWD:$PWD docker.io/debian:trixie host$ podman exec -it --user root --latest apt-get --update install -y build-essential make bison flex bc rsync kmod cpio libssl-dev gcc-aarch64-linux-gnu debhelper ncurses-dev python3-pyelftools python3-setuptools swig python3-dev
container$ touch bl31.elf
container$ export BL31.elf
container$ make CROSS_COMPILE="aarch64-linux-gnu-" O=build/ringneck ringneck-px30_defconfig container$ make CROSS_COMPILE="aarch64-linux-gnu-" O=build/ringneck -j`nproc`

You can then see that ./build/ringneck/tools/generated/lib/rsa/rsa-sign.o is built.

host$ podman run -it --rm --security-opt label=disable --userns keep-id -w $PWD -v $PWD:$PWD docker.io/archlinux/archlinux:latest host$ podman exec -it --user root --latest pacman -Sy openssl swig python python-setuptools make gcc bison flex bc rsync kmod cpio python-pyelftools aarch64-linux-gnu-gcc
container$ touch bl31.elf
container$ export BL31.elf
container$ make CROSS_COMPILE="aarch64-linux-gnu-" O=build/ringneck ringneck-px30_defconfig container$ make CROSS_COMPILE="aarch64-linux-gnu-" O=build/ringneck -j`nproc`

You can then see that ./build/ringneck/tools/generated/lib/rsa/rsa-sign.o is built.

I'm also pretty sure OpenSSL is built with engine support in Fedora even without openssl-devel-engine since I could run the binman test suite using the openssl pkcs11 engine in Fedora without that package.

Some OpenSSL engines are available in the official package feeds:

$ dnf provides '/usr/lib64/engines-3/*'
Updating and loading repositories:
Repositories loaded.
openssl-libs-1:3.5.5-2.fc44.x86_64 : A general purpose cryptography library with TLS implementation
Repo         : @System
Matched From :
Filename     : /usr/lib64/engines-3/afalg.so
Filename     : /usr/lib64/engines-3/capi.so
Filename     : /usr/lib64/engines-3/loader_attic.so
Filename     : /usr/lib64/engines-3/padlock.so

openssl-pkcs11-0.4.13-4.fc44.x86_64 : A PKCS#11 engine for use with OpenSSL
Repo         : @System
Matched From :
Filename     : /usr/lib64/engines-3/libpkcs11.so
Filename     : /usr/lib64/engines-3/pkcs11.so

openssl-gost-engine-3.0.3-11.fc44.x86_64 : A reference implementation of the Russian GOST crypto algorithms for OpenSSL
Repo         : fedora
Matched From :
Filename     : /usr/lib64/engines-3/README.gost
Filename     : /usr/lib64/engines-3/gost.so

openssl-libs-1:3.5.5-1.fc44.x86_64 : A general purpose cryptography library with TLS implementation
Repo         : fedora
Matched From :
Filename     : /usr/lib64/engines-3/afalg.so
Filename     : /usr/lib64/engines-3/capi.so
Filename     : /usr/lib64/engines-3/loader_attic.so
Filename     : /usr/lib64/engines-3/padlock.so

openssl-pkcs11-0.4.13-4.fc44.x86_64 : A PKCS#11 engine for use with OpenSSL
Repo         : fedora
Matched From :
Filename     : /usr/lib64/engines-3/libpkcs11.so
Filename     : /usr/lib64/engines-3/pkcs11.so

p11-remote-0.3-23.fc44.x86_64 : Remoting of PKCS#11 modules across sessions
Repo         : fedora
Matched From :
Filename     : /usr/lib64/engines-3/libp11-kit-engine.so

tpm2-tss-engine-1.2.0-9.fc44.x86_64 : OpenSSL Engine for TPM2 devices using the tpm2-tss software stack
Repo         : fedora
Matched From :
Filename     : /usr/lib64/engines-3/libtpm2tss.so
Filename     : /usr/lib64/engines-3/tpm2tss.so

openssl-libs-1:3.5.5-2.fc44.x86_64 : A general purpose cryptography library with TLS implementation
Repo         : updates
Matched From :
Filename     : /usr/lib64/engines-3/afalg.so
Filename     : /usr/lib64/engines-3/capi.so
Filename     : /usr/lib64/engines-3/loader_attic.so
Filename     : /usr/lib64/engines-3/padlock.so

$ openssl engine dynamic -c pkcs11
(dynamic) Dynamic engine loading support
(pkcs11) pkcs11 engine

So it seems the only thing Fedora (and RHEL and other Red Hat distros I guess) is doing is moving openssl/engine.h (and a few others) to a different package.

Note that Fedora modifies /usr/include/openssl/configuration-x86_64.h to add

# if !__has_include(<openssl/engine.h>) && !defined(OPENSSL_NO_ENGINE)
#  define OPENSSL_NO_ENGINE
# endif

which is kinda odd since technically, OpenSSL is built with engine support, regardless of openssl/engine.h presence on your system. It does however prevent you from building a new engine. I'm honestly not sure what the intent is by moving this to a separate package? Fail everybody but provide a fallback until OpenSSL 4.x is packaged where the fallback won't be available anymore?

Note that OpenSSL 4.x still ships an engine.h, although with stubs (if OPENSSL_ENGINE_STUBS is defined).

Fedora is currently providing a bridge package openssl-devel-engine [3] to
help make the API transition easier, but that is only a temporary
solution. (I think Debian is currently doing something similar.)


Considering Debian happily compiles rsa-sign.o as well as the dummy RSA engine in tools/binman/test/fit with

gcc -lcrypto -lssl dummy-rsa-engine.c -fPIC -shared -o dummy-rsa-engine.so

I'm not sure that's true, do you have a source for that?

[3] https://packages.fedoraproject.org/pkgs/openssl/openssl-devel-engine/

The Kconfig option OPENSSL_NO_DEPRECATED introduces support for the

Please consider renaming this, OpenSSL itself uses OPENSSL_NO_DEPRECATED
constants for many things. I would recommend simply renaming to
OPENSSL_NO_ENGINE which is also the symbol OpenSSL is using. If there comes
a time we have more OPENSSL_NO_ options, we can always have a "virtual"
symbol called OPENSSL_NO_DEPRECATED which would select them all if one
wanted for example.


I did give some thought to using a different name because I don't
like the double negative that comes from this construct:

     #ifndef CONFIG_OPENSSL_NO_DEPRECATED

But I kept it because the name is advantageous precisely because it's
already recognized by the OpenSSL API. OPENSSL_NO_DEPRECATED is a
user-defined macro.[4] When combined with the OPENSSL_API_COMPAT macro,
which is already defined in lib/rsa/rsa-sign.c, we can ensure that
deprecated symbols won't be available in sections where
OPENSSL_NO_DEPRECATED is defined.

[4] https://docs.openssl.org/3.0/man7/openssl_user_macros/

Provider API while continuing to use the existing Engine API on distros
shipping older releases of OpenSSL.


One can use org.openssl.engine: as prefix for provider arguments when one
wants to use an engine still.


Sorry, but it's not clear what you are referring to here.


I meant to say one can still use engines without using the engine API explicitly, by using org.openssl.engine:<engine>: scheme in OSSL_STORE_open() for example or when a key is requested on the openssl CLI.

This is based on similar work contributed by Jan Stancek updating Linux
to use the Provider interface.

      commit 558bdc45dfb2669e1741384a0c80be9c82fa052c
      Author: Jan Stancek <[email protected]>
      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.


Are there actually tests using an OpenSSL engine? Because otherwise it's
simply checking that local keys are still working... which isn't that much
different from what we currently have with engines when not using engines.

I'm implementing FIT images signing with OpenSSL engines, and it'd be nice
if we could have something that doesn't require changes to support providers
(or if it does, not in a confusing manner for example).

https://lore.kernel.org/u-boot/[email protected]/T/#t
for the v1, I'll soon (next hours or tomorrow) post a v2 and Cc you if you
don't mind.

[...]


As mentioned above, the motivation for this patch is that the Engine
API has already been deprecated. Projects that depend on OpenSSL will
need to move to the new Provider API in order to continue to function.


Yes. At the same time, OpenSSL 3.5 is supported until April 2030 so until we are a few years after that, we'll probably still need to support engines.

The FIT Signature Verification tests I used to exercise both APIs are
documented here.[5]

[5] 
https://docs.u-boot.org/en/latest/usage/fit/signature.html#u-boot-fit-signature-verification


Did you follow https://docs.u-boot.org/en/latest/usage/fit/signature.html#hardware-signing-with-pkcs-11-or-with-hsm which I believe is the only section which uses an engine? Specifically, the last code snippet "Sign the fitImage with the hardware key:".

I don't think we have any test in ./test/py/test.py --bd sandbox --build -k vboot using engines (git grep -E 'pkcs11|engine' test/py doesn't return anything).

Cheers,
Quentin

Reply via email to