+static int serialize_EVP_PKEY_legacy_PEM(void **serialized,
+ long *serialized_len,
+ void *object,
+ const char *pass, const char *pcipher,
+ ossl_unused const char *ser_propq)
+{
+ EVP_PKEY *pkey = object;
+ EVP_CIPHER *cipher = NULL;
+ BIO *mem_ser = NULL;
+ BUF_MEM *mem_buf = NULL;
+ const unsigned char *upass = (const unsigned char *)pass;
+ size_t passlen = 0;
+ int ok = 0;
+
+ if (pcipher != NULL && pass != NULL) {
+ passlen = strlen(pass);
+ if (!TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, pcipher, NULL)))
+ goto end;
+ }
+ if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
+ || !TEST_true(PEM_write_bio_PrivateKey_traditional(mem_ser, pkey,
+ cipher,
+ upass, passlen,
+ NULL, NULL))
+ || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
+ || !TEST_ptr(*serialized = mem_buf->data)
+ || !TEST_long_gt(*serialized_len = mem_buf->length, 0))
+ goto end;
+
+ /* Detach the serialized output */
+ mem_buf->data = NULL;
+ mem_buf->length = 0;
+ ok = 1;
+ end:
+ BIO_free(mem_ser);
+ EVP_CIPHER_free(cipher);
+ return ok;
+}
+