blob: bf875f3efdad5a899c9014514451976a59e8f1da [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é-Gonnardb9b630d2023-02-16 19:07:31 +01006 * depends_on:MBEDTLS_MD_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010010/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010011void mbedtls_md_list()
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é-Gonnardba2412f2023-02-16 18:44:46 +010016 unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010017
Gilles Peskine449bd832023-01-11 14:50:10 +010018 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +010019#if defined(MBEDTLS_MD_SOME_PSA)
20 PSA_INIT();
21#endif
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020022
23 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010024 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020025 */
Gilles Peskine449bd832023-01-11 14:50:10 +010026 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
27 info = mbedtls_md_info_from_type(*md_type_ptr);
28 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010029 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
30 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010031 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010032 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020033 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020034
35exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010036 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +010037#if defined(MBEDTLS_MD_SOME_PSA)
38 PSA_DONE();
39#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010040}
41/* END_CASE */
42
43/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +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;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010047#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010048 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010049#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020050 unsigned char buf[1] = { 0 };
51
Gilles Peskine449bd832023-01-11 14:50:10 +010052 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020053
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010054 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010055#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010056 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010057 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020058
Gilles Peskine449bd832023-01-11 14:50:10 +010059 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
60 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
61 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010062#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020063
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010064 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010065#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010066 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010067#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020068
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010069 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
70 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020071
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010072 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
73 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020074
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010075 TEST_EQUAL(mbedtls_md_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
76 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020077
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010078 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020079
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010080#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020081#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010082 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020083#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020084
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010085 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
86 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
87 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
88 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020089
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010090 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
91 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
92 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
93 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020094
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010095 TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
96 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020097
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010098 TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
99 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200100
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100101 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
102 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100103#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200104
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100105 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100106 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100107#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100109#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200110}
111/* END_CASE */
112
113/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100114void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100115{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100117#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100118 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100119#else
120 (void) md_name;
121#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100122
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 md_info = mbedtls_md_info_from_type(md_type);
124 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100125#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100127#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100128
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100129 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
130 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100131#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100132 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100133
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100134 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
136 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100137 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 }
139 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100140 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100141#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100142}
143/* END_CASE */
144
145/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100146void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000147{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100148 unsigned char *src = (unsigned char *) text_src_string;
149 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100150 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000152
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100153 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000155
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100156 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000157
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100158 ASSERT_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é-Gonnardc90514e2023-02-03 12:13:10 +0100163void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000164{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100165 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200166 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000167
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100168 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100169 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000170
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100171 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000172
Paul Bakker17373852011-01-06 14:20:01 +0000173
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100174 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000175}
Paul Bakker33b43f12013-08-20 11:48:36 +0200176/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000177
Paul Bakker33b43f12013-08-20 11:48:36 +0200178/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100179void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100180 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000181{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100182 unsigned char *src = (unsigned char *) text_src_string;
183 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100184 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100185 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100188 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200189
Gilles Peskine449bd832023-01-11 14:50:10 +0100190 mbedtls_md_init(&ctx);
191 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000192
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100193 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100194
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100195 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100196 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100197 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
198 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100199#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
201 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100202#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000203
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100204 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100205 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100206 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
207 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100208
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100209 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
210 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100211 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000212
Paul Bakker97c53c22016-07-13 17:20:22 +0100213 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100214 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100215
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100216 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
217 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100218 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200219
220exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100221 mbedtls_md_free(&ctx);
222 mbedtls_md_free(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000223}
Paul Bakker33b43f12013-08-20 11:48:36 +0200224/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000225
Paul Bakker33b43f12013-08-20 11:48:36 +0200226/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100227void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000228{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100229 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200230 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100231 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100232 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200233
Gilles Peskine449bd832023-01-11 14:50:10 +0100234 mbedtls_md_init(&ctx);
235 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000236
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100237 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100238 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100239 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
240 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100241#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
243 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100244#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000245
Azim Khand30ca132017-06-09 04:32:58 +0100246 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200247
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100248 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100250 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
251 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100252
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100253 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
254 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100255 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000256
Paul Bakker97c53c22016-07-13 17:20:22 +0100257 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100258 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100259
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100260 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
261 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100262 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200263
264exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 mbedtls_md_free(&ctx);
266 mbedtls_md_free(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000267}
Paul Bakker33b43f12013-08-20 11:48:36 +0200268/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000269
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100270/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100271void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100272 data_t *key_str, data_t *src_str,
273 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000274{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100275 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000277
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100278 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000280
Paul Bakker17373852011-01-06 14:20:01 +0000281
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100282 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100283 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000284
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100285 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000286}
Paul Bakker33b43f12013-08-20 11:48:36 +0200287/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000288
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100289/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100290void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000292{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100293 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294 const mbedtls_md_info_t *md_info = NULL;
295 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100296 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200297
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000299
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100300 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100302 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100303#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100305#endif
Paul Bakker17373852011-01-06 14:20:01 +0000306
Azim Khand30ca132017-06-09 04:32:58 +0100307 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000308
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100309 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100310 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100311 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
312 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
313 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100314
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100315 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100316
317 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100318 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100319
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100320 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
321 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
322 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
323 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200324
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100325 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200326
327exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100328 mbedtls_md_free(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000329}
Paul Bakker33b43f12013-08-20 11:48:36 +0200330/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200331
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100332/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100333void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000335{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100336 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000338
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100339 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100340 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000341
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100342 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000343
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100344 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000345}
Paul Bakker33b43f12013-08-20 11:48:36 +0200346/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100347
348/* BEGIN_CASE */
349void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
350{
351 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
352 TEST_ASSERT(md_info != NULL);
353 mbedtls_md_context_t ctx1, ctx2;
354
355 mbedtls_md_init(&ctx1);
356 mbedtls_md_init(&ctx2);
357
358 /* Before PSA crypto init */
359 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
360 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
361
362#if defined(MBEDTLS_MD_SOME_PSA)
363 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
364 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
365#endif
366
367 /* Reset ctx1 but keep ctx2 for the cloning test */
368 mbedtls_md_free(&ctx1);
369 mbedtls_md_init(&ctx1);
370
371 /* After PSA Crypto init */
372 PSA_INIT();
373 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
374#if defined(MBEDTLS_MD_SOME_PSA)
375 TEST_EQUAL(ctx1.engine, post_psa_engine);
376#endif
377
378 /* Cloning test */
379 if (pre_psa_ret == 0) {
380 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
381 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
382 : 0;
383 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
384 }
385
386exit:
387 mbedtls_md_free(&ctx1);
388 mbedtls_md_free(&ctx2);
389 PSA_DONE();
390}
391/* END_CASE */