Move *_pemify() function to PEM module
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 );
     }