blob: 735c9aa283f3b284587e267e383c403f208505b7 [file] [log] [blame]
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/ccm.h"
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +02003/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006 * depends_on:MBEDTLS_CCM_C
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +02007 * END_DEPENDENCIES
8 */
9
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020010/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST:MBEDTLS_AES_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010011void mbedtls_ccm_self_test()
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +020012{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010013 TEST_ASSERT(mbedtls_ccm_self_test(1) == 0);
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +020014}
15/* END_CASE */
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020016
17/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010018void mbedtls_ccm_setkey(int cipher_id, int key_size, int result)
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020019{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020020 mbedtls_ccm_context ctx;
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020021 unsigned char key[32];
22 int ret;
23
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010024 mbedtls_ccm_init(&ctx);
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +020025
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010026 memset(key, 0x2A, sizeof(key));
27 TEST_ASSERT((unsigned) key_size <= 8 * sizeof(key));
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020028
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010029 ret = mbedtls_ccm_setkey(&ctx, cipher_id, key, key_size);
30 TEST_ASSERT(ret == result);
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020031
Paul Bakkerbd51b262014-07-10 15:26:12 +020032exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010033 mbedtls_ccm_free(&ctx);
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020034}
35/* END_CASE */
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +020036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020037/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010038void ccm_lengths(int msg_len, int iv_len, int add_len, int tag_len, int res)
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020039{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040 mbedtls_ccm_context ctx;
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020041 unsigned char key[16];
42 unsigned char msg[10];
43 unsigned char iv[14];
Dave Rodgman2e680342020-10-15 14:00:40 +010044 unsigned char *add = NULL;
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020045 unsigned char out[10];
46 unsigned char tag[18];
47 int decrypt_ret;
48
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010049 mbedtls_ccm_init(&ctx);
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +020050
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010051 ASSERT_ALLOC_WEAK(add, add_len);
52 memset(key, 0, sizeof(key));
53 memset(msg, 0, sizeof(msg));
54 memset(iv, 0, sizeof(iv));
55 memset(out, 0, sizeof(out));
56 memset(tag, 0, sizeof(tag));
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020057
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010058 TEST_ASSERT(mbedtls_ccm_setkey(&ctx, MBEDTLS_CIPHER_ID_AES,
59 key, 8 * sizeof(key)) == 0);
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020060
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010061 TEST_ASSERT(mbedtls_ccm_encrypt_and_tag(&ctx, msg_len, iv, iv_len, add, add_len,
62 msg, out, tag, tag_len) == res);
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020063
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010064 decrypt_ret = mbedtls_ccm_auth_decrypt(&ctx, msg_len, iv, iv_len, add, add_len,
65 msg, out, tag, tag_len);
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020066
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010067 if (res == 0) {
68 TEST_ASSERT(decrypt_ret == MBEDTLS_ERR_CCM_AUTH_FAILED);
69 } else {
70 TEST_ASSERT(decrypt_ret == res);
71 }
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020072
Paul Bakkerbd51b262014-07-10 15:26:12 +020073exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010074 mbedtls_free(add);
75 mbedtls_ccm_free(&ctx);
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020076}
77/* END_CASE */
78
Janos Follath95ab93d2018-05-14 14:32:41 +010079/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010080void ccm_star_lengths(int msg_len, int iv_len, int add_len, int tag_len,
81 int res)
Janos Follath95ab93d2018-05-14 14:32:41 +010082{
83 mbedtls_ccm_context ctx;
84 unsigned char key[16];
85 unsigned char msg[10];
86 unsigned char iv[14];
87 unsigned char add[10];
88 unsigned char out[10];
89 unsigned char tag[18];
90 int decrypt_ret;
91
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010092 mbedtls_ccm_init(&ctx);
Janos Follath95ab93d2018-05-14 14:32:41 +010093
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010094 memset(key, 0, sizeof(key));
95 memset(msg, 0, sizeof(msg));
96 memset(iv, 0, sizeof(iv));
97 memset(add, 0, sizeof(add));
98 memset(out, 0, sizeof(out));
99 memset(tag, 0, sizeof(tag));
Janos Follath95ab93d2018-05-14 14:32:41 +0100100
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100101 TEST_ASSERT(mbedtls_ccm_setkey(&ctx, MBEDTLS_CIPHER_ID_AES,
102 key, 8 * sizeof(key)) == 0);
Janos Follath95ab93d2018-05-14 14:32:41 +0100103
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100104 TEST_ASSERT(mbedtls_ccm_star_encrypt_and_tag(&ctx, msg_len, iv, iv_len,
105 add, add_len, msg, out, tag, tag_len) == res);
Janos Follath95ab93d2018-05-14 14:32:41 +0100106
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100107 decrypt_ret = mbedtls_ccm_star_auth_decrypt(&ctx, msg_len, iv, iv_len, add,
108 add_len, msg, out, tag, tag_len);
Janos Follath95ab93d2018-05-14 14:32:41 +0100109
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100110 if (res == 0 && tag_len != 0) {
111 TEST_ASSERT(decrypt_ret == MBEDTLS_ERR_CCM_AUTH_FAILED);
112 } else {
113 TEST_ASSERT(decrypt_ret == res);
114 }
Janos Follath95ab93d2018-05-14 14:32:41 +0100115
116exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100117 mbedtls_ccm_free(&ctx);
Janos Follath95ab93d2018-05-14 14:32:41 +0100118}
119/* END_CASE */
120
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200121/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100122void mbedtls_ccm_encrypt_and_tag(int cipher_id, data_t *key,
123 data_t *msg, data_t *iv,
124 data_t *add, data_t *result)
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200125{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126 mbedtls_ccm_context ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100127 size_t tag_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100128 uint8_t *msg_n_tag = (uint8_t *) malloc(result->len + 2);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200129
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100130 mbedtls_ccm_init(&ctx);
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200131
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100132 memset(msg_n_tag, 0, result->len + 2);
133 memcpy(msg_n_tag, msg->x, msg->len);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200134
Azim Khand30ca132017-06-09 04:32:58 +0100135 tag_len = result->len - msg->len;
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200136
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100137 TEST_ASSERT(mbedtls_ccm_setkey(&ctx, cipher_id, key->x, key->len * 8) == 0);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200138
Manuel Pégourié-Gonnard0f6b66d2014-05-07 14:43:46 +0200139 /* Test with input == output */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100140 TEST_ASSERT(mbedtls_ccm_encrypt_and_tag(&ctx, msg->len, iv->x, iv->len, add->x, add->len,
141 msg_n_tag, msg_n_tag, msg_n_tag + msg->len,
142 tag_len) == 0);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200143
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100144 TEST_ASSERT(memcmp(msg_n_tag, result->x, result->len) == 0);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200145
146 /* Check we didn't write past the end */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100147 TEST_ASSERT(msg_n_tag[result->len] == 0 && msg_n_tag[result->len + 1] == 0);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200148
Paul Bakkerbd51b262014-07-10 15:26:12 +0200149exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100150 mbedtls_ccm_free(&ctx);
151 free(msg_n_tag);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200152}
153/* END_CASE */
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200154
155/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100156void mbedtls_ccm_auth_decrypt(int cipher_id, data_t *key,
157 data_t *msg, data_t *iv,
158 data_t *add, int tag_len, int result,
159 data_t *expected_msg)
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200160{
Manuel Pégourié-Gonnard0f6b66d2014-05-07 14:43:46 +0200161 unsigned char tag[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162 mbedtls_ccm_context ctx;
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200163
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100164 mbedtls_ccm_init(&ctx);
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200165
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100166 memset(tag, 0x00, sizeof(tag));
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200167
Azim Khand30ca132017-06-09 04:32:58 +0100168 msg->len -= tag_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100169 memcpy(tag, msg->x + msg->len, tag_len);
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200170
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100171 TEST_ASSERT(mbedtls_ccm_setkey(&ctx, cipher_id, key->x, key->len * 8) == 0);
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200172
Manuel Pégourié-Gonnard0f6b66d2014-05-07 14:43:46 +0200173 /* Test with input == output */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100174 TEST_ASSERT(mbedtls_ccm_auth_decrypt(&ctx, msg->len, iv->x, iv->len, add->x, add->len,
175 msg->x, msg->x, msg->x + msg->len, tag_len) == result);
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200176
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100177 if (result == 0) {
178 TEST_ASSERT(memcmp(msg->x, expected_msg->x, expected_msg->len) == 0);
179 } else {
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200180 size_t i;
181
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100182 for (i = 0; i < msg->len; i++) {
183 TEST_ASSERT(msg->x[i] == 0);
184 }
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200185 }
186
Manuel Pégourié-Gonnard0f6b66d2014-05-07 14:43:46 +0200187 /* Check we didn't write past the end (where the original tag is) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100188 TEST_ASSERT(memcmp(msg->x + msg->len, tag, tag_len) == 0);
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200189
Paul Bakkerbd51b262014-07-10 15:26:12 +0200190exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100191 mbedtls_ccm_free(&ctx);
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200192}
193/* END_CASE */
Darryl Green0daf4ca2018-05-29 14:12:26 +0100194
195/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100196void mbedtls_ccm_star_encrypt_and_tag(int cipher_id,
197 data_t *key, data_t *msg,
198 data_t *source_address, data_t *frame_counter,
199 int sec_level, data_t *add,
200 data_t *expected_result, int output_ret)
Darryl Green0daf4ca2018-05-29 14:12:26 +0100201{
Darryl Green0daf4ca2018-05-29 14:12:26 +0100202 unsigned char iv[13];
Darryl Green0daf4ca2018-05-29 14:12:26 +0100203 unsigned char result[50];
Darryl Green0daf4ca2018-05-29 14:12:26 +0100204 mbedtls_ccm_context ctx;
Gilles Peskineb168c0d2021-02-09 12:00:13 +0100205 size_t iv_len, tag_len;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100206 int ret;
207
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100208 mbedtls_ccm_init(&ctx);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100209
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100210 memset(result, 0x00, sizeof(result));
Darryl Green0daf4ca2018-05-29 14:12:26 +0100211
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100212 if (sec_level % 4 == 0) {
Darryl Green0daf4ca2018-05-29 14:12:26 +0100213 tag_len = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100214 } else {
215 tag_len = 1 << (sec_level % 4 + 1);
216 }
Darryl Green0daf4ca2018-05-29 14:12:26 +0100217
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100218 TEST_ASSERT(source_address->len == 8);
219 TEST_ASSERT(frame_counter->len == 4);
220 memcpy(iv, source_address->x, source_address->len);
221 memcpy(iv + source_address->len, frame_counter->x, frame_counter->len);
Ronald Cron9ed40732020-06-25 09:03:34 +0200222 iv[source_address->len + frame_counter->len] = sec_level;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100223 iv_len = sizeof(iv);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100224
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100225 TEST_ASSERT(mbedtls_ccm_setkey(&ctx, cipher_id,
226 key->x, key->len * 8) == 0);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100227
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100228 ret = mbedtls_ccm_star_encrypt_and_tag(&ctx, msg->len, iv, iv_len,
229 add->x, add->len, msg->x,
230 result, result + msg->len, tag_len);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100231
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100232 TEST_ASSERT(ret == output_ret);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100233
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100234 TEST_ASSERT(memcmp(result,
235 expected_result->x, expected_result->len) == 0);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100236
237 /* Check we didn't write past the end */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100238 TEST_ASSERT(result[expected_result->len] == 0 &&
239 result[expected_result->len + 1] == 0);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100240
241exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100242 mbedtls_ccm_free(&ctx);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100243}
244/* END_CASE */
245
246/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100247void mbedtls_ccm_star_auth_decrypt(int cipher_id,
248 data_t *key, data_t *msg,
249 data_t *source_address, data_t *frame_counter,
250 int sec_level, data_t *add,
251 data_t *expected_result, int output_ret)
Darryl Green0daf4ca2018-05-29 14:12:26 +0100252{
Darryl Green0daf4ca2018-05-29 14:12:26 +0100253 unsigned char iv[13];
Darryl Green0daf4ca2018-05-29 14:12:26 +0100254 unsigned char result[50];
Darryl Green0daf4ca2018-05-29 14:12:26 +0100255 mbedtls_ccm_context ctx;
Gilles Peskineb168c0d2021-02-09 12:00:13 +0100256 size_t iv_len, tag_len;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100257 int ret;
258
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100259 mbedtls_ccm_init(&ctx);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100260
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100261 memset(iv, 0x00, sizeof(iv));
262 memset(result, '+', sizeof(result));
Darryl Green0daf4ca2018-05-29 14:12:26 +0100263
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100264 if (sec_level % 4 == 0) {
Darryl Green0daf4ca2018-05-29 14:12:26 +0100265 tag_len = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100266 } else {
267 tag_len = 1 << (sec_level % 4 + 1);
268 }
Darryl Green0daf4ca2018-05-29 14:12:26 +0100269
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100270 TEST_ASSERT(source_address->len == 8);
271 TEST_ASSERT(frame_counter->len == 4);
272 memcpy(iv, source_address->x, source_address->len);
273 memcpy(iv + source_address->len, frame_counter->x, frame_counter->len);
Ronald Cron9ed40732020-06-25 09:03:34 +0200274 iv[source_address->len + frame_counter->len] = sec_level;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100275 iv_len = sizeof(iv);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100276
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100277 TEST_ASSERT(mbedtls_ccm_setkey(&ctx, cipher_id, key->x, key->len * 8) == 0);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100278
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100279 ret = mbedtls_ccm_star_auth_decrypt(&ctx, msg->len - tag_len, iv, iv_len,
280 add->x, add->len, msg->x, result,
281 msg->x + msg->len - tag_len, tag_len);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100282
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100283 TEST_ASSERT(ret == output_ret);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100284
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100285 TEST_ASSERT(memcmp(result, expected_result->x,
286 expected_result->len) == 0);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100287
288 /* Check we didn't write past the end (where the original tag is) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100289 TEST_ASSERT((msg->len + 2) <= sizeof(result));
290 TEST_EQUAL(result[msg->len], '+');
291 TEST_EQUAL(result[msg->len + 1], '+');
Darryl Green0daf4ca2018-05-29 14:12:26 +0100292
293exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100294 mbedtls_ccm_free(&ctx);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100295}
296/* END_CASE */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500297
298/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100299void ccm_invalid_param()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500300{
301 struct mbedtls_ccm_context ctx;
302 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
303 mbedtls_cipher_id_t valid_cipher = MBEDTLS_CIPHER_ID_AES;
304 int valid_len = sizeof(valid_buffer);
305 int valid_bitlen = valid_len * 8;
306
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100307 mbedtls_ccm_init(&ctx);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500308
309 /* mbedtls_ccm_init() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100310 TEST_INVALID_PARAM(mbedtls_ccm_init(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500311
312 /* mbedtls_ccm_setkey() */
313 TEST_INVALID_PARAM_RET(
314 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100315 mbedtls_ccm_setkey(NULL, valid_cipher, valid_buffer, valid_bitlen));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500316 TEST_INVALID_PARAM_RET(
317 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100318 mbedtls_ccm_setkey(&ctx, valid_cipher, NULL, valid_bitlen));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500319
320 /* mbedtls_ccm_encrypt_and_tag() */
321 TEST_INVALID_PARAM_RET(
322 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100323 mbedtls_ccm_encrypt_and_tag(NULL, valid_len,
324 valid_buffer, valid_len,
325 valid_buffer, valid_len,
326 valid_buffer, valid_buffer,
327 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500328 TEST_INVALID_PARAM_RET(
329 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100330 mbedtls_ccm_encrypt_and_tag(&ctx, valid_len,
331 NULL, valid_len,
332 valid_buffer, valid_len,
333 valid_buffer, valid_buffer,
334 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500335 TEST_INVALID_PARAM_RET(
336 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100337 mbedtls_ccm_encrypt_and_tag(&ctx, valid_len,
338 valid_buffer, valid_len,
339 NULL, valid_len,
340 valid_buffer, valid_buffer,
341 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500342 TEST_INVALID_PARAM_RET(
343 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100344 mbedtls_ccm_encrypt_and_tag(&ctx, valid_len,
345 valid_buffer, valid_len,
346 valid_buffer, valid_len,
347 NULL, valid_buffer,
348 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500349 TEST_INVALID_PARAM_RET(
350 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100351 mbedtls_ccm_encrypt_and_tag(&ctx, valid_len,
352 valid_buffer, valid_len,
353 valid_buffer, valid_len,
354 valid_buffer, NULL,
355 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500356 TEST_INVALID_PARAM_RET(
357 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100358 mbedtls_ccm_encrypt_and_tag(&ctx, valid_len,
359 valid_buffer, valid_len,
360 valid_buffer, valid_len,
361 valid_buffer, valid_buffer,
362 NULL, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500363
364 /* mbedtls_ccm_star_encrypt_and_tag() */
365 TEST_INVALID_PARAM_RET(
366 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100367 mbedtls_ccm_star_encrypt_and_tag(NULL, valid_len,
368 valid_buffer, valid_len,
369 valid_buffer, valid_len,
370 valid_buffer, valid_buffer,
371 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500372 TEST_INVALID_PARAM_RET(
373 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100374 mbedtls_ccm_star_encrypt_and_tag(&ctx, valid_len,
375 NULL, valid_len,
376 valid_buffer, valid_len,
377 valid_buffer, valid_buffer,
378 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500379 TEST_INVALID_PARAM_RET(
380 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100381 mbedtls_ccm_star_encrypt_and_tag(&ctx, valid_len,
382 valid_buffer, valid_len,
383 NULL, valid_len,
384 valid_buffer, valid_buffer,
385 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500386 TEST_INVALID_PARAM_RET(
387 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100388 mbedtls_ccm_star_encrypt_and_tag(&ctx, valid_len,
389 valid_buffer, valid_len,
390 valid_buffer, valid_len,
391 NULL, valid_buffer,
392 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500393 TEST_INVALID_PARAM_RET(
394 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100395 mbedtls_ccm_star_encrypt_and_tag(&ctx, valid_len,
396 valid_buffer, valid_len,
397 valid_buffer, valid_len,
398 valid_buffer, NULL,
399 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500400 TEST_INVALID_PARAM_RET(
401 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100402 mbedtls_ccm_star_encrypt_and_tag(&ctx, valid_len,
403 valid_buffer, valid_len,
404 valid_buffer, valid_len,
405 valid_buffer, valid_buffer,
406 NULL, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500407
408 /* mbedtls_ccm_auth_decrypt() */
409 TEST_INVALID_PARAM_RET(
410 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100411 mbedtls_ccm_auth_decrypt(NULL, valid_len,
412 valid_buffer, valid_len,
413 valid_buffer, valid_len,
414 valid_buffer, valid_buffer,
415 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500416 TEST_INVALID_PARAM_RET(
417 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100418 mbedtls_ccm_auth_decrypt(&ctx, valid_len,
419 NULL, valid_len,
420 valid_buffer, valid_len,
421 valid_buffer, valid_buffer,
422 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500423 TEST_INVALID_PARAM_RET(
424 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100425 mbedtls_ccm_auth_decrypt(&ctx, valid_len,
426 valid_buffer, valid_len,
427 NULL, valid_len,
428 valid_buffer, valid_buffer,
429 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500430 TEST_INVALID_PARAM_RET(
431 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100432 mbedtls_ccm_auth_decrypt(&ctx, valid_len,
433 valid_buffer, valid_len,
434 valid_buffer, valid_len,
435 NULL, valid_buffer,
436 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500437 TEST_INVALID_PARAM_RET(
438 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100439 mbedtls_ccm_auth_decrypt(&ctx, valid_len,
440 valid_buffer, valid_len,
441 valid_buffer, valid_len,
442 valid_buffer, NULL,
443 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500444 TEST_INVALID_PARAM_RET(
445 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100446 mbedtls_ccm_auth_decrypt(&ctx, valid_len,
447 valid_buffer, valid_len,
448 valid_buffer, valid_len,
449 valid_buffer, valid_buffer,
450 NULL, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500451
452 /* mbedtls_ccm_star_auth_decrypt() */
453 TEST_INVALID_PARAM_RET(
454 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100455 mbedtls_ccm_star_auth_decrypt(NULL, valid_len,
456 valid_buffer, valid_len,
457 valid_buffer, valid_len,
458 valid_buffer, valid_buffer,
459 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500460 TEST_INVALID_PARAM_RET(
461 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100462 mbedtls_ccm_star_auth_decrypt(&ctx, valid_len,
463 NULL, valid_len,
464 valid_buffer, valid_len,
465 valid_buffer, valid_buffer,
466 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500467 TEST_INVALID_PARAM_RET(
468 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100469 mbedtls_ccm_star_auth_decrypt(&ctx, valid_len,
470 valid_buffer, valid_len,
471 NULL, valid_len,
472 valid_buffer, valid_buffer,
473 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500474 TEST_INVALID_PARAM_RET(
475 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100476 mbedtls_ccm_star_auth_decrypt(&ctx, valid_len,
477 valid_buffer, valid_len,
478 valid_buffer, valid_len,
479 NULL, valid_buffer,
480 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500481 TEST_INVALID_PARAM_RET(
482 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100483 mbedtls_ccm_star_auth_decrypt(&ctx, valid_len,
484 valid_buffer, valid_len,
485 valid_buffer, valid_len,
486 valid_buffer, NULL,
487 valid_buffer, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500488 TEST_INVALID_PARAM_RET(
489 MBEDTLS_ERR_CCM_BAD_INPUT,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100490 mbedtls_ccm_star_auth_decrypt(&ctx, valid_len,
491 valid_buffer, valid_len,
492 valid_buffer, valid_len,
493 valid_buffer, valid_buffer,
494 NULL, valid_len));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500495
496exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100497 mbedtls_ccm_free(&ctx);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500498 return;
499}
500/* END_CASE */
501
502/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100503void ccm_valid_param()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500504{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100505 TEST_VALID_PARAM(mbedtls_ccm_free(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500506exit:
507 return;
508}
509/* END_CASE */