blob: 4438fa15099a0c5f805252cedbddb64f2d60a7d5 [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
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010018 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010019 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020020
21 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010022 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020023 */
Gilles Peskine449bd832023-01-11 14:50:10 +010024 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
25 info = mbedtls_md_info_from_type(*md_type_ptr);
26 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010027 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
28 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010029 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010030 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020031 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020032
33exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010034 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010035 MD_PSA_DONE();
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010036}
37/* END_CASE */
38
39/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010040void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020041{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020042 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010043#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010044 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010045#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020046 unsigned char buf[1] = { 0 };
47
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010048 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010049 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020050
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010051 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010052#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010053 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010054 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020055
Gilles Peskine449bd832023-01-11 14:50:10 +010056 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
57 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
58 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010059#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020060
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010061 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010062#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010063 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010064#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020065
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010066 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
67 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020068
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010069 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
70 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), 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_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
73 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), 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(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020076
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010077#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020078#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010079 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020080#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020081
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010082 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
83 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
84 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
85 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020086
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010087 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
88 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
89 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
90 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020091
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010092 TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
93 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), 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_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
96 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), 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(NULL, buf, 1, buf, 1, buf),
99 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100100#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200101
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100102 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100104#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100105 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100106#endif
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100107
108exit:
109 MD_PSA_DONE();
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
Manuel Pégourié-Gonnard6ea8d342023-03-17 09:43:50 +0100123 /* Note: PSA Crypto init not needed for info functions */
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100124
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 md_info = mbedtls_md_info_from_type(md_type);
126 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100127#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100129#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100130
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100131 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
132 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100133#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100134 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100135
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100136 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
138 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100139 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 }
141 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100142 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100143#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100144}
145/* END_CASE */
146
147/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100148void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000149{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100150 unsigned char *src = (unsigned char *) text_src_string;
151 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100152 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000154
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100155 MD_PSA_INIT();
156
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100157 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000159
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100160 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000161
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100162 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100163
164exit:
165 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000166}
Paul Bakker33b43f12013-08-20 11:48:36 +0200167/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000168
Paul Bakker33b43f12013-08-20 11:48:36 +0200169/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100170void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000171{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100172 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200173 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000174
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100175 MD_PSA_INIT();
176
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100177 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000179
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100180 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000181
Paul Bakker17373852011-01-06 14:20:01 +0000182
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100183 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100184
185exit:
186 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000187}
Paul Bakker33b43f12013-08-20 11:48:36 +0200188/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000189
Paul Bakker33b43f12013-08-20 11:48:36 +0200190/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100191void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100192 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000193{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100194 unsigned char *src = (unsigned char *) text_src_string;
195 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100196 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100197 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200199 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100200 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200201
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100202 MD_PSA_INIT();
203
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 mbedtls_md_init(&ctx);
205 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000206
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100207 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100208
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100209 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100211 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
212 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100213#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
215 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100216#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000217
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100218 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100220 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
221 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100222
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100223 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
224 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100225 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000226
Paul Bakker97c53c22016-07-13 17:20:22 +0100227 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100228 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100229
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100230 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
231 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100232 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200233
234exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 mbedtls_md_free(&ctx);
236 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100237 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000238}
Paul Bakker33b43f12013-08-20 11:48:36 +0200239/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000240
Paul Bakker33b43f12013-08-20 11:48:36 +0200241/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100242void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000243{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100244 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200245 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100246 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100247 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200248
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100249 MD_PSA_INIT();
250
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 mbedtls_md_init(&ctx);
252 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000253
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100254 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100256 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
257 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100258#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
260 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100261#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000262
Azim Khand30ca132017-06-09 04:32:58 +0100263 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200264
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100265 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100267 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
268 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100269
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100270 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
271 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100272 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000273
Paul Bakker97c53c22016-07-13 17:20:22 +0100274 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100275 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100276
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100277 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
278 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100279 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200280
281exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 mbedtls_md_free(&ctx);
283 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100284 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000285}
Paul Bakker33b43f12013-08-20 11:48:36 +0200286/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000287
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100288/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100289void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100290 data_t *key_str, data_t *src_str,
291 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;
Paul Bakker17373852011-01-06 14:20:01 +0000295
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100296 MD_PSA_INIT();
297
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100298 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000300
Paul Bakker17373852011-01-06 14:20:01 +0000301
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100302 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100303 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000304
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100305 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100306
307exit:
308 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000309}
Paul Bakker33b43f12013-08-20 11:48:36 +0200310/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000311
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100312/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100313void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100314 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000315{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100316 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200317 const mbedtls_md_info_t *md_info = NULL;
318 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100319 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200320
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100321 MD_PSA_INIT();
322
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000324
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100325 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100326 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100327 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100328#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100330#endif
Paul Bakker17373852011-01-06 14:20:01 +0000331
Azim Khand30ca132017-06-09 04:32:58 +0100332 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000333
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100334 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100336 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
337 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
338 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100339
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100340 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100341
342 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100343 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100344
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100345 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
346 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
347 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
348 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200349
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100350 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200351
352exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100354 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000355}
Paul Bakker33b43f12013-08-20 11:48:36 +0200356/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200357
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100358/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100359void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000361{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100362 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000364
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100365 MD_PSA_INIT();
366
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100367 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100368 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000369
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100370 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000371
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100372 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100373
374exit:
375 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000376}
Paul Bakker33b43f12013-08-20 11:48:36 +0200377/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100378
379/* BEGIN_CASE */
380void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
381{
382 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
383 TEST_ASSERT(md_info != NULL);
384 mbedtls_md_context_t ctx1, ctx2;
385
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100386 /* Intentionally no PSA init here! (Will be done later.) */
387
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100388 mbedtls_md_init(&ctx1);
389 mbedtls_md_init(&ctx2);
390
391 /* Before PSA crypto init */
392 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
393 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
394
395#if defined(MBEDTLS_MD_SOME_PSA)
396 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
397 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
398#endif
399
400 /* Reset ctx1 but keep ctx2 for the cloning test */
401 mbedtls_md_free(&ctx1);
402 mbedtls_md_init(&ctx1);
403
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100404 /* Now initilize PSA Crypto */
405 MD_PSA_INIT();
406
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100407 /* After PSA Crypto init */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100408 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
409#if defined(MBEDTLS_MD_SOME_PSA)
410 TEST_EQUAL(ctx1.engine, post_psa_engine);
411#endif
412
413 /* Cloning test */
414 if (pre_psa_ret == 0) {
415 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
416 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
417 : 0;
418 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
419 }
420
421exit:
422 mbedtls_md_free(&ctx1);
423 mbedtls_md_free(&ctx2);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100424 MD_PSA_DONE();
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100425}
426/* END_CASE */