blob: 2768707e9f8c4965b8199c76ebc8ac9eceb1a39a [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);
Dave Rodgmanc0a09902023-07-05 19:15:53 +010031
32 /* Ensure that we can convert to and from a psa_algorithm_t */
33 psa_algorithm_t p = mbedtls_md_psa_alg_from_type(*md_type_ptr);
34 TEST_ASSERT(p != PSA_ALG_NONE);
35 TEST_EQUAL(*md_type_ptr, mbedtls_md_type_from_psa_alg(p));
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020036 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020037
38exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010039 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010040 MD_PSA_DONE();
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010041}
42/* END_CASE */
43
44/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010045void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020046{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010048#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010049 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010050#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020051 unsigned char buf[1] = { 0 };
52
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010053 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010054 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020055
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010056 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010057#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010058 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010059 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020060
Gilles Peskine449bd832023-01-11 14:50:10 +010061 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
62 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
63 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010064#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020065
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010066 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010067#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010068 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020069
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010070 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
71 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020072
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010073 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
74 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020075
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010076 TEST_EQUAL(mbedtls_md_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
77 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Thomas Daubney5903e9c2023-06-02 10:43:08 +010078#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020079
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010080 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020081
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010082#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020083#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010084 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020085#endif
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_starts(NULL, buf, 1),
88 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
89 TEST_EQUAL(mbedtls_md_hmac_starts(&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_update(NULL, buf, 1),
93 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
94 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
95 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020096
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010097 TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
98 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020099
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100100 TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
101 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200102
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100103 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
104 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100105#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200106
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100107 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100109#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100111#endif
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100112
113exit:
114 MD_PSA_DONE();
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200115}
116/* END_CASE */
117
118/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100119void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100120{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200121 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100122#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100123 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100124#else
125 (void) md_name;
126#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100127
Manuel Pégourié-Gonnard6ea8d342023-03-17 09:43:50 +0100128 /* Note: PSA Crypto init not needed for info functions */
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100129
Gilles Peskine449bd832023-01-11 14:50:10 +0100130 md_info = mbedtls_md_info_from_type(md_type);
131 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100132#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100133 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100134#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100135
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100136 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
137 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100138#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100139 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100140
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100141 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
143 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100144 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100145 }
146 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100147 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100148#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100149}
150/* END_CASE */
151
152/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100153void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000154{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100155 unsigned char *src = (unsigned char *) text_src_string;
156 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100157 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200158 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000159
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100160 MD_PSA_INIT();
161
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100162 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000164
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100165 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000166
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100167 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100168
169exit:
170 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000171}
Paul Bakker33b43f12013-08-20 11:48:36 +0200172/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000173
Paul Bakker33b43f12013-08-20 11:48:36 +0200174/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100175void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000176{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100177 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200178 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000179
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100180 MD_PSA_INIT();
181
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100182 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100183 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000184
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100185 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000186
Paul Bakker17373852011-01-06 14:20:01 +0000187
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100188 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100189
190exit:
191 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000192}
Paul Bakker33b43f12013-08-20 11:48:36 +0200193/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000194
Paul Bakker33b43f12013-08-20 11:48:36 +0200195/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100196void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000198{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100199 unsigned char *src = (unsigned char *) text_src_string;
200 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100201 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100202 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200203
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200204 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100205 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200206
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100207 MD_PSA_INIT();
208
Gilles Peskine449bd832023-01-11 14:50:10 +0100209 mbedtls_md_init(&ctx);
210 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000211
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100212 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100213
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100214 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100216 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
217 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100218#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
220 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100221#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000222
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100223 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100225 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
226 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100227
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100228 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
229 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100230 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000231
Paul Bakker97c53c22016-07-13 17:20:22 +0100232 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100233 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100234
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100235 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
236 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100237 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200238
239exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 mbedtls_md_free(&ctx);
241 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100242 MD_PSA_DONE();
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é-Gonnardc90514e2023-02-03 12:13:10 +0100247void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000248{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100249 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100251 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100252 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200253
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100254 MD_PSA_INIT();
255
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 mbedtls_md_init(&ctx);
257 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000258
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100259 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100261 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
262 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100263#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
265 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100266#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000267
Azim Khand30ca132017-06-09 04:32:58 +0100268 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200269
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100270 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100271 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100272 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
273 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100274
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100275 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
276 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100277 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000278
Paul Bakker97c53c22016-07-13 17:20:22 +0100279 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100280 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100281
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100282 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
283 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100284 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200285
286exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 mbedtls_md_free(&ctx);
288 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100289 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000290}
Paul Bakker33b43f12013-08-20 11:48:36 +0200291/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000292
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100293/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100294void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100295 data_t *key_str, data_t *src_str,
296 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000297{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100298 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000300
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100301 MD_PSA_INIT();
302
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100303 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000305
Paul Bakker17373852011-01-06 14:20:01 +0000306
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100307 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100308 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000309
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100310 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100311
312exit:
313 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000314}
Paul Bakker33b43f12013-08-20 11:48:36 +0200315/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000316
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100317/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100318void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000320{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100321 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200322 const mbedtls_md_info_t *md_info = NULL;
323 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100324 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200325
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100326 MD_PSA_INIT();
327
Gilles Peskine449bd832023-01-11 14:50:10 +0100328 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000329
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100330 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100331 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100332 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100333#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100335#endif
Paul Bakker17373852011-01-06 14:20:01 +0000336
Azim Khand30ca132017-06-09 04:32:58 +0100337 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000338
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100339 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100340 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100341 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
342 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
343 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100344
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100345 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100346
347 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100348 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100349
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100350 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
351 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
352 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
353 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200354
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100355 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200356
357exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100358 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100359 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000360}
Paul Bakker33b43f12013-08-20 11:48:36 +0200361/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200362
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100363/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100364void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100365 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000366{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100367 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200368 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000369
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100370 MD_PSA_INIT();
371
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100372 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000374
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100375 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000376
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100377 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100378
379exit:
380 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000381}
Paul Bakker33b43f12013-08-20 11:48:36 +0200382/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100383
384/* BEGIN_CASE */
385void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
386{
387 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
388 TEST_ASSERT(md_info != NULL);
389 mbedtls_md_context_t ctx1, ctx2;
390
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100391 /* Intentionally no PSA init here! (Will be done later.) */
392
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100393 mbedtls_md_init(&ctx1);
394 mbedtls_md_init(&ctx2);
395
396 /* Before PSA crypto init */
397 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
398 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
399
400#if defined(MBEDTLS_MD_SOME_PSA)
401 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
402 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
403#endif
404
405 /* Reset ctx1 but keep ctx2 for the cloning test */
406 mbedtls_md_free(&ctx1);
407 mbedtls_md_init(&ctx1);
408
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100409 /* Now initilize PSA Crypto */
410 MD_PSA_INIT();
411
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100412 /* After PSA Crypto init */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100413 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
414#if defined(MBEDTLS_MD_SOME_PSA)
415 TEST_EQUAL(ctx1.engine, post_psa_engine);
416#endif
417
418 /* Cloning test */
419 if (pre_psa_ret == 0) {
420 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
421 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
422 : 0;
423 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
424 }
425
426exit:
427 mbedtls_md_free(&ctx1);
428 mbedtls_md_free(&ctx2);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100429 MD_PSA_DONE();
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100430}
431/* END_CASE */