1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/aes.h" 3a8e1175bSopenharmony_ci 4a8e1175bSopenharmony_ci/* Test AES with a copied context. 5a8e1175bSopenharmony_ci * 6a8e1175bSopenharmony_ci * master, enc and dec must be AES context objects. They don't need to 7a8e1175bSopenharmony_ci * be initialized, and are left freed. 8a8e1175bSopenharmony_ci */ 9a8e1175bSopenharmony_ci#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT) 10a8e1175bSopenharmony_cistatic int test_copy(const data_t *key, 11a8e1175bSopenharmony_ci mbedtls_aes_context *master, 12a8e1175bSopenharmony_ci mbedtls_aes_context *enc, 13a8e1175bSopenharmony_ci mbedtls_aes_context *dec) 14a8e1175bSopenharmony_ci{ 15a8e1175bSopenharmony_ci unsigned char plaintext[16] = { 16a8e1175bSopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 17a8e1175bSopenharmony_ci 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 18a8e1175bSopenharmony_ci }; 19a8e1175bSopenharmony_ci unsigned char ciphertext[16]; 20a8e1175bSopenharmony_ci unsigned char output[16]; 21a8e1175bSopenharmony_ci 22a8e1175bSopenharmony_ci // Set key and encrypt with original context 23a8e1175bSopenharmony_ci mbedtls_aes_init(master); 24a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(master, key->x, 25a8e1175bSopenharmony_ci key->len * 8) == 0); 26a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_ecb(master, MBEDTLS_AES_ENCRYPT, 27a8e1175bSopenharmony_ci plaintext, ciphertext) == 0); 28a8e1175bSopenharmony_ci *enc = *master; 29a8e1175bSopenharmony_ci 30a8e1175bSopenharmony_ci // Set key for decryption with original context 31a8e1175bSopenharmony_ci mbedtls_aes_init(master); 32a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_dec(master, key->x, 33a8e1175bSopenharmony_ci key->len * 8) == 0); 34a8e1175bSopenharmony_ci *dec = *master; 35a8e1175bSopenharmony_ci 36a8e1175bSopenharmony_ci // Wipe the original context to make sure nothing from it is used 37a8e1175bSopenharmony_ci memset(master, 0, sizeof(*master)); 38a8e1175bSopenharmony_ci 39a8e1175bSopenharmony_ci // Encrypt with copied context 40a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_ecb(enc, MBEDTLS_AES_ENCRYPT, 41a8e1175bSopenharmony_ci plaintext, output) == 0); 42a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(ciphertext, 16, output, 16); 43a8e1175bSopenharmony_ci mbedtls_aes_free(enc); 44a8e1175bSopenharmony_ci 45a8e1175bSopenharmony_ci // Decrypt with copied context 46a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_ecb(dec, MBEDTLS_AES_DECRYPT, 47a8e1175bSopenharmony_ci ciphertext, output) == 0); 48a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(plaintext, 16, output, 16); 49a8e1175bSopenharmony_ci mbedtls_aes_free(dec); 50a8e1175bSopenharmony_ci 51a8e1175bSopenharmony_ci return 1; 52a8e1175bSopenharmony_ci 53a8e1175bSopenharmony_ciexit: 54a8e1175bSopenharmony_ci /* Bug: we may be leaving something unfreed. This is harmless 55a8e1175bSopenharmony_ci * in our built-in implementations, but might cause a memory leak 56a8e1175bSopenharmony_ci * with alternative implementations. */ 57a8e1175bSopenharmony_ci return 0; 58a8e1175bSopenharmony_ci} 59a8e1175bSopenharmony_ci#endif 60a8e1175bSopenharmony_ci 61a8e1175bSopenharmony_ci/* END_HEADER */ 62a8e1175bSopenharmony_ci 63a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 64a8e1175bSopenharmony_ci * depends_on:MBEDTLS_AES_C 65a8e1175bSopenharmony_ci * END_DEPENDENCIES 66a8e1175bSopenharmony_ci */ 67a8e1175bSopenharmony_ci 68a8e1175bSopenharmony_ci/* BEGIN_CASE */ 69a8e1175bSopenharmony_civoid aes_encrypt_ecb(data_t *key_str, data_t *src_str, 70a8e1175bSopenharmony_ci data_t *dst, int setkey_result) 71a8e1175bSopenharmony_ci{ 72a8e1175bSopenharmony_ci unsigned char output[100]; 73a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 74a8e1175bSopenharmony_ci 75a8e1175bSopenharmony_ci memset(output, 0x00, 100); 76a8e1175bSopenharmony_ci 77a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 78a8e1175bSopenharmony_ci 79a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == setkey_result); 80a8e1175bSopenharmony_ci if (setkey_result == 0) { 81a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, src_str->x, output) == 0); 82a8e1175bSopenharmony_ci 83a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0); 84a8e1175bSopenharmony_ci } 85a8e1175bSopenharmony_ci 86a8e1175bSopenharmony_ciexit: 87a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 88a8e1175bSopenharmony_ci} 89a8e1175bSopenharmony_ci/* END_CASE */ 90a8e1175bSopenharmony_ci 91a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CTR */ 92a8e1175bSopenharmony_civoid aes_ctr(data_t *key, data_t *ictr, data_t *pt, data_t *ct, int expected) 93a8e1175bSopenharmony_ci{ 94a8e1175bSopenharmony_ci unsigned char *output = NULL; 95a8e1175bSopenharmony_ci unsigned char ctr[16]; 96a8e1175bSopenharmony_ci unsigned char stream_block[16]; 97a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 98a8e1175bSopenharmony_ci 99a8e1175bSopenharmony_ci // sanity checks on test input 100a8e1175bSopenharmony_ci TEST_ASSERT(pt->len == ct->len); 101a8e1175bSopenharmony_ci TEST_ASSERT(key->len == 16 || key->len == 24 || key->len == 32); 102a8e1175bSopenharmony_ci 103a8e1175bSopenharmony_ci TEST_CALLOC(output, pt->len); 104a8e1175bSopenharmony_ci 105a8e1175bSopenharmony_ci // expected result is always success on zero-length input, so skip len == 0 if expecting failure 106a8e1175bSopenharmony_ci for (size_t len = (expected == 0 ? 0 : 1); len <= pt->len; len++) { 107a8e1175bSopenharmony_ci for (int i = 0; i < 2; i++) { 108a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 109a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key->x, key->len * 8) == 0); 110a8e1175bSopenharmony_ci 111a8e1175bSopenharmony_ci memcpy(ctr, ictr->x, 16); 112a8e1175bSopenharmony_ci memset(stream_block, 0, 16); 113a8e1175bSopenharmony_ci memset(output, 0, pt->len); 114a8e1175bSopenharmony_ci 115a8e1175bSopenharmony_ci size_t nc_off = 0; 116a8e1175bSopenharmony_ci 117a8e1175bSopenharmony_ci if (i == 0) { 118a8e1175bSopenharmony_ci // encrypt 119a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, ctr, 120a8e1175bSopenharmony_ci stream_block, pt->x, output), 0); 121a8e1175bSopenharmony_ci TEST_ASSERT(!!memcmp(output, ct->x, len) == expected); 122a8e1175bSopenharmony_ci } else { 123a8e1175bSopenharmony_ci // decrypt 124a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, ctr, 125a8e1175bSopenharmony_ci stream_block, ct->x, output), 0); 126a8e1175bSopenharmony_ci TEST_ASSERT(!!memcmp(output, pt->x, len) == expected); 127a8e1175bSopenharmony_ci } 128a8e1175bSopenharmony_ci } 129a8e1175bSopenharmony_ci } 130a8e1175bSopenharmony_ci 131a8e1175bSopenharmony_ciexit: 132a8e1175bSopenharmony_ci mbedtls_free(output); 133a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 134a8e1175bSopenharmony_ci} 135a8e1175bSopenharmony_ci/* END_CASE */ 136a8e1175bSopenharmony_ci 137a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CTR */ 138a8e1175bSopenharmony_civoid aes_encrypt_ctr_multipart(int length, int step_size) 139a8e1175bSopenharmony_ci{ 140a8e1175bSopenharmony_ci unsigned char key[16]; 141a8e1175bSopenharmony_ci unsigned char ctr_a[16]; 142a8e1175bSopenharmony_ci unsigned char ctr_b[16]; 143a8e1175bSopenharmony_ci unsigned char stream_block_a[16]; 144a8e1175bSopenharmony_ci unsigned char stream_block_b[16]; 145a8e1175bSopenharmony_ci unsigned char *input = NULL; 146a8e1175bSopenharmony_ci unsigned char *output_a = NULL; 147a8e1175bSopenharmony_ci unsigned char *output_b = NULL; 148a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 149a8e1175bSopenharmony_ci size_t nc_off_a, nc_off_b; 150a8e1175bSopenharmony_ci 151a8e1175bSopenharmony_ci TEST_ASSERT(length >= 0); 152a8e1175bSopenharmony_ci TEST_ASSERT(step_size > 0); 153a8e1175bSopenharmony_ci 154a8e1175bSopenharmony_ci TEST_CALLOC(input, length); 155a8e1175bSopenharmony_ci TEST_CALLOC(output_a, length); 156a8e1175bSopenharmony_ci TEST_CALLOC(output_b, length); 157a8e1175bSopenharmony_ci 158a8e1175bSopenharmony_ci // set up a random key 159a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand(NULL, key, sizeof(key)); 160a8e1175bSopenharmony_ci 161a8e1175bSopenharmony_ci // random input 162a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand(NULL, input, length); 163a8e1175bSopenharmony_ci 164a8e1175bSopenharmony_ci 165a8e1175bSopenharmony_ci // complete encryption in one call 166a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 167a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key, sizeof(key) * 8) == 0); 168a8e1175bSopenharmony_ci memset(ctr_a, 0, sizeof(ctr_a)); 169a8e1175bSopenharmony_ci memset(stream_block_a, 0, sizeof(stream_block_a)); 170a8e1175bSopenharmony_ci nc_off_a = 0; 171a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, length, &nc_off_a, ctr_a, 172a8e1175bSopenharmony_ci stream_block_a, input, output_a), 0); 173a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 174a8e1175bSopenharmony_ci 175a8e1175bSopenharmony_ci 176a8e1175bSopenharmony_ci // encrypt in multiple steps of varying size 177a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 178a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key, sizeof(key) * 8) == 0); 179a8e1175bSopenharmony_ci memset(ctr_b, 0, sizeof(ctr_b)); 180a8e1175bSopenharmony_ci memset(stream_block_b, 0, sizeof(stream_block_b)); 181a8e1175bSopenharmony_ci nc_off_b = 0; 182a8e1175bSopenharmony_ci size_t remaining = length; 183a8e1175bSopenharmony_ci unsigned char *ip = input, *op = output_b; 184a8e1175bSopenharmony_ci while (remaining != 0) { 185a8e1175bSopenharmony_ci size_t l = MIN(remaining, (size_t) step_size); 186a8e1175bSopenharmony_ci step_size *= 2; 187a8e1175bSopenharmony_ci remaining -= l; 188a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, l, &nc_off_b, ctr_b, stream_block_b, ip, op), 0); 189a8e1175bSopenharmony_ci ip += l; 190a8e1175bSopenharmony_ci op += l; 191a8e1175bSopenharmony_ci } 192a8e1175bSopenharmony_ci 193a8e1175bSopenharmony_ci // finally, validate that multiple steps produced same result as single-pass 194a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output_a, length, output_b, length); 195a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(ctr_a, sizeof(ctr_a), ctr_b, sizeof(ctr_b)); 196a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(stream_block_a, sizeof(stream_block_a), 197a8e1175bSopenharmony_ci stream_block_b, sizeof(stream_block_b)); 198a8e1175bSopenharmony_ci TEST_EQUAL(nc_off_a, nc_off_b); 199a8e1175bSopenharmony_ci 200a8e1175bSopenharmony_ciexit: 201a8e1175bSopenharmony_ci mbedtls_free(input); 202a8e1175bSopenharmony_ci mbedtls_free(output_a); 203a8e1175bSopenharmony_ci mbedtls_free(output_b); 204a8e1175bSopenharmony_ci 205a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 206a8e1175bSopenharmony_ci} 207a8e1175bSopenharmony_ci/* END_CASE */ 208a8e1175bSopenharmony_ci 209a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */ 210a8e1175bSopenharmony_civoid aes_decrypt_ecb(data_t *key_str, data_t *src_str, 211a8e1175bSopenharmony_ci data_t *dst, int setkey_result) 212a8e1175bSopenharmony_ci{ 213a8e1175bSopenharmony_ci unsigned char output[100]; 214a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 215a8e1175bSopenharmony_ci 216a8e1175bSopenharmony_ci memset(output, 0x00, 100); 217a8e1175bSopenharmony_ci 218a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 219a8e1175bSopenharmony_ci 220a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == setkey_result); 221a8e1175bSopenharmony_ci if (setkey_result == 0) { 222a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, src_str->x, output) == 0); 223a8e1175bSopenharmony_ci 224a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0); 225a8e1175bSopenharmony_ci } 226a8e1175bSopenharmony_ci 227a8e1175bSopenharmony_ciexit: 228a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 229a8e1175bSopenharmony_ci} 230a8e1175bSopenharmony_ci/* END_CASE */ 231a8e1175bSopenharmony_ci 232a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */ 233a8e1175bSopenharmony_civoid aes_encrypt_cbc(data_t *key_str, data_t *iv_str, 234a8e1175bSopenharmony_ci data_t *src_str, data_t *dst, 235a8e1175bSopenharmony_ci int cbc_result) 236a8e1175bSopenharmony_ci{ 237a8e1175bSopenharmony_ci unsigned char output[100]; 238a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 239a8e1175bSopenharmony_ci 240a8e1175bSopenharmony_ci memset(output, 0x00, 100); 241a8e1175bSopenharmony_ci 242a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 243a8e1175bSopenharmony_ci 244a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0); 245a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x, 246a8e1175bSopenharmony_ci src_str->x, output) == cbc_result); 247a8e1175bSopenharmony_ci if (cbc_result == 0) { 248a8e1175bSopenharmony_ci 249a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 250a8e1175bSopenharmony_ci src_str->len, dst->len) == 0); 251a8e1175bSopenharmony_ci } 252a8e1175bSopenharmony_ci 253a8e1175bSopenharmony_ciexit: 254a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 255a8e1175bSopenharmony_ci} 256a8e1175bSopenharmony_ci/* END_CASE */ 257a8e1175bSopenharmony_ci 258a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */ 259a8e1175bSopenharmony_civoid aes_decrypt_cbc(data_t *key_str, data_t *iv_str, 260a8e1175bSopenharmony_ci data_t *src_str, data_t *dst, 261a8e1175bSopenharmony_ci int cbc_result) 262a8e1175bSopenharmony_ci{ 263a8e1175bSopenharmony_ci unsigned char output[100]; 264a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 265a8e1175bSopenharmony_ci 266a8e1175bSopenharmony_ci memset(output, 0x00, 100); 267a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 268a8e1175bSopenharmony_ci 269a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == 0); 270a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x, 271a8e1175bSopenharmony_ci src_str->x, output) == cbc_result); 272a8e1175bSopenharmony_ci if (cbc_result == 0) { 273a8e1175bSopenharmony_ci 274a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 275a8e1175bSopenharmony_ci src_str->len, dst->len) == 0); 276a8e1175bSopenharmony_ci } 277a8e1175bSopenharmony_ci 278a8e1175bSopenharmony_ciexit: 279a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 280a8e1175bSopenharmony_ci} 281a8e1175bSopenharmony_ci/* END_CASE */ 282a8e1175bSopenharmony_ci 283a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */ 284a8e1175bSopenharmony_civoid aes_encrypt_xts(char *hex_key_string, char *hex_data_unit_string, 285a8e1175bSopenharmony_ci char *hex_src_string, char *hex_dst_string) 286a8e1175bSopenharmony_ci{ 287a8e1175bSopenharmony_ci enum { AES_BLOCK_SIZE = 16 }; 288a8e1175bSopenharmony_ci unsigned char *data_unit = NULL; 289a8e1175bSopenharmony_ci unsigned char *key = NULL; 290a8e1175bSopenharmony_ci unsigned char *src = NULL; 291a8e1175bSopenharmony_ci unsigned char *dst = NULL; 292a8e1175bSopenharmony_ci unsigned char *output = NULL; 293a8e1175bSopenharmony_ci mbedtls_aes_xts_context ctx; 294a8e1175bSopenharmony_ci size_t key_len, src_len, dst_len, data_unit_len; 295a8e1175bSopenharmony_ci 296a8e1175bSopenharmony_ci mbedtls_aes_xts_init(&ctx); 297a8e1175bSopenharmony_ci 298a8e1175bSopenharmony_ci data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string, 299a8e1175bSopenharmony_ci &data_unit_len); 300a8e1175bSopenharmony_ci TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE); 301a8e1175bSopenharmony_ci 302a8e1175bSopenharmony_ci key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len); 303a8e1175bSopenharmony_ci TEST_ASSERT(key_len % 2 == 0); 304a8e1175bSopenharmony_ci 305a8e1175bSopenharmony_ci src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len); 306a8e1175bSopenharmony_ci dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len); 307a8e1175bSopenharmony_ci TEST_ASSERT(src_len == dst_len); 308a8e1175bSopenharmony_ci 309a8e1175bSopenharmony_ci output = mbedtls_test_zero_alloc(dst_len); 310a8e1175bSopenharmony_ci 311a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == 0); 312a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, src_len, 313a8e1175bSopenharmony_ci data_unit, src, output) == 0); 314a8e1175bSopenharmony_ci 315a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output, dst, dst_len) == 0); 316a8e1175bSopenharmony_ci 317a8e1175bSopenharmony_ciexit: 318a8e1175bSopenharmony_ci mbedtls_aes_xts_free(&ctx); 319a8e1175bSopenharmony_ci mbedtls_free(data_unit); 320a8e1175bSopenharmony_ci mbedtls_free(key); 321a8e1175bSopenharmony_ci mbedtls_free(src); 322a8e1175bSopenharmony_ci mbedtls_free(dst); 323a8e1175bSopenharmony_ci mbedtls_free(output); 324a8e1175bSopenharmony_ci} 325a8e1175bSopenharmony_ci/* END_CASE */ 326a8e1175bSopenharmony_ci 327a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */ 328a8e1175bSopenharmony_civoid aes_decrypt_xts(char *hex_key_string, char *hex_data_unit_string, 329a8e1175bSopenharmony_ci char *hex_dst_string, char *hex_src_string) 330a8e1175bSopenharmony_ci{ 331a8e1175bSopenharmony_ci enum { AES_BLOCK_SIZE = 16 }; 332a8e1175bSopenharmony_ci unsigned char *data_unit = NULL; 333a8e1175bSopenharmony_ci unsigned char *key = NULL; 334a8e1175bSopenharmony_ci unsigned char *src = NULL; 335a8e1175bSopenharmony_ci unsigned char *dst = NULL; 336a8e1175bSopenharmony_ci unsigned char *output = NULL; 337a8e1175bSopenharmony_ci mbedtls_aes_xts_context ctx; 338a8e1175bSopenharmony_ci size_t key_len, src_len, dst_len, data_unit_len; 339a8e1175bSopenharmony_ci 340a8e1175bSopenharmony_ci mbedtls_aes_xts_init(&ctx); 341a8e1175bSopenharmony_ci 342a8e1175bSopenharmony_ci data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string, 343a8e1175bSopenharmony_ci &data_unit_len); 344a8e1175bSopenharmony_ci TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE); 345a8e1175bSopenharmony_ci 346a8e1175bSopenharmony_ci key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len); 347a8e1175bSopenharmony_ci TEST_ASSERT(key_len % 2 == 0); 348a8e1175bSopenharmony_ci 349a8e1175bSopenharmony_ci src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len); 350a8e1175bSopenharmony_ci dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len); 351a8e1175bSopenharmony_ci TEST_ASSERT(src_len == dst_len); 352a8e1175bSopenharmony_ci 353a8e1175bSopenharmony_ci output = mbedtls_test_zero_alloc(dst_len); 354a8e1175bSopenharmony_ci 355a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == 0); 356a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_DECRYPT, src_len, 357a8e1175bSopenharmony_ci data_unit, src, output) == 0); 358a8e1175bSopenharmony_ci 359a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output, dst, dst_len) == 0); 360a8e1175bSopenharmony_ci 361a8e1175bSopenharmony_ciexit: 362a8e1175bSopenharmony_ci mbedtls_aes_xts_free(&ctx); 363a8e1175bSopenharmony_ci mbedtls_free(data_unit); 364a8e1175bSopenharmony_ci mbedtls_free(key); 365a8e1175bSopenharmony_ci mbedtls_free(src); 366a8e1175bSopenharmony_ci mbedtls_free(dst); 367a8e1175bSopenharmony_ci mbedtls_free(output); 368a8e1175bSopenharmony_ci} 369a8e1175bSopenharmony_ci/* END_CASE */ 370a8e1175bSopenharmony_ci 371a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */ 372a8e1175bSopenharmony_civoid aes_crypt_xts_size(int size, int retval) 373a8e1175bSopenharmony_ci{ 374a8e1175bSopenharmony_ci mbedtls_aes_xts_context ctx; 375a8e1175bSopenharmony_ci const unsigned char src[16] = { 0 }; 376a8e1175bSopenharmony_ci unsigned char output[16]; 377a8e1175bSopenharmony_ci unsigned char data_unit[16]; 378a8e1175bSopenharmony_ci size_t length = size; 379a8e1175bSopenharmony_ci 380a8e1175bSopenharmony_ci mbedtls_aes_xts_init(&ctx); 381a8e1175bSopenharmony_ci memset(data_unit, 0x00, sizeof(data_unit)); 382a8e1175bSopenharmony_ci 383a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, length, data_unit, src, 384a8e1175bSopenharmony_ci output) == retval); 385a8e1175bSopenharmony_ciexit: 386a8e1175bSopenharmony_ci mbedtls_aes_xts_free(&ctx); 387a8e1175bSopenharmony_ci} 388a8e1175bSopenharmony_ci/* END_CASE */ 389a8e1175bSopenharmony_ci 390a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */ 391a8e1175bSopenharmony_civoid aes_crypt_xts_keysize(int size, int retval) 392a8e1175bSopenharmony_ci{ 393a8e1175bSopenharmony_ci mbedtls_aes_xts_context ctx; 394a8e1175bSopenharmony_ci const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; 395a8e1175bSopenharmony_ci size_t key_len = size; 396a8e1175bSopenharmony_ci 397a8e1175bSopenharmony_ci mbedtls_aes_xts_init(&ctx); 398a8e1175bSopenharmony_ci 399a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == retval); 400a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == retval); 401a8e1175bSopenharmony_ciexit: 402a8e1175bSopenharmony_ci mbedtls_aes_xts_free(&ctx); 403a8e1175bSopenharmony_ci} 404a8e1175bSopenharmony_ci/* END_CASE */ 405a8e1175bSopenharmony_ci 406a8e1175bSopenharmony_ci 407a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */ 408a8e1175bSopenharmony_civoid aes_encrypt_cfb128(data_t *key_str, data_t *iv_str, 409a8e1175bSopenharmony_ci data_t *src_str, data_t *dst) 410a8e1175bSopenharmony_ci{ 411a8e1175bSopenharmony_ci unsigned char output[100]; 412a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 413a8e1175bSopenharmony_ci size_t iv_offset = 0; 414a8e1175bSopenharmony_ci 415a8e1175bSopenharmony_ci memset(output, 0x00, 100); 416a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 417a8e1175bSopenharmony_ci 418a8e1175bSopenharmony_ci 419a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0); 420a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, 16, &iv_offset, iv_str->x, 421a8e1175bSopenharmony_ci src_str->x, output) == 0); 422a8e1175bSopenharmony_ci 423a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0); 424a8e1175bSopenharmony_ci 425a8e1175bSopenharmony_ciexit: 426a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 427a8e1175bSopenharmony_ci} 428a8e1175bSopenharmony_ci/* END_CASE */ 429a8e1175bSopenharmony_ci 430a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */ 431a8e1175bSopenharmony_civoid aes_decrypt_cfb128(data_t *key_str, data_t *iv_str, 432a8e1175bSopenharmony_ci data_t *src_str, data_t *dst) 433a8e1175bSopenharmony_ci{ 434a8e1175bSopenharmony_ci unsigned char output[100]; 435a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 436a8e1175bSopenharmony_ci size_t iv_offset = 0; 437a8e1175bSopenharmony_ci 438a8e1175bSopenharmony_ci memset(output, 0x00, 100); 439a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 440a8e1175bSopenharmony_ci 441a8e1175bSopenharmony_ci 442a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0); 443a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, 16, &iv_offset, iv_str->x, 444a8e1175bSopenharmony_ci src_str->x, output) == 0); 445a8e1175bSopenharmony_ci 446a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0); 447a8e1175bSopenharmony_ci 448a8e1175bSopenharmony_ciexit: 449a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 450a8e1175bSopenharmony_ci} 451a8e1175bSopenharmony_ci/* END_CASE */ 452a8e1175bSopenharmony_ci 453a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */ 454a8e1175bSopenharmony_civoid aes_encrypt_cfb8(data_t *key_str, data_t *iv_str, 455a8e1175bSopenharmony_ci data_t *src_str, data_t *dst) 456a8e1175bSopenharmony_ci{ 457a8e1175bSopenharmony_ci unsigned char output[100]; 458a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 459a8e1175bSopenharmony_ci 460a8e1175bSopenharmony_ci memset(output, 0x00, 100); 461a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 462a8e1175bSopenharmony_ci 463a8e1175bSopenharmony_ci 464a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0); 465a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x, 466a8e1175bSopenharmony_ci src_str->x, output) == 0); 467a8e1175bSopenharmony_ci 468a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 469a8e1175bSopenharmony_ci src_str->len, dst->len) == 0); 470a8e1175bSopenharmony_ci 471a8e1175bSopenharmony_ciexit: 472a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 473a8e1175bSopenharmony_ci} 474a8e1175bSopenharmony_ci/* END_CASE */ 475a8e1175bSopenharmony_ci 476a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */ 477a8e1175bSopenharmony_civoid aes_decrypt_cfb8(data_t *key_str, data_t *iv_str, 478a8e1175bSopenharmony_ci data_t *src_str, data_t *dst) 479a8e1175bSopenharmony_ci{ 480a8e1175bSopenharmony_ci unsigned char output[100]; 481a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 482a8e1175bSopenharmony_ci 483a8e1175bSopenharmony_ci memset(output, 0x00, 100); 484a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 485a8e1175bSopenharmony_ci 486a8e1175bSopenharmony_ci 487a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0); 488a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x, 489a8e1175bSopenharmony_ci src_str->x, output) == 0); 490a8e1175bSopenharmony_ci 491a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 492a8e1175bSopenharmony_ci src_str->len, dst->len) == 0); 493a8e1175bSopenharmony_ci 494a8e1175bSopenharmony_ciexit: 495a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 496a8e1175bSopenharmony_ci} 497a8e1175bSopenharmony_ci/* END_CASE */ 498a8e1175bSopenharmony_ci 499a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_OFB */ 500a8e1175bSopenharmony_civoid aes_encrypt_ofb(int fragment_size, data_t *key_str, 501a8e1175bSopenharmony_ci data_t *iv_str, data_t *src_str, 502a8e1175bSopenharmony_ci data_t *expected_output) 503a8e1175bSopenharmony_ci{ 504a8e1175bSopenharmony_ci unsigned char output[32]; 505a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 506a8e1175bSopenharmony_ci size_t iv_offset = 0; 507a8e1175bSopenharmony_ci int in_buffer_len; 508a8e1175bSopenharmony_ci unsigned char *src_str_next; 509a8e1175bSopenharmony_ci 510a8e1175bSopenharmony_ci memset(output, 0x00, sizeof(output)); 511a8e1175bSopenharmony_ci mbedtls_aes_init(&ctx); 512a8e1175bSopenharmony_ci 513a8e1175bSopenharmony_ci TEST_ASSERT((size_t) fragment_size < sizeof(output)); 514a8e1175bSopenharmony_ci 515a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, 516a8e1175bSopenharmony_ci key_str->len * 8) == 0); 517a8e1175bSopenharmony_ci in_buffer_len = src_str->len; 518a8e1175bSopenharmony_ci src_str_next = src_str->x; 519a8e1175bSopenharmony_ci 520a8e1175bSopenharmony_ci while (in_buffer_len > 0) { 521a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_ofb(&ctx, fragment_size, &iv_offset, 522a8e1175bSopenharmony_ci iv_str->x, src_str_next, output) == 0); 523a8e1175bSopenharmony_ci 524a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output, expected_output->x, fragment_size) == 0); 525a8e1175bSopenharmony_ci 526a8e1175bSopenharmony_ci in_buffer_len -= fragment_size; 527a8e1175bSopenharmony_ci expected_output->x += fragment_size; 528a8e1175bSopenharmony_ci src_str_next += fragment_size; 529a8e1175bSopenharmony_ci 530a8e1175bSopenharmony_ci if (in_buffer_len < fragment_size) { 531a8e1175bSopenharmony_ci fragment_size = in_buffer_len; 532a8e1175bSopenharmony_ci } 533a8e1175bSopenharmony_ci } 534a8e1175bSopenharmony_ci 535a8e1175bSopenharmony_ciexit: 536a8e1175bSopenharmony_ci mbedtls_aes_free(&ctx); 537a8e1175bSopenharmony_ci} 538a8e1175bSopenharmony_ci/* END_CASE */ 539a8e1175bSopenharmony_ci 540a8e1175bSopenharmony_ci/* BEGIN_CASE */ 541a8e1175bSopenharmony_civoid aes_invalid_mode() 542a8e1175bSopenharmony_ci{ 543a8e1175bSopenharmony_ci mbedtls_aes_context aes_ctx; 544a8e1175bSopenharmony_ci const unsigned char in[16] = { 0 }; 545a8e1175bSopenharmony_ci unsigned char out[16]; 546a8e1175bSopenharmony_ci const int invalid_mode = 42; 547a8e1175bSopenharmony_ci 548a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA, 549a8e1175bSopenharmony_ci mbedtls_aes_crypt_ecb(&aes_ctx, invalid_mode, in, out)); 550a8e1175bSopenharmony_ci 551a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC) 552a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA, 553a8e1175bSopenharmony_ci mbedtls_aes_crypt_cbc(&aes_ctx, invalid_mode, 16, 554a8e1175bSopenharmony_ci out, in, out)); 555a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_MODE_CBC */ 556a8e1175bSopenharmony_ci 557a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_XTS) 558a8e1175bSopenharmony_ci mbedtls_aes_xts_context xts_ctx; 559a8e1175bSopenharmony_ci 560a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA, 561a8e1175bSopenharmony_ci mbedtls_aes_crypt_xts(&xts_ctx, invalid_mode, 16, 562a8e1175bSopenharmony_ci in, in, out)); 563a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_MODE_XTS */ 564a8e1175bSopenharmony_ci 565a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CFB) 566a8e1175bSopenharmony_ci size_t size; 567a8e1175bSopenharmony_ci 568a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA, 569a8e1175bSopenharmony_ci mbedtls_aes_crypt_cfb128(&aes_ctx, invalid_mode, 16, 570a8e1175bSopenharmony_ci &size, out, in, out)); 571a8e1175bSopenharmony_ci TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA, 572a8e1175bSopenharmony_ci mbedtls_aes_crypt_cfb8(&aes_ctx, invalid_mode, 16, 573a8e1175bSopenharmony_ci out, in, out)); 574a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_MODE_CFB */ 575a8e1175bSopenharmony_ci} 576a8e1175bSopenharmony_ci/* END_CASE */ 577a8e1175bSopenharmony_ci 578a8e1175bSopenharmony_ci/* BEGIN_CASE */ 579a8e1175bSopenharmony_civoid aes_misc_params() 580a8e1175bSopenharmony_ci{ 581a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC) || \ 582a8e1175bSopenharmony_ci defined(MBEDTLS_CIPHER_MODE_XTS) || \ 583a8e1175bSopenharmony_ci defined(MBEDTLS_CIPHER_MODE_CFB) || \ 584a8e1175bSopenharmony_ci defined(MBEDTLS_CIPHER_MODE_OFB) 585a8e1175bSopenharmony_ci const unsigned char in[16] = { 0 }; 586a8e1175bSopenharmony_ci unsigned char out[16]; 587a8e1175bSopenharmony_ci#endif 588a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC) || \ 589a8e1175bSopenharmony_ci defined(MBEDTLS_CIPHER_MODE_CFB) || \ 590a8e1175bSopenharmony_ci defined(MBEDTLS_CIPHER_MODE_OFB) 591a8e1175bSopenharmony_ci mbedtls_aes_context aes_ctx; 592a8e1175bSopenharmony_ci#endif 593a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_XTS) 594a8e1175bSopenharmony_ci mbedtls_aes_xts_context xts_ctx; 595a8e1175bSopenharmony_ci#endif 596a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CFB) || \ 597a8e1175bSopenharmony_ci defined(MBEDTLS_CIPHER_MODE_OFB) 598a8e1175bSopenharmony_ci size_t size; 599a8e1175bSopenharmony_ci#endif 600a8e1175bSopenharmony_ci 601a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC) 602a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, 603a8e1175bSopenharmony_ci 15, 604a8e1175bSopenharmony_ci out, in, out) 605a8e1175bSopenharmony_ci == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH); 606a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, 607a8e1175bSopenharmony_ci 17, 608a8e1175bSopenharmony_ci out, in, out) 609a8e1175bSopenharmony_ci == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH); 610a8e1175bSopenharmony_ci#endif 611a8e1175bSopenharmony_ci 612a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_XTS) 613a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT, 614a8e1175bSopenharmony_ci 15, 615a8e1175bSopenharmony_ci in, in, out) 616a8e1175bSopenharmony_ci == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH); 617a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT, 618a8e1175bSopenharmony_ci (1 << 24) + 1, 619a8e1175bSopenharmony_ci in, in, out) 620a8e1175bSopenharmony_ci == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH); 621a8e1175bSopenharmony_ci#endif 622a8e1175bSopenharmony_ci 623a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CFB) 624a8e1175bSopenharmony_ci size = 16; 625a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_cfb128(&aes_ctx, MBEDTLS_AES_ENCRYPT, 16, 626a8e1175bSopenharmony_ci &size, out, in, out) 627a8e1175bSopenharmony_ci == MBEDTLS_ERR_AES_BAD_INPUT_DATA); 628a8e1175bSopenharmony_ci#endif 629a8e1175bSopenharmony_ci 630a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_OFB) 631a8e1175bSopenharmony_ci size = 16; 632a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_crypt_ofb(&aes_ctx, 16, &size, out, in, out) 633a8e1175bSopenharmony_ci == MBEDTLS_ERR_AES_BAD_INPUT_DATA); 634a8e1175bSopenharmony_ci#endif 635a8e1175bSopenharmony_ci 636a8e1175bSopenharmony_ci/* 637a8e1175bSopenharmony_ci * The following line needs to be added to make the code compilable 638a8e1175bSopenharmony_ci * when all the conditions above will be not define in a specific 639a8e1175bSopenharmony_ci * choice of features. 640a8e1175bSopenharmony_ci */ 641a8e1175bSopenharmony_ci TEST_ASSERT(1); 642a8e1175bSopenharmony_ci/* TODO: It will be removed when the whole test will be reworked */ 643a8e1175bSopenharmony_ci} 644a8e1175bSopenharmony_ci/* END_CASE */ 645a8e1175bSopenharmony_ci 646a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */ 647a8e1175bSopenharmony_civoid aes_ecb_copy_context(data_t *key) 648a8e1175bSopenharmony_ci{ 649a8e1175bSopenharmony_ci /* We test context copying multiple times, with different alignments 650a8e1175bSopenharmony_ci * of the original and of the copies. */ 651a8e1175bSopenharmony_ci 652a8e1175bSopenharmony_ci struct align0 { 653a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 654a8e1175bSopenharmony_ci }; 655a8e1175bSopenharmony_ci struct align0 *src0 = NULL; 656a8e1175bSopenharmony_ci struct align0 *enc0 = NULL; 657a8e1175bSopenharmony_ci struct align0 *dec0 = NULL; 658a8e1175bSopenharmony_ci 659a8e1175bSopenharmony_ci struct align1 { 660a8e1175bSopenharmony_ci char bump; 661a8e1175bSopenharmony_ci mbedtls_aes_context ctx; 662a8e1175bSopenharmony_ci }; 663a8e1175bSopenharmony_ci struct align1 *src1 = NULL; 664a8e1175bSopenharmony_ci struct align1 *enc1 = NULL; 665a8e1175bSopenharmony_ci struct align1 *dec1 = NULL; 666a8e1175bSopenharmony_ci 667a8e1175bSopenharmony_ci /* All peak alignment */ 668a8e1175bSopenharmony_ci TEST_CALLOC(src0, 1); 669a8e1175bSopenharmony_ci TEST_CALLOC(enc0, 1); 670a8e1175bSopenharmony_ci TEST_CALLOC(dec0, 1); 671a8e1175bSopenharmony_ci if (!test_copy(key, &src0->ctx, &enc0->ctx, &dec0->ctx)) { 672a8e1175bSopenharmony_ci goto exit; 673a8e1175bSopenharmony_ci } 674a8e1175bSopenharmony_ci mbedtls_free(src0); 675a8e1175bSopenharmony_ci src0 = NULL; 676a8e1175bSopenharmony_ci mbedtls_free(enc0); 677a8e1175bSopenharmony_ci enc0 = NULL; 678a8e1175bSopenharmony_ci mbedtls_free(dec0); 679a8e1175bSopenharmony_ci dec0 = NULL; 680a8e1175bSopenharmony_ci 681a8e1175bSopenharmony_ci /* Original shifted */ 682a8e1175bSopenharmony_ci TEST_CALLOC(src1, 1); 683a8e1175bSopenharmony_ci TEST_CALLOC(enc0, 1); 684a8e1175bSopenharmony_ci TEST_CALLOC(dec0, 1); 685a8e1175bSopenharmony_ci if (!test_copy(key, &src1->ctx, &enc0->ctx, &dec0->ctx)) { 686a8e1175bSopenharmony_ci goto exit; 687a8e1175bSopenharmony_ci } 688a8e1175bSopenharmony_ci mbedtls_free(src1); 689a8e1175bSopenharmony_ci src1 = NULL; 690a8e1175bSopenharmony_ci mbedtls_free(enc0); 691a8e1175bSopenharmony_ci enc0 = NULL; 692a8e1175bSopenharmony_ci mbedtls_free(dec0); 693a8e1175bSopenharmony_ci dec0 = NULL; 694a8e1175bSopenharmony_ci 695a8e1175bSopenharmony_ci /* Copies shifted */ 696a8e1175bSopenharmony_ci TEST_CALLOC(src0, 1); 697a8e1175bSopenharmony_ci TEST_CALLOC(enc1, 1); 698a8e1175bSopenharmony_ci TEST_CALLOC(dec1, 1); 699a8e1175bSopenharmony_ci if (!test_copy(key, &src0->ctx, &enc1->ctx, &dec1->ctx)) { 700a8e1175bSopenharmony_ci goto exit; 701a8e1175bSopenharmony_ci } 702a8e1175bSopenharmony_ci mbedtls_free(src0); 703a8e1175bSopenharmony_ci src0 = NULL; 704a8e1175bSopenharmony_ci mbedtls_free(enc1); 705a8e1175bSopenharmony_ci enc1 = NULL; 706a8e1175bSopenharmony_ci mbedtls_free(dec1); 707a8e1175bSopenharmony_ci dec1 = NULL; 708a8e1175bSopenharmony_ci 709a8e1175bSopenharmony_ci /* Source and copies shifted */ 710a8e1175bSopenharmony_ci TEST_CALLOC(src1, 1); 711a8e1175bSopenharmony_ci TEST_CALLOC(enc1, 1); 712a8e1175bSopenharmony_ci TEST_CALLOC(dec1, 1); 713a8e1175bSopenharmony_ci if (!test_copy(key, &src1->ctx, &enc1->ctx, &dec1->ctx)) { 714a8e1175bSopenharmony_ci goto exit; 715a8e1175bSopenharmony_ci } 716a8e1175bSopenharmony_ci mbedtls_free(src1); 717a8e1175bSopenharmony_ci src1 = NULL; 718a8e1175bSopenharmony_ci mbedtls_free(enc1); 719a8e1175bSopenharmony_ci enc1 = NULL; 720a8e1175bSopenharmony_ci mbedtls_free(dec1); 721a8e1175bSopenharmony_ci dec1 = NULL; 722a8e1175bSopenharmony_ci 723a8e1175bSopenharmony_ciexit: 724a8e1175bSopenharmony_ci mbedtls_free(src0); 725a8e1175bSopenharmony_ci mbedtls_free(enc0); 726a8e1175bSopenharmony_ci mbedtls_free(dec0); 727a8e1175bSopenharmony_ci mbedtls_free(src1); 728a8e1175bSopenharmony_ci mbedtls_free(enc1); 729a8e1175bSopenharmony_ci mbedtls_free(dec1); 730a8e1175bSopenharmony_ci} 731a8e1175bSopenharmony_ci/* END_CASE */ 732a8e1175bSopenharmony_ci 733a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 734a8e1175bSopenharmony_civoid aes_selftest() 735a8e1175bSopenharmony_ci{ 736a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_self_test(1) == 0); 737a8e1175bSopenharmony_ci} 738a8e1175bSopenharmony_ci/* END_CASE */ 739