blob: 308eaa18aafded1c27526e31410378c82a04d455 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/md.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker17373852011-01-06 14:20:01 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006 * depends_on:MBEDTLS_MD_C
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010011void mbedtls_md_process()
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010012{
13 const int *md_type_ptr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020014 const mbedtls_md_info_t *info;
15 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020016 unsigned char buf[150];
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010017
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010018 mbedtls_md_init(&ctx);
19 memset(buf, 0, sizeof(buf));
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020020
21 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020022 * Very minimal testing of mbedtls_md_process, just make sure the various
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020023 * xxx_process_wrap() function pointers are valid. (Testing that they
Shaun Case0e7791f2021-12-20 21:14:10 -080024 * indeed do the right thing would require messing with the internal
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020025 * state of the underlying mbedtls_md/sha context.)
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020026 *
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027 * Also tests that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020028 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010029 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
30 info = mbedtls_md_info_from_type(*md_type_ptr);
31 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010032 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
33 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
34 TEST_EQUAL(0, mbedtls_md_process(&ctx, buf));
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010035 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020036 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020037
38exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010039 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010040}
41/* END_CASE */
42
43/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010044void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020045{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046 mbedtls_md_context_t ctx;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010047 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020048 unsigned char buf[1] = { 0 };
49
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010050 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020051
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010052 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnard2122f442023-02-09 09:18:22 +010053 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010054 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020055
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010056 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020057
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010058 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
59 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020060
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010061 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
62 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020063
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010064 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
65 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020066
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010067 TEST_EQUAL(mbedtls_md_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
68 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020069
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010070 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020071
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020072#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010073 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020074#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020075
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010076 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
77 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
78 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
79 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020080
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010081 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
82 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
83 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
84 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020085
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010086 TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
87 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020088
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010089 TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
90 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020091
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010092 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
93 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020094
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +010095 TEST_EQUAL(mbedtls_md_process(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
96 TEST_EQUAL(mbedtls_md_process(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +010097
98 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010099 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
100 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200101}
102/* END_CASE */
103
104/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100105void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100106{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200107 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100108 const int *md_type_ptr;
109 int found;
110
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100111 md_info = mbedtls_md_info_from_type(md_type);
112 TEST_ASSERT(md_info != NULL);
113 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100114
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100115 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
116 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
117 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100118
119 found = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100120 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
121 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100122 found = 1;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100123 }
124 }
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100125 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100126}
127/* END_CASE */
128
129/* BEGIN_CASE */
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100130void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000131{
Manuel Pégourié-Gonnard96108b62023-02-03 12:32:41 +0100132 unsigned char *src = (unsigned char *) text_src_string;
133 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100134 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000136
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100137 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100138 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000139
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100140 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000141
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100142 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000143}
Paul Bakker33b43f12013-08-20 11:48:36 +0200144/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000145
Paul Bakker33b43f12013-08-20 11:48:36 +0200146/* BEGIN_CASE */
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100147void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000148{
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100149 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000151
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100152 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100153 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000154
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100155 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000156
Paul Bakker17373852011-01-06 14:20:01 +0000157
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100158 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000159}
Paul Bakker33b43f12013-08-20 11:48:36 +0200160/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000161
Paul Bakker33b43f12013-08-20 11:48:36 +0200162/* BEGIN_CASE */
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100163void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100164 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000165{
Manuel Pégourié-Gonnard96108b62023-02-03 12:32:41 +0100166 unsigned char *src = (unsigned char *) text_src_string;
167 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100168 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard96108b62023-02-03 12:32:41 +0100169 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200170
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200171 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100172 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200173
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100174 mbedtls_md_init(&ctx);
175 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000176
Manuel Pégourié-Gonnard96108b62023-02-03 12:32:41 +0100177 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100178
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100179 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100180 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100181 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
182 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Paul Bakker17373852011-01-06 14:20:01 +0000183
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100184 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100185 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100186 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
187 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100188
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100189 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
190 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100191 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000192
Paul Bakker97c53c22016-07-13 17:20:22 +0100193 /* Test clone */
Manuel Pégourié-Gonnard2a5e2132023-02-03 12:25:53 +0100194 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100195
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100196 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
197 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100198 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200199
200exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100201 mbedtls_md_free(&ctx);
202 mbedtls_md_free(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000203}
Paul Bakker33b43f12013-08-20 11:48:36 +0200204/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000205
Paul Bakker33b43f12013-08-20 11:48:36 +0200206/* BEGIN_CASE */
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100207void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000208{
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100209 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200210 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100211 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100212 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200213
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100214 mbedtls_md_init(&ctx);
215 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000216
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100217 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100218 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100219 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
220 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Paul Bakker17373852011-01-06 14:20:01 +0000221
Azim Khand30ca132017-06-09 04:32:58 +0100222 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200223
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100224 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100225 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100226 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
227 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100228
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100229 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
230 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100231 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000232
Paul Bakker97c53c22016-07-13 17:20:22 +0100233 /* Test clone */
Manuel Pégourié-Gonnard2a5e2132023-02-03 12:25:53 +0100234 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100235
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100236 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
237 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100238 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200239
240exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100241 mbedtls_md_free(&ctx);
242 mbedtls_md_free(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000243}
Paul Bakker33b43f12013-08-20 11:48:36 +0200244/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000245
Paul Bakker33b43f12013-08-20 11:48:36 +0200246/* BEGIN_CASE */
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100247void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100248 data_t *key_str, data_t *src_str,
249 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000250{
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100251 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200252 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000253
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100254 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100255 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000256
Paul Bakker17373852011-01-06 14:20:01 +0000257
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100258 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100259 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000260
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100261 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000262}
Paul Bakker33b43f12013-08-20 11:48:36 +0200263/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000264
Paul Bakker33b43f12013-08-20 11:48:36 +0200265/* BEGIN_CASE */
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100266void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100267 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000268{
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100269 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200270 const mbedtls_md_info_t *md_info = NULL;
271 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100272 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200273
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100274 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000275
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100276 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100277 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100278 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Paul Bakker17373852011-01-06 14:20:01 +0000279
Azim Khand30ca132017-06-09 04:32:58 +0100280 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000281
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100282 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100283 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100284 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
285 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
286 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100287
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100288 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100289
290 /* Test again, for reset() */
Manuel Pégourié-Gonnard2a5e2132023-02-03 12:25:53 +0100291 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100292
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100293 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
294 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
295 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
296 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200297
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100298 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200299
300exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100301 mbedtls_md_free(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000302}
Paul Bakker33b43f12013-08-20 11:48:36 +0200303/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200304
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200305/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100306void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100307 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000308{
Manuel Pégourié-Gonnard54faadc2023-02-06 12:37:02 +0100309 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200310 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000311
Manuel Pégourié-Gonnarda876bd22023-02-03 12:13:10 +0100312 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100313 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000314
Manuel Pégourié-Gonnard67565d02023-02-03 12:51:03 +0100315 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000316
Tom Cosgroveba3b14d2023-09-04 11:23:02 +0100317 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000318}
Paul Bakker33b43f12013-08-20 11:48:36 +0200319/* END_CASE */