blob: 4497d042e3e6ac10ce67da5debafe38cc1420824 [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"
Valerio Setti384fbde2024-01-02 13:26:40 +01003#include "mbedtls/psa_util.h"
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +02004
Dave Rodgman8dda1312023-07-06 09:30:37 +01005#include "mbedtls/oid.h"
6#include "mbedtls/asn1.h"
Valerio Setti9b2d7382024-01-09 08:41:21 +01007
8#define MD_PSA(md, psa) \
9 TEST_EQUAL(mbedtls_md_psa_alg_from_type(md), psa); \
10 TEST_EQUAL(mbedtls_md_type_from_psa_alg(psa), md);
Paul Bakker33b43f12013-08-20 11:48:36 +020011/* END_HEADER */
Paul Bakker17373852011-01-06 14:20:01 +000012
Paul Bakker33b43f12013-08-20 11:48:36 +020013/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010014 * depends_on:MBEDTLS_MD_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +020015 * END_DEPENDENCIES
16 */
Paul Bakker5690efc2011-05-26 13:16:06 +000017
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010018/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010019void mbedtls_md_list()
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010020{
21 const int *md_type_ptr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020022 const mbedtls_md_info_t *info;
23 mbedtls_md_context_t ctx;
Gilles Peskine8369b4a2024-11-04 18:21:57 +010024 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010025 unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010026
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010027 MD_PSA_INIT();
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020028
29 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010030 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020031 */
Gilles Peskine449bd832023-01-11 14:50:10 +010032 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
33 info = mbedtls_md_info_from_type(*md_type_ptr);
34 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010035 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
36 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010037 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010038 mbedtls_md_free(&ctx);
Dave Rodgmanc0a09902023-07-05 19:15:53 +010039
Dave Rodgman8dda1312023-07-06 09:30:37 +010040#if defined(MBEDTLS_PSA_CRYPTO_C)
Dave Rodgmanc0a09902023-07-05 19:15:53 +010041 /* Ensure that we can convert to and from a psa_algorithm_t */
42 psa_algorithm_t p = mbedtls_md_psa_alg_from_type(*md_type_ptr);
43 TEST_ASSERT(p != PSA_ALG_NONE);
44 TEST_EQUAL(*md_type_ptr, mbedtls_md_type_from_psa_alg(p));
Dave Rodgman6cc17342023-07-05 20:27:45 +010045#endif
Dave Rodgman8dda1312023-07-06 09:30:37 +010046
47#if defined(MBEDTLS_OID_C)
48 mbedtls_asn1_buf asn1;
49 /* Check that we have an OID definition */
50 TEST_EQUAL(mbedtls_oid_get_oid_by_md((mbedtls_md_type_t) *md_type_ptr,
51 (const char **) &asn1.p, &asn1.len), 0);
52 /* Check that this OID definition maps back to the correct mbedtls_md_type_t */
53 mbedtls_md_type_t m;
54 TEST_EQUAL(mbedtls_oid_get_md_alg(&asn1, &m), 0);
55 TEST_EQUAL(m, *md_type_ptr);
56#endif
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020057 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020058
59exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010060 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010061 MD_PSA_DONE();
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010062}
63/* END_CASE */
64
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020065/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
Valerio Setti9b2d7382024-01-09 08:41:21 +010066void md_to_from_psa()
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020067{
Valerio Setti9b2d7382024-01-09 08:41:21 +010068 /* We use a simplified implementation that relies on numerical values
69 * being aligned, so make sure they remain so. */
70 MD_PSA(MBEDTLS_MD_MD5, PSA_ALG_MD5);
71 MD_PSA(MBEDTLS_MD_RIPEMD160, PSA_ALG_RIPEMD160);
72 MD_PSA(MBEDTLS_MD_SHA1, PSA_ALG_SHA_1);
73 MD_PSA(MBEDTLS_MD_SHA224, PSA_ALG_SHA_224);
74 MD_PSA(MBEDTLS_MD_SHA256, PSA_ALG_SHA_256);
75 MD_PSA(MBEDTLS_MD_SHA384, PSA_ALG_SHA_384);
76 MD_PSA(MBEDTLS_MD_SHA512, PSA_ALG_SHA_512);
77 MD_PSA(MBEDTLS_MD_SHA3_224, PSA_ALG_SHA3_224);
78 MD_PSA(MBEDTLS_MD_SHA3_256, PSA_ALG_SHA3_256);
79 MD_PSA(MBEDTLS_MD_SHA3_384, PSA_ALG_SHA3_384);
80 MD_PSA(MBEDTLS_MD_SHA3_512, PSA_ALG_SHA3_512);
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020081
Valerio Setti9b2d7382024-01-09 08:41:21 +010082 /* Don't test for NONE<->NONE as this is not guaranteed */
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020083}
84/* END_CASE */
85
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010086/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010087void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020088{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089 mbedtls_md_context_t ctx;
Gilles Peskine8369b4a2024-11-04 18:21:57 +010090 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010091#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010092 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010093#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020094 unsigned char buf[1] = { 0 };
95
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010096 MD_PSA_INIT();
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020097
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010098 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010099#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +0100100 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100101 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200102
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
104 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
105 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
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é-Gonnardf5e23312023-02-03 12:51:03 +0100108 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100109#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100110 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200111
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100112 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
113 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200114
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100115 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
116 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), 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_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
119 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Thomas Daubney5903e9c2023-06-02 10:43:08 +0100120#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200121
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100122 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200123
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100124#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200125#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100126 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200127#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200128
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100129 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
130 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
131 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
132 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200133
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100134 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
135 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
136 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
137 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200138
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100139 TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
140 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200141
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100142 TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
143 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200144
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100145 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
146 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100147#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200148
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100149 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100151#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100153#endif
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100154
155exit:
156 MD_PSA_DONE();
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200157}
158/* END_CASE */
159
160/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100161void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100162{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200163 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100164#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100165 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100166#else
167 (void) md_name;
168#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100169
Manuel Pégourié-Gonnard6ea8d342023-03-17 09:43:50 +0100170 /* Note: PSA Crypto init not needed for info functions */
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100171
Gilles Peskine449bd832023-01-11 14:50:10 +0100172 md_info = mbedtls_md_info_from_type(md_type);
173 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100174#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100175 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100176#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100177
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100178 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
179 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100180#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100181 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100182
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100183 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
185 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100186 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100187 }
188 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100189 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100190#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100191}
192/* END_CASE */
193
194/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100195void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000196{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100197 unsigned char *src = (unsigned char *) text_src_string;
198 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100199 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200200 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000201
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100202 MD_PSA_INIT();
203
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100204 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100205 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000206
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100207 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000208
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100209 TEST_MEMORY_COMPARE(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_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000218{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100219 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200220 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000221
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100222 MD_PSA_INIT();
223
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100224 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000226
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100227 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000228
Paul Bakker17373852011-01-06 14:20:01 +0000229
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100230 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100231
232exit:
233 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000234}
Paul Bakker33b43f12013-08-20 11:48:36 +0200235/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000236
Paul Bakker33b43f12013-08-20 11:48:36 +0200237/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100238void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100239 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000240{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100241 unsigned char *src = (unsigned char *) text_src_string;
242 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100243 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100244 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200246 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100247 mbedtls_md_context_t ctx, ctx_copy;
Gilles Peskine449bd832023-01-11 14:50:10 +0100248 mbedtls_md_init(&ctx);
249 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000250
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100251 MD_PSA_INIT();
252
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100253 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100254
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100255 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100257 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
258 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100259#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
261 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100262#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000263
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100264 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100266 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
267 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100268
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100269 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
270 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100271 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000272
Paul Bakker97c53c22016-07-13 17:20:22 +0100273 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100274 memset(output, 0x00, sizeof(output));
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_copy, src + halfway, src_len - halfway));
277 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100278 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200279
280exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 mbedtls_md_free(&ctx);
282 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100283 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000284}
Paul Bakker33b43f12013-08-20 11:48:36 +0200285/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000286
Paul Bakker33b43f12013-08-20 11:48:36 +0200287/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100288void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000289{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100290 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100292 mbedtls_md_context_t ctx, ctx_copy;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100293 mbedtls_md_init(&ctx);
294 mbedtls_md_init(&ctx_copy);
Azim Khanf1aaec92017-05-30 14:23:15 +0100295 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200296
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100297 MD_PSA_INIT();
298
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100299 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100301 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
302 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100303#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
305 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100306#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000307
Azim Khand30ca132017-06-09 04:32:58 +0100308 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200309
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100310 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100312 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
313 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100314
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100315 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
316 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100317 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000318
Paul Bakker97c53c22016-07-13 17:20:22 +0100319 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100320 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100321
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100322 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
323 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100324 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200325
326exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 mbedtls_md_free(&ctx);
328 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100329 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000330}
Paul Bakker33b43f12013-08-20 11:48:36 +0200331/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000332
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100333/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100334void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 data_t *key_str, data_t *src_str,
336 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000337{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100338 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000340
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100341 MD_PSA_INIT();
342
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100343 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000345
Paul Bakker17373852011-01-06 14:20:01 +0000346
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100347 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100348 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000349
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100350 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100351
352exit:
353 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000354}
Paul Bakker33b43f12013-08-20 11:48:36 +0200355/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000356
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100357/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100358void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100359 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000360{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100361 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200362 const mbedtls_md_info_t *md_info = NULL;
363 mbedtls_md_context_t ctx;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100364 mbedtls_md_init(&ctx);
Azim Khanf1aaec92017-05-30 14:23:15 +0100365 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200366
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100367 MD_PSA_INIT();
368
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100369 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100370 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100371 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100372#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100374#endif
Paul Bakker17373852011-01-06 14:20:01 +0000375
Azim Khand30ca132017-06-09 04:32:58 +0100376 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000377
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100378 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100380 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
381 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
382 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100383
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100384 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100385
386 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100387 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100388
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100389 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
390 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
391 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
392 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200393
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100394 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200395
396exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100398 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000399}
Paul Bakker33b43f12013-08-20 11:48:36 +0200400/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200401
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100402/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100403void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000405{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100406 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000408
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100409 MD_PSA_INIT();
410
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100411 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000413
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100414 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000415
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100416 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100417
418exit:
419 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000420}
Paul Bakker33b43f12013-08-20 11:48:36 +0200421/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100422
Valerio Settic5163072024-09-13 10:55:22 +0200423/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100424void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
425{
426 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100427 mbedtls_md_context_t ctx1, ctx2;
428
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100429 /* Intentionally no PSA init here! (Will be done later.) */
430
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100431 mbedtls_md_init(&ctx1);
432 mbedtls_md_init(&ctx2);
433
Dave Rodgman0c2d1af2023-07-05 20:23:09 +0100434 TEST_ASSERT(md_info != NULL);
435
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100436 /* Before PSA crypto init */
437 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
438 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
439
440#if defined(MBEDTLS_MD_SOME_PSA)
441 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
442 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
443#endif
444
445 /* Reset ctx1 but keep ctx2 for the cloning test */
446 mbedtls_md_free(&ctx1);
447 mbedtls_md_init(&ctx1);
448
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100449 /* Now initilize PSA Crypto */
450 MD_PSA_INIT();
451
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100452 /* After PSA Crypto init */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100453 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
454#if defined(MBEDTLS_MD_SOME_PSA)
455 TEST_EQUAL(ctx1.engine, post_psa_engine);
456#endif
457
458 /* Cloning test */
459 if (pre_psa_ret == 0) {
460 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
461 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
462 : 0;
463 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
464 }
465
466exit:
467 mbedtls_md_free(&ctx1);
468 mbedtls_md_free(&ctx2);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100469 MD_PSA_DONE();
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100470}
471/* END_CASE */