blob: 71b5f0066727676be35c05c8bf05db822e6a7f84 [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 */
Gilles Peskine449bd832023-01-11 14:50:10 +010012void mbedtls_cmac_self_test()
Simon Butcherd812fa62016-10-05 14:13:31 +010013{
Gilles Peskine449bd832023-01-11 14:50:10 +010014 TEST_ASSERT(mbedtls_cmac_self_test(1) == 0);
Simon Butcherd812fa62016-10-05 14:13:31 +010015}
16/* END_CASE */
17
18/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010019void 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
Gilles Peskine449bd832023-01-11 14:50:10 +010027 mbedtls_cipher_init(&ctx);
Simon Butcher33183fd2016-10-10 21:41:03 +010028
29 /* Test NULL cipher info */
Gilles Peskine449bd832023-01-11 14:50:10 +010030 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
Gilles Peskine449bd832023-01-11 14:50:10 +010033 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
Gilles Peskine449bd832023-01-11 14:50:10 +010036 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
Gilles Peskine449bd832023-01-11 14:50:10 +010039 TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx, NULL, 128) ==
40 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010041
Gilles Peskine449bd832023-01-11 14:50:10 +010042 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
Gilles Peskine449bd832023-01-11 14:50:10 +010045 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx, NULL, 16) ==
46 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010047
Gilles Peskine449bd832023-01-11 14:50:10 +010048 TEST_ASSERT(mbedtls_cipher_cmac_finish(NULL, test_output) ==
49 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010050
Gilles Peskine449bd832023-01-11 14:50:10 +010051 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, NULL) ==
52 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010053
Gilles Peskine449bd832023-01-11 14:50:10 +010054 TEST_ASSERT(mbedtls_cipher_cmac_reset(NULL) ==
55 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Simon Butcher33183fd2016-10-10 21:41:03 +010056
Gilles Peskine449bd832023-01-11 14:50:10 +010057 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
Gilles Peskine449bd832023-01-11 14:50:10 +010063 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
Gilles Peskine449bd832023-01-11 14:50:10 +010069 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
Gilles Peskine449bd832023-01-11 14:50:10 +010075 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)
Gilles Peskine449bd832023-01-11 14:50:10 +010081 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
Gilles Peskine449bd832023-01-11 14:50:10 +010086 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
Gilles Peskine449bd832023-01-11 14:50:10 +010091 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:
Gilles Peskine449bd832023-01-11 14:50:10 +010097 mbedtls_cipher_free(&ctx);
Simon Butcher33183fd2016-10-10 21:41:03 +010098}
99/* END_CASE */
100
101/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100102void 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
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 memset(key, 0x2A, sizeof(key));
110 TEST_ASSERT((unsigned) key_size <= 8 * sizeof(key));
Simon Butcherd812fa62016-10-05 14:13:31 +0100111
Gilles Peskine449bd832023-01-11 14:50:10 +0100112 TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type))
113 != NULL);
Gilles Peskine4f4d4b22023-06-14 17:34:31 +0200114 TEST_LE_U(mbedtls_cipher_info_get_block_size(cipher_info),
115 MBEDTLS_CIPHER_BLKSIZE_MAX);
Gilles Peskine7282a9e2023-06-14 17:49:02 +0200116 TEST_LE_U(mbedtls_cipher_info_get_block_size(cipher_info),
117 MBEDTLS_CMAC_MAX_BLOCK_SIZE);
Simon Butcherd812fa62016-10-05 14:13:31 +0100118
Gilles Peskine449bd832023-01-11 14:50:10 +0100119 memset(buf, 0x2A, sizeof(buf));
120 TEST_ASSERT((result == mbedtls_cipher_cmac(cipher_info, key, key_size,
121 buf, 16, tmp)) != 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100122}
123/* END_CASE */
124
125/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100126void mbedtls_cmac_multiple_blocks(int cipher_type, data_t *key,
127 int keybits, int block_size,
128 data_t *block1, int block1_len,
129 data_t *block2, int block2_len,
130 data_t *block3, int block3_len,
131 data_t *block4, int block4_len,
132 data_t *expected_result)
Simon Butcher33183fd2016-10-10 21:41:03 +0100133{
Simon Butcher33183fd2016-10-10 21:41:03 +0100134 const mbedtls_cipher_info_t *cipher_info;
135 mbedtls_cipher_context_t ctx;
136 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
137
138 /* Convert the test parameters to binary data */
Simon Butcher33183fd2016-10-10 21:41:03 +0100139
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 mbedtls_cipher_init(&ctx);
Andres AG8abc6b82016-10-11 15:41:40 +0100141
Simon Butcher33183fd2016-10-10 21:41:03 +0100142 /* Validate the test inputs */
Gilles Peskine449bd832023-01-11 14:50:10 +0100143 TEST_ASSERT(block1_len <= 100);
144 TEST_ASSERT(block2_len <= 100);
145 TEST_ASSERT(block3_len <= 100);
146 TEST_ASSERT(block4_len <= 100);
Simon Butcher33183fd2016-10-10 21:41:03 +0100147
148 /* Set up */
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type))
150 != NULL);
Simon Butcher33183fd2016-10-10 21:41:03 +0100151
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100153
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx,
155 (const unsigned char *) key->x,
156 keybits) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100157
158 /* Multiple partial and complete blocks. A negative length means skip the
159 * update operation */
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 if (block1_len >= 0) {
161 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
162 (unsigned char *) block1->x,
163 block1_len) == 0);
164 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100165
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 if (block2_len >= 0) {
167 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
168 (unsigned char *) block2->x,
169 block2_len) == 0);
170 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100171
Gilles Peskine449bd832023-01-11 14:50:10 +0100172 if (block3_len >= 0) {
173 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
174 (unsigned char *) block3->x,
175 block3_len) == 0);
176 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 if (block4_len >= 0) {
179 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
180 (unsigned char *) block4->x,
181 block4_len) == 0);
182 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100183
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100185
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 TEST_ASSERT(memcmp(output, expected_result->x, block_size) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100187
Simon Butcherbd8d2212016-10-11 12:05:51 +0100188exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 mbedtls_cipher_free(&ctx);
Simon Butcher33183fd2016-10-10 21:41:03 +0100190}
191/* END_CASE */
192
193/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100194void mbedtls_cmac_multiple_operations_same_key(int cipher_type,
195 data_t *key, int keybits,
196 int block_size,
197 data_t *block_a1,
198 int block_a1_len,
199 data_t *block_a2,
200 int block_a2_len,
201 data_t *block_a3,
202 int block_a3_len,
203 data_t *expected_result_a,
204 data_t *block_b1,
205 int block_b1_len,
206 data_t *block_b2,
207 int block_b2_len,
208 data_t *block_b3,
209 int block_b3_len,
210 data_t *expected_result_b
211 )
Simon Butcher33183fd2016-10-10 21:41:03 +0100212{
Simon Butcher33183fd2016-10-10 21:41:03 +0100213 const mbedtls_cipher_info_t *cipher_info;
214 mbedtls_cipher_context_t ctx;
215 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
216
217 /* Convert the test parameters to binary data */
Simon Butcher33183fd2016-10-10 21:41:03 +0100218
Simon Butcher33183fd2016-10-10 21:41:03 +0100219
Simon Butcher33183fd2016-10-10 21:41:03 +0100220
Gilles Peskine449bd832023-01-11 14:50:10 +0100221 mbedtls_cipher_init(&ctx);
Andres AG8abc6b82016-10-11 15:41:40 +0100222
Simon Butcher33183fd2016-10-10 21:41:03 +0100223 /* Validate the test inputs */
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 TEST_ASSERT(block_a1_len <= 100);
225 TEST_ASSERT(block_a2_len <= 100);
226 TEST_ASSERT(block_a3_len <= 100);
Simon Butcher33183fd2016-10-10 21:41:03 +0100227
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 TEST_ASSERT(block_b1_len <= 100);
229 TEST_ASSERT(block_b2_len <= 100);
230 TEST_ASSERT(block_b3_len <= 100);
Simon Butcher33183fd2016-10-10 21:41:03 +0100231
232 /* Set up */
Gilles Peskine449bd832023-01-11 14:50:10 +0100233 TEST_ASSERT((cipher_info = mbedtls_cipher_info_from_type(cipher_type))
234 != NULL);
Simon Butcher33183fd2016-10-10 21:41:03 +0100235
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 TEST_ASSERT(mbedtls_cipher_setup(&ctx, cipher_info) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100237
Gilles Peskine449bd832023-01-11 14:50:10 +0100238 TEST_ASSERT(mbedtls_cipher_cmac_starts(&ctx,
239 (const unsigned char *) key->x,
240 keybits) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100241
242 /* Sequence A */
243
244 /* Multiple partial and complete blocks. A negative length means skip the
245 * update operation */
Gilles Peskine449bd832023-01-11 14:50:10 +0100246 if (block_a1_len >= 0) {
247 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
248 (unsigned char *) block_a1->x,
249 block_a1_len) == 0);
250 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100251
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 if (block_a2_len >= 0) {
253 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
254 (unsigned char *) block_a2->x,
255 block_a2_len) == 0);
256 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100257
Gilles Peskine449bd832023-01-11 14:50:10 +0100258 if (block_a3_len >= 0) {
259 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
260 (unsigned char *) block_a3->x,
261 block_a3_len) == 0);
262 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100263
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100265
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 TEST_ASSERT(memcmp(output, expected_result_a->x, block_size) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100267
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 TEST_ASSERT(mbedtls_cipher_cmac_reset(&ctx) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100269
270 /* Sequence B */
271
272 /* Multiple partial and complete blocks. A negative length means skip the
273 * update operation */
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 if (block_b1_len >= 0) {
275 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
276 (unsigned char *) block_b1->x,
277 block_b1_len) == 0);
278 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100279
Gilles Peskine449bd832023-01-11 14:50:10 +0100280 if (block_b2_len >= 0) {
281 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
282 (unsigned char *) block_b2->x,
283 block_b2_len) == 0);
284 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100285
Gilles Peskine449bd832023-01-11 14:50:10 +0100286 if (block_b3_len >= 0) {
287 TEST_ASSERT(mbedtls_cipher_cmac_update(&ctx,
288 (unsigned char *) block_b3->x,
289 block_b3_len) == 0);
290 }
Simon Butcher33183fd2016-10-10 21:41:03 +0100291
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 TEST_ASSERT(mbedtls_cipher_cmac_finish(&ctx, output) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100293
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 TEST_ASSERT(memcmp(output, expected_result_b->x, block_size) == 0);
Simon Butcher33183fd2016-10-10 21:41:03 +0100295
Simon Butcherbd8d2212016-10-11 12:05:51 +0100296exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 mbedtls_cipher_free(&ctx);
Simon Butcherd812fa62016-10-05 14:13:31 +0100298}
299/* END_CASE */