/* BEGIN_HEADER */
#include "mbedtls/des.h"
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:POLARSSL_DES_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void des_check_weak( char *key_hex, int ret )
{
    unsigned char key[DES_KEY_SIZE];

    memset( key, 0, sizeof key );

    unhexify( key, key_hex );

    TEST_ASSERT( des_key_check_weak( key ) == ret );
}
/* END_CASE */

/* BEGIN_CASE */
void des_encrypt_ecb( char *hex_key_string, char *hex_src_string,
                      char *hex_dst_string )
{
    unsigned char key_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des_context ctx;

    memset(key_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( src_str, hex_src_string );

    des_setkey_enc( &ctx, key_str );
    TEST_ASSERT( des_crypt_ecb( &ctx, src_str, output ) == 0 );
    hexify( dst_str, output, 8 );

    TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );

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

/* BEGIN_CASE */
void des_decrypt_ecb( char *hex_key_string, char *hex_src_string,
                      char *hex_dst_string )
{
    unsigned char key_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des_context ctx;

    memset(key_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( src_str, hex_src_string );

    des_setkey_dec( &ctx, key_str );
    TEST_ASSERT( des_crypt_ecb( &ctx, src_str, output ) == 0 );
    hexify( dst_str, output, 8 );

    TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );

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

/* BEGIN_CASE depends_on:POLARSSL_CIPHER_MODE_CBC */
void des_encrypt_cbc( char *hex_key_string, char *hex_iv_string,
                      char *hex_src_string, char *hex_dst_string, int cbc_result )
{
    unsigned char key_str[100];
    unsigned char iv_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des_context ctx;
    int src_len;

    memset(key_str, 0x00, 100);
    memset(iv_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( iv_str, hex_iv_string );
    src_len = unhexify( src_str, hex_src_string );

    des_setkey_enc( &ctx, key_str );
    TEST_ASSERT( des_crypt_cbc( &ctx, DES_ENCRYPT, src_len, iv_str, src_str, output ) == cbc_result );
    if( cbc_result == 0 )
    {
        hexify( dst_str, output, src_len );

        TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );
    }

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

/* BEGIN_CASE depends_on:POLARSSL_CIPHER_MODE_CBC */
void des_decrypt_cbc( char *hex_key_string, char *hex_iv_string,
                      char *hex_src_string, char *hex_dst_string, int cbc_result )
{
    unsigned char key_str[100];
    unsigned char iv_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des_context ctx;
    int src_len;

    memset(key_str, 0x00, 100);
    memset(iv_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( iv_str, hex_iv_string );
    src_len = unhexify( src_str, hex_src_string );

    des_setkey_dec( &ctx, key_str );
    TEST_ASSERT( des_crypt_cbc( &ctx, DES_DECRYPT, src_len, iv_str, src_str, output ) == cbc_result );
    if( cbc_result == 0 )
    {
        hexify( dst_str, output, src_len );

        TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );
    }

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

/* BEGIN_CASE */
void des3_encrypt_ecb( int key_count, char *hex_key_string,
                       char *hex_src_string, char *hex_dst_string )
{
    unsigned char key_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des3_context ctx;

    memset(key_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des3_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( src_str, hex_src_string );

    if( key_count == 2 )
        des3_set2key_enc( &ctx, key_str );
    else if( key_count == 3 )
        des3_set3key_enc( &ctx, key_str );
    else
        TEST_ASSERT( 0 );

    TEST_ASSERT( des3_crypt_ecb( &ctx, src_str, output ) == 0 );
    hexify( dst_str, output, 8 );

    TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );

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

/* BEGIN_CASE */
void des3_decrypt_ecb( int key_count, char *hex_key_string,
                       char *hex_src_string, char *hex_dst_string )
{
    unsigned char key_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des3_context ctx;

    memset(key_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des3_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( src_str, hex_src_string );

    if( key_count == 2 )
        des3_set2key_dec( &ctx, key_str );
    else if( key_count == 3 )
        des3_set3key_dec( &ctx, key_str );
    else
        TEST_ASSERT( 0 );

    TEST_ASSERT( des3_crypt_ecb( &ctx, src_str, output ) == 0 );
    hexify( dst_str, output, 8 );

    TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );

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

/* BEGIN_CASE depends_on:POLARSSL_CIPHER_MODE_CBC */
void des3_encrypt_cbc( int key_count, char *hex_key_string,
                       char *hex_iv_string, char *hex_src_string,
                       char *hex_dst_string, int cbc_result )
{
    unsigned char key_str[100];
    unsigned char iv_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des3_context ctx;
    int src_len;

    memset(key_str, 0x00, 100);
    memset(iv_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des3_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( iv_str, hex_iv_string );
    src_len = unhexify( src_str, hex_src_string );

    if( key_count == 2 )
        des3_set2key_enc( &ctx, key_str );
    else if( key_count == 3 )
        des3_set3key_enc( &ctx, key_str );
    else
        TEST_ASSERT( 0 );

    TEST_ASSERT( des3_crypt_cbc( &ctx, DES_ENCRYPT, src_len, iv_str, src_str, output ) == cbc_result );

    if( cbc_result == 0 )
    {
        hexify( dst_str, output, src_len );

        TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );
    }

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

/* BEGIN_CASE depends_on:POLARSSL_CIPHER_MODE_CBC */
void des3_decrypt_cbc( int key_count, char *hex_key_string,
                       char *hex_iv_string, char *hex_src_string,
                       char *hex_dst_string, int cbc_result )
{
    unsigned char key_str[100];
    unsigned char iv_str[100];
    unsigned char src_str[100];
    unsigned char dst_str[100];
    unsigned char output[100];
    des3_context ctx;
    int src_len;

    memset(key_str, 0x00, 100);
    memset(iv_str, 0x00, 100);
    memset(src_str, 0x00, 100);
    memset(dst_str, 0x00, 100);
    memset(output, 0x00, 100);
    des3_init( &ctx );

    unhexify( key_str, hex_key_string );
    unhexify( iv_str, hex_iv_string );
    src_len = unhexify( src_str, hex_src_string );

    if( key_count == 2 )
        des3_set2key_dec( &ctx, key_str );
    else if( key_count == 3 )
        des3_set3key_dec( &ctx, key_str );
    else
        TEST_ASSERT( 0 );

    TEST_ASSERT( des3_crypt_cbc( &ctx, DES_DECRYPT, src_len, iv_str, src_str, output ) == cbc_result );

    if( cbc_result == 0 )
    {
        hexify( dst_str, output, src_len );

        TEST_ASSERT( strcasecmp( (char *) dst_str, hex_dst_string ) == 0 );
    }

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

/* BEGIN_CASE */
void des_key_parity_run()
{
    int i, j, cnt;
    unsigned char key[DES_KEY_SIZE];
    unsigned int parity;

    memset( key, 0, DES_KEY_SIZE );
    cnt = 0;

    // Iterate through all possible byte values
    //
    for( i = 0; i < 32; i++ )
    {
        for( j = 0; j < 8; j++ )
            key[j] = cnt++;

        // Set the key parity according to the table
        //
        des_key_set_parity( key );

        // Check the parity with a function
        //
        for( j = 0; j < 8; j++ )
        {
            parity = key[j] ^ ( key[j] >> 4 );
            parity = parity ^
                    ( parity >> 1 ) ^
                    ( parity >> 2 ) ^
                    ( parity >> 3 );
            parity &= 1;

            if( parity != 1 )
                TEST_ASSERT( 0 );
        }

        // Check the parity with the table
        //
        TEST_ASSERT( des_key_check_key_parity( key ) == 0 );
    }
}
/* END_CASE */

/* BEGIN_CASE depends_on:POLARSSL_SELF_TEST */
void des_selftest()
{
    TEST_ASSERT( des_self_test( 0 ) == 0 );
}
/* END_CASE */
