blob: 63d5d0ae8b97990652030be32b5be109815e121e [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"
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +02003#include "md_psa.h"
4
5#define MD_PSA(md, psa) \
6 TEST_EQUAL(mbedtls_md_psa_alg_from_type(md), psa); \
7 TEST_EQUAL(mbedtls_md_type_from_psa_alg(psa), md);
Paul Bakker33b43f12013-08-20 11:48:36 +02008/* END_HEADER */
Paul Bakker17373852011-01-06 14:20:01 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010011 * depends_on:MBEDTLS_MD_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +020012 * END_DEPENDENCIES
13 */
Paul Bakker5690efc2011-05-26 13:16:06 +000014
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010015/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010016void mbedtls_md_list()
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010017{
18 const int *md_type_ptr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020019 const mbedtls_md_info_t *info;
20 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010021 unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010022
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010023 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010024 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020025
26 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010027 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020028 */
Gilles Peskine449bd832023-01-11 14:50:10 +010029 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
30 info = mbedtls_md_info_from_type(*md_type_ptr);
31 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010032 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
33 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010034 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010035 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020036 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020037
38exit:
Gilles 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
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020044/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
45void md_to_from_psa()
46{
47 /* We use a simplified implementation that relies on numerical values
48 * being aligned, so make sure they remain so. */
49 MD_PSA(MBEDTLS_MD_MD5, PSA_ALG_MD5);
50 MD_PSA(MBEDTLS_MD_RIPEMD160, PSA_ALG_RIPEMD160);
51 MD_PSA(MBEDTLS_MD_SHA1, PSA_ALG_SHA_1);
52 MD_PSA(MBEDTLS_MD_SHA224, PSA_ALG_SHA_224);
53 MD_PSA(MBEDTLS_MD_SHA256, PSA_ALG_SHA_256);
54 MD_PSA(MBEDTLS_MD_SHA384, PSA_ALG_SHA_384);
55 MD_PSA(MBEDTLS_MD_SHA512, PSA_ALG_SHA_512);
56 MD_PSA(MBEDTLS_MD_SHA3_224, PSA_ALG_SHA3_224);
57 MD_PSA(MBEDTLS_MD_SHA3_256, PSA_ALG_SHA3_256);
58 MD_PSA(MBEDTLS_MD_SHA3_384, PSA_ALG_SHA3_384);
59 MD_PSA(MBEDTLS_MD_SHA3_512, PSA_ALG_SHA3_512);
60
Manuel Pégourié-Gonnard0f5fc1a2023-06-28 09:42:04 +020061 /* Don't test for NONE<->NONE as this is not guaranteed */
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020062}
63/* END_CASE */
64
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010065/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010066void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020067{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010069#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010070 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010071#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020072 unsigned char buf[1] = { 0 };
73
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010074 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010075 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020076
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010077 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010078#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010079 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010080 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020081
Gilles Peskine449bd832023-01-11 14:50:10 +010082 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
83 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
84 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010085#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020086
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010087 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010088#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010089 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020090
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010091 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
92 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020093
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010094 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
95 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), 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_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
98 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Thomas Daubney5903e9c2023-06-02 10:43:08 +010099#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200100
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100101 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200102
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100103#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200104#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100105 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200106#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200107
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100108 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
109 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
110 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
111 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200112
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100113 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
114 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
115 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
116 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200117
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100118 TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
119 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200120
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100121 TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
122 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200123
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100124 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
125 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100126#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200127
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100128 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100129 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100130#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100132#endif
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100133
134exit:
135 MD_PSA_DONE();
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200136}
137/* END_CASE */
138
139/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100140void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100141{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200142 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100143#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100144 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100145#else
146 (void) md_name;
147#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100148
Manuel Pégourié-Gonnard6ea8d342023-03-17 09:43:50 +0100149 /* Note: PSA Crypto init not needed for info functions */
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100150
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 md_info = mbedtls_md_info_from_type(md_type);
152 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100153#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100155#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100156
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100157 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
158 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100159#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100160 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100161
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100162 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
164 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100165 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 }
167 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100168 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100169#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100170}
171/* END_CASE */
172
173/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100174void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000175{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100176 unsigned char *src = (unsigned char *) text_src_string;
177 size_t src_len = strlen(text_src_string);
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, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000187
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100188 TEST_BUFFERS_EQUAL(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_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000197{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100198 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200199 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000200
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100201 MD_PSA_INIT();
202
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100203 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000205
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100206 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000207
Paul Bakker17373852011-01-06 14:20:01 +0000208
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100209 TEST_BUFFERS_EQUAL(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100210
211exit:
212 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000213}
Paul Bakker33b43f12013-08-20 11:48:36 +0200214/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000215
Paul Bakker33b43f12013-08-20 11:48:36 +0200216/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100217void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100218 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000219{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100220 unsigned char *src = (unsigned char *) text_src_string;
221 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100222 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100223 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100226 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200227
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100228 MD_PSA_INIT();
229
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 mbedtls_md_init(&ctx);
231 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000232
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100233 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100234
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100235 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100237 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
238 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100239#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
241 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100242#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000243
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100244 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100246 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
247 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100248
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100249 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
250 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100251 TEST_BUFFERS_EQUAL(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000252
Paul Bakker97c53c22016-07-13 17:20:22 +0100253 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100254 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100255
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100256 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
257 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100258 TEST_BUFFERS_EQUAL(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200259
260exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 mbedtls_md_free(&ctx);
262 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100263 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000264}
Paul Bakker33b43f12013-08-20 11:48:36 +0200265/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000266
Paul Bakker33b43f12013-08-20 11:48:36 +0200267/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100268void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000269{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100270 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100272 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100273 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200274
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100275 MD_PSA_INIT();
276
Gilles Peskine449bd832023-01-11 14:50:10 +0100277 mbedtls_md_init(&ctx);
278 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000279
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100280 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100282 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
283 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100284#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
286 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100287#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000288
Azim Khand30ca132017-06-09 04:32:58 +0100289 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200290
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100291 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100293 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
294 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100295
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100296 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
297 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100298 TEST_BUFFERS_EQUAL(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000299
Paul Bakker97c53c22016-07-13 17:20:22 +0100300 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100301 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100302
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100303 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
304 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100305 TEST_BUFFERS_EQUAL(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200306
307exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 mbedtls_md_free(&ctx);
309 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100310 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000311}
Paul Bakker33b43f12013-08-20 11:48:36 +0200312/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000313
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100314/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100315void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100316 data_t *key_str, data_t *src_str,
317 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000318{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100319 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200320 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000321
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100322 MD_PSA_INIT();
323
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100324 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100325 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000326
Paul Bakker17373852011-01-06 14:20:01 +0000327
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100328 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100329 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000330
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100331 TEST_BUFFERS_EQUAL(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100332
333exit:
334 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000335}
Paul Bakker33b43f12013-08-20 11:48:36 +0200336/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000337
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100338/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100339void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100340 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000341{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100342 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 const mbedtls_md_info_t *md_info = NULL;
344 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100345 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200346
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100347 MD_PSA_INIT();
348
Gilles Peskine449bd832023-01-11 14:50:10 +0100349 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000350
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100351 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100352 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100353 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100354#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100355 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100356#endif
Paul Bakker17373852011-01-06 14:20:01 +0000357
Azim Khand30ca132017-06-09 04:32:58 +0100358 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000359
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100360 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100362 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
363 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
364 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100365
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100366 TEST_BUFFERS_EQUAL(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100367
368 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100369 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100370
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100371 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
372 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
373 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
374 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200375
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100376 TEST_BUFFERS_EQUAL(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200377
378exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100380 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000381}
Paul Bakker33b43f12013-08-20 11:48:36 +0200382/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200383
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100384/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100385void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000387{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100388 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000390
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100391 MD_PSA_INIT();
392
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100393 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000395
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100396 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000397
Tom Cosgrove65cd8512023-07-20 16:46:01 +0100398 TEST_BUFFERS_EQUAL(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100399
400exit:
401 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000402}
Paul Bakker33b43f12013-08-20 11:48:36 +0200403/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100404
405/* BEGIN_CASE */
406void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
407{
408 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
409 TEST_ASSERT(md_info != NULL);
410 mbedtls_md_context_t ctx1, ctx2;
411
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100412 /* Intentionally no PSA init here! (Will be done later.) */
413
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100414 mbedtls_md_init(&ctx1);
415 mbedtls_md_init(&ctx2);
416
417 /* Before PSA crypto init */
418 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
419 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
420
421#if defined(MBEDTLS_MD_SOME_PSA)
422 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
423 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
424#endif
425
426 /* Reset ctx1 but keep ctx2 for the cloning test */
427 mbedtls_md_free(&ctx1);
428 mbedtls_md_init(&ctx1);
429
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100430 /* Now initilize PSA Crypto */
431 MD_PSA_INIT();
432
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100433 /* After PSA Crypto init */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100434 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
435#if defined(MBEDTLS_MD_SOME_PSA)
436 TEST_EQUAL(ctx1.engine, post_psa_engine);
437#endif
438
439 /* Cloning test */
440 if (pre_psa_ret == 0) {
441 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
442 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
443 : 0;
444 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
445 }
446
447exit:
448 mbedtls_md_free(&ctx1);
449 mbedtls_md_free(&ctx2);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100450 MD_PSA_DONE();
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100451}
452/* END_CASE */