blob: 1e8622be0f8b00c0b471b8bb151d2f4680086006 [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"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker17373852011-01-06 14:20:01 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +01006 * depends_on:MBEDTLS_MD_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010010/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010011void mbedtls_md_list()
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010012{
13 const int *md_type_ptr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020014 const mbedtls_md_info_t *info;
15 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010016 unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010017
Gilles Peskine449bd832023-01-11 14:50:10 +010018 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020019
20 /*
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010021 * Test that mbedtls_md_list() only returns valid MDs.
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020022 */
Gilles Peskine449bd832023-01-11 14:50:10 +010023 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
24 info = mbedtls_md_info_from_type(*md_type_ptr);
25 TEST_ASSERT(info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010026 TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
27 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Manuel Pégourié-Gonnardba2412f2023-02-16 18:44:46 +010028 TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
Gilles Peskine449bd832023-01-11 14:50:10 +010029 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardedb242f2014-04-02 17:52:04 +020030 }
Paul Bakkerbd51b262014-07-10 15:26:12 +020031
32exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010033 mbedtls_md_free(&ctx);
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +010034}
35/* END_CASE */
36
37/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010038void md_null_args()
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020039{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010041#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010042 const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010043#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020044 unsigned char buf[1] = { 0 };
45
Gilles Peskine449bd832023-01-11 14:50:10 +010046 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020047
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010048 TEST_EQUAL(0, mbedtls_md_get_size(NULL));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010049#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnard2189fda2023-02-09 09:18:22 +010050 TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +010051 TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020052
Gilles Peskine449bd832023-01-11 14:50:10 +010053 TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
54 TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
55 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010056#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020057
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010058 TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010059#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010060 TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010061#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020062
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010063 TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
64 TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020065
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010066 TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
67 TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020068
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010069 TEST_EQUAL(mbedtls_md_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
70 TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020071
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010072 TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020073
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010074#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020075#if defined(MBEDTLS_FS_IO)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010076 TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020077#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020078
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010079 TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
80 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
81 TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
82 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020083
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010084 TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
85 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
86 TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
87 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_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
90 TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), 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_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
93 TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020094
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +010095 TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
96 MBEDTLS_ERR_MD_BAD_INPUT_DATA);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010097#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +020098
Manuel Pégourié-Gonnard19d644b2015-03-26 12:42:35 +010099 /* Ok, this is not NULL arg but NULL return... */
Gilles Peskine449bd832023-01-11 14:50:10 +0100100 TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100101#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100103#endif
Manuel Pégourié-Gonnardb25f8162014-06-13 16:34:30 +0200104}
105/* END_CASE */
106
107/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100108void md_info(int md_type, char *md_name, int md_size)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100109{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110 const mbedtls_md_info_t *md_info;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100111#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100112 const int *md_type_ptr;
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100113#else
114 (void) md_name;
115#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100116
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 md_info = mbedtls_md_info_from_type(md_type);
118 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100119#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100121#endif
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100122
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100123 TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
124 TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100125#if defined(MBEDTLS_MD_C)
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100126 TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100127
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100128 int found = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100129 for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
130 if (*md_type_ptr == md_type) {
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100131 found = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100132 }
133 }
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100134 TEST_EQUAL(found, 1);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100135#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardf3013832014-03-29 15:54:50 +0100136}
137/* END_CASE */
138
139/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100140void md_text(int md_type, char *text_src_string, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000141{
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100142 unsigned char *src = (unsigned char *) text_src_string;
143 size_t src_len = strlen(text_src_string);
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100144 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000146
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100147 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000149
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100150 TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000151
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100152 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000153}
Paul Bakker33b43f12013-08-20 11:48:36 +0200154/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000155
Paul Bakker33b43f12013-08-20 11:48:36 +0200156/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100157void md_hex(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000158{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100159 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200160 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000161
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100162 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000164
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100165 TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000166
Paul Bakker17373852011-01-06 14:20:01 +0000167
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100168 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000169}
Paul Bakker33b43f12013-08-20 11:48:36 +0200170/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000171
Paul Bakker33b43f12013-08-20 11:48:36 +0200172/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100173void md_text_multi(int md_type, char *text_src_string,
Gilles Peskine449bd832023-01-11 14:50:10 +0100174 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é-Gonnardb707bed2023-02-03 12:32:41 +0100179 size_t halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200180
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100182 mbedtls_md_context_t ctx, ctx_copy;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200183
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 mbedtls_md_init(&ctx);
185 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000186
Manuel Pégourié-Gonnardb707bed2023-02-03 12:32:41 +0100187 halfway = src_len / 2;
Paul Bakkere35afa22016-07-13 17:09:14 +0100188
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100189 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100190 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100191 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
192 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100193#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100194 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
195 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100196#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000197
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100198 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100199 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100200 TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
201 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100202
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100203 TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
204 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100205 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000206
Paul Bakker97c53c22016-07-13 17:20:22 +0100207 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100208 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100209
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100210 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
211 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100212 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200213
214exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 mbedtls_md_free(&ctx);
216 mbedtls_md_free(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000217}
Paul Bakker33b43f12013-08-20 11:48:36 +0200218/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000219
Paul Bakker33b43f12013-08-20 11:48:36 +0200220/* BEGIN_CASE */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100221void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000222{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100223 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200224 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker97c53c22016-07-13 17:20:22 +0100225 mbedtls_md_context_t ctx, ctx_copy;
Azim Khanf1aaec92017-05-30 14:23:15 +0100226 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200227
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 mbedtls_md_init(&ctx);
229 mbedtls_md_init(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000230
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100231 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100232 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100233 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
234 TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100235#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
237 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100238#endif /* MBEDTLS_MD_C */
Paul Bakker17373852011-01-06 14:20:01 +0000239
Azim Khand30ca132017-06-09 04:32:58 +0100240 halfway = src_str->len / 2;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200241
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100242 TEST_EQUAL(0, mbedtls_md_starts(&ctx));
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100244 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
245 TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));
Paul Bakker97c53c22016-07-13 17:20:22 +0100246
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100247 TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
248 TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100249 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000250
Paul Bakker97c53c22016-07-13 17:20:22 +0100251 /* Test clone */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100252 memset(output, 0x00, sizeof(output));
Paul Bakker97c53c22016-07-13 17:20:22 +0100253
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100254 TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
255 TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100256 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200257
258exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 mbedtls_md_free(&ctx);
260 mbedtls_md_free(&ctx_copy);
Paul Bakker17373852011-01-06 14:20:01 +0000261}
Paul Bakker33b43f12013-08-20 11:48:36 +0200262/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000263
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100264/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100265void mbedtls_md_hmac(int md_type, int trunc_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 data_t *key_str, data_t *src_str,
267 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000268{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100269 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200270 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000271
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100272 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000274
Paul Bakker17373852011-01-06 14:20:01 +0000275
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100276 TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100277 src_str->x, src_str->len, output));
Paul Bakker17373852011-01-06 14:20:01 +0000278
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100279 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000280}
Paul Bakker33b43f12013-08-20 11:48:36 +0200281/* END_CASE */
Paul Bakker17373852011-01-06 14:20:01 +0000282
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100283/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100284void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 data_t *src_str, data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000286{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100287 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 const mbedtls_md_info_t *md_info = NULL;
289 mbedtls_md_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100290 int halfway;
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200291
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 mbedtls_md_init(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000293
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100294 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100295 TEST_ASSERT(md_info != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100296 TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100297#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100299#endif
Paul Bakker17373852011-01-06 14:20:01 +0000300
Azim Khand30ca132017-06-09 04:32:58 +0100301 halfway = src_str->len / 2;
Paul Bakker17373852011-01-06 14:20:01 +0000302
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100303 TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 TEST_ASSERT(ctx.md_ctx != NULL);
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100305 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
306 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
307 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100308
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100309 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100310
311 /* Test again, for reset() */
Manuel Pégourié-Gonnard4ba98f52023-02-03 12:25:53 +0100312 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard59ba4e92014-03-29 14:43:44 +0100313
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100314 TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
315 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
316 TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
317 TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));
Paul Bakker33b43f12013-08-20 11:48:36 +0200318
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100319 ASSERT_COMPARE(output, trunc_size, hash->x, hash->len);
Paul Bakkerbd51b262014-07-10 15:26:12 +0200320
321exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 mbedtls_md_free(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +0000323}
Paul Bakker33b43f12013-08-20 11:48:36 +0200324/* END_CASE */
Paul Bakker428b9ba2013-09-15 15:20:37 +0200325
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +0100326/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100327void mbedtls_md_file(int md_type, char *filename,
Gilles Peskine449bd832023-01-11 14:50:10 +0100328 data_t *hash)
Paul Bakker17373852011-01-06 14:20:01 +0000329{
Manuel Pégourié-Gonnardcced3522023-02-06 12:37:02 +0100330 unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331 const mbedtls_md_info_t *md_info = NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000332
Manuel Pégourié-Gonnardc90514e2023-02-03 12:13:10 +0100333 md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 TEST_ASSERT(md_info != NULL);
Paul Bakker17373852011-01-06 14:20:01 +0000335
Manuel Pégourié-Gonnardf5e23312023-02-03 12:51:03 +0100336 TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));
Paul Bakker17373852011-01-06 14:20:01 +0000337
Manuel Pégourié-Gonnarda9a1b212023-02-09 09:15:04 +0100338 ASSERT_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);
Paul Bakker17373852011-01-06 14:20:01 +0000339}
Paul Bakker33b43f12013-08-20 11:48:36 +0200340/* END_CASE */