1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/cipher.h" 3a8e1175bSopenharmony_ci#include "mbedtls/cmac.h" 4a8e1175bSopenharmony_ci/* END_HEADER */ 5a8e1175bSopenharmony_ci 6a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 7a8e1175bSopenharmony_ci * depends_on:MBEDTLS_CMAC_C 8a8e1175bSopenharmony_ci * END_DEPENDENCIES 9a8e1175bSopenharmony_ci */ 10a8e1175bSopenharmony_ci 11a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 12a8e1175bSopenharmony_civoid mbedtls_cmac_self_test() 13a8e1175bSopenharmony_ci{ 14a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cmac_self_test(1) == 0); 15a8e1175bSopenharmony_ci} 16a8e1175bSopenharmony_ci/* END_CASE */ 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci/* BEGIN_CASE */ 19a8e1175bSopenharmony_civoid mbedtls_cmac_null_args() 20a8e1175bSopenharmony_ci{ 21a8e1175bSopenharmony_ci mbedtls_cipher_context_t ctx; 22a8e1175bSopenharmony_ci const mbedtls_cipher_info_t *cipher_info; 23a8e1175bSopenharmony_ci unsigned char test_key[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 24a8e1175bSopenharmony_ci unsigned char test_data[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 25a8e1175bSopenharmony_ci unsigned char test_output[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 26a8e1175bSopenharmony_ci 27a8e1175bSopenharmony_ci mbedtls_cipher_init(&ctx); 28a8e1175bSopenharmony_ci 29a8e1175bSopenharmony_ci /* Test NULL cipher info */ 30a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, test_data, 16) == 31a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 32a8e1175bSopenharmony_ci 33a8e1175bSopenharmony_ci cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_ECB); 34a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0); 35a8e1175bSopenharmony_ci 36a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_starts(NULL, test_key, 128) == 37a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 38a8e1175bSopenharmony_ci 39a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, NULL, 128) == 40a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 41a8e1175bSopenharmony_ci 42a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(NULL, test_data, 16) == 43a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 44a8e1175bSopenharmony_ci 45a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, NULL, 16) == 46a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 47a8e1175bSopenharmony_ci 48a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_finish(NULL, test_output) == 49a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 50a8e1175bSopenharmony_ci 51a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, NULL) == 52a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 53a8e1175bSopenharmony_ci 54a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_reset(NULL) == 55a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 56a8e1175bSopenharmony_ci 57a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac(NULL, 58a8e1175bSopenharmony_ci test_key, 128, 59a8e1175bSopenharmony_ci test_data, 16, 60a8e1175bSopenharmony_ci test_output) == 61a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 62a8e1175bSopenharmony_ci 63a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac(cipher_info, 64a8e1175bSopenharmony_ci NULL, 128, 65a8e1175bSopenharmony_ci test_data, 16, 66a8e1175bSopenharmony_ci test_output) == 67a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 68a8e1175bSopenharmony_ci 69a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac(cipher_info, 70a8e1175bSopenharmony_ci test_key, 128, 71a8e1175bSopenharmony_ci NULL, 16, 72a8e1175bSopenharmony_ci test_output) == 73a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 74a8e1175bSopenharmony_ci 75a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac(cipher_info, 76a8e1175bSopenharmony_ci test_key, 128, 77a8e1175bSopenharmony_ci test_data, 16, 78a8e1175bSopenharmony_ci NULL) == 79a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 80a8e1175bSopenharmony_ci#if defined(MBEDTLS_AES_C) 81a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_cmac_prf_128(NULL, 16, 82a8e1175bSopenharmony_ci test_data, 16, 83a8e1175bSopenharmony_ci test_output) == 84a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 85a8e1175bSopenharmony_ci 86a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_cmac_prf_128(test_key, 16, 87a8e1175bSopenharmony_ci NULL, 16, 88a8e1175bSopenharmony_ci test_output) == 89a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 90a8e1175bSopenharmony_ci 91a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_aes_cmac_prf_128(test_key, 16, 92a8e1175bSopenharmony_ci test_data, 16, 93a8e1175bSopenharmony_ci NULL) == 94a8e1175bSopenharmony_ci MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); 95a8e1175bSopenharmony_ci#endif 96a8e1175bSopenharmony_ciexit: 97a8e1175bSopenharmony_ci mbedtls_cipher_free(&ctx); 98a8e1175bSopenharmony_ci} 99a8e1175bSopenharmony_ci/* END_CASE */ 100a8e1175bSopenharmony_ci 101a8e1175bSopenharmony_ci/* BEGIN_CASE */ 102a8e1175bSopenharmony_civoid mbedtls_cmac_setkey(int cipher_type, int key_size, int result) 103a8e1175bSopenharmony_ci{ 104a8e1175bSopenharmony_ci const mbedtls_cipher_info_t *cipher_info; 105a8e1175bSopenharmony_ci unsigned char key[32]; 106a8e1175bSopenharmony_ci unsigned char buf[16]; 107a8e1175bSopenharmony_ci unsigned char tmp[16]; 108a8e1175bSopenharmony_ci 109a8e1175bSopenharmony_ci memset(key, 0x2A, sizeof(key)); 110a8e1175bSopenharmony_ci TEST_ASSERT((unsigned) key_size <= 8 * sizeof(key)); 111a8e1175bSopenharmony_ci 112a8e1175bSopenharmony_ci TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type)) 113a8e1175bSopenharmony_ci != NULL); 114a8e1175bSopenharmony_ci#if !defined(MBEDTLS_DEPRECATED_REMOVED) 115a8e1175bSopenharmony_ci TEST_LE_U(mbedtls_cipher_info_get_block_size(cipher_info), 116a8e1175bSopenharmony_ci MBEDTLS_CIPHER_BLKSIZE_MAX); 117a8e1175bSopenharmony_ci#endif /* MBEDTLS_DEPRECATED_REMOVED */ 118a8e1175bSopenharmony_ci TEST_LE_U(mbedtls_cipher_info_get_block_size(cipher_info), 119a8e1175bSopenharmony_ci MBEDTLS_CMAC_MAX_BLOCK_SIZE); 120a8e1175bSopenharmony_ci 121a8e1175bSopenharmony_ci memset(buf, 0x2A, sizeof(buf)); 122a8e1175bSopenharmony_ci TEST_ASSERT((result == mbedtls_cipher_cmac(cipher_info, key, key_size, 123a8e1175bSopenharmony_ci buf, 16, tmp)) != 0); 124a8e1175bSopenharmony_ci} 125a8e1175bSopenharmony_ci/* END_CASE */ 126a8e1175bSopenharmony_ci 127a8e1175bSopenharmony_ci/* BEGIN_CASE */ 128a8e1175bSopenharmony_civoid mbedtls_cmac_multiple_blocks(int cipher_type, data_t *key, 129a8e1175bSopenharmony_ci int keybits, int block_size, 130a8e1175bSopenharmony_ci data_t *block1, int block1_len, 131a8e1175bSopenharmony_ci data_t *block2, int block2_len, 132a8e1175bSopenharmony_ci data_t *block3, int block3_len, 133a8e1175bSopenharmony_ci data_t *block4, int block4_len, 134a8e1175bSopenharmony_ci data_t *expected_result) 135a8e1175bSopenharmony_ci{ 136a8e1175bSopenharmony_ci const mbedtls_cipher_info_t *cipher_info; 137a8e1175bSopenharmony_ci mbedtls_cipher_context_t ctx; 138a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 139a8e1175bSopenharmony_ci 140a8e1175bSopenharmony_ci /* Convert the test parameters to binary data */ 141a8e1175bSopenharmony_ci 142a8e1175bSopenharmony_ci mbedtls_cipher_init(&ctx); 143a8e1175bSopenharmony_ci 144a8e1175bSopenharmony_ci /* Validate the test inputs */ 145a8e1175bSopenharmony_ci TEST_ASSERT(block1_len <= 100); 146a8e1175bSopenharmony_ci TEST_ASSERT(block2_len <= 100); 147a8e1175bSopenharmony_ci TEST_ASSERT(block3_len <= 100); 148a8e1175bSopenharmony_ci TEST_ASSERT(block4_len <= 100); 149a8e1175bSopenharmony_ci 150a8e1175bSopenharmony_ci /* Set up */ 151a8e1175bSopenharmony_ci TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type)) 152a8e1175bSopenharmony_ci != NULL); 153a8e1175bSopenharmony_ci 154a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0); 155a8e1175bSopenharmony_ci 156a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, 157a8e1175bSopenharmony_ci (const unsigned char *) key->x, 158a8e1175bSopenharmony_ci keybits) == 0); 159a8e1175bSopenharmony_ci 160a8e1175bSopenharmony_ci /* Multiple partial and complete blocks. A negative length means skip the 161a8e1175bSopenharmony_ci * update operation */ 162a8e1175bSopenharmony_ci if (block1_len >= 0) { 163a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 164a8e1175bSopenharmony_ci (unsigned char *) block1->x, 165a8e1175bSopenharmony_ci block1_len) == 0); 166a8e1175bSopenharmony_ci } 167a8e1175bSopenharmony_ci 168a8e1175bSopenharmony_ci if (block2_len >= 0) { 169a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 170a8e1175bSopenharmony_ci (unsigned char *) block2->x, 171a8e1175bSopenharmony_ci block2_len) == 0); 172a8e1175bSopenharmony_ci } 173a8e1175bSopenharmony_ci 174a8e1175bSopenharmony_ci if (block3_len >= 0) { 175a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 176a8e1175bSopenharmony_ci (unsigned char *) block3->x, 177a8e1175bSopenharmony_ci block3_len) == 0); 178a8e1175bSopenharmony_ci } 179a8e1175bSopenharmony_ci 180a8e1175bSopenharmony_ci if (block4_len >= 0) { 181a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 182a8e1175bSopenharmony_ci (unsigned char *) block4->x, 183a8e1175bSopenharmony_ci block4_len) == 0); 184a8e1175bSopenharmony_ci } 185a8e1175bSopenharmony_ci 186a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0); 187a8e1175bSopenharmony_ci 188a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output, expected_result->x, block_size) == 0); 189a8e1175bSopenharmony_ci 190a8e1175bSopenharmony_ciexit: 191a8e1175bSopenharmony_ci mbedtls_cipher_free(&ctx); 192a8e1175bSopenharmony_ci} 193a8e1175bSopenharmony_ci/* END_CASE */ 194a8e1175bSopenharmony_ci 195a8e1175bSopenharmony_ci/* BEGIN_CASE */ 196a8e1175bSopenharmony_civoid mbedtls_cmac_multiple_operations_same_key(int cipher_type, 197a8e1175bSopenharmony_ci data_t *key, int keybits, 198a8e1175bSopenharmony_ci int block_size, 199a8e1175bSopenharmony_ci data_t *block_a1, 200a8e1175bSopenharmony_ci int block_a1_len, 201a8e1175bSopenharmony_ci data_t *block_a2, 202a8e1175bSopenharmony_ci int block_a2_len, 203a8e1175bSopenharmony_ci data_t *block_a3, 204a8e1175bSopenharmony_ci int block_a3_len, 205a8e1175bSopenharmony_ci data_t *expected_result_a, 206a8e1175bSopenharmony_ci data_t *block_b1, 207a8e1175bSopenharmony_ci int block_b1_len, 208a8e1175bSopenharmony_ci data_t *block_b2, 209a8e1175bSopenharmony_ci int block_b2_len, 210a8e1175bSopenharmony_ci data_t *block_b3, 211a8e1175bSopenharmony_ci int block_b3_len, 212a8e1175bSopenharmony_ci data_t *expected_result_b 213a8e1175bSopenharmony_ci ) 214a8e1175bSopenharmony_ci{ 215a8e1175bSopenharmony_ci const mbedtls_cipher_info_t *cipher_info; 216a8e1175bSopenharmony_ci mbedtls_cipher_context_t ctx; 217a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_CMAC_MAX_BLOCK_SIZE]; 218a8e1175bSopenharmony_ci 219a8e1175bSopenharmony_ci /* Convert the test parameters to binary data */ 220a8e1175bSopenharmony_ci 221a8e1175bSopenharmony_ci 222a8e1175bSopenharmony_ci 223a8e1175bSopenharmony_ci mbedtls_cipher_init(&ctx); 224a8e1175bSopenharmony_ci 225a8e1175bSopenharmony_ci /* Validate the test inputs */ 226a8e1175bSopenharmony_ci TEST_ASSERT(block_a1_len <= 100); 227a8e1175bSopenharmony_ci TEST_ASSERT(block_a2_len <= 100); 228a8e1175bSopenharmony_ci TEST_ASSERT(block_a3_len <= 100); 229a8e1175bSopenharmony_ci 230a8e1175bSopenharmony_ci TEST_ASSERT(block_b1_len <= 100); 231a8e1175bSopenharmony_ci TEST_ASSERT(block_b2_len <= 100); 232a8e1175bSopenharmony_ci TEST_ASSERT(block_b3_len <= 100); 233a8e1175bSopenharmony_ci 234a8e1175bSopenharmony_ci /* Set up */ 235a8e1175bSopenharmony_ci TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type)) 236a8e1175bSopenharmony_ci != NULL); 237a8e1175bSopenharmony_ci 238a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0); 239a8e1175bSopenharmony_ci 240a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, 241a8e1175bSopenharmony_ci (const unsigned char *) key->x, 242a8e1175bSopenharmony_ci keybits) == 0); 243a8e1175bSopenharmony_ci 244a8e1175bSopenharmony_ci /* Sequence A */ 245a8e1175bSopenharmony_ci 246a8e1175bSopenharmony_ci /* Multiple partial and complete blocks. A negative length means skip the 247a8e1175bSopenharmony_ci * update operation */ 248a8e1175bSopenharmony_ci if (block_a1_len >= 0) { 249a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 250a8e1175bSopenharmony_ci (unsigned char *) block_a1->x, 251a8e1175bSopenharmony_ci block_a1_len) == 0); 252a8e1175bSopenharmony_ci } 253a8e1175bSopenharmony_ci 254a8e1175bSopenharmony_ci if (block_a2_len >= 0) { 255a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 256a8e1175bSopenharmony_ci (unsigned char *) block_a2->x, 257a8e1175bSopenharmony_ci block_a2_len) == 0); 258a8e1175bSopenharmony_ci } 259a8e1175bSopenharmony_ci 260a8e1175bSopenharmony_ci if (block_a3_len >= 0) { 261a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 262a8e1175bSopenharmony_ci (unsigned char *) block_a3->x, 263a8e1175bSopenharmony_ci block_a3_len) == 0); 264a8e1175bSopenharmony_ci } 265a8e1175bSopenharmony_ci 266a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0); 267a8e1175bSopenharmony_ci 268a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output, expected_result_a->x, block_size) == 0); 269a8e1175bSopenharmony_ci 270a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_reset(&ctx) == 0); 271a8e1175bSopenharmony_ci 272a8e1175bSopenharmony_ci /* Sequence B */ 273a8e1175bSopenharmony_ci 274a8e1175bSopenharmony_ci /* Multiple partial and complete blocks. A negative length means skip the 275a8e1175bSopenharmony_ci * update operation */ 276a8e1175bSopenharmony_ci if (block_b1_len >= 0) { 277a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 278a8e1175bSopenharmony_ci (unsigned char *) block_b1->x, 279a8e1175bSopenharmony_ci block_b1_len) == 0); 280a8e1175bSopenharmony_ci } 281a8e1175bSopenharmony_ci 282a8e1175bSopenharmony_ci if (block_b2_len >= 0) { 283a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 284a8e1175bSopenharmony_ci (unsigned char *) block_b2->x, 285a8e1175bSopenharmony_ci block_b2_len) == 0); 286a8e1175bSopenharmony_ci } 287a8e1175bSopenharmony_ci 288a8e1175bSopenharmony_ci if (block_b3_len >= 0) { 289a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, 290a8e1175bSopenharmony_ci (unsigned char *) block_b3->x, 291a8e1175bSopenharmony_ci block_b3_len) == 0); 292a8e1175bSopenharmony_ci } 293a8e1175bSopenharmony_ci 294a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0); 295a8e1175bSopenharmony_ci 296a8e1175bSopenharmony_ci TEST_ASSERT(memcmp(output, expected_result_b->x, block_size) == 0); 297a8e1175bSopenharmony_ci 298a8e1175bSopenharmony_ciexit: 299a8e1175bSopenharmony_ci mbedtls_cipher_free(&ctx); 300a8e1175bSopenharmony_ci} 301a8e1175bSopenharmony_ci/* END_CASE */ 302