+ /* Convert to PEM and back. */
+ BIO *bp;
+ T(bp = BIO_new(BIO_s_secmem()));
+ T(PEM_write_bio_PrivateKey(bp, priv_key, NULL, NULL, 0, NULL, NULL));
+ pkey = NULL;
+ T(PEM_read_bio_PrivateKey(bp, &pkey, NULL, NULL));
+ printf("\tPEM_read_bio_PrivateKey:");
+ /* Yes, it compares only public part. */
+ err = !EVP_PKEY_cmp(priv_key, pkey);
+ print_test_result(!err);
+ ret |= err;
+ EVP_PKEY_free(pkey);
+
+ /* Convert to DER and back, using _PrivateKey_bio API. */
+ T(BIO_reset(bp));
+ T(i2d_PrivateKey_bio(bp, priv_key));
+ T(d2i_PrivateKey_bio(bp, &pkey));
+ printf("\td2i_PrivateKey_bio:\t");
+ err = !EVP_PKEY_cmp(priv_key, pkey);
+ print_test_result(!err);
+ ret |= err;
+ EVP_PKEY_free(pkey);
+
+#if OPENSSL_VERSION_MAJOR >= 3
+ /* Try d2i_PrivateKey_ex_bio, added in 3.0. */
+ T(BIO_reset(bp));
+ T(i2d_PrivateKey_bio(bp, priv_key));
+ T(d2i_PrivateKey_ex_bio(bp, &pkey, NULL, NULL));
+ printf("\td2i_PrivateKey_ex_bio:\t");
+ err = !EVP_PKEY_cmp(priv_key, pkey);
+ print_test_result(!err);
+ ret |= err;
+ EVP_PKEY_free(pkey);
+#endif
+
+ /* Convert to DER and back, using OSSL_STORE API. */
+ T(BIO_reset(bp));
+ T(i2d_PrivateKey_bio(bp, priv_key));
+ printf("\tOSSL_STORE_attach:\t");
+ fflush(stdout);
+ pkey = NULL;
+ OSSL_STORE_CTX *cts;
+ T(cts = OSSL_STORE_attach(bp, "file", NULL, NULL, NULL, NULL, NULL, NULL));
+ for (;;) {
+ OSSL_STORE_INFO *info = OSSL_STORE_load(cts);
+ if (!info) {
+ ERR_print_errors_fp(stderr);
+ T(OSSL_STORE_eof(cts));
+ break;
+ }
+ if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_PKEY) {
+ T((pkey = OSSL_STORE_INFO_get1_PKEY(info)));
+ }
+ OSSL_STORE_INFO_free(info);
+ }
+ OSSL_STORE_close(cts);
+ if (pkey) {
+ err = !EVP_PKEY_cmp(priv_key, pkey);
+ print_test_result(!err);
+ ret |= err;
+ EVP_PKEY_free(pkey);
+ } else
+ printf(cCYAN "skipped" cNORM "\n");
+ BIO_free(bp);
+
+ /* Convert to DER and back, using memory API. */
+ unsigned char *kptr = NULL;
+ int klen;
+ T(klen = i2d_PrivateKey(priv_key, &kptr));
+ const unsigned char *tptr = kptr; /* will be moved by d2i_PrivateKey */
+ pkey = NULL;
+ T(d2i_PrivateKey(type, &pkey, &tptr, klen));
+ printf("\td2i_PrivateKey:\t\t");
+ err = !EVP_PKEY_cmp(priv_key, pkey);
+ print_test_result(!err);
+ ret |= err;
+ EVP_PKEY_free(pkey);
+ OPENSSL_free(kptr);
+