[PATCH v5] tools: mkeficapsule: Rework pkcs11 support

Quentin Schulz quentin.schulz at cherry.de
Wed Jun 3 19:16:20 CEST 2026


Hi Simon,

There's a v6 already, please post your reviews there again if applicable.

On 6/3/26 6:43 PM, Simon Glass wrote:
> Hi Wojciech,
> 
> On 2026-05-28T08:03:54, Wojciech Dubowik <Wojciech.Dubowik at mt.com> wrote:
>> tools: mkeficapsule: Rework pkcs11 support
>>
>> 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>
>> Acked-by: Quentin Schulz <quentin.schulz at cherry.de>
>>
>> tools/Makefile       |  5 +++
>>   tools/mkeficapsule.c | 95 +++++++++++++++++++++++++++++++++++++++-------------
>>   2 files changed, 77 insertions(+), 23 deletions(-)
> 
>> diff --git 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)
>> +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;
> 
> !obj_list_size
> 
> Behaviour change: when obj_list_size == 0 but ret >= 0, the caller's
> 'if (ret < 0)' check passes and execution continues with an empty
> obj_list. Please return -1 explicitly in that case.
> 

Yes, good catch, we can have ret == 0 here when obj_list_size==0 and 
thus return 0.

>> +static int import_pkcs11_crt(gnutls_x509_crt_t *x509, struct auth_context *ctx)
>> +{
> 
> ...
>> +     ret = gnutls_x509_crt_import_pkcs11(*x509, obj_list[0]);
> ...
>> +static int import_pkcs11_key(gnutls_privkey_t *pkey, struct auth_context *ctx)
>> +{
>> +     return gnutls_privkey_import_pkcs11_url(*pkey, ctx->key_file);
>> +}
> 
> gnutls_x509_crt_t and gnutls_privkey_t are already pointer typedefs
> and neither function reassigns the handle, so the extra indirection
> buys nothing. Please pass the handles by value and drop the '&' at the
> call sites.
> 
>> +#else
>> +static int pkcs11_init(void)
>> +{
>> +     fprintf(stderr, "Pkcs11 support is disabled\n");
>> +     return -1;
>> +}
>> +
>> +static int import_pkcs11_crt(gnutls_x509_crt_t *x509, struct auth_context *ctx)
>> +{
>> +     fprintf(stderr, "Pkcs11 support is disabled\n");
>> +     return -1;
>> +}
>> +
>> +static int import_pkcs11_key(gnutls_privkey_t *pkey, struct auth_context *ctx)
>> +{
>> +     fprintf(stderr, "Pkcs11 support is disabled\n");
>> +     return -1;
>> +}
>> +#endif
> 
> "PKCS#11 support..."
> 
> import_pkcs11_crt() and import_pkcs11_key() are only reached after
> pkcs11_init() has already failed with the same message, so these two
> stubs look like dead code.
> 

How do you compile the code if you don't have those stubs?

Cheers,
Quentin


More information about the U-Boot mailing list