1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/chachapoly.h" 3a8e1175bSopenharmony_ci/* END_HEADER */ 4a8e1175bSopenharmony_ci 5a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 6a8e1175bSopenharmony_ci * depends_on:MBEDTLS_CHACHAPOLY_C 7a8e1175bSopenharmony_ci * END_DEPENDENCIES 8a8e1175bSopenharmony_ci */ 9a8e1175bSopenharmony_ci 10a8e1175bSopenharmony_ci/* BEGIN_CASE */ 11a8e1175bSopenharmony_civoid mbedtls_chachapoly_enc(data_t *key_str, 12a8e1175bSopenharmony_ci data_t *nonce_str, 13a8e1175bSopenharmony_ci data_t *aad_str, 14a8e1175bSopenharmony_ci data_t *input_str, 15a8e1175bSopenharmony_ci data_t *output_str, 16a8e1175bSopenharmony_ci data_t *mac_str) 17a8e1175bSopenharmony_ci{ 18a8e1175bSopenharmony_ci unsigned char output[265]; 19a8e1175bSopenharmony_ci unsigned char mac[16]; /* size set by the standard */ 20a8e1175bSopenharmony_ci mbedtls_chachapoly_context ctx; 21a8e1175bSopenharmony_ci 22a8e1175bSopenharmony_ci TEST_ASSERT(key_str->len == 32); 23a8e1175bSopenharmony_ci TEST_ASSERT(nonce_str->len == 12); 24a8e1175bSopenharmony_ci TEST_ASSERT(mac_str->len == 16); 25a8e1175bSopenharmony_ci 26a8e1175bSopenharmony_ci mbedtls_chachapoly_init(&ctx); 27a8e1175bSopenharmony_ci 28a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key_str->x) == 0); 29a8e1175bSopenharmony_ci 30a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_encrypt_and_tag(&ctx, 31a8e1175bSopenharmony_ci input_str->len, nonce_str->x, 32a8e1175bSopenharmony_ci aad_str->x, aad_str->len, 33a8e1175bSopenharmony_ci input_str->x, output, mac) == 0); 34a8e1175bSopenharmony_ci 35a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output_str->x, output, output_str->len) == 0); 36a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(mac_str->x, mac, 16U) == 0); 37a8e1175bSopenharmony_ci 38a8e1175bSopenharmony_ciexit: 39a8e1175bSopenharmony_ci mbedtls_chachapoly_free(&ctx); 40a8e1175bSopenharmony_ci} 41a8e1175bSopenharmony_ci/* END_CASE */ 42a8e1175bSopenharmony_ci 43a8e1175bSopenharmony_ci/* BEGIN_CASE */ 44a8e1175bSopenharmony_civoid mbedtls_chachapoly_dec(data_t *key_str, 45a8e1175bSopenharmony_ci data_t *nonce_str, 46a8e1175bSopenharmony_ci data_t *aad_str, 47a8e1175bSopenharmony_ci data_t *input_str, 48a8e1175bSopenharmony_ci data_t *output_str, 49a8e1175bSopenharmony_ci data_t *mac_str, 50a8e1175bSopenharmony_ci int ret_exp) 51a8e1175bSopenharmony_ci{ 52a8e1175bSopenharmony_ci unsigned char output[265]; 53a8e1175bSopenharmony_ci int ret; 54a8e1175bSopenharmony_ci mbedtls_chachapoly_context ctx; 55a8e1175bSopenharmony_ci 56a8e1175bSopenharmony_ci TEST_ASSERT(key_str->len == 32); 57a8e1175bSopenharmony_ci TEST_ASSERT(nonce_str->len == 12); 58a8e1175bSopenharmony_ci TEST_ASSERT(mac_str->len == 16); 59a8e1175bSopenharmony_ci 60a8e1175bSopenharmony_ci mbedtls_chachapoly_init(&ctx); 61a8e1175bSopenharmony_ci 62a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key_str->x) == 0); 63a8e1175bSopenharmony_ci 64a8e1175bSopenharmony_ci ret = mbedtls_chachapoly_auth_decrypt(&ctx, 65a8e1175bSopenharmony_ci input_str->len, nonce_str->x, 66a8e1175bSopenharmony_ci aad_str->x, aad_str->len, 67a8e1175bSopenharmony_ci mac_str->x, input_str->x, output); 68a8e1175bSopenharmony_ci 69a8e1175bSopenharmony_ci TEST_ASSERT(ret == ret_exp); 70a8e1175bSopenharmony_ci if (ret_exp == 0) { 71a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output_str->x, output, output_str->len) == 0); 72a8e1175bSopenharmony_ci } 73a8e1175bSopenharmony_ci 74a8e1175bSopenharmony_ciexit: 75a8e1175bSopenharmony_ci mbedtls_chachapoly_free(&ctx); 76a8e1175bSopenharmony_ci} 77a8e1175bSopenharmony_ci/* END_CASE */ 78a8e1175bSopenharmony_ci 79a8e1175bSopenharmony_ci/* BEGIN_CASE */ 80a8e1175bSopenharmony_civoid chachapoly_state() 81a8e1175bSopenharmony_ci{ 82a8e1175bSopenharmony_ci unsigned char key[32]; 83a8e1175bSopenharmony_ci unsigned char nonce[12]; 84a8e1175bSopenharmony_ci unsigned char aad[1]; 85a8e1175bSopenharmony_ci unsigned char input[1]; 86a8e1175bSopenharmony_ci unsigned char output[1]; 87a8e1175bSopenharmony_ci unsigned char mac[16]; 88a8e1175bSopenharmony_ci size_t input_len = sizeof(input); 89a8e1175bSopenharmony_ci size_t aad_len = sizeof(aad); 90a8e1175bSopenharmony_ci mbedtls_chachapoly_context ctx; 91a8e1175bSopenharmony_ci 92a8e1175bSopenharmony_ci memset(key, 0x00, sizeof(key)); 93a8e1175bSopenharmony_ci memset(nonce, 0x00, sizeof(nonce)); 94a8e1175bSopenharmony_ci memset(aad, 0x00, sizeof(aad)); 95a8e1175bSopenharmony_ci memset(input, 0x00, sizeof(input)); 96a8e1175bSopenharmony_ci memset(output, 0x00, sizeof(output)); 97a8e1175bSopenharmony_ci memset(mac, 0x00, sizeof(mac)); 98a8e1175bSopenharmony_ci 99a8e1175bSopenharmony_ci /* Initial state: finish, update, update_aad forbidden */ 100a8e1175bSopenharmony_ci mbedtls_chachapoly_init(&ctx); 101a8e1175bSopenharmony_ci 102a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac) 103a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 104a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output) 105a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 106a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len) 107a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 108a8e1175bSopenharmony_ci 109a8e1175bSopenharmony_ci /* Still initial state: finish, update, update_aad forbidden */ 110a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key) 111a8e1175bSopenharmony_ci == 0); 112a8e1175bSopenharmony_ci 113a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac) 114a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 115a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output) 116a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 117a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len) 118a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 119a8e1175bSopenharmony_ci 120a8e1175bSopenharmony_ci /* Starts -> finish OK */ 121a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT) 122a8e1175bSopenharmony_ci == 0); 123a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac) 124a8e1175bSopenharmony_ci == 0); 125a8e1175bSopenharmony_ci 126a8e1175bSopenharmony_ci /* After finish: update, update_aad forbidden */ 127a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output) 128a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 129a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len) 130a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 131a8e1175bSopenharmony_ci 132a8e1175bSopenharmony_ci /* Starts -> update* OK */ 133a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT) 134a8e1175bSopenharmony_ci == 0); 135a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output) 136a8e1175bSopenharmony_ci == 0); 137a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output) 138a8e1175bSopenharmony_ci == 0); 139a8e1175bSopenharmony_ci 140a8e1175bSopenharmony_ci /* After update: update_aad forbidden */ 141a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len) 142a8e1175bSopenharmony_ci == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE); 143a8e1175bSopenharmony_ci 144a8e1175bSopenharmony_ci /* Starts -> update_aad* -> finish OK */ 145a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT) 146a8e1175bSopenharmony_ci == 0); 147a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len) 148a8e1175bSopenharmony_ci == 0); 149a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len) 150a8e1175bSopenharmony_ci == 0); 151a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac) 152a8e1175bSopenharmony_ci == 0); 153a8e1175bSopenharmony_ci 154a8e1175bSopenharmony_ciexit: 155a8e1175bSopenharmony_ci mbedtls_chachapoly_free(&ctx); 156a8e1175bSopenharmony_ci} 157a8e1175bSopenharmony_ci/* END_CASE */ 158a8e1175bSopenharmony_ci 159a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 160a8e1175bSopenharmony_civoid chachapoly_selftest() 161a8e1175bSopenharmony_ci{ 162a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_chachapoly_self_test(1) == 0); 163a8e1175bSopenharmony_ci} 164a8e1175bSopenharmony_ci/* END_CASE */ 165