Order of providers breaks my keymgmt

Tomas Mraz tomas at openssl.org
Mon Jan 17 08:49:54 UTC 2022


On Mon, 2022-01-17 at 09:36 +0100, Milan Kaše wrote:
> Hi,
> I successfully implemented OpenSSL v3 provider which provides store
> and keymgmt and I can use it to sign a cms with the following
> command:
> 
> openssl cms -sign -signer myprov:cert=0014 -provider myprov -provider
> default
> 
> However when I swap the order of providers (in the real world
> scenario
> the providers are configured through the configuration file), i.e.
> 
> openssl cms -sign -signer myprov:cert=0014 -provider default -
> provider myprov
> 
> the command stops working.
> 
> I return the private key from the store through the reference:
> 
> int construct_ec_key(LOADER_CTX *myloader, OSSL_CALLBACK *object_cb,
> void *object_cbarg) {
>     static const int object_type = OSSL_OBJECT_PKEY;
>     static const char data_type[] = "EC";
>     KEYREF ref = { 0, };
>     OSSL_PARAM objparams[] = {
>         OSSL_PARAM_int(OSSL_OBJECT_PARAM_TYPE, (int *)&object_type),
>         OSSL_PARAM_octet_string(OSSL_OBJECT_PARAM_REFERENCE, &ref,
> sizeof(ref)),
>         OSSL_PARAM_utf8_string(OSSL_OBJECT_PARAM_DATA_TYPE, (char
> *)data_type, COUNTOF(data_type) - 1),
>         OSSL_PARAM_END,
>     };
>     return object_cb(objparams, object_cbarg);
> }
> 
> The try_key_ref function then tries to transform data from the store
> into the EVP_PKEY. It first looks up a keymgmt that can handle the
> "EC" data type. Since the default provider is the first one that can
> do that it is selected. It then tries to export data from my keymgmt
> and import it into the selected default keymgmt. But obviously I
> can't
> export the private key and the operation fails.

We need to add a fallback in the try_key_ref() to try to fetch the
keymgmt from the provider of the store if the key is unexportable.
Could you please open an issue?


> When my provider is activated before the default one then everything
> works because the EVP_PKEY is constructed from my keymgmt.
> 
> What am I doing wrong? Shouldn't OpenSSL first try to construct
> EVP_PKEY from the provider it actually returned the data? Is there a
> way to force OpenSSL to use the specified provider (some property
> "provider=myprov")?

You can set a default property query in the configuration file with 
"?provider=myprov" as a workaround. That way your provider will be
preferred for the operations. However it might have some unwanted and
unexpected consequences.

-- 
Tomáš Mráz, OpenSSL




More information about the openssl-users mailing list