blob: 7a108912388d888feeeaf7931747a15c699cd3e4 [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"
Dave Rodgman8dda1312023-07-06 09:30:37 +01004#include "mbedtls/oid.h"
5#include "mbedtls/asn1.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02006/* END_HEADER */
Paul Bakker17373852011-01-06 14:20:01 +00007
Paul Bakker33b43f12013-08-20 11:48:36 +02008/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +01009 * depends_on:MBEDTLS_MD_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +020010 * END_DEPENDENCIES
11 */
Paul Bakker5690efc2011-05-26 13:16:06 +000012
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010013/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010014void mbedtls_md_list()
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010015{
16 const int *md_type_ptr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020017 const mbedtls_md_info_t *info;
18 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010019 unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010020
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010021 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010022 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020023
24 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010025 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020026 */
Gilles Peskine449bd832023-01-11 14:50:10 +010027 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
28 info = mbedtls_md_info_from_type(*md_type_ptr);
29 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010030 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
31 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010032 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010033 mbedtls_md_free(&ctx);
Dave Rodgmanc0a09902023-07-05 19:15:53 +010034
Dave Rodgman8dda1312023-07-06 09:30:37 +010035#if defined(MBEDTLS_PSA_CRYPTO_C)
Dave Rodgmanc0a09902023-07-05 19:15:53 +010036 /* Ensure that we can convert to and from a psa_algorithm_t */
37 psa_algorithm_t p = mbedtls_md_psa_alg_from_type(*md_type_ptr);
38 TEST_ASSERT(p != PSA_ALG_NONE);
39 TEST_EQUAL(*md_type_ptr, mbedtls_md_type_from_psa_alg(p));
Dave Rodgman6cc17342023-07-05 20:27:45 +010040#endif
Dave Rodgman8dda1312023-07-06 09:30:37 +010041
42#if defined(MBEDTLS_OID_C)
43 mbedtls_asn1_buf asn1;
44 /* Check that we have an OID definition */
45 TEST_EQUAL(mbedtls_oid_get_oid_by_md((mbedtls_md_type_t) *md_type_ptr,
46 (const char **) &asn1.p, &asn1.len), 0);
47 /* Check that this OID definition maps back to the correct mbedtls_md_type_t */
48 mbedtls_md_type_t m;
49 TEST_EQUAL(mbedtls_oid_get_md_alg(&asn1, &m), 0);
50 TEST_EQUAL(m, *md_type_ptr);
51#endif
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020052 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020053
54exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010055 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010056 MD_PSA_DONE();
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010057}
58/* END_CASE */
59
60/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010061void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020062{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020063 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010064#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010065 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010066#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020067 unsigned char buf[1] = { 0 };
68
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010069 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010070 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020071
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010072 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010073#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010074 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010075 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020076
Gilles Peskine449bd832023-01-11 14:50:10 +010077 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
78 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
79 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010080#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020081
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010082 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010083#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010084 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020085
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010086 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
87 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020088
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010089 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
90 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), 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_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
93 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Thomas Daubney5903e9c2023-06-02 10:43:08 +010094#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020095
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010096 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020097
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010098#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020099#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100100 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200101#endif
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_starts(NULL, buf, 1),
104 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
105 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
106 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
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_update(NULL, buf, 1),
109 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
110 TEST_EQUAL(mbedtls_md_hmac_update(&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_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
114 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200115
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100116 TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
117 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200118
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100119 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
120 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100121#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200122
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100123 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100125#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100127#endif
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100128
129exit:
130 MD_PSA_DONE();
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200131}
132/* END_CASE */
133
134/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100135void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100136{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200137 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100138#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100139 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100140#else
141 (void) md_name;
142#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100143
Manuel Pégourié-Gonnard6ea8d342023-03-17 09:43:50 +0100144 /* Note: PSA Crypto init not needed for info functions */
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100145
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 md_info = mbedtls_md_info_from_type(md_type);
147 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100148#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100150#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100151
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100152 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
153 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100154#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100155 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100156
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100157 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
159 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100160 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 }
162 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100163 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100164#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100165}
166/* END_CASE */
167
168/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100169void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000170{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100171 unsigned char *src = (unsigned char *) text_src_string;
172 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100173 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200174 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000175
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100176 MD_PSA_INIT();
177
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100178 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000180
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100181 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000182
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100183 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100184
185exit:
186 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000187}
Paul Bakker33b43f12013-08-20 11:48:36 +0200188/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000189
Paul Bakker33b43f12013-08-20 11:48:36 +0200190/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100191void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000192{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100193 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200194 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000195
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100196 MD_PSA_INIT();
197
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100198 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100199 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000200
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100201 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000202
Paul Bakker17373852011-01-06 14:20:01 +0000203
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100204 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100205
206exit:
207 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000208}
Paul Bakker33b43f12013-08-20 11:48:36 +0200209/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000210
Paul Bakker33b43f12013-08-20 11:48:36 +0200211/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100212void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000214{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100215 unsigned char *src = (unsigned char *) text_src_string;
216 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100217 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100218 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200220 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100221 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200222
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100223 MD_PSA_INIT();
224
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 mbedtls_md_init(&ctx);
226 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000227
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100228 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100229
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100230 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100232 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
233 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100234#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
236 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100237#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000238
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100239 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100241 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
242 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100243
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100244 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
245 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100246 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000247
Paul Bakker97c53c22016-07-13 17:20:22 +0100248 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100249 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100250
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100251 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
252 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100253 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200254
255exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 mbedtls_md_free(&ctx);
257 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100258 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000259}
Paul Bakker33b43f12013-08-20 11:48:36 +0200260/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000261
Paul Bakker33b43f12013-08-20 11:48:36 +0200262/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100263void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000264{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100265 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200266 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100267 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100268 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200269
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100270 MD_PSA_INIT();
271
Gilles Peskine449bd832023-01-11 14:50:10 +0100272 mbedtls_md_init(&ctx);
273 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000274
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100275 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100277 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
278 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100279#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100280 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
281 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100282#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000283
Azim Khand30ca132017-06-09 04:32:58 +0100284 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200285
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100286 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100288 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
289 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100290
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100291 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
292 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100293 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000294
Paul Bakker97c53c22016-07-13 17:20:22 +0100295 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100296 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100297
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100298 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
299 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100300 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200301
302exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100303 mbedtls_md_free(&ctx);
304 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100305 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000306}
Paul Bakker33b43f12013-08-20 11:48:36 +0200307/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000308
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100309/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100310void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 data_t *key_str, data_t *src_str,
312 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000313{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100314 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000316
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100317 MD_PSA_INIT();
318
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100319 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100320 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000321
Paul Bakker17373852011-01-06 14:20:01 +0000322
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100323 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100324 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000325
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100326 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100327
328exit:
329 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 md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100335 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000336{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100337 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338 const mbedtls_md_info_t *md_info = NULL;
339 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100340 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200341
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100342 MD_PSA_INIT();
343
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000345
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100346 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100348 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100349#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100351#endif
Paul Bakker17373852011-01-06 14:20:01 +0000352
Azim Khand30ca132017-06-09 04:32:58 +0100353 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000354
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100355 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100357 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
358 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
359 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100360
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100361 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100362
363 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100364 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100365
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100366 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
367 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
368 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
369 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200370
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100371 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200372
373exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100375 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000376}
Paul Bakker33b43f12013-08-20 11:48:36 +0200377/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200378
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100379/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100380void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100381 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000382{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100383 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000385
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100386 MD_PSA_INIT();
387
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100388 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000390
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100391 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000392
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100393 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100394
395exit:
396 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000397}
Paul Bakker33b43f12013-08-20 11:48:36 +0200398/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100399
400/* BEGIN_CASE */
401void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
402{
403 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100404 mbedtls_md_context_t ctx1, ctx2;
405
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100406 /* Intentionally no PSA init here! (Will be done later.) */
407
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100408 mbedtls_md_init(&ctx1);
409 mbedtls_md_init(&ctx2);
410
Dave Rodgman0c2d1af2023-07-05 20:23:09 +0100411 TEST_ASSERT(md_info != NULL);
412
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100413 /* Before PSA crypto init */
414 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
415 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
416
417#if defined(MBEDTLS_MD_SOME_PSA)
418 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
419 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
420#endif
421
422 /* Reset ctx1 but keep ctx2 for the cloning test */
423 mbedtls_md_free(&ctx1);
424 mbedtls_md_init(&ctx1);
425
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100426 /* Now initilize PSA Crypto */
427 MD_PSA_INIT();
428
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100429 /* After PSA Crypto init */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100430 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
431#if defined(MBEDTLS_MD_SOME_PSA)
432 TEST_EQUAL(ctx1.engine, post_psa_engine);
433#endif
434
435 /* Cloning test */
436 if (pre_psa_ret == 0) {
437 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
438 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
439 : 0;
440 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
441 }
442
443exit:
444 mbedtls_md_free(&ctx1);
445 mbedtls_md_free(&ctx2);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100446 MD_PSA_DONE();
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100447}
448/* END_CASE */