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