1*62c56f98SSadaf Ebrahimi/* BEGIN_HEADER */ 2*62c56f98SSadaf Ebrahimi#include "mbedtls/chacha20.h" 3*62c56f98SSadaf Ebrahimi/* END_HEADER */ 4*62c56f98SSadaf Ebrahimi 5*62c56f98SSadaf Ebrahimi/* BEGIN_DEPENDENCIES 6*62c56f98SSadaf Ebrahimi * depends_on:MBEDTLS_CHACHA20_C 7*62c56f98SSadaf Ebrahimi * END_DEPENDENCIES 8*62c56f98SSadaf Ebrahimi */ 9*62c56f98SSadaf Ebrahimi 10*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 11*62c56f98SSadaf Ebrahimivoid chacha20_crypt(data_t *key_str, 12*62c56f98SSadaf Ebrahimi data_t *nonce_str, 13*62c56f98SSadaf Ebrahimi int counter, 14*62c56f98SSadaf Ebrahimi data_t *src_str, 15*62c56f98SSadaf Ebrahimi data_t *expected_output_str) 16*62c56f98SSadaf Ebrahimi{ 17*62c56f98SSadaf Ebrahimi unsigned char output[375]; 18*62c56f98SSadaf Ebrahimi mbedtls_chacha20_context ctx; 19*62c56f98SSadaf Ebrahimi 20*62c56f98SSadaf Ebrahimi memset(output, 0x00, sizeof(output)); 21*62c56f98SSadaf Ebrahimi 22*62c56f98SSadaf Ebrahimi TEST_ASSERT(src_str->len == expected_output_str->len); 23*62c56f98SSadaf Ebrahimi TEST_ASSERT(key_str->len == 32U); 24*62c56f98SSadaf Ebrahimi TEST_ASSERT(nonce_str->len == 12U); 25*62c56f98SSadaf Ebrahimi 26*62c56f98SSadaf Ebrahimi /* 27*62c56f98SSadaf Ebrahimi * Test the integrated API 28*62c56f98SSadaf Ebrahimi */ 29*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_crypt(key_str->x, nonce_str->x, counter, src_str->len, src_str->x, 30*62c56f98SSadaf Ebrahimi output) == 0); 31*62c56f98SSadaf Ebrahimi 32*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(output, expected_output_str->len, 33*62c56f98SSadaf Ebrahimi expected_output_str->x, expected_output_str->len); 34*62c56f98SSadaf Ebrahimi 35*62c56f98SSadaf Ebrahimi /* 36*62c56f98SSadaf Ebrahimi * Test the streaming API 37*62c56f98SSadaf Ebrahimi */ 38*62c56f98SSadaf Ebrahimi mbedtls_chacha20_init(&ctx); 39*62c56f98SSadaf Ebrahimi 40*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_setkey(&ctx, key_str->x) == 0); 41*62c56f98SSadaf Ebrahimi 42*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_starts(&ctx, nonce_str->x, counter) == 0); 43*62c56f98SSadaf Ebrahimi 44*62c56f98SSadaf Ebrahimi memset(output, 0x00, sizeof(output)); 45*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_update(&ctx, src_str->len, src_str->x, output) == 0); 46*62c56f98SSadaf Ebrahimi 47*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(output, expected_output_str->len, 48*62c56f98SSadaf Ebrahimi expected_output_str->x, expected_output_str->len); 49*62c56f98SSadaf Ebrahimi 50*62c56f98SSadaf Ebrahimi /* 51*62c56f98SSadaf Ebrahimi * Test the streaming API again, piecewise 52*62c56f98SSadaf Ebrahimi */ 53*62c56f98SSadaf Ebrahimi 54*62c56f98SSadaf Ebrahimi /* Don't free/init the context nor set the key again, 55*62c56f98SSadaf Ebrahimi * in order to test that starts() does the right thing. */ 56*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_starts(&ctx, nonce_str->x, counter) == 0); 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimi memset(output, 0x00, sizeof(output)); 59*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_update(&ctx, 1, src_str->x, output) == 0); 60*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_update(&ctx, src_str->len - 1, 61*62c56f98SSadaf Ebrahimi src_str->x + 1, output + 1) == 0); 62*62c56f98SSadaf Ebrahimi 63*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(output, expected_output_str->len, 64*62c56f98SSadaf Ebrahimi expected_output_str->x, expected_output_str->len); 65*62c56f98SSadaf Ebrahimi 66*62c56f98SSadaf Ebrahimi mbedtls_chacha20_free(&ctx); 67*62c56f98SSadaf Ebrahimi} 68*62c56f98SSadaf Ebrahimi/* END_CASE */ 69*62c56f98SSadaf Ebrahimi 70*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 71*62c56f98SSadaf Ebrahimivoid chacha20_self_test() 72*62c56f98SSadaf Ebrahimi{ 73*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_chacha20_self_test(1) == 0); 74*62c56f98SSadaf Ebrahimi} 75*62c56f98SSadaf Ebrahimi/* END_CASE */ 76