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

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_XTEA_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void xtea_encrypt_ecb( data_t * key_str, data_t * src_str,
                       data_t * dst )
{
    unsigned char output[100];
    mbedtls_xtea_context ctx;

    memset(output, 0x00, 100);


    mbedtls_xtea_setup( &ctx, key_str->x );
    TEST_ASSERT( mbedtls_xtea_crypt_ecb( &ctx, MBEDTLS_XTEA_ENCRYPT, src_str->x, output ) == 0 );

    TEST_ASSERT( mbedtls_test_hexcmp( output, dst->x, 8, dst->len ) == 0 );
}
/* END_CASE */

/* BEGIN_CASE */
void xtea_decrypt_ecb( data_t * key_str, data_t * src_str, data_t * dst )
{
    unsigned char output[100];
    mbedtls_xtea_context ctx;

    memset(output, 0x00, 100);


    mbedtls_xtea_setup( &ctx, key_str->x );
    TEST_ASSERT( mbedtls_xtea_crypt_ecb( &ctx, MBEDTLS_XTEA_DECRYPT, src_str->x, output ) == 0 );

    TEST_ASSERT( mbedtls_test_hexcmp( output, dst->x, 8, dst->len ) == 0 );
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
void xtea_encrypt_cbc( data_t * key_str, data_t * iv_str,
                       data_t * src_str, data_t * dst )
{
    unsigned char output[100];
    mbedtls_xtea_context ctx;

    memset(output, 0x00, 100);


    mbedtls_xtea_setup( &ctx, key_str->x );
    TEST_ASSERT( mbedtls_xtea_crypt_cbc( &ctx, MBEDTLS_XTEA_ENCRYPT, src_str->len, iv_str->x,
                                 src_str->x, output ) == 0 );

    TEST_ASSERT( mbedtls_test_hexcmp( output, dst->x,
                                      src_str->len, dst->len ) == 0 );
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
void xtea_decrypt_cbc( data_t * key_str, data_t * iv_str,
                       data_t * src_str, data_t * dst )
{
    unsigned char output[100];
    mbedtls_xtea_context ctx;

    memset(output, 0x00, 100);


    mbedtls_xtea_setup( &ctx, key_str->x );
    TEST_ASSERT( mbedtls_xtea_crypt_cbc( &ctx, MBEDTLS_XTEA_DECRYPT, src_str->len, iv_str->x,
                                 src_str->x, output ) == 0 );

    TEST_ASSERT( mbedtls_test_hexcmp( output, dst->x,
                                      src_str->len, dst->len ) == 0 );
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
void xtea_selftest(  )
{
    TEST_ASSERT( mbedtls_xtea_self_test( 1 ) == 0 );
}
/* END_CASE */
