1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/des.h" 3a8e1175bSopenharmony_ci/* END_HEADER */ 4a8e1175bSopenharmony_ci 5a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 6a8e1175bSopenharmony_ci * depends_on:MBEDTLS_DES_C 7a8e1175bSopenharmony_ci * END_DEPENDENCIES 8a8e1175bSopenharmony_ci */ 9a8e1175bSopenharmony_ci 10a8e1175bSopenharmony_ci/* BEGIN_CASE */ 11a8e1175bSopenharmony_civoid des_check_weak(data_t *key, int ret) 12a8e1175bSopenharmony_ci{ 13a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_key_check_weak(key->x) == ret); 14a8e1175bSopenharmony_ci} 15a8e1175bSopenharmony_ci/* END_CASE */ 16a8e1175bSopenharmony_ci 17a8e1175bSopenharmony_ci/* BEGIN_CASE */ 18a8e1175bSopenharmony_civoid des_encrypt_ecb(data_t *key_str, data_t *src_str, data_t *dst) 19a8e1175bSopenharmony_ci{ 20a8e1175bSopenharmony_ci unsigned char output[100]; 21a8e1175bSopenharmony_ci mbedtls_des_context ctx; 22a8e1175bSopenharmony_ci 23a8e1175bSopenharmony_ci memset(output, 0x00, 100); 24a8e1175bSopenharmony_ci mbedtls_des_init(&ctx); 25a8e1175bSopenharmony_ci 26a8e1175bSopenharmony_ci 27a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_setkey_enc(&ctx, key_str->x) == 0); 28a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_crypt_ecb(&ctx, src_str->x, output) == 0); 29a8e1175bSopenharmony_ci 30a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 8, dst->len) == 0); 31a8e1175bSopenharmony_ci 32a8e1175bSopenharmony_ciexit: 33a8e1175bSopenharmony_ci mbedtls_des_free(&ctx); 34a8e1175bSopenharmony_ci} 35a8e1175bSopenharmony_ci/* END_CASE */ 36a8e1175bSopenharmony_ci 37a8e1175bSopenharmony_ci/* BEGIN_CASE */ 38a8e1175bSopenharmony_civoid des_decrypt_ecb(data_t *key_str, data_t *src_str, data_t *dst) 39a8e1175bSopenharmony_ci{ 40a8e1175bSopenharmony_ci unsigned char output[100]; 41a8e1175bSopenharmony_ci mbedtls_des_context ctx; 42a8e1175bSopenharmony_ci 43a8e1175bSopenharmony_ci memset(output, 0x00, 100); 44a8e1175bSopenharmony_ci mbedtls_des_init(&ctx); 45a8e1175bSopenharmony_ci 46a8e1175bSopenharmony_ci 47a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_setkey_dec(&ctx, key_str->x) == 0); 48a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_crypt_ecb(&ctx, src_str->x, output) == 0); 49a8e1175bSopenharmony_ci 50a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 8, dst->len) == 0); 51a8e1175bSopenharmony_ci 52a8e1175bSopenharmony_ciexit: 53a8e1175bSopenharmony_ci mbedtls_des_free(&ctx); 54a8e1175bSopenharmony_ci} 55a8e1175bSopenharmony_ci/* END_CASE */ 56a8e1175bSopenharmony_ci 57a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */ 58a8e1175bSopenharmony_civoid des_encrypt_cbc(data_t *key_str, data_t *iv_str, 59a8e1175bSopenharmony_ci data_t *src_str, data_t *dst, int cbc_result) 60a8e1175bSopenharmony_ci{ 61a8e1175bSopenharmony_ci unsigned char output[100]; 62a8e1175bSopenharmony_ci mbedtls_des_context ctx; 63a8e1175bSopenharmony_ci 64a8e1175bSopenharmony_ci memset(output, 0x00, 100); 65a8e1175bSopenharmony_ci mbedtls_des_init(&ctx); 66a8e1175bSopenharmony_ci 67a8e1175bSopenharmony_ci 68a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_setkey_enc(&ctx, key_str->x) == 0); 69a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_crypt_cbc(&ctx, MBEDTLS_DES_ENCRYPT, src_str->len, iv_str->x, 70a8e1175bSopenharmony_ci src_str->x, output) == cbc_result); 71a8e1175bSopenharmony_ci if (cbc_result == 0) { 72a8e1175bSopenharmony_ci 73a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, src_str->len, 74a8e1175bSopenharmony_ci dst->len) == 0); 75a8e1175bSopenharmony_ci } 76a8e1175bSopenharmony_ci 77a8e1175bSopenharmony_ciexit: 78a8e1175bSopenharmony_ci mbedtls_des_free(&ctx); 79a8e1175bSopenharmony_ci} 80a8e1175bSopenharmony_ci/* END_CASE */ 81a8e1175bSopenharmony_ci 82a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */ 83a8e1175bSopenharmony_civoid des_decrypt_cbc(data_t *key_str, data_t *iv_str, 84a8e1175bSopenharmony_ci data_t *src_str, data_t *dst, 85a8e1175bSopenharmony_ci int cbc_result) 86a8e1175bSopenharmony_ci{ 87a8e1175bSopenharmony_ci unsigned char output[100]; 88a8e1175bSopenharmony_ci mbedtls_des_context ctx; 89a8e1175bSopenharmony_ci 90a8e1175bSopenharmony_ci memset(output, 0x00, 100); 91a8e1175bSopenharmony_ci mbedtls_des_init(&ctx); 92a8e1175bSopenharmony_ci 93a8e1175bSopenharmony_ci 94a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_setkey_dec(&ctx, key_str->x) == 0); 95a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_crypt_cbc(&ctx, MBEDTLS_DES_DECRYPT, src_str->len, iv_str->x, 96a8e1175bSopenharmony_ci src_str->x, output) == cbc_result); 97a8e1175bSopenharmony_ci if (cbc_result == 0) { 98a8e1175bSopenharmony_ci 99a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, src_str->len, 100a8e1175bSopenharmony_ci dst->len) == 0); 101a8e1175bSopenharmony_ci } 102a8e1175bSopenharmony_ci 103a8e1175bSopenharmony_ciexit: 104a8e1175bSopenharmony_ci mbedtls_des_free(&ctx); 105a8e1175bSopenharmony_ci} 106a8e1175bSopenharmony_ci/* END_CASE */ 107a8e1175bSopenharmony_ci 108a8e1175bSopenharmony_ci/* BEGIN_CASE */ 109a8e1175bSopenharmony_civoid des3_encrypt_ecb(int key_count, data_t *key_str, 110a8e1175bSopenharmony_ci data_t *src_str, data_t *dst) 111a8e1175bSopenharmony_ci{ 112a8e1175bSopenharmony_ci unsigned char output[100]; 113a8e1175bSopenharmony_ci mbedtls_des3_context ctx; 114a8e1175bSopenharmony_ci 115a8e1175bSopenharmony_ci memset(output, 0x00, 100); 116a8e1175bSopenharmony_ci mbedtls_des3_init(&ctx); 117a8e1175bSopenharmony_ci 118a8e1175bSopenharmony_ci 119a8e1175bSopenharmony_ci if (key_count == 2) { 120a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set2key_enc(&ctx, key_str->x) == 0); 121a8e1175bSopenharmony_ci } else if (key_count == 3) { 122a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set3key_enc(&ctx, key_str->x) == 0); 123a8e1175bSopenharmony_ci } else { 124a8e1175bSopenharmony_ci TEST_ASSERT(0); 125a8e1175bSopenharmony_ci } 126a8e1175bSopenharmony_ci 127a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_crypt_ecb(&ctx, src_str->x, output) == 0); 128a8e1175bSopenharmony_ci 129a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 8, dst->len) == 0); 130a8e1175bSopenharmony_ci 131a8e1175bSopenharmony_ciexit: 132a8e1175bSopenharmony_ci mbedtls_des3_free(&ctx); 133a8e1175bSopenharmony_ci} 134a8e1175bSopenharmony_ci/* END_CASE */ 135a8e1175bSopenharmony_ci 136a8e1175bSopenharmony_ci/* BEGIN_CASE */ 137a8e1175bSopenharmony_civoid des3_decrypt_ecb(int key_count, data_t *key_str, 138a8e1175bSopenharmony_ci data_t *src_str, data_t *dst) 139a8e1175bSopenharmony_ci{ 140a8e1175bSopenharmony_ci unsigned char output[100]; 141a8e1175bSopenharmony_ci mbedtls_des3_context ctx; 142a8e1175bSopenharmony_ci 143a8e1175bSopenharmony_ci memset(output, 0x00, 100); 144a8e1175bSopenharmony_ci mbedtls_des3_init(&ctx); 145a8e1175bSopenharmony_ci 146a8e1175bSopenharmony_ci 147a8e1175bSopenharmony_ci if (key_count == 2) { 148a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set2key_dec(&ctx, key_str->x) == 0); 149a8e1175bSopenharmony_ci } else if (key_count == 3) { 150a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set3key_dec(&ctx, key_str->x) == 0); 151a8e1175bSopenharmony_ci } else { 152a8e1175bSopenharmony_ci TEST_ASSERT(0); 153a8e1175bSopenharmony_ci } 154a8e1175bSopenharmony_ci 155a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_crypt_ecb(&ctx, src_str->x, output) == 0); 156a8e1175bSopenharmony_ci 157a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 8, dst->len) == 0); 158a8e1175bSopenharmony_ci 159a8e1175bSopenharmony_ciexit: 160a8e1175bSopenharmony_ci mbedtls_des3_free(&ctx); 161a8e1175bSopenharmony_ci} 162a8e1175bSopenharmony_ci/* END_CASE */ 163a8e1175bSopenharmony_ci 164a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */ 165a8e1175bSopenharmony_civoid des3_encrypt_cbc(int key_count, data_t *key_str, 166a8e1175bSopenharmony_ci data_t *iv_str, data_t *src_str, 167a8e1175bSopenharmony_ci data_t *dst, int cbc_result) 168a8e1175bSopenharmony_ci{ 169a8e1175bSopenharmony_ci unsigned char output[100]; 170a8e1175bSopenharmony_ci mbedtls_des3_context ctx; 171a8e1175bSopenharmony_ci 172a8e1175bSopenharmony_ci memset(output, 0x00, 100); 173a8e1175bSopenharmony_ci mbedtls_des3_init(&ctx); 174a8e1175bSopenharmony_ci 175a8e1175bSopenharmony_ci 176a8e1175bSopenharmony_ci if (key_count == 2) { 177a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set2key_enc(&ctx, key_str->x) == 0); 178a8e1175bSopenharmony_ci } else if (key_count == 3) { 179a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set3key_enc(&ctx, key_str->x) == 0); 180a8e1175bSopenharmony_ci } else { 181a8e1175bSopenharmony_ci TEST_ASSERT(0); 182a8e1175bSopenharmony_ci } 183a8e1175bSopenharmony_ci 184a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_ENCRYPT, src_str->len, iv_str->x, 185a8e1175bSopenharmony_ci src_str->x, output) == cbc_result); 186a8e1175bSopenharmony_ci 187a8e1175bSopenharmony_ci if (cbc_result == 0) { 188a8e1175bSopenharmony_ci 189a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 190a8e1175bSopenharmony_ci src_str->len, dst->len) == 0); 191a8e1175bSopenharmony_ci } 192a8e1175bSopenharmony_ci 193a8e1175bSopenharmony_ciexit: 194a8e1175bSopenharmony_ci mbedtls_des3_free(&ctx); 195a8e1175bSopenharmony_ci} 196a8e1175bSopenharmony_ci/* END_CASE */ 197a8e1175bSopenharmony_ci 198a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */ 199a8e1175bSopenharmony_civoid des3_decrypt_cbc(int key_count, data_t *key_str, 200a8e1175bSopenharmony_ci data_t *iv_str, data_t *src_str, 201a8e1175bSopenharmony_ci data_t *dst, int cbc_result) 202a8e1175bSopenharmony_ci{ 203a8e1175bSopenharmony_ci unsigned char output[100]; 204a8e1175bSopenharmony_ci mbedtls_des3_context ctx; 205a8e1175bSopenharmony_ci 206a8e1175bSopenharmony_ci memset(output, 0x00, 100); 207a8e1175bSopenharmony_ci mbedtls_des3_init(&ctx); 208a8e1175bSopenharmony_ci 209a8e1175bSopenharmony_ci 210a8e1175bSopenharmony_ci if (key_count == 2) { 211a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set2key_dec(&ctx, key_str->x) == 0); 212a8e1175bSopenharmony_ci } else if (key_count == 3) { 213a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_set3key_dec(&ctx, key_str->x) == 0); 214a8e1175bSopenharmony_ci } else { 215a8e1175bSopenharmony_ci TEST_ASSERT(0); 216a8e1175bSopenharmony_ci } 217a8e1175bSopenharmony_ci 218a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_DECRYPT, src_str->len, iv_str->x, 219a8e1175bSopenharmony_ci src_str->x, output) == cbc_result); 220a8e1175bSopenharmony_ci 221a8e1175bSopenharmony_ci if (cbc_result == 0) { 222a8e1175bSopenharmony_ci 223a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, src_str->len, 224a8e1175bSopenharmony_ci dst->len) == 0); 225a8e1175bSopenharmony_ci } 226a8e1175bSopenharmony_ci 227a8e1175bSopenharmony_ciexit: 228a8e1175bSopenharmony_ci mbedtls_des3_free(&ctx); 229a8e1175bSopenharmony_ci} 230a8e1175bSopenharmony_ci/* END_CASE */ 231a8e1175bSopenharmony_ci 232a8e1175bSopenharmony_ci/* BEGIN_CASE */ 233a8e1175bSopenharmony_civoid des_key_parity_run() 234a8e1175bSopenharmony_ci{ 235a8e1175bSopenharmony_ci int i, j, cnt; 236a8e1175bSopenharmony_ci unsigned char key[MBEDTLS_DES_KEY_SIZE]; 237a8e1175bSopenharmony_ci unsigned int parity; 238a8e1175bSopenharmony_ci 239a8e1175bSopenharmony_ci memset(key, 0, MBEDTLS_DES_KEY_SIZE); 240a8e1175bSopenharmony_ci cnt = 0; 241a8e1175bSopenharmony_ci 242a8e1175bSopenharmony_ci // Iterate through all possible byte values 243a8e1175bSopenharmony_ci // 244a8e1175bSopenharmony_ci for (i = 0; i < 32; i++) { 245a8e1175bSopenharmony_ci for (j = 0; j < 8; j++) { 246a8e1175bSopenharmony_ci key[j] = cnt++; 247a8e1175bSopenharmony_ci } 248a8e1175bSopenharmony_ci 249a8e1175bSopenharmony_ci // Set the key parity according to the table 250a8e1175bSopenharmony_ci // 251a8e1175bSopenharmony_ci mbedtls_des_key_set_parity(key); 252a8e1175bSopenharmony_ci 253a8e1175bSopenharmony_ci // Check the parity with a function 254a8e1175bSopenharmony_ci // 255a8e1175bSopenharmony_ci for (j = 0; j < 8; j++) { 256a8e1175bSopenharmony_ci parity = key[j] ^ (key[j] >> 4); 257a8e1175bSopenharmony_ci parity = parity ^ 258a8e1175bSopenharmony_ci (parity >> 1) ^ 259a8e1175bSopenharmony_ci (parity >> 2) ^ 260a8e1175bSopenharmony_ci (parity >> 3); 261a8e1175bSopenharmony_ci parity &= 1; 262a8e1175bSopenharmony_ci 263a8e1175bSopenharmony_ci if (parity != 1) { 264a8e1175bSopenharmony_ci TEST_ASSERT(0); 265a8e1175bSopenharmony_ci } 266a8e1175bSopenharmony_ci } 267a8e1175bSopenharmony_ci 268a8e1175bSopenharmony_ci // Check the parity with the table 269a8e1175bSopenharmony_ci // 270a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_key_check_key_parity(key) == 0); 271a8e1175bSopenharmony_ci } 272a8e1175bSopenharmony_ci} 273a8e1175bSopenharmony_ci/* END_CASE */ 274a8e1175bSopenharmony_ci 275a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 276a8e1175bSopenharmony_civoid des_selftest() 277a8e1175bSopenharmony_ci{ 278a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_des_self_test(1) == 0); 279a8e1175bSopenharmony_ci} 280a8e1175bSopenharmony_ci/* END_CASE */ 281