+EVP_PKEY *EVP_PKCS82PKEY_ex(const PKCS8_PRIV_KEY_INFO *p8, OSSL_LIB_CTX *libctx,
+ const char *propq)
+{
+ EVP_PKEY *pkey = NULL;
+ const unsigned char *p8_data = NULL;
+ unsigned char *encoded_data = NULL;
+ int encoded_len;
+ size_t len;
+ OSSL_DECODER_CTX *dctx = NULL;
+
+ if ((encoded_len = i2d_PKCS8_PRIV_KEY_INFO(p8, &encoded_data)) <= 0)
+ goto end;
+
+ p8_data = encoded_data;
+ len = encoded_len;
+ dctx = OSSL_DECODER_CTX_new_for_pkey(&pkey, "DER", "pkcs8", EVP_PKEY_NONE,
+ 0, libctx, propq);
+ if (dctx == NULL
+ || !OSSL_DECODER_from_data(dctx, &p8_data, &len))
+ /* try legacy */
+ pkey = evp_pkcs82pkey_legacy(p8, libctx, propq);
+
+ end:
+ OPENSSL_clear_free(encoded_data, encoded_len);
+ OSSL_DECODER_CTX_free(dctx);
+ return pkey;
+}
+