blob: 0a8e4216ee9dccc153e06b283b116d604ec1dcb6 [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"
Paul Bakker33b43f12013-08-20 11:48:36 +02007/* END_HEADER */
Paul Bakker17373852011-01-06 14:20:01 +00008
Paul Bakker33b43f12013-08-20 11:48:36 +02009/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010010 * depends_on:MBEDTLS_MD_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +020011 * END_DEPENDENCIES
12 */
Paul Bakker5690efc2011-05-26 13:16:06 +000013
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010014/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010015void mbedtls_md_list()
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010016{
17 const int *md_type_ptr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020018 const mbedtls_md_info_t *info;
19 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010020 unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010021
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010022 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010023 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020024
25 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010026 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020027 */
Gilles Peskine449bd832023-01-11 14:50:10 +010028 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
29 info = mbedtls_md_info_from_type(*md_type_ptr);
30 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010031 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
32 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010033 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010034 mbedtls_md_free(&ctx);
Dave Rodgmanc0a09902023-07-05 19:15:53 +010035
Dave Rodgman8dda1312023-07-06 09:30:37 +010036#if defined(MBEDTLS_PSA_CRYPTO_C)
Dave Rodgmanc0a09902023-07-05 19:15:53 +010037 /* Ensure that we can convert to and from a psa_algorithm_t */
38 psa_algorithm_t p = mbedtls_md_psa_alg_from_type(*md_type_ptr);
39 TEST_ASSERT(p != PSA_ALG_NONE);
40 TEST_EQUAL(*md_type_ptr, mbedtls_md_type_from_psa_alg(p));
Dave Rodgman6cc17342023-07-05 20:27:45 +010041#endif
Dave Rodgman8dda1312023-07-06 09:30:37 +010042
43#if defined(MBEDTLS_OID_C)
44 mbedtls_asn1_buf asn1;
45 /* Check that we have an OID definition */
46 TEST_EQUAL(mbedtls_oid_get_oid_by_md((mbedtls_md_type_t) *md_type_ptr,
47 (const char **) &asn1.p, &asn1.len), 0);
48 /* Check that this OID definition maps back to the correct mbedtls_md_type_t */
49 mbedtls_md_type_t m;
50 TEST_EQUAL(mbedtls_oid_get_md_alg(&asn1, &m), 0);
51 TEST_EQUAL(m, *md_type_ptr);
52#endif
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020053 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020054
55exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010056 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010057 MD_PSA_DONE();
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010058}
59/* END_CASE */
60
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020061/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
Valerio Setti2c1070b2024-01-02 14:58:22 +010062void md_to_from_psa(int md_alg_arg, int psa_alg_arg)
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020063{
Valerio Setti2c1070b2024-01-02 14:58:22 +010064 mbedtls_md_type_t md_alg = md_alg_arg;
65 psa_algorithm_t psa_alg = psa_alg_arg;
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020066
Valerio Setti2c1070b2024-01-02 14:58:22 +010067 TEST_EQUAL(mbedtls_md_psa_alg_from_type(md_alg), psa_alg); \
68 TEST_EQUAL(mbedtls_md_type_from_psa_alg(psa_alg), md_alg);
Manuel Pégourié-Gonnard1f6d2e32023-06-06 12:34:45 +020069}
70/* END_CASE */
71
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010072/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010073void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020074{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020075 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010076#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010077 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010078#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020079 unsigned char buf[1] = { 0 };
80
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +010081 MD_PSA_INIT();
Gilles Peskine449bd832023-01-11 14:50:10 +010082 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020083
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010084 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010085#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010086 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010087 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020088
Gilles Peskine449bd832023-01-11 14:50:10 +010089 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
90 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
91 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010092#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020093
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010094 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010095#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010096 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), 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_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
99 TEST_EQUAL(mbedtls_md_starts(&ctx), 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_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
102 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), 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_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
105 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Thomas Daubney5903e9c2023-06-02 10:43:08 +0100106#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(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200109
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100110#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200111#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100112 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200113#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200114
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100115 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
116 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
117 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
118 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200119
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100120 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
121 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
122 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
123 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200124
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100125 TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
126 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200127
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100128 TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
129 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200130
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100131 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
132 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100133#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200134
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +0100135 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100137#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100139#endif
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100140
141exit:
142 MD_PSA_DONE();
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200143}
144/* END_CASE */
145
146/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100147void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100148{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100150#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100151 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100152#else
153 (void) md_name;
154#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100155
Manuel Pégourié-Gonnard6ea8d342023-03-17 09:43:50 +0100156 /* Note: PSA Crypto init not needed for info functions */
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100157
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 md_info = mbedtls_md_info_from_type(md_type);
159 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100160#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100162#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100163
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100164 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
165 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100166#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100167 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100168
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100169 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
171 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100172 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100173 }
174 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100175 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100176#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100177}
178/* END_CASE */
179
180/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100181void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000182{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100183 unsigned char *src = (unsigned char *) text_src_string;
184 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100185 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200186 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000187
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100188 MD_PSA_INIT();
189
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100190 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000192
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100193 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000194
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100195 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100196
197exit:
198 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000199}
Paul Bakker33b43f12013-08-20 11:48:36 +0200200/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000201
Paul Bakker33b43f12013-08-20 11:48:36 +0200202/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100203void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000204{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100205 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000207
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100208 MD_PSA_INIT();
209
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100210 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100211 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000212
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100213 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000214
Paul Bakker17373852011-01-06 14:20:01 +0000215
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100216 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100217
218exit:
219 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000220}
Paul Bakker33b43f12013-08-20 11:48:36 +0200221/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000222
Paul Bakker33b43f12013-08-20 11:48:36 +0200223/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100224void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100225 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000226{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100227 unsigned char *src = (unsigned char *) text_src_string;
228 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100229 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100230 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200232 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100233 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200234
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100235 MD_PSA_INIT();
236
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 mbedtls_md_init(&ctx);
238 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000239
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100240 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100241
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100242 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100244 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
245 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100246#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100247 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
248 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100249#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000250
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100251 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100253 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
254 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
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, src + halfway, src_len - halfway));
257 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100258 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000259
Paul Bakker97c53c22016-07-13 17:20:22 +0100260 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100261 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100262
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100263 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
264 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100265 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200266
267exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 mbedtls_md_free(&ctx);
269 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100270 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000271}
Paul Bakker33b43f12013-08-20 11:48:36 +0200272/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000273
Paul Bakker33b43f12013-08-20 11:48:36 +0200274/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100275void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000276{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100277 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200278 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100279 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100280 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200281
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100282 MD_PSA_INIT();
283
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 mbedtls_md_init(&ctx);
285 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000286
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100287 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100289 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
290 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100291#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
293 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100294#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000295
Azim Khand30ca132017-06-09 04:32:58 +0100296 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200297
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100298 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100300 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
301 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
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, src_str->x + halfway, src_str->len - halfway));
304 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100305 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000306
Paul Bakker97c53c22016-07-13 17:20:22 +0100307 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100308 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100309
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100310 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
311 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100312 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200313
314exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 mbedtls_md_free(&ctx);
316 mbedtls_md_free(&ctx_copy);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100317 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000318}
Paul Bakker33b43f12013-08-20 11:48:36 +0200319/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000320
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100321/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100322void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 data_t *key_str, data_t *src_str,
324 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000325{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100326 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000328
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100329 MD_PSA_INIT();
330
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);
Paul Bakker17373852011-01-06 14:20:01 +0000333
Paul Bakker17373852011-01-06 14:20:01 +0000334
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100335 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100336 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000337
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100338 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100339
340exit:
341 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000342}
Paul Bakker33b43f12013-08-20 11:48:36 +0200343/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000344
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100345/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100346void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000348{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100349 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350 const mbedtls_md_info_t *md_info = NULL;
351 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100352 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200353
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100354 MD_PSA_INIT();
355
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000357
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100358 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100359 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100360 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100361#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100362 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100363#endif
Paul Bakker17373852011-01-06 14:20:01 +0000364
Azim Khand30ca132017-06-09 04:32:58 +0100365 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000366
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100367 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100368 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100369 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
370 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
371 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100372
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100373 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100374
375 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100376 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100377
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100378 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
379 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
380 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
381 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200382
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100383 TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200384
385exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100387 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000388}
Paul Bakker33b43f12013-08-20 11:48:36 +0200389/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200390
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100391/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100392void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100393 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000394{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100395 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200396 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000397
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100398 MD_PSA_INIT();
399
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100400 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100401 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000402
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100403 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000404
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100405 TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100406
407exit:
408 MD_PSA_DONE();
Paul Bakker17373852011-01-06 14:20:01 +0000409}
Paul Bakker33b43f12013-08-20 11:48:36 +0200410/* END_CASE */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100411
412/* BEGIN_CASE */
413void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
414{
415 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100416 mbedtls_md_context_t ctx1, ctx2;
417
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100418 /* Intentionally no PSA init here! (Will be done later.) */
419
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100420 mbedtls_md_init(&ctx1);
421 mbedtls_md_init(&ctx2);
422
Dave Rodgman0c2d1af2023-07-05 20:23:09 +0100423 TEST_ASSERT(md_info != NULL);
424
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100425 /* Before PSA crypto init */
426 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
427 TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));
428
429#if defined(MBEDTLS_MD_SOME_PSA)
430 TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
431 TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
432#endif
433
434 /* Reset ctx1 but keep ctx2 for the cloning test */
435 mbedtls_md_free(&ctx1);
436 mbedtls_md_init(&ctx1);
437
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100438 /* Now initilize PSA Crypto */
439 MD_PSA_INIT();
440
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100441 /* After PSA Crypto init */
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100442 TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
443#if defined(MBEDTLS_MD_SOME_PSA)
444 TEST_EQUAL(ctx1.engine, post_psa_engine);
445#endif
446
447 /* Cloning test */
448 if (pre_psa_ret == 0) {
449 int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
450 ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
451 : 0;
452 TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
453 }
454
455exit:
456 mbedtls_md_free(&ctx1);
457 mbedtls_md_free(&ctx2);
Manuel Pégourié-Gonnardec31f292023-03-14 11:03:37 +0100458 MD_PSA_DONE();
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100459}
460/* END_CASE */