BEGIN_HEADER
#include <polarssl/md.h>
#include <polarssl/md2.h>
#include <polarssl/md4.h>
#include <polarssl/md5.h>
#include <polarssl/sha1.h>
#include <polarssl/sha256.h>
#include <polarssl/sha512.h>
END_HEADER

BEGIN_DEPENDENCIES
depends_on:POLARSSL_MD_C
END_DEPENDENCIES

BEGIN_CASE
md_text:text_md_name:text_src_string:hex_hash_string
{
    char md_name[100];
    unsigned char src_str[1000];
    unsigned char hash_str[1000];
    unsigned char output[100];
    const md_info_t *md_info = NULL;

    memset(md_name, 0x00, 100);
    memset(src_str, 0x00, 1000);
    memset(hash_str, 0x00, 1000);
    memset(output, 0x00, 100);

    strcpy( (char *) src_str, {text_src_string} );
    
    strncpy( (char *) md_name, {text_md_name}, 100 );
    md_info = md_info_from_string(md_name);
    TEST_ASSERT( md_info != NULL );

    TEST_ASSERT ( 0 == md( md_info, src_str, strlen( (char *) src_str ), output ) );
    hexify( hash_str, output, md_get_size(md_info) );

    TEST_ASSERT( strcmp( (char *) hash_str, {hex_hash_string} ) == 0 );
}
END_CASE

BEGIN_CASE
md_hex:text_md_name:hex_src_string:hex_hash_string
{
    char md_name[100];
    unsigned char src_str[10000];
    unsigned char hash_str[10000];
    unsigned char output[100];
    int src_len;
    const md_info_t *md_info = NULL;

    memset(md_name, 0x00, 100);
    memset(src_str, 0x00, 10000);
    memset(hash_str, 0x00, 10000);
    memset(output, 0x00, 100);

    strncpy( (char *) md_name, {text_md_name}, 100 );
    md_info = md_info_from_string(md_name);
    TEST_ASSERT( md_info != NULL );

    src_len = unhexify( src_str, {hex_src_string} );
    TEST_ASSERT ( 0 == md( md_info, src_str, src_len, output ) );

    hexify( hash_str, output, md_get_size(md_info) );

    TEST_ASSERT( strcmp( (char *) hash_str, {hex_hash_string} ) == 0 );
}
END_CASE

BEGIN_CASE
md_text_multi:text_md_name:text_src_string:hex_hash_string
{
    char md_name[100];
    unsigned char src_str[1000];
    unsigned char hash_str[1000];
    unsigned char output[100];
    
    const md_info_t *md_info = NULL;
    md_context_t ctx = MD_CONTEXT_T_INIT;

    memset(md_name, 0x00, 100);
    memset(src_str, 0x00, 1000);
    memset(hash_str, 0x00, 1000);
    memset(output, 0x00, 100);

    strcpy( (char *) src_str, {text_src_string} );
    
    strncpy( (char *) md_name, {text_md_name}, 100 );
    md_info = md_info_from_string(md_name);
    TEST_ASSERT( md_info != NULL );
    TEST_ASSERT ( 0 == md_init_ctx( &ctx, md_info ) );

    TEST_ASSERT ( 0 == md_starts( &ctx ) );
    TEST_ASSERT ( ctx.md_ctx != NULL );
    TEST_ASSERT ( 0 == md_update( &ctx, src_str, strlen( (char *) src_str ) ) );
    TEST_ASSERT ( 0 == md_finish( &ctx, output ) );
    TEST_ASSERT ( 0 == md_free_ctx( &ctx ) );
    
    hexify( hash_str, output, md_get_size(md_info) );

    TEST_ASSERT( strcmp( (char *) hash_str, {hex_hash_string} ) == 0 );
}
END_CASE

BEGIN_CASE
md_hex_multi:text_md_name:hex_src_string:hex_hash_string
{
    char md_name[100];
    unsigned char src_str[10000];
    unsigned char hash_str[10000];
    unsigned char output[100];
    int src_len;
    const md_info_t *md_info = NULL;
    md_context_t ctx = MD_CONTEXT_T_INIT;

    memset(md_name, 0x00, 100);
    memset(src_str, 0x00, 10000);
    memset(hash_str, 0x00, 10000);
    memset(output, 0x00, 100);

    strncpy( (char *) md_name, {text_md_name}, 100 );
    md_info = md_info_from_string(md_name);
    TEST_ASSERT( md_info != NULL );
    TEST_ASSERT ( 0 == md_init_ctx( &ctx, md_info ) );

    src_len = unhexify( src_str, {hex_src_string} );
    
    TEST_ASSERT ( 0 == md_starts( &ctx ) );
    TEST_ASSERT ( ctx.md_ctx != NULL );
    TEST_ASSERT ( 0 == md_update( &ctx, src_str, src_len ) );
    TEST_ASSERT ( 0 == md_finish( &ctx, output ) );
    TEST_ASSERT ( 0 == md_free_ctx( &ctx ) );
    
    hexify( hash_str, output, md_get_size(md_info) );

    TEST_ASSERT( strcmp( (char *) hash_str, {hex_hash_string} ) == 0 );
}
END_CASE

BEGIN_CASE
md_hmac:text_md_name:trunc_size:hex_key_string:hex_src_string:hex_hash_string
{
    char md_name[100];
    unsigned char src_str[10000];
    unsigned char key_str[10000];
    unsigned char hash_str[10000];
    unsigned char output[100];
    int key_len, src_len;
    const md_info_t *md_info = NULL;

    memset(md_name, 0x00, 100);
    memset(src_str, 0x00, 10000);
    memset(key_str, 0x00, 10000);
    memset(hash_str, 0x00, 10000);
    memset(output, 0x00, 100);

    strncpy( (char *) md_name, {text_md_name}, 100 );
    md_info = md_info_from_string( md_name );
    TEST_ASSERT( md_info != NULL );

    key_len = unhexify( key_str, {hex_key_string} );
    src_len = unhexify( src_str, {hex_src_string} );

    TEST_ASSERT ( md_hmac( md_info, key_str, key_len, src_str, src_len, output ) == 0 );
    hexify( hash_str, output, md_get_size(md_info) );

    TEST_ASSERT( strncmp( (char *) hash_str, {hex_hash_string}, {trunc_size} * 2 ) == 0 );
}
END_CASE

BEGIN_CASE
md_hmac_multi:text_md_name:trunc_size:hex_key_string:hex_src_string:hex_hash_string
{
    char md_name[100];
    unsigned char src_str[10000];
    unsigned char key_str[10000];
    unsigned char hash_str[10000];
    unsigned char output[100];
    int key_len, src_len;
    const md_info_t *md_info = NULL;
    md_context_t ctx = MD_CONTEXT_T_INIT;

    memset(md_name, 0x00, 100);
    memset(src_str, 0x00, 10000);
    memset(key_str, 0x00, 10000);
    memset(hash_str, 0x00, 10000);
    memset(output, 0x00, 100);

    strncpy( (char *) md_name, {text_md_name}, 100 );
    md_info = md_info_from_string( md_name );
    TEST_ASSERT( md_info != NULL );
    TEST_ASSERT ( 0 == md_init_ctx( &ctx, md_info ) );

    key_len = unhexify( key_str, {hex_key_string} );
    src_len = unhexify( src_str, {hex_src_string} );

    TEST_ASSERT ( 0 == md_hmac_starts( &ctx, key_str, key_len ) );
    TEST_ASSERT ( ctx.md_ctx != NULL );
    TEST_ASSERT ( 0 == md_hmac_update( &ctx, src_str, src_len ) );
    TEST_ASSERT ( 0 == md_hmac_finish( &ctx, output ) );
    TEST_ASSERT ( 0 == md_free_ctx( &ctx ) );
    
    hexify( hash_str, output, md_get_size(md_info) );

    TEST_ASSERT( strncmp( (char *) hash_str, {hex_hash_string}, {trunc_size} * 2 ) == 0 );
}
END_CASE
BEGIN_CASE
md_file:text_md_name:filename:hex_hash_string
{
    char md_name[100];
    unsigned char hash_str[1000];
    unsigned char output[100];
    const md_info_t *md_info = NULL;

    memset(md_name, 0x00, 100);
    memset(hash_str, 0x00, 1000);
    memset(output, 0x00, 100);

    strncpy( (char *) md_name, {text_md_name}, 100 );
    md_info = md_info_from_string( md_name );
    TEST_ASSERT( md_info != NULL );

    md_file( md_info, {filename}, output);
    hexify( hash_str, output, md_get_size(md_info) );

    TEST_ASSERT( strcmp( (char *) hash_str, {hex_hash_string} ) == 0 );
}
END_CASE
