diff --git a/library/pem.c b/library/pem.c
index 8a6de3a..ff7f32c 100644
--- a/library/pem.c
+++ b/library/pem.c
@@ -363,6 +363,56 @@
     return( 0 );
 }
 
+int pem_write_buffer( const char *header, const char *footer,
+                      const unsigned char *der_data, size_t der_len,
+                      unsigned char *buf, size_t buf_len, size_t *olen )
+{
+    int ret;
+    unsigned char *encode_buf, *c, *p = buf;
+    size_t len = 0, use_len = 0;
+    size_t add_len = strlen( header ) + strlen( footer ) + ( use_len / 64 ) + 1;
+
+    base64_encode( NULL, &use_len, der_data, der_len );
+    if( use_len + add_len > buf_len )
+    {
+        *olen = use_len + add_len;
+        return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
+    }
+
+    if( ( encode_buf = polarssl_malloc( use_len ) ) == NULL )
+        return( POLARSSL_ERR_PEM_MALLOC_FAILED );
+
+    if( ( ret = base64_encode( encode_buf, &use_len, der_data,
+                               der_len ) ) != 0 )
+    {
+        polarssl_free( encode_buf );
+        return( ret );
+    }
+
+    memcpy( p, header, strlen( header ) );
+    p += strlen( header );
+    c = encode_buf;
+
+    while( use_len )
+    {
+        len = ( use_len > 64 ) ? 64 : use_len;
+        memcpy( p, c, len );
+        use_len -= len;
+        p += len;
+        c += len;
+        *p++ = '\n';
+    }
+
+    memcpy( p, footer, strlen( footer ) );
+    p += strlen( footer );
+
+    *p++ = '\0';
+    *olen = p - buf;
+
+    polarssl_free( encode_buf );
+    return( 0 );
+}
+
 void pem_free( pem_context *ctx )
 {
     if( ctx->buf )
diff --git a/library/pkwrite.c b/library/pkwrite.c
index 022281d..44823d7 100644
--- a/library/pkwrite.c
+++ b/library/pkwrite.c
@@ -40,8 +40,8 @@
 #if defined(POLARSSL_ECDSA_C)
 #include "polarssl/ecdsa.h"
 #endif
-#if defined(POLARSSL_BASE64_C)
-#include "polarssl/base64.h"
+#if defined(POLARSSL_PEM_C)
+#include "polarssl/pem.h"
 #endif
 
 #if defined(POLARSSL_MEMORY_C)
@@ -276,45 +276,7 @@
     return( len );
 }
 
-#if defined(POLARSSL_BASE64_C)
-static int pk_write_pemify( const char *begin_str, const char *end_str,
-                             const unsigned char *der_data, size_t der_len,
-                             unsigned char *buf, size_t size )
-{
-    int ret;
-    unsigned char base_buf[4096];
-    unsigned char *c = base_buf, *p = buf;
-    size_t len = 0, olen = sizeof(base_buf);
-
-    if( ( ret = base64_encode( base_buf, &olen, der_data, der_len ) ) != 0 )
-        return( ret );
-
-    if( olen + strlen( begin_str ) + strlen( end_str ) +
-        olen / 64 > size )
-    {
-        return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
-    }
-
-    memcpy( p, begin_str, strlen( begin_str ) );
-    p += strlen( begin_str );
-
-    while( olen )
-    {
-        len = ( olen > 64 ) ? 64 : olen;
-        memcpy( p, c, len );
-        olen -= len;
-        p += len;
-        c += len;
-        *p++ = '\n';
-    }
-
-    memcpy( p, end_str, strlen( end_str ) );
-    p += strlen( end_str );
-
-    *p = '\0';
-
-    return( 0 );
-}
+#if defined(POLARSSL_PEM_C)
 
 #define PEM_BEGIN_PUBLIC_KEY    "-----BEGIN PUBLIC KEY-----\n"
 #define PEM_END_PUBLIC_KEY      "-----END PUBLIC KEY-----\n"
@@ -328,16 +290,17 @@
 {
     int ret;
     unsigned char output_buf[4096];
+    size_t olen = 0;
 
     if( ( ret = pk_write_pubkey_der( key, output_buf,
-                                      sizeof(output_buf) ) ) < 0 )
+                                     sizeof(output_buf) ) ) < 0 )
     {
         return( ret );
     }
 
-    if( ( ret = pk_write_pemify( PEM_BEGIN_PUBLIC_KEY, PEM_END_PUBLIC_KEY,
+    if( ( ret = pem_write_buffer( PEM_BEGIN_PUBLIC_KEY, PEM_END_PUBLIC_KEY,
                                   output_buf + sizeof(output_buf) - ret,
-                                  ret, buf, size ) ) != 0 )
+                                  ret, buf, size, &olen ) ) != 0 )
     {
         return( ret );
     }
@@ -350,12 +313,10 @@
     int ret;
     unsigned char output_buf[4096];
     char *begin, *end;
+    size_t olen = 0;
 
-    if( ( ret = pk_write_key_der( key, output_buf,
-                                      sizeof(output_buf) ) ) < 0 )
-    {
+    if( ( ret = pk_write_key_der( key, output_buf, sizeof(output_buf) ) ) < 0 )
         return( ret );
-    }
 
 #if defined(POLARSSL_RSA_C)
     if( pk_get_type( key ) == POLARSSL_PK_RSA )
@@ -375,15 +336,15 @@
 #endif
         return( POLARSSL_ERR_PK_FEATURE_UNAVAILABLE );
 
-    if( ( ret = pk_write_pemify( begin, end,
+    if( ( ret = pem_write_buffer( begin, end,
                                   output_buf + sizeof(output_buf) - ret,
-                                  ret, buf, size ) ) != 0 )
+                                  ret, buf, size, &olen ) ) != 0 )
     {
         return( ret );
     }
 
     return( 0 );
 }
-#endif /* POLARSSL_BASE64_C */
+#endif /* POLARSSL_PEM_C */
 
 #endif /* POLARSSL_PK_WRITE_C */
diff --git a/library/x509write.c b/library/x509write.c
index 2231206..3a8c89d 100644
--- a/library/x509write.c
+++ b/library/x509write.c
@@ -42,8 +42,8 @@
 
 #include "polarssl/sha1.h"
 
-#if defined(POLARSSL_BASE64_C)
-#include "polarssl/base64.h"
+#if defined(POLARSSL_PEM_C)
+#include "polarssl/pem.h"
 #endif
 
 #if defined(POLARSSL_MEMORY_C)
@@ -816,52 +816,14 @@
 #define PEM_BEGIN_CSR           "-----BEGIN CERTIFICATE REQUEST-----\n"
 #define PEM_END_CSR             "-----END CERTIFICATE REQUEST-----\n"
 
-#if defined(POLARSSL_BASE64_C)
-static int x509write_pemify( const char *begin_str, const char *end_str,
-                             const unsigned char *der_data, size_t der_len,
-                             unsigned char *buf, size_t size )
-{
-    int ret;
-    unsigned char base_buf[4096];
-    unsigned char *c = base_buf, *p = buf;
-    size_t len = 0, olen = sizeof(base_buf);
-
-    if( ( ret = base64_encode( base_buf, &olen, der_data, der_len ) ) != 0 )
-        return( ret );
-
-    if( olen + strlen( begin_str ) + strlen( end_str ) +
-        olen / 64 > size )
-    {
-        return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
-    }
-
-    memcpy( p, begin_str, strlen( begin_str ) );
-    p += strlen( begin_str );
-
-    while( olen )
-    {
-        len = ( olen > 64 ) ? 64 : olen;
-        memcpy( p, c, len );
-        olen -= len;
-        p += len;
-        c += len;
-        *p++ = '\n';
-    }
-
-    memcpy( p, end_str, strlen( end_str ) );
-    p += strlen( end_str );
-
-    *p = '\0';
-
-    return( 0 );
-}
-
+#if defined(POLARSSL_PEM_C)
 int x509write_crt_pem( x509write_cert *crt, unsigned char *buf, size_t size,
                        int (*f_rng)(void *, unsigned char *, size_t),
                        void *p_rng )
 {
     int ret;
     unsigned char output_buf[4096];
+    size_t olen = 0;
 
     if( ( ret = x509write_crt_der( crt, output_buf, sizeof(output_buf),
                                    f_rng, p_rng ) ) < 0 )
@@ -869,9 +831,9 @@
         return( ret );
     }
 
-    if( ( ret = x509write_pemify( PEM_BEGIN_CRT, PEM_END_CRT,
+    if( ( ret = pem_write_buffer( PEM_BEGIN_CRT, PEM_END_CRT,
                                   output_buf + sizeof(output_buf) - ret,
-                                  ret, buf, size ) ) != 0 )
+                                  ret, buf, size, &olen ) ) != 0 )
     {
         return( ret );
     }
@@ -885,6 +847,7 @@
 {
     int ret;
     unsigned char output_buf[4096];
+    size_t olen = 0;
 
     if( ( ret = x509write_csr_der( ctx, output_buf, sizeof(output_buf),
                                    f_rng, p_rng ) ) < 0 )
@@ -892,9 +855,9 @@
         return( ret );
     }
 
-    if( ( ret = x509write_pemify( PEM_BEGIN_CSR, PEM_END_CSR,
+    if( ( ret = pem_write_buffer( PEM_BEGIN_CSR, PEM_END_CSR,
                                   output_buf + sizeof(output_buf) - ret,
-                                  ret, buf, size ) ) != 0 )
+                                  ret, buf, size, &olen ) ) != 0 )
     {
         return( ret );
     }
