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