blob: 75087e7eeab064aedb1ccc7544e6a472769935c2 [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"
Dave Rodgman76814b62023-07-05 19:38:21 +01003#include "../library/md_psa.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02004/* END_HEADER */
Paul Bakker17373852011-01-06 14:20:01 +00005
Paul Bakker33b43f12013-08-20 11:48:36 +02006/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +01007 * depends_on:MBEDTLS_MD_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +02008 * END_DEPENDENCIES
9 */
Paul Bakker5690efc2011-05-26 13:16:06 +000010
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010011/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010012void mbedtls_md_list()
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010013{
14 const int *md_type_ptr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020015 const mbedtls_md_info_t *info;
16 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010017 unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010018
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010019 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010020 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020021
22 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010023 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020024 */
Gilles Peskine449bd832023-01-11 14:50:10 +010025 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
26 info = mbedtls_md_info_from_type(*md_type_ptr);
27 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010028 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
29 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010030 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010031 mbedtls_md_free(&ctx);
Dave Rodgmanc0a09902023-07-05 19:15:53 +010032
33 /* Ensure that we can convert to and from a psa_algorithm_t */
34 psa_algorithm_t p = mbedtls_md_psa_alg_from_type(*md_type_ptr);
35 TEST_ASSERT(p != PSA_ALG_NONE);
36 TEST_EQUAL(*md_type_ptr, mbedtls_md_type_from_psa_alg(p));
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020037 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020038
39exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010040 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010041 MD_PSA_DONE();
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010042}
43/* END_CASE */
44
45/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010046void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020047{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010049#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010050 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010051#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020052 unsigned char buf[1] = { 0 };
53
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010054 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010055 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020056
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010057 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010058#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010059 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010060 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020061
Gilles Peskine449bd832023-01-11 14:50:10 +010062 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
63 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
64 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010065#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020066
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010067 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010068#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010069 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020070
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010071 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
72 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020073
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010074 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
75 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020076
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010077 TEST_EQUAL(mbedtls_md_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
78 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Thomas Daubney5903e9c2023-06-02 10:43:08 +010079#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020080
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010081 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020082
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010083#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020084#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010085 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020086#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020087
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010088 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
89 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
90 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
91 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020092
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010093 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
94 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
95 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
96 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_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
99 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), 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_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
102 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200103
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100104 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
105 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100106#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200107
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100108 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100110#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100112#endif
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100113
114exit:
115 MD_PSA_DONE();
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200116}
117/* END_CASE */
118
119/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100120void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100121{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200122 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100123#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100124 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100125#else
126 (void) md_name;
127#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100128
Manuel Pégourié-Gonnard6ea8d342023-03-17 09:43:50 +0100129 /* Note: PSA Crypto init not needed for info functions */
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100130
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 md_info = mbedtls_md_info_from_type(md_type);
132 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100133#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100135#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100136
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100137 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
138 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100139#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100140 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100141
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100142 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100143 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
144 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100145 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 }
147 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100148 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100149#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100150}
151/* END_CASE */
152
153/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100154void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000155{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100156 unsigned char *src = (unsigned char *) text_src_string;
157 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100158 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200159 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000160
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100161 MD_PSA_INIT();
162
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100163 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000165
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100166 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000167
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100168 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100169
170exit:
171 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000172}
Paul Bakker33b43f12013-08-20 11:48:36 +0200173/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000174
Paul Bakker33b43f12013-08-20 11:48:36 +0200175/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100176void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000177{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100178 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200179 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000180
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100181 MD_PSA_INIT();
182
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100183 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000185
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100186 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000187
Paul Bakker17373852011-01-06 14:20:01 +0000188
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100189 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100190
191exit:
192 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000193}
Paul Bakker33b43f12013-08-20 11:48:36 +0200194/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000195
Paul Bakker33b43f12013-08-20 11:48:36 +0200196/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100197void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000199{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100200 unsigned char *src = (unsigned char *) text_src_string;
201 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100202 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100203 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200205 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100206 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200207
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100208 MD_PSA_INIT();
209
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 mbedtls_md_init(&ctx);
211 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000212
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100213 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100214
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100215 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100217 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
218 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100219#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100220 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
221 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100222#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000223
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100224 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100226 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
227 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100228
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100229 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
230 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100231 ASSERT_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é-Gonnard4ba98f52023-02-03 12:25:53 +0100234 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100235
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100236 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
237 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100238 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200239
240exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 mbedtls_md_free(&ctx);
242 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100243 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000244}
Paul Bakker33b43f12013-08-20 11:48:36 +0200245/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000246
Paul Bakker33b43f12013-08-20 11:48:36 +0200247/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100248void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000249{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100250 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200251 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100252 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100253 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200254
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100255 MD_PSA_INIT();
256
Gilles Peskine449bd832023-01-11 14:50:10 +0100257 mbedtls_md_init(&ctx);
258 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000259
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100260 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100262 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
263 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100264#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
266 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100267#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000268
Azim Khand30ca132017-06-09 04:32:58 +0100269 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200270
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100271 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100272 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100273 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
274 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100275
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100276 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
277 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100278 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000279
Paul Bakker97c53c22016-07-13 17:20:22 +0100280 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100281 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100282
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100283 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
284 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100285 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200286
287exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 mbedtls_md_free(&ctx);
289 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100290 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000291}
Paul Bakker33b43f12013-08-20 11:48:36 +0200292/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000293
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100294/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100295void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 data_t *key_str, data_t *src_str,
297 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000298{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100299 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000301
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100302 MD_PSA_INIT();
303
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100304 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000306
Paul Bakker17373852011-01-06 14:20:01 +0000307
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100308 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100309 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000310
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100311 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100312
313exit:
314 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000315}
Paul Bakker33b43f12013-08-20 11:48:36 +0200316/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000317
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100318/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100319void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000321{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100322 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323 const mbedtls_md_info_t *md_info = NULL;
324 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100325 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200326
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100327 MD_PSA_INIT();
328
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000330
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100331 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100333 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100334#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100336#endif
Paul Bakker17373852011-01-06 14:20:01 +0000337
Azim Khand30ca132017-06-09 04:32:58 +0100338 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000339
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100340 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100341 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100342 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
343 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
344 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100345
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100346 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100347
348 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100349 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100350
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100351 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
352 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
353 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
354 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200355
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100356 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200357
358exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100359 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100360 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000361}
Paul Bakker33b43f12013-08-20 11:48:36 +0200362/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200363
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100364/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100365void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000367{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100368 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200369 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000370
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100371 MD_PSA_INIT();
372
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100373 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000375
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100376 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000377
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100378 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100379
380exit:
381 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000382}
Paul Bakker33b43f12013-08-20 11:48:36 +0200383/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100384
385/* BEGIN_CASE */
386void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
387{
388 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
389 TEST_ASSERT(md_info != NULL);
390 mbedtls_md_context_t ctx1, ctx2;
391
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100392 /* Intentionally no PSA init here! (Will be done later.) */
393
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100394 mbedtls_md_init(&ctx1);
395 mbedtls_md_init(&ctx2);
396
397 /* Before PSA crypto init */
398 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
399 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
400
401#if defined(MBEDTLS_MD_SOME_PSA)
402 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
403 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
404#endif
405
406 /* Reset ctx1 but keep ctx2 for the cloning test */
407 mbedtls_md_free(&ctx1);
408 mbedtls_md_init(&ctx1);
409
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100410 /* Now initilize PSA Crypto */
411 MD_PSA_INIT();
412
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100413 /* After PSA Crypto init */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100414 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
415#if defined(MBEDTLS_MD_SOME_PSA)
416 TEST_EQUAL(ctx1.engine, post_psa_engine);
417#endif
418
419 /* Cloning test */
420 if (pre_psa_ret == 0) {
421 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
422 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
423 : 0;
424 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
425 }
426
427exit:
428 mbedtls_md_free(&ctx1);
429 mbedtls_md_free(&ctx2);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100430 MD_PSA_DONE();
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100431}
432/* END_CASE */