/* BEGIN_HEADER */
#include "mbedtls/pk.h"
#include "mbedtls/pem.h"
#include "mbedtls/oid.h"
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_PK_PARSE_C:MBEDTLS_PK_WRITE_C:MBEDTLS_BIGNUM_C:MBEDTLS_FS_IO
 * END_DEPENDENCIES
 */

/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C */
void pk_write_pubkey_check(char *key_file)
{
    mbedtls_pk_context key;
    unsigned char buf[5000];
    unsigned char check_buf[5000];
    int ret;
    FILE *f;
    size_t ilen, pem_len, buf_index;

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

    mbedtls_pk_init(&key);
    TEST_ASSERT(mbedtls_pk_parse_public_keyfile(&key, key_file) == 0);

    ret = mbedtls_pk_write_pubkey_pem(&key, buf, sizeof(buf));
    TEST_ASSERT(ret == 0);

    pem_len = strlen((char *) buf);

    // check that the rest of the buffer remains clear
    for (buf_index = pem_len; buf_index < sizeof(buf); ++buf_index) {
        TEST_ASSERT(buf[buf_index] == 0);
    }

    f = fopen(key_file, "r");
    TEST_ASSERT(f != NULL);
    ilen = fread(check_buf, 1, sizeof(check_buf), f);
    fclose(f);

    TEST_ASSERT(ilen == pem_len);
    TEST_ASSERT(memcmp((char *) buf, (char *) check_buf, ilen) == 0);

exit:
    mbedtls_pk_free(&key);
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C */
void pk_write_key_check(char *key_file)
{
    mbedtls_pk_context key;
    unsigned char buf[5000];
    unsigned char check_buf[5000];
    int ret;
    FILE *f;
    size_t ilen, pem_len, buf_index;

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

    mbedtls_pk_init(&key);
    TEST_ASSERT(mbedtls_pk_parse_keyfile(&key, key_file, NULL,
                                         mbedtls_test_rnd_std_rand, NULL) == 0);

    ret = mbedtls_pk_write_key_pem(&key, buf, sizeof(buf));
    TEST_ASSERT(ret == 0);

    pem_len = strlen((char *) buf);

    // check that the rest of the buffer remains clear
    for (buf_index = pem_len; buf_index < sizeof(buf); ++buf_index) {
        TEST_ASSERT(buf[buf_index] == 0);
    }

    f = fopen(key_file, "r");
    TEST_ASSERT(f != NULL);
    ilen = fread(check_buf, 1, sizeof(check_buf), f);
    fclose(f);

    TEST_ASSERT(ilen == strlen((char *) buf));
    TEST_ASSERT(memcmp((char *) buf, (char *) check_buf, ilen) == 0);

exit:
    mbedtls_pk_free(&key);
}
/* END_CASE */
