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