/* BEGIN_HEADER */
#include "mbedtls/base64.h"
#include "mbedtls/pem.h"
#include "mbedtls/des.h"
#include "mbedtls/aes.h"
/* END_HEADER */

/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C */
void mbedtls_pem_write_buffer( char *start, char *end, char *buf_str, char *result_str )
{
    unsigned char buf[5000];
    unsigned char *check_buf = NULL;
    int ret;
    size_t buf_len, olen = 0, olen2 = 0;

    memset( buf, 0, sizeof( buf ) );

    buf_len = unhexify( buf, buf_str );

    ret = mbedtls_pem_write_buffer( start, end, buf, buf_len, NULL, 0, &olen );
    TEST_ASSERT( ret == MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );

    check_buf = (unsigned char *) mbedtls_calloc( 1, olen );
    TEST_ASSERT( check_buf != NULL );

    memset( check_buf, 0, olen );
    ret = mbedtls_pem_write_buffer( start, end, buf, buf_len, check_buf, olen, &olen2 );

    TEST_ASSERT( olen2 <= olen );
    TEST_ASSERT( olen > strlen( (char*) result_str ) );
    TEST_ASSERT( ret == 0 );
    TEST_ASSERT( strncmp( (char *) check_buf, (char *) result_str, olen ) == 0 );

exit:
    mbedtls_free( check_buf );
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_PEM_PARSE_C:MBEDTLS_AES_C:MBEDTLS_DES_C:MBEDTLS_MD5_C:MBEDTLS_CIPHER_MODE_CBC */
void mbedtls_pem_read_buffer( char *header, char *footer, char *data,
                              char *pwd, int res )
{
    mbedtls_pem_context ctx;
    int ret;
    size_t use_len = 0;
    size_t pwd_len = strlen( pwd );

    mbedtls_pem_init( &ctx );

    ret = mbedtls_pem_read_buffer( &ctx, header, footer, (unsigned char *)data,
                (unsigned char *)pwd, pwd_len, &use_len );
    TEST_ASSERT( ret == res );

exit:
    mbedtls_pem_free( &ctx );
}
/* END_CASE */
