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

/* BEGIN_DEPENDENCIES
 * depends_on:POLARSSL_BIGNUM_C:POLARSSL_FS_IO:POLARSSL_PK_PARSE_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE depends_on:POLARSSL_PEM_WRITE_C:POLARSSL_X509_CSR_WRITE_C */
void x509_csr_check( char *key_file, char *cert_req_check_file,
                     int md_type, int key_usage, int cert_type )
{
    pk_context key;
    x509write_csr req;
    unsigned char buf[4000];
    unsigned char check_buf[4000];
    int ret;
    size_t olen = 0, pem_len = 0;
    FILE *f;
    const char *subject_name = "C=NL,O=PolarSSL,CN=PolarSSL Server 1";
    rnd_pseudo_info rnd_info;

    memset( &rnd_info, 0x2a, sizeof( rnd_pseudo_info ) );

    pk_init( &key );
    TEST_ASSERT( pk_parse_keyfile( &key, key_file, NULL ) == 0 );

    x509write_csr_init( &req );
    x509write_csr_set_md_alg( &req, md_type );
    x509write_csr_set_key( &req, &key );
    TEST_ASSERT( x509write_csr_set_subject_name( &req, subject_name ) == 0 );
    if( key_usage != 0 )
        TEST_ASSERT( x509write_csr_set_key_usage( &req, key_usage ) == 0 );
    if( cert_type != 0 )
        TEST_ASSERT( x509write_csr_set_ns_cert_type( &req, cert_type ) == 0 );

    ret = x509write_csr_pem( &req, buf, sizeof(buf),
                             rnd_pseudo_rand, &rnd_info );
    TEST_ASSERT( ret == 0 );

    pem_len = strlen( (char *) buf );

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

    TEST_ASSERT( olen >= pem_len - 1 );
    TEST_ASSERT( memcmp( buf, check_buf, pem_len - 1 ) == 0 );

exit:
    x509write_csr_free( &req );
    pk_free( &key );
}
/* END_CASE */

/* BEGIN_CASE depends_on:POLARSSL_PEM_WRITE_C:POLARSSL_X509_CRT_WRITE_C:POLARSSL_SHA1_C */
void x509_crt_check( char *subject_key_file, char *subject_pwd,
                     char *subject_name, char *issuer_key_file,
                     char *issuer_pwd, char *issuer_name,
                     char *serial_str, char *not_before, char *not_after,
                     int md_type, int key_usage, int cert_type, int ver,
                     char *cert_check_file )
{
    pk_context subject_key, issuer_key;
    x509write_cert crt;
    unsigned char buf[4000];
    unsigned char check_buf[5000];
    mpi serial;
    int ret;
    size_t olen = 0, pem_len = 0;
    FILE *f;
    rnd_pseudo_info rnd_info;

    memset( &rnd_info, 0x2a, sizeof( rnd_pseudo_info ) );
    mpi_init( &serial );
    pk_init( &subject_key );
    pk_init( &issuer_key );

    TEST_ASSERT( pk_parse_keyfile( &subject_key, subject_key_file,
                                         subject_pwd ) == 0 );
    TEST_ASSERT( pk_parse_keyfile( &issuer_key, issuer_key_file,
                                         issuer_pwd ) == 0 );
    TEST_ASSERT( mpi_read_string( &serial, 10, serial_str ) == 0 );

    x509write_crt_init( &crt );
    if( ver != -1 )
        x509write_crt_set_version( &crt, ver );
    TEST_ASSERT( x509write_crt_set_serial( &crt, &serial ) == 0 );
    TEST_ASSERT( x509write_crt_set_validity( &crt, not_before,
                                                   not_after ) == 0 );
    x509write_crt_set_md_alg( &crt, md_type );
    TEST_ASSERT( x509write_crt_set_issuer_name( &crt, issuer_name ) == 0 );
    TEST_ASSERT( x509write_crt_set_subject_name( &crt, subject_name ) == 0 );
    x509write_crt_set_subject_key( &crt, &subject_key );
    x509write_crt_set_issuer_key( &crt, &issuer_key );

    if( crt.version >= X509_CRT_VERSION_3 )
    {
        TEST_ASSERT( x509write_crt_set_basic_constraints( &crt, 0, 0 ) == 0 );
        TEST_ASSERT( x509write_crt_set_subject_key_identifier( &crt ) == 0 );
        TEST_ASSERT( x509write_crt_set_authority_key_identifier( &crt ) == 0 );
        if( key_usage != 0 )
            TEST_ASSERT( x509write_crt_set_key_usage( &crt, key_usage ) == 0 );
        if( cert_type != 0 )
            TEST_ASSERT( x509write_crt_set_ns_cert_type( &crt, cert_type ) == 0 );
    }

    ret = x509write_crt_pem( &crt, buf, sizeof(buf),
                             rnd_pseudo_rand, &rnd_info );
    TEST_ASSERT( ret == 0 );

    pem_len = strlen( (char *) buf );

    f = fopen( cert_check_file, "r" );
    TEST_ASSERT( f != NULL );
    olen = fread( check_buf, 1, sizeof(check_buf), f );
    TEST_ASSERT( olen < sizeof(check_buf) );
    fclose( f );

    TEST_ASSERT( olen >= pem_len - 1 );
    TEST_ASSERT( memcmp( buf, check_buf, pem_len - 1 ) == 0 );

exit:
    x509write_crt_free( &crt );
    pk_free( &issuer_key );
    pk_free( &subject_key );
    mpi_free( &serial );
}
/* END_CASE */

/* BEGIN_CASE depends_on:POLARSSL_X509_CREATE_C:POLARSSL_X509_USE_C */
void x509_string_to_names( char *name, char *parsed_name, int result )
{
    int ret;
    size_t len = 0;
    asn1_named_data *names = NULL;
    x509_name parsed, *parsed_cur, *parsed_prv;
    unsigned char buf[2048], *c;

    memset( &parsed, 0, sizeof( parsed ) );
    memset( buf, 0, sizeof( buf ) );
    c = buf + sizeof( buf );

    ret = x509_string_to_names( &names, name );
    TEST_ASSERT( ret == result );

    if( ret != 0 )
        goto exit;

    ret = x509_write_names( &c, buf, names );
    TEST_ASSERT( ret > 0 );

    TEST_ASSERT( asn1_get_tag( &c, buf + sizeof( buf ), &len,
                        ASN1_CONSTRUCTED | ASN1_SEQUENCE ) == 0 );
    TEST_ASSERT( x509_get_name( &c, buf + sizeof( buf ), &parsed ) == 0 );

    ret = x509_dn_gets( (char *) buf, sizeof( buf ), &parsed );
    TEST_ASSERT( ret > 0 );

    TEST_ASSERT( strcmp( (char *) buf, parsed_name ) == 0 );

exit:
    asn1_free_named_data_list( &names );

    parsed_cur = parsed.next;
    while( parsed_cur != 0 )
    {
        parsed_prv = parsed_cur;
        parsed_cur = parsed_cur->next;
        polarssl_free( parsed_prv );
    }
}
/* END_CASE */
