@@ -292,7 +292,10 @@ static int der_write_to_bio_as_pem(const unsigned char* der, int derSz,
292292#endif
293293#endif
294294
295- #if defined(OPENSSL_EXTRA ) && !defined(NO_FILESYSTEM )
295+ #if !defined(NO_FILESYSTEM ) && \
296+ ((defined(OPENSSL_EXTRA ) && !defined(NO_CERTS ) && !defined(NO_ASN ) && \
297+ !defined(NO_PWDBASED )) || \
298+ defined(WOLFSSL_DH_EXTRA ))
296299/* Write the DER data as PEM into file pointer.
297300 *
298301 * @param [in] der Buffer containing DER data.
@@ -322,7 +325,9 @@ static int der_write_to_file_as_pem(const unsigned char* der, int derSz,
322325 XFREE (pem , NULL , DYNAMIC_TYPE_TMP_BUFFER );
323326 return ret ;
324327}
325- #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
328+ #endif /* !NO_FILESYSTEM &&
329+ * ((OPENSSL_EXTRA && !NO_CERTS && !NO_ASN && !NO_PWDBASED) ||
330+ * WOLFSSL_DH_EXTRA) */
326331
327332#if defined(OPENSSL_EXTRA ) && defined(WOLFSSL_KEY_GEN ) && \
328333 defined(WOLFSSL_PEM_TO_DER )
@@ -6277,9 +6282,8 @@ int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
62776282}
62786283#endif /* !NO_BIO */
62796284
6280- #ifndef NO_FILESYSTEM
6281- #ifndef NO_CERTS
6282- #if defined(OPENSSL_EXTRA ) && !defined(NO_ASN ) && !defined(NO_PWDBASED )
6285+ #if !defined(NO_FILESYSTEM ) && !defined(NO_CERTS ) && defined(OPENSSL_EXTRA ) && \
6286+ !defined(NO_ASN ) && !defined(NO_PWDBASED )
62836287/* Writes a public key to a file pointer encoded in PEM format.
62846288 *
62856289 * @param [in] fp File pointer to write to.
@@ -6295,19 +6299,34 @@ int wolfSSL_PEM_write_PUBKEY(XFILE fp, WOLFSSL_EVP_PKEY* key)
62956299
62966300 WOLFSSL_ENTER ("wolfSSL_PEM_write_PUBKEY" );
62976301
6298- /* Validate parameters. */
62996302 if ((fp == XBADFILE ) || (key == NULL )) {
63006303 WOLFSSL_MSG ("Bad Function Arguments" );
63016304 err = 1 ;
63026305 }
63036306
6304- /* Encode the public key as DER. */
63056307 if (!err ) {
6306- derSz = wolfSSL_i2d_PUBKEY (key , & derBuf );
6308+ derSz = wolfSSL_i2d_PUBKEY (key , NULL );
63076309 if (derSz <= 0 ) {
6308- WOLFSSL_MSG ("Failed to convert key to DER" );
6310+ WOLFSSL_MSG ("Failed to get DER size for key" );
6311+ err = 1 ;
6312+ }
6313+ }
6314+
6315+ if (!err ) {
6316+ unsigned char * tmp ;
6317+ derBuf = (unsigned char * )XMALLOC ((size_t )derSz , NULL ,
6318+ DYNAMIC_TYPE_TMP_BUFFER );
6319+ if (derBuf == NULL ) {
6320+ WOLFSSL_MSG ("Failed to allocate DER buffer" );
63096321 err = 1 ;
63106322 }
6323+ else {
6324+ tmp = derBuf ;
6325+ if (wolfSSL_i2d_PUBKEY (key , & tmp ) <= 0 ) {
6326+ WOLFSSL_MSG ("Failed to convert key to DER" );
6327+ err = 1 ;
6328+ }
6329+ }
63116330 }
63126331
63136332 /* Write DER buffer to file as PEM. */
@@ -6382,15 +6401,31 @@ int wolfSSL_PEM_write_PrivateKey(XFILE fp, WOLFSSL_EVP_PKEY* key,
63826401 }
63836402 }
63846403
6385- /* Encode the private key as DER. */
63866404 if (!err ) {
6387- derSz = wolfSSL_i2d_PrivateKey (key , & derBuf );
6405+ derSz = wolfSSL_i2d_PrivateKey (key , NULL );
63886406 if (derSz <= 0 ) {
6389- WOLFSSL_MSG ("Error encoding private key as DER " );
6407+ WOLFSSL_MSG ("Failed to get DER size for private key " );
63906408 err = 1 ;
63916409 }
63926410 }
63936411
6412+ if (!err ) {
6413+ unsigned char * tmp ;
6414+ derBuf = (unsigned char * )XMALLOC ((size_t )derSz , NULL ,
6415+ DYNAMIC_TYPE_TMP_BUFFER );
6416+ if (derBuf == NULL ) {
6417+ WOLFSSL_MSG ("Failed to allocate DER buffer" );
6418+ err = 1 ;
6419+ }
6420+ else {
6421+ tmp = derBuf ;
6422+ if (wolfSSL_i2d_PrivateKey (key , & tmp ) <= 0 ) {
6423+ WOLFSSL_MSG ("Error encoding private key as DER" );
6424+ err = 1 ;
6425+ }
6426+ }
6427+ }
6428+
63946429 /* Write DER buffer to file as PEM. */
63956430 if ((!err ) && (der_write_to_file_as_pem (derBuf , derSz , fp , type ,
63966431 NULL ) != 1 )) {
@@ -6404,9 +6439,8 @@ int wolfSSL_PEM_write_PrivateKey(XFILE fp, WOLFSSL_EVP_PKEY* key,
64046439 WOLFSSL_LEAVE ("wolfSSL_PEM_write_PrivateKey" , err );
64056440 return !err ;
64066441}
6407- #endif /* OPENSSL_EXTRA && !NO_ASN && !NO_PWDBASED */
6408- #endif /* !NO_CERTS */
6409- #endif /* !NO_FILESYSTEM */
6442+ #endif /* !NO_FILESYSTEM && !NO_CERTS && OPENSSL_EXTRA && !NO_ASN &&
6443+ * !NO_PWDBASED */
64106444
64116445#ifndef NO_BIO
64126446/* Create a private key object from the data in the BIO.
0 commit comments