[PATCH v5] tools: mkeficapsule: Rework pkcs11 support
Quentin Schulz
quentin.schulz at cherry.de
Thu May 28 10:34:04 CEST 2026
Hi Wojciech,
On 5/28/26 10:03 AM, Wojciech Dubowik wrote:
> Some distros like OpenEmbedded are using gnutls library
> without pkcs11 support and linking of mkeficapsule will fail.
> It would make maintenance of default configs a hurdle.
> Add detection of pkcs11 support in gnutls so it's enabled
> when available and doesn't need to be set explicitly.
>
> Suggested-by: Tom Rini <trini at konsulko.com>
> Cc: Franz Schnyder <fra.schnyder at gmail.com>
> Signed-off-by: Wojciech Dubowik <Wojciech.Dubowik at mt.com>
> ---
> Changes in v5:
> - removed more unrelated cleanup improvements spotted by
> Quentin, to be sent in another patch later
> Changes in v4:
> - abstract pkcs11 init function
> - removed unrelated cleanup improvements, to be sent in
> another patch later
> Changes in v3:
> - remove config option for pkcs11 support and add auto
> detection in Makefile
> - reduce amount of ifdefs by abstracting import pkcs11
> functions
> - add missing free and deinit functions
> Changes in v2:
> - make use of stderr more consistent
> - add missing ifndef around pkcs11 deinit functions
> ---
> tools/Makefile | 5 +++
> tools/mkeficapsule.c | 95 +++++++++++++++++++++++++++++++++-----------
> 2 files changed, 77 insertions(+), 23 deletions(-)
>
> diff --git a/tools/Makefile b/tools/Makefile
> index 1a5f425ecdaa..e85f5a354b81 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -271,6 +271,11 @@ mkeficapsule-objs := generated/lib/uuid.o \
> $(LIBFDT_OBJS) \
> mkeficapsule.o
> hostprogs-always-$(CONFIG_TOOLS_MKEFICAPSULE) += mkeficapsule
> +GNUTLS_SUPPORTS_P11KIT = $(shell pkg-config --libs gnutls --print-requires-private \
> + 2> /dev/null | grep p11-kit-1)
> +ifeq ($(GNUTLS_SUPPORTS_P11KIT),p11-kit-1)
> +HOSTCFLAGS_mkeficapsule.o += -DMKEFICAPSULE_PKCS11
> +endif
>
> include tools/fwumdata_src/fwumdata.mk
>
> diff --git a/tools/mkeficapsule.c b/tools/mkeficapsule.c
> index ec640c57e8a5..a36332567e0c 100644
> --- a/tools/mkeficapsule.c
> +++ b/tools/mkeficapsule.c
> @@ -207,6 +207,71 @@ static int write_capsule_file(FILE *f, void *data, size_t size, const char *msg)
> return 0;
> }
>
> +#ifdef MKEFICAPSULE_PKCS11
> +static int pkcs11_init(void)
> +{
> + const char *lib;
> + int ret;
> +
> + lib = getenv("PKCS11_MODULE_PATH");
> + if (!lib) {
> + fprintf(stdout,
> + "PKCS11_MODULE_PATH not set in the environment\n");
> + return -1;
> + }
> +
> + gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
> + gnutls_global_init();
> +
> + ret = gnutls_pkcs11_add_provider(lib, "trusted");
> + if (ret < 0) {
> + fprintf(stdout, "Failed to add pkcs11 provider\n");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static int import_pkcs11_crt(gnutls_x509_crt_t *x509, struct auth_context *ctx)
> +{
> + gnutls_pkcs11_obj_t *obj_list;
> + unsigned int obj_list_size = 0;
> + int ret;
> +
> + ret = gnutls_pkcs11_obj_list_import_url4(&obj_list, &obj_list_size,
> + ctx->cert_file, 0);
> + if (ret < 0 || obj_list_size == 0)
> + return ret;
> +
> + ret = gnutls_x509_crt_import_pkcs11(*x509, obj_list[0]);
> +
> + return ret;
This is still doing something we currently do not do, that is, checking
the return code of gnutls_x509_crt_import_pkcs11(). I'm not saying we
shouldn't (I haven't checked), but this now does more than just
ifdef'ing pkcs11 support.
With that done, feel free to add my
Acked-by: Quentin Schulz <quentin.schulz at cherry.de>
on the next version.
Thanks!
Quentin
More information about the U-Boot
mailing list