blob: 9624e8fea0849803413b7001f248e305ca1e4443 [file] [log] [blame]
Simon Butcherd812fa62016-10-05 14:13:31 +01001/* BEGIN_HEADER */
2#include "mbedtls/cipher.h"
3#include "mbedtls/cmac.h"
4/* END_HEADER */
5
6/* BEGIN_DEPENDENCIES
7 * depends_on:MBEDTLS_CMAC_C
8 * END_DEPENDENCIES
9 */
10
11/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
David Horstmann71159f42023-01-03 12:51:59 +000012void mbedtls_cmac_self_test()
Simon Butcherd812fa62016-10-05 14:13:31 +010013{
David Horstmann71159f42023-01-03 12:51:59 +000014 TEST_ASSERT(mbedtls_cmac_self_test(1) == 0);
Simon Butcherd812fa62016-10-05 14:13:31 +010015}
16/* END_CASE */
17
18/* BEGIN_CASE */
David Horstmann71159f42023-01-03 12:51:59 +000019void mbedtls_cmac_null_args()
Simon Butcher33183fd2016-10-10 21:41:03 +010020{
21 mbedtls_cipher_context_t ctx;
22 const mbedtls_cipher_info_t *cipher_info;
23 unsigned char test_key[MBEDTLS_CIPHER_BLKSIZE_MAX];
24 unsigned char test_data[MBEDTLS_CIPHER_BLKSIZE_MAX];
25 unsigned char test_output[MBEDTLS_CIPHER_BLKSIZE_MAX];
26
David Horstmann71159f42023-01-03 12:51:59 +000027 mbedtls_cipher_init(&ctx);
Simon Butcher33183fd2016-10-10 21:41:03 +010028
29 /* Test NULL cipher info */
David Horstmann71159f42023-01-03 12:51:59 +000030 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, test_data, 16) ==
31 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010032
David Horstmann71159f42023-01-03 12:51:59 +000033 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_ECB);
34 TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +010035
David Horstmann71159f42023-01-03 12:51:59 +000036 TEST_ASSERT(mbedtls_cipher_cmac_starts(NULL, test_key, 128) ==
37 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010038
David Horstmann71159f42023-01-03 12:51:59 +000039 TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, NULL, 128) ==
40 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010041
David Horstmann71159f42023-01-03 12:51:59 +000042 TEST_ASSERT(mbedtls_cipher_cmac_update(NULL, test_data, 16) ==
43 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010044
David Horstmann71159f42023-01-03 12:51:59 +000045 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, NULL, 16) ==
46 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010047
David Horstmann71159f42023-01-03 12:51:59 +000048 TEST_ASSERT(mbedtls_cipher_cmac_finish(NULL, test_output) ==
49 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010050
David Horstmann71159f42023-01-03 12:51:59 +000051 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, NULL) ==
52 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010053
David Horstmann71159f42023-01-03 12:51:59 +000054 TEST_ASSERT(mbedtls_cipher_cmac_reset(NULL) ==
55 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010056
David Horstmann71159f42023-01-03 12:51:59 +000057 TEST_ASSERT(mbedtls_cipher_cmac(NULL,
58 test_key, 128,
59 test_data, 16,
60 test_output) ==
61 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010062
David Horstmann71159f42023-01-03 12:51:59 +000063 TEST_ASSERT(mbedtls_cipher_cmac(cipher_info,
64 NULL, 128,
65 test_data, 16,
66 test_output) ==
67 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010068
David Horstmann71159f42023-01-03 12:51:59 +000069 TEST_ASSERT(mbedtls_cipher_cmac(cipher_info,
70 test_key, 128,
71 NULL, 16,
72 test_output) ==
73 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010074
David Horstmann71159f42023-01-03 12:51:59 +000075 TEST_ASSERT(mbedtls_cipher_cmac(cipher_info,
76 test_key, 128,
77 test_data, 16,
78 NULL) ==
79 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekf502bcb2022-09-27 09:27:56 -040080#if defined(MBEDTLS_AES_C)
David Horstmann71159f42023-01-03 12:51:59 +000081 TEST_ASSERT(mbedtls_aes_cmac_prf_128(NULL, 16,
82 test_data, 16,
83 test_output) ==
84 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010085
David Horstmann71159f42023-01-03 12:51:59 +000086 TEST_ASSERT(mbedtls_aes_cmac_prf_128(test_key, 16,
87 NULL, 16,
88 test_output) ==
89 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010090
David Horstmann71159f42023-01-03 12:51:59 +000091 TEST_ASSERT(mbedtls_aes_cmac_prf_128(test_key, 16,
92 test_data, 16,
93 NULL) ==
94 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekf502bcb2022-09-27 09:27:56 -040095#endif
Andres AG8abc6b82016-10-11 15:41:40 +010096exit:
David Horstmann71159f42023-01-03 12:51:59 +000097 mbedtls_cipher_free(&ctx);
Simon Butcher33183fd2016-10-10 21:41:03 +010098}
99/* END_CASE */
100
101/* BEGIN_CASE */
David Horstmann71159f42023-01-03 12:51:59 +0000102void mbedtls_cmac_setkey(int cipher_type, int key_size, int result)
Simon Butcherd812fa62016-10-05 14:13:31 +0100103{
104 const mbedtls_cipher_info_t *cipher_info;
105 unsigned char key[32];
106 unsigned char buf[16];
107 unsigned char tmp[16];
108
David Horstmann71159f42023-01-03 12:51:59 +0000109 memset(key, 0x2A, sizeof(key));
110 TEST_ASSERT((unsigned) key_size <= 8 * sizeof(key));
Simon Butcherd812fa62016-10-05 14:13:31 +0100111
David Horstmann71159f42023-01-03 12:51:59 +0000112 TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type))
113 != NULL);
Simon Butcherd812fa62016-10-05 14:13:31 +0100114
David Horstmann71159f42023-01-03 12:51:59 +0000115 memset(buf, 0x2A, sizeof(buf));
116 TEST_ASSERT((result == mbedtls_cipher_cmac(cipher_info, key, key_size,
117 buf, 16, tmp)) != 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100118}
119/* END_CASE */
120
121/* BEGIN_CASE */
David Horstmann71159f42023-01-03 12:51:59 +0000122void mbedtls_cmac_multiple_blocks(int cipher_type, data_t *key,
123 int keybits, int block_size,
124 data_t *block1, int block1_len,
125 data_t *block2, int block2_len,
126 data_t *block3, int block3_len,
127 data_t *block4, int block4_len,
128 data_t *expected_result)
Simon Butcher33183fd2016-10-10 21:41:03 +0100129{
Simon Butcher33183fd2016-10-10 21:41:03 +0100130 const mbedtls_cipher_info_t *cipher_info;
131 mbedtls_cipher_context_t ctx;
132 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
133
134 /* Convert the test parameters to binary data */
Simon Butcher33183fd2016-10-10 21:41:03 +0100135
David Horstmann71159f42023-01-03 12:51:59 +0000136 mbedtls_cipher_init(&ctx);
Andres AG8abc6b82016-10-11 15:41:40 +0100137
Simon Butcher33183fd2016-10-10 21:41:03 +0100138 /* Validate the test inputs */
David Horstmann71159f42023-01-03 12:51:59 +0000139 TEST_ASSERT(block1_len <= 100);
140 TEST_ASSERT(block2_len <= 100);
141 TEST_ASSERT(block3_len <= 100);
142 TEST_ASSERT(block4_len <= 100);
Simon Butcher33183fd2016-10-10 21:41:03 +0100143
144 /* Set up */
David Horstmann71159f42023-01-03 12:51:59 +0000145 TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type))
146 != NULL);
Simon Butcher33183fd2016-10-10 21:41:03 +0100147
David Horstmann71159f42023-01-03 12:51:59 +0000148 TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100149
David Horstmann71159f42023-01-03 12:51:59 +0000150 TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx,
151 (const unsigned char *) key->x,
152 keybits) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100153
154 /* Multiple partial and complete blocks. A negative length means skip the
155 * update operation */
David Horstmann71159f42023-01-03 12:51:59 +0000156 if (block1_len >= 0) {
157 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
158 (unsigned char *) block1->x,
159 block1_len) == 0);
160 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100161
David Horstmann71159f42023-01-03 12:51:59 +0000162 if (block2_len >= 0) {
163 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
164 (unsigned char *) block2->x,
165 block2_len) == 0);
166 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100167
David Horstmann71159f42023-01-03 12:51:59 +0000168 if (block3_len >= 0) {
169 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
170 (unsigned char *) block3->x,
171 block3_len) == 0);
172 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100173
David Horstmann71159f42023-01-03 12:51:59 +0000174 if (block4_len >= 0) {
175 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
176 (unsigned char *) block4->x,
177 block4_len) == 0);
178 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100179
David Horstmann71159f42023-01-03 12:51:59 +0000180 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100181
David Horstmann71159f42023-01-03 12:51:59 +0000182 TEST_ASSERT(memcmp(output, expected_result->x, block_size) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100183
Simon Butcherbd8d2212016-10-11 12:05:51 +0100184exit:
David Horstmann71159f42023-01-03 12:51:59 +0000185 mbedtls_cipher_free(&ctx);
Simon Butcher33183fd2016-10-10 21:41:03 +0100186}
187/* END_CASE */
188
189/* BEGIN_CASE */
David Horstmann71159f42023-01-03 12:51:59 +0000190void mbedtls_cmac_multiple_operations_same_key(int cipher_type,
191 data_t *key, int keybits,
192 int block_size,
193 data_t *block_a1,
194 int block_a1_len,
195 data_t *block_a2,
196 int block_a2_len,
197 data_t *block_a3,
198 int block_a3_len,
199 data_t *expected_result_a,
200 data_t *block_b1,
201 int block_b1_len,
202 data_t *block_b2,
203 int block_b2_len,
204 data_t *block_b3,
205 int block_b3_len,
206 data_t *expected_result_b
207 )
Simon Butcher33183fd2016-10-10 21:41:03 +0100208{
Simon Butcher33183fd2016-10-10 21:41:03 +0100209 const mbedtls_cipher_info_t *cipher_info;
210 mbedtls_cipher_context_t ctx;
211 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
212
213 /* Convert the test parameters to binary data */
Simon Butcher33183fd2016-10-10 21:41:03 +0100214
Simon Butcher33183fd2016-10-10 21:41:03 +0100215
Simon Butcher33183fd2016-10-10 21:41:03 +0100216
David Horstmann71159f42023-01-03 12:51:59 +0000217 mbedtls_cipher_init(&ctx);
Andres AG8abc6b82016-10-11 15:41:40 +0100218
Simon Butcher33183fd2016-10-10 21:41:03 +0100219 /* Validate the test inputs */
David Horstmann71159f42023-01-03 12:51:59 +0000220 TEST_ASSERT(block_a1_len <= 100);
221 TEST_ASSERT(block_a2_len <= 100);
222 TEST_ASSERT(block_a3_len <= 100);
Simon Butcher33183fd2016-10-10 21:41:03 +0100223
David Horstmann71159f42023-01-03 12:51:59 +0000224 TEST_ASSERT(block_b1_len <= 100);
225 TEST_ASSERT(block_b2_len <= 100);
226 TEST_ASSERT(block_b3_len <= 100);
Simon Butcher33183fd2016-10-10 21:41:03 +0100227
228 /* Set up */
David Horstmann71159f42023-01-03 12:51:59 +0000229 TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type))
230 != NULL);
Simon Butcher33183fd2016-10-10 21:41:03 +0100231
David Horstmann71159f42023-01-03 12:51:59 +0000232 TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100233
David Horstmann71159f42023-01-03 12:51:59 +0000234 TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx,
235 (const unsigned char *) key->x,
236 keybits) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100237
238 /* Sequence A */
239
240 /* Multiple partial and complete blocks. A negative length means skip the
241 * update operation */
David Horstmann71159f42023-01-03 12:51:59 +0000242 if (block_a1_len >= 0) {
243 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
244 (unsigned char *) block_a1->x,
245 block_a1_len) == 0);
246 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100247
David Horstmann71159f42023-01-03 12:51:59 +0000248 if (block_a2_len >= 0) {
249 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
250 (unsigned char *) block_a2->x,
251 block_a2_len) == 0);
252 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100253
David Horstmann71159f42023-01-03 12:51:59 +0000254 if (block_a3_len >= 0) {
255 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
256 (unsigned char *) block_a3->x,
257 block_a3_len) == 0);
258 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100259
David Horstmann71159f42023-01-03 12:51:59 +0000260 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100261
David Horstmann71159f42023-01-03 12:51:59 +0000262 TEST_ASSERT(memcmp(output, expected_result_a->x, block_size) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100263
David Horstmann71159f42023-01-03 12:51:59 +0000264 TEST_ASSERT(mbedtls_cipher_cmac_reset(&ctx) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100265
266 /* Sequence B */
267
268 /* Multiple partial and complete blocks. A negative length means skip the
269 * update operation */
David Horstmann71159f42023-01-03 12:51:59 +0000270 if (block_b1_len >= 0) {
271 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
272 (unsigned char *) block_b1->x,
273 block_b1_len) == 0);
274 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100275
David Horstmann71159f42023-01-03 12:51:59 +0000276 if (block_b2_len >= 0) {
277 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
278 (unsigned char *) block_b2->x,
279 block_b2_len) == 0);
280 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100281
David Horstmann71159f42023-01-03 12:51:59 +0000282 if (block_b3_len >= 0) {
283 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
284 (unsigned char *) block_b3->x,
285 block_b3_len) == 0);
286 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100287
David Horstmann71159f42023-01-03 12:51:59 +0000288 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100289
David Horstmann71159f42023-01-03 12:51:59 +0000290 TEST_ASSERT(memcmp(output, expected_result_b->x, block_size) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100291
Simon Butcherbd8d2212016-10-11 12:05:51 +0100292exit:
David Horstmann71159f42023-01-03 12:51:59 +0000293 mbedtls_cipher_free(&ctx);
Simon Butcherd812fa62016-10-05 14:13:31 +0100294}
295/* END_CASE */