Hi, in follow up to https://github.com/openssl/openssl/issues/17456 where Matt Caswell writes > The normal way of using the decoder APIs is to set up an OSSL_DECODER_CTX and then call OSSL_DECODER_from_bio or similar function to iterate through the available decoders to find the right one for the data that we are trying to decode. I'm still struggling to get the OSSL_DECODER to work. I'm trying to implement a provider with a store loader and use it to load a certificate (and in the future also a private key) from my HSM-like device and use them to sign a CMS. In my STORE_LOAD function I create a new OSSL_DECODER_CTX and I add all the decoders enumerated with OSSL_DECODER_do_all_provided. It is my understanding that during decoding the best decoders are selected automatically (in this case PEM -> DER -> X509). Then I read certificate from the HSM in PEM format and use OSSL_DECODER_from_data to construct X509 instance. This seems fine until later when CMS_add1_signer calls X509_check_private_key and it turns out that the *public* key from the decoded certificate is empty (X509->cert_info.key.pkey is NULL). It seems that x509_pubkey_ex_d2i_ex fails to decode the public key using the inner context created by OSSL_DECODER_CTX_new_for_pkey. command: openssl cms -sign -signer myprov:cert=0014 -provider myprov provider (interesting parts): int OSSL_provider_init() { ... OSSL_PROVIDER_load(myprov->libctx, "default"); // I load default provider into child lib ctx ... } int store_load(void *loaderctx, OSSL_CALLBACK *object_cb, void *object_cbarg, ...) { char *cert_pem = "----BEGIN CERTIFICATE..." // I load certificate from HSM OSSL_DECODER_CTX *dctx = OSSL_DECODER_CTX_new(); OSSL_DECODER_do_add_provided(loader->libctx, add_decoder, dctx); OSSL_DECODER_CTX_set_input_type(dctx, "pem"); OSSL_DECODER_CTX_set_input_structure(dctx, "Certificate"); OSSL_DECODER_CTX_set_construct(dctx, constructor); struct closure closure = { .callback = object_cb, .arg = object_cbarg }; OSSL_DECODER_CTX_set_construct_data(dctx, &closure); return OSSL_DECODER_from_data(dctx, pem, strlen(pem)); } Certificates obtained through the default file loader are ok. I don't know how to populate DECODER_CTX with actual DECODERs. File loader uses some relatively complex algorithm which I am unable to comprehend. Thanks, Milan