blob: 12a3ea2374a6b69f05e6feefe2297a6a13e94b53 [file] [log] [blame]
Jens Wiklander817466c2018-05-22 13:49:31 +02001/**
Jerome Forissier79013242021-07-28 10:24:04 +02002 * \file md.c
Jens Wiklander817466c2018-05-22 13:49:31 +02003 *
Tom Van Eyckc1633172024-04-09 18:44:13 +02004 * \brief Generic message digest wrapper for Mbed TLS
Jens Wiklander817466c2018-05-22 13:49:31 +02005 *
6 * \author Adriaan de Jong <dejong@fox-it.com>
7 *
Jerome Forissier79013242021-07-28 10:24:04 +02008 * Copyright The Mbed TLS Contributors
Tom Van Eyckc1633172024-04-09 18:44:13 +02009 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Jens Wiklander817466c2018-05-22 13:49:31 +020010 */
11
Jerome Forissier79013242021-07-28 10:24:04 +020012#include "common.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020013
Jens Wiklander32b31802023-10-06 16:59:46 +020014/*
15 * Availability of functions in this module is controlled by two
16 * feature macros:
17 * - MBEDTLS_MD_C enables the whole module;
18 * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
19 * most hash metadata (everything except string names); is it
20 * automatically set whenever MBEDTLS_MD_C is defined.
21 *
22 * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
23 *
24 * In the future we may want to change the contract of some functions
25 * (behaviour with NULL arguments) depending on whether MD_C is defined or
26 * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
27 *
28 * For these reasons, we're keeping MD_LIGHT internal for now.
29 */
30#if defined(MBEDTLS_MD_LIGHT)
Jens Wiklander817466c2018-05-22 13:49:31 +020031
32#include "mbedtls/md.h"
Jens Wiklander32b31802023-10-06 16:59:46 +020033#include "md_wrap.h"
Jens Wiklander3d3b0592019-03-20 15:30:29 +010034#include "mbedtls/platform_util.h"
Jerome Forissier11fa71b2020-04-20 17:17:56 +020035#include "mbedtls/error.h"
36
Jerome Forissier11fa71b2020-04-20 17:17:56 +020037#include "mbedtls/md5.h"
38#include "mbedtls/ripemd160.h"
39#include "mbedtls/sha1.h"
40#include "mbedtls/sha256.h"
41#include "mbedtls/sha512.h"
Tom Van Eyckc1633172024-04-09 18:44:13 +020042#include "mbedtls/sha3.h"
43
44#if defined(MBEDTLS_PSA_CRYPTO_C)
45#include <psa/crypto.h>
46#include "md_psa.h"
47#include "psa_util_internal.h"
48#endif
Jens Wiklander817466c2018-05-22 13:49:31 +020049
Jens Wiklander32b31802023-10-06 16:59:46 +020050#if defined(MBEDTLS_MD_SOME_PSA)
Jens Wiklander32b31802023-10-06 16:59:46 +020051#include "psa_crypto_core.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020052#endif
53
Jens Wiklander32b31802023-10-06 16:59:46 +020054#include "mbedtls/platform.h"
55
Jens Wiklander817466c2018-05-22 13:49:31 +020056#include <string.h>
57
58#if defined(MBEDTLS_FS_IO)
59#include <stdio.h>
60#endif
61
Tom Van Eyckc1633172024-04-09 18:44:13 +020062/* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
63#if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
64#error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
65#endif
66
67#if defined(MBEDTLS_MD_C)
68#define MD_INFO(type, out_size, block_size) type, out_size, block_size,
69#else
70#define MD_INFO(type, out_size, block_size) type, out_size,
71#endif
72
Jens Wiklander32b31802023-10-06 16:59:46 +020073#if defined(MBEDTLS_MD_CAN_MD5)
Tom Van Eyckc1633172024-04-09 18:44:13 +020074static const mbedtls_md_info_t mbedtls_md5_info = {
75 MD_INFO(MBEDTLS_MD_MD5, 16, 64)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020076};
77#endif
78
Jens Wiklander32b31802023-10-06 16:59:46 +020079#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Tom Van Eyckc1633172024-04-09 18:44:13 +020080static const mbedtls_md_info_t mbedtls_ripemd160_info = {
81 MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020082};
83#endif
84
Jens Wiklander32b31802023-10-06 16:59:46 +020085#if defined(MBEDTLS_MD_CAN_SHA1)
Tom Van Eyckc1633172024-04-09 18:44:13 +020086static const mbedtls_md_info_t mbedtls_sha1_info = {
87 MD_INFO(MBEDTLS_MD_SHA1, 20, 64)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020088};
89#endif
90
Jens Wiklander32b31802023-10-06 16:59:46 +020091#if defined(MBEDTLS_MD_CAN_SHA224)
Tom Van Eyckc1633172024-04-09 18:44:13 +020092static const mbedtls_md_info_t mbedtls_sha224_info = {
93 MD_INFO(MBEDTLS_MD_SHA224, 28, 64)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020094};
Jens Wiklander32b31802023-10-06 16:59:46 +020095#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +020096
Jens Wiklander32b31802023-10-06 16:59:46 +020097#if defined(MBEDTLS_MD_CAN_SHA256)
Tom Van Eyckc1633172024-04-09 18:44:13 +020098static const mbedtls_md_info_t mbedtls_sha256_info = {
99 MD_INFO(MBEDTLS_MD_SHA256, 32, 64)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200100};
101#endif
102
Jens Wiklander32b31802023-10-06 16:59:46 +0200103#if defined(MBEDTLS_MD_CAN_SHA384)
Tom Van Eyckc1633172024-04-09 18:44:13 +0200104static const mbedtls_md_info_t mbedtls_sha384_info = {
105 MD_INFO(MBEDTLS_MD_SHA384, 48, 128)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200106};
107#endif
108
Jens Wiklander32b31802023-10-06 16:59:46 +0200109#if defined(MBEDTLS_MD_CAN_SHA512)
Tom Van Eyckc1633172024-04-09 18:44:13 +0200110static const mbedtls_md_info_t mbedtls_sha512_info = {
111 MD_INFO(MBEDTLS_MD_SHA512, 64, 128)
112};
113#endif
114
115#if defined(MBEDTLS_MD_CAN_SHA3_224)
116static const mbedtls_md_info_t mbedtls_sha3_224_info = {
117 MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144)
118};
119#endif
120
121#if defined(MBEDTLS_MD_CAN_SHA3_256)
122static const mbedtls_md_info_t mbedtls_sha3_256_info = {
123 MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136)
124};
125#endif
126
127#if defined(MBEDTLS_MD_CAN_SHA3_384)
128static const mbedtls_md_info_t mbedtls_sha3_384_info = {
129 MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104)
130};
131#endif
132
133#if defined(MBEDTLS_MD_CAN_SHA3_512)
134static const mbedtls_md_info_t mbedtls_sha3_512_info = {
135 MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200136};
137#endif
138
Jens Wiklander32b31802023-10-06 16:59:46 +0200139const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
Jens Wiklander817466c2018-05-22 13:49:31 +0200140{
Jens Wiklander32b31802023-10-06 16:59:46 +0200141 switch (md_type) {
142#if defined(MBEDTLS_MD_CAN_MD5)
Jens Wiklander817466c2018-05-22 13:49:31 +0200143 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200144 return &mbedtls_md5_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200145#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200146#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Jens Wiklander817466c2018-05-22 13:49:31 +0200147 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200148 return &mbedtls_ripemd160_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200149#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200150#if defined(MBEDTLS_MD_CAN_SHA1)
Jens Wiklander817466c2018-05-22 13:49:31 +0200151 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200152 return &mbedtls_sha1_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200153#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200154#if defined(MBEDTLS_MD_CAN_SHA224)
Jens Wiklander817466c2018-05-22 13:49:31 +0200155 case MBEDTLS_MD_SHA224:
Jens Wiklander32b31802023-10-06 16:59:46 +0200156 return &mbedtls_sha224_info;
157#endif
158#if defined(MBEDTLS_MD_CAN_SHA256)
Jens Wiklander817466c2018-05-22 13:49:31 +0200159 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200160 return &mbedtls_sha256_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200161#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200162#if defined(MBEDTLS_MD_CAN_SHA384)
Jens Wiklander817466c2018-05-22 13:49:31 +0200163 case MBEDTLS_MD_SHA384:
Jens Wiklander32b31802023-10-06 16:59:46 +0200164 return &mbedtls_sha384_info;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200165#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200166#if defined(MBEDTLS_MD_CAN_SHA512)
Jens Wiklander817466c2018-05-22 13:49:31 +0200167 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200168 return &mbedtls_sha512_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200169#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200170#if defined(MBEDTLS_MD_CAN_SHA3_224)
171 case MBEDTLS_MD_SHA3_224:
172 return &mbedtls_sha3_224_info;
173#endif
174#if defined(MBEDTLS_MD_CAN_SHA3_256)
175 case MBEDTLS_MD_SHA3_256:
176 return &mbedtls_sha3_256_info;
177#endif
178#if defined(MBEDTLS_MD_CAN_SHA3_384)
179 case MBEDTLS_MD_SHA3_384:
180 return &mbedtls_sha3_384_info;
181#endif
182#if defined(MBEDTLS_MD_CAN_SHA3_512)
183 case MBEDTLS_MD_SHA3_512:
184 return &mbedtls_sha3_512_info;
185#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200186 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200187 return NULL;
Jens Wiklander817466c2018-05-22 13:49:31 +0200188 }
189}
190
Jens Wiklander32b31802023-10-06 16:59:46 +0200191#if defined(MBEDTLS_MD_SOME_PSA)
192static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
Jens Wiklander817466c2018-05-22 13:49:31 +0200193{
Jens Wiklander32b31802023-10-06 16:59:46 +0200194 switch (info->type) {
195#if defined(MBEDTLS_MD_MD5_VIA_PSA)
196 case MBEDTLS_MD_MD5:
197 return PSA_ALG_MD5;
198#endif
199#if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
200 case MBEDTLS_MD_RIPEMD160:
201 return PSA_ALG_RIPEMD160;
202#endif
203#if defined(MBEDTLS_MD_SHA1_VIA_PSA)
204 case MBEDTLS_MD_SHA1:
205 return PSA_ALG_SHA_1;
206#endif
207#if defined(MBEDTLS_MD_SHA224_VIA_PSA)
208 case MBEDTLS_MD_SHA224:
209 return PSA_ALG_SHA_224;
210#endif
211#if defined(MBEDTLS_MD_SHA256_VIA_PSA)
212 case MBEDTLS_MD_SHA256:
213 return PSA_ALG_SHA_256;
214#endif
215#if defined(MBEDTLS_MD_SHA384_VIA_PSA)
216 case MBEDTLS_MD_SHA384:
217 return PSA_ALG_SHA_384;
218#endif
219#if defined(MBEDTLS_MD_SHA512_VIA_PSA)
220 case MBEDTLS_MD_SHA512:
221 return PSA_ALG_SHA_512;
222#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200223#if defined(MBEDTLS_MD_SHA3_224_VIA_PSA)
224 case MBEDTLS_MD_SHA3_224:
225 return PSA_ALG_SHA3_224;
226#endif
227#if defined(MBEDTLS_MD_SHA3_256_VIA_PSA)
228 case MBEDTLS_MD_SHA3_256:
229 return PSA_ALG_SHA3_256;
230#endif
231#if defined(MBEDTLS_MD_SHA3_384_VIA_PSA)
232 case MBEDTLS_MD_SHA3_384:
233 return PSA_ALG_SHA3_384;
234#endif
235#if defined(MBEDTLS_MD_SHA3_512_VIA_PSA)
236 case MBEDTLS_MD_SHA3_512:
237 return PSA_ALG_SHA3_512;
238#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200239 default:
240 return PSA_ALG_NONE;
241 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200242}
243
Jens Wiklander32b31802023-10-06 16:59:46 +0200244static int md_can_use_psa(const mbedtls_md_info_t *info)
Jens Wiklander817466c2018-05-22 13:49:31 +0200245{
Jens Wiklander32b31802023-10-06 16:59:46 +0200246 psa_algorithm_t alg = psa_alg_of_md(info);
247 if (alg == PSA_ALG_NONE) {
248 return 0;
249 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200250
Jens Wiklander32b31802023-10-06 16:59:46 +0200251 return psa_can_do_hash(alg);
252}
Jens Wiklander32b31802023-10-06 16:59:46 +0200253#endif /* MBEDTLS_MD_SOME_PSA */
254
255void mbedtls_md_init(mbedtls_md_context_t *ctx)
256{
257 /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
258 memset(ctx, 0, sizeof(mbedtls_md_context_t));
259}
260
261void mbedtls_md_free(mbedtls_md_context_t *ctx)
262{
263 if (ctx == NULL || ctx->md_info == NULL) {
264 return;
265 }
266
267 if (ctx->md_ctx != NULL) {
268#if defined(MBEDTLS_MD_SOME_PSA)
269 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
270 psa_hash_abort(ctx->md_ctx);
271 } else
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200272#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200273 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200274#if defined(MBEDTLS_MD5_C)
275 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200276 mbedtls_md5_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200277 break;
278#endif
279#if defined(MBEDTLS_RIPEMD160_C)
280 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200281 mbedtls_ripemd160_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200282 break;
283#endif
284#if defined(MBEDTLS_SHA1_C)
285 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200286 mbedtls_sha1_free(ctx->md_ctx);
287 break;
288#endif
289#if defined(MBEDTLS_SHA224_C)
290 case MBEDTLS_MD_SHA224:
291 mbedtls_sha256_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200292 break;
293#endif
294#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200295 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200296 mbedtls_sha256_free(ctx->md_ctx);
297 break;
298#endif
299#if defined(MBEDTLS_SHA384_C)
300 case MBEDTLS_MD_SHA384:
301 mbedtls_sha512_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200302 break;
303#endif
304#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200305 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200306 mbedtls_sha512_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200307 break;
308#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200309#if defined(MBEDTLS_SHA3_C)
310 case MBEDTLS_MD_SHA3_224:
311 case MBEDTLS_MD_SHA3_256:
312 case MBEDTLS_MD_SHA3_384:
313 case MBEDTLS_MD_SHA3_512:
314 mbedtls_sha3_free(ctx->md_ctx);
315 break;
316#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200317 default:
318 /* Shouldn't happen */
319 break;
320 }
Jens Wiklander32b31802023-10-06 16:59:46 +0200321 mbedtls_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200322 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200323
Jens Wiklander32b31802023-10-06 16:59:46 +0200324#if defined(MBEDTLS_MD_C)
325 if (ctx->hmac_ctx != NULL) {
Tom Van Eyckc1633172024-04-09 18:44:13 +0200326 mbedtls_zeroize_and_free(ctx->hmac_ctx,
Jens Wiklander32b31802023-10-06 16:59:46 +0200327 2 * ctx->md_info->block_size);
Jens Wiklander817466c2018-05-22 13:49:31 +0200328 }
Jens Wiklander32b31802023-10-06 16:59:46 +0200329#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200330
Jens Wiklander32b31802023-10-06 16:59:46 +0200331 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
Jens Wiklander817466c2018-05-22 13:49:31 +0200332}
333
Jens Wiklander32b31802023-10-06 16:59:46 +0200334int mbedtls_md_clone(mbedtls_md_context_t *dst,
335 const mbedtls_md_context_t *src)
Jens Wiklander817466c2018-05-22 13:49:31 +0200336{
Jens Wiklander32b31802023-10-06 16:59:46 +0200337 if (dst == NULL || dst->md_info == NULL ||
Jens Wiklander817466c2018-05-22 13:49:31 +0200338 src == NULL || src->md_info == NULL ||
Jens Wiklander32b31802023-10-06 16:59:46 +0200339 dst->md_info != src->md_info) {
340 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jens Wiklander817466c2018-05-22 13:49:31 +0200341 }
342
Jens Wiklander32b31802023-10-06 16:59:46 +0200343#if defined(MBEDTLS_MD_SOME_PSA)
344 if (src->engine != dst->engine) {
345 /* This can happen with src set to legacy because PSA wasn't ready
346 * yet, and dst to PSA because it became ready in the meantime.
347 * We currently don't support that case (we'd need to re-allocate
348 * md_ctx to the size of the appropriate MD context). */
349 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
350 }
351
352 if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
353 psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
354 return mbedtls_md_error_from_psa(status);
355 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200356#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200357
358 switch (src->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200359#if defined(MBEDTLS_MD5_C)
360 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200361 mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200362 break;
363#endif
364#if defined(MBEDTLS_RIPEMD160_C)
365 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200366 mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200367 break;
368#endif
369#if defined(MBEDTLS_SHA1_C)
370 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200371 mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
372 break;
373#endif
374#if defined(MBEDTLS_SHA224_C)
375 case MBEDTLS_MD_SHA224:
376 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200377 break;
378#endif
379#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200380 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200381 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
382 break;
383#endif
384#if defined(MBEDTLS_SHA384_C)
385 case MBEDTLS_MD_SHA384:
386 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200387 break;
388#endif
389#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200390 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200391 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200392 break;
393#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200394#if defined(MBEDTLS_SHA3_C)
395 case MBEDTLS_MD_SHA3_224:
396 case MBEDTLS_MD_SHA3_256:
397 case MBEDTLS_MD_SHA3_384:
398 case MBEDTLS_MD_SHA3_512:
399 mbedtls_sha3_clone(dst->md_ctx, src->md_ctx);
400 break;
401#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200402 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200403 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200404 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200405
Jens Wiklander32b31802023-10-06 16:59:46 +0200406 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200407}
408
Jens Wiklander32b31802023-10-06 16:59:46 +0200409#define ALLOC(type) \
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200410 do { \
Jens Wiklander32b31802023-10-06 16:59:46 +0200411 ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
412 if (ctx->md_ctx == NULL) \
413 return MBEDTLS_ERR_MD_ALLOC_FAILED; \
414 mbedtls_##type##_init(ctx->md_ctx); \
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200415 } \
Jens Wiklander32b31802023-10-06 16:59:46 +0200416 while (0)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200417
Jens Wiklander32b31802023-10-06 16:59:46 +0200418int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
Jens Wiklander817466c2018-05-22 13:49:31 +0200419{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200420#if defined(MBEDTLS_MD_C)
421 if (ctx == NULL) {
422 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
423 }
424#endif
425 if (md_info == NULL) {
Jens Wiklander32b31802023-10-06 16:59:46 +0200426 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
427 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200428
Jerome Forissier79013242021-07-28 10:24:04 +0200429 ctx->md_info = md_info;
430 ctx->md_ctx = NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200431#if defined(MBEDTLS_MD_C)
Jerome Forissier79013242021-07-28 10:24:04 +0200432 ctx->hmac_ctx = NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200433#else
434 if (hmac != 0) {
435 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
436 }
437#endif
Jerome Forissier79013242021-07-28 10:24:04 +0200438
Jens Wiklander32b31802023-10-06 16:59:46 +0200439#if defined(MBEDTLS_MD_SOME_PSA)
440 if (md_can_use_psa(ctx->md_info)) {
441 ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
442 if (ctx->md_ctx == NULL) {
443 return MBEDTLS_ERR_MD_ALLOC_FAILED;
444 }
445 ctx->engine = MBEDTLS_MD_ENGINE_PSA;
446 } else
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200447#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200448 switch (md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200449#if defined(MBEDTLS_MD5_C)
450 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200451 ALLOC(md5);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200452 break;
453#endif
454#if defined(MBEDTLS_RIPEMD160_C)
455 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200456 ALLOC(ripemd160);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200457 break;
458#endif
459#if defined(MBEDTLS_SHA1_C)
460 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200461 ALLOC(sha1);
462 break;
463#endif
464#if defined(MBEDTLS_SHA224_C)
465 case MBEDTLS_MD_SHA224:
466 ALLOC(sha256);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200467 break;
468#endif
469#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200470 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200471 ALLOC(sha256);
472 break;
473#endif
474#if defined(MBEDTLS_SHA384_C)
475 case MBEDTLS_MD_SHA384:
476 ALLOC(sha512);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200477 break;
478#endif
479#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200480 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200481 ALLOC(sha512);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200482 break;
483#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200484#if defined(MBEDTLS_SHA3_C)
485 case MBEDTLS_MD_SHA3_224:
486 case MBEDTLS_MD_SHA3_256:
487 case MBEDTLS_MD_SHA3_384:
488 case MBEDTLS_MD_SHA3_512:
489 ALLOC(sha3);
490 break;
491#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200492 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200493 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200494 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200495
Jens Wiklander32b31802023-10-06 16:59:46 +0200496#if defined(MBEDTLS_MD_C)
497 if (hmac != 0) {
498 ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
499 if (ctx->hmac_ctx == NULL) {
500 mbedtls_md_free(ctx);
501 return MBEDTLS_ERR_MD_ALLOC_FAILED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200502 }
503 }
Jens Wiklander32b31802023-10-06 16:59:46 +0200504#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200505
Jens Wiklander32b31802023-10-06 16:59:46 +0200506 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200507}
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200508#undef ALLOC
Jens Wiklander817466c2018-05-22 13:49:31 +0200509
Jens Wiklander32b31802023-10-06 16:59:46 +0200510int mbedtls_md_starts(mbedtls_md_context_t *ctx)
Jens Wiklander817466c2018-05-22 13:49:31 +0200511{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200512#if defined(MBEDTLS_MD_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200513 if (ctx == NULL || ctx->md_info == NULL) {
514 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
515 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200516#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200517
Jens Wiklander32b31802023-10-06 16:59:46 +0200518#if defined(MBEDTLS_MD_SOME_PSA)
519 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
520 psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
521 psa_hash_abort(ctx->md_ctx);
522 psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
523 return mbedtls_md_error_from_psa(status);
524 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200525#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200526
527 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200528#if defined(MBEDTLS_MD5_C)
529 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200530 return mbedtls_md5_starts(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200531#endif
532#if defined(MBEDTLS_RIPEMD160_C)
533 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200534 return mbedtls_ripemd160_starts(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200535#endif
536#if defined(MBEDTLS_SHA1_C)
537 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200538 return mbedtls_sha1_starts(ctx->md_ctx);
539#endif
540#if defined(MBEDTLS_SHA224_C)
541 case MBEDTLS_MD_SHA224:
542 return mbedtls_sha256_starts(ctx->md_ctx, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200543#endif
544#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200545 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200546 return mbedtls_sha256_starts(ctx->md_ctx, 0);
547#endif
548#if defined(MBEDTLS_SHA384_C)
549 case MBEDTLS_MD_SHA384:
550 return mbedtls_sha512_starts(ctx->md_ctx, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200551#endif
552#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200553 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200554 return mbedtls_sha512_starts(ctx->md_ctx, 0);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200555#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200556#if defined(MBEDTLS_SHA3_C)
557 case MBEDTLS_MD_SHA3_224:
558 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
559 case MBEDTLS_MD_SHA3_256:
560 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
561 case MBEDTLS_MD_SHA3_384:
562 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
563 case MBEDTLS_MD_SHA3_512:
564 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
565#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200566 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200567 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200568 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200569}
570
Jens Wiklander32b31802023-10-06 16:59:46 +0200571int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Jens Wiklander817466c2018-05-22 13:49:31 +0200572{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200573#if defined(MBEDTLS_MD_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200574 if (ctx == NULL || ctx->md_info == NULL) {
575 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
576 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200577#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200578
Jens Wiklander32b31802023-10-06 16:59:46 +0200579#if defined(MBEDTLS_MD_SOME_PSA)
580 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
581 psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
582 return mbedtls_md_error_from_psa(status);
583 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200584#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200585
586 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200587#if defined(MBEDTLS_MD5_C)
588 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200589 return mbedtls_md5_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200590#endif
591#if defined(MBEDTLS_RIPEMD160_C)
592 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200593 return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200594#endif
595#if defined(MBEDTLS_SHA1_C)
596 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200597 return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
598#endif
599#if defined(MBEDTLS_SHA224_C)
600 case MBEDTLS_MD_SHA224:
601 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200602#endif
603#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200604 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200605 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
606#endif
607#if defined(MBEDTLS_SHA384_C)
608 case MBEDTLS_MD_SHA384:
609 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200610#endif
611#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200612 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200613 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200614#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200615#if defined(MBEDTLS_SHA3_C)
616 case MBEDTLS_MD_SHA3_224:
617 case MBEDTLS_MD_SHA3_256:
618 case MBEDTLS_MD_SHA3_384:
619 case MBEDTLS_MD_SHA3_512:
620 return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
621#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200622 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200623 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200624 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200625}
626
Jens Wiklander32b31802023-10-06 16:59:46 +0200627int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200628{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200629#if defined(MBEDTLS_MD_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200630 if (ctx == NULL || ctx->md_info == NULL) {
631 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
632 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200633#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200634
Jens Wiklander32b31802023-10-06 16:59:46 +0200635#if defined(MBEDTLS_MD_SOME_PSA)
636 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
637 size_t size = ctx->md_info->size;
638 psa_status_t status = psa_hash_finish(ctx->md_ctx,
639 output, size, &size);
640 return mbedtls_md_error_from_psa(status);
641 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200642#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200643
644 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200645#if defined(MBEDTLS_MD5_C)
646 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200647 return mbedtls_md5_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200648#endif
649#if defined(MBEDTLS_RIPEMD160_C)
650 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200651 return mbedtls_ripemd160_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200652#endif
653#if defined(MBEDTLS_SHA1_C)
654 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200655 return mbedtls_sha1_finish(ctx->md_ctx, output);
656#endif
657#if defined(MBEDTLS_SHA224_C)
658 case MBEDTLS_MD_SHA224:
659 return mbedtls_sha256_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200660#endif
661#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200662 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200663 return mbedtls_sha256_finish(ctx->md_ctx, output);
664#endif
665#if defined(MBEDTLS_SHA384_C)
666 case MBEDTLS_MD_SHA384:
667 return mbedtls_sha512_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200668#endif
669#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200670 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200671 return mbedtls_sha512_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200672#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200673#if defined(MBEDTLS_SHA3_C)
674 case MBEDTLS_MD_SHA3_224:
675 case MBEDTLS_MD_SHA3_256:
676 case MBEDTLS_MD_SHA3_384:
677 case MBEDTLS_MD_SHA3_512:
678 return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
679#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200680 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200681 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200682 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200683}
684
Jens Wiklander32b31802023-10-06 16:59:46 +0200685int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
686 unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200687{
Jens Wiklander32b31802023-10-06 16:59:46 +0200688 if (md_info == NULL) {
689 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
690 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200691
Jens Wiklander32b31802023-10-06 16:59:46 +0200692#if defined(MBEDTLS_MD_SOME_PSA)
693 if (md_can_use_psa(md_info)) {
694 size_t size = md_info->size;
695 psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
696 input, ilen,
697 output, size, &size);
698 return mbedtls_md_error_from_psa(status);
699 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200700#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200701
702 switch (md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200703#if defined(MBEDTLS_MD5_C)
704 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200705 return mbedtls_md5(input, ilen, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200706#endif
707#if defined(MBEDTLS_RIPEMD160_C)
708 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200709 return mbedtls_ripemd160(input, ilen, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200710#endif
711#if defined(MBEDTLS_SHA1_C)
712 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200713 return mbedtls_sha1(input, ilen, output);
714#endif
715#if defined(MBEDTLS_SHA224_C)
716 case MBEDTLS_MD_SHA224:
717 return mbedtls_sha256(input, ilen, output, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200718#endif
719#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200720 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200721 return mbedtls_sha256(input, ilen, output, 0);
722#endif
723#if defined(MBEDTLS_SHA384_C)
724 case MBEDTLS_MD_SHA384:
725 return mbedtls_sha512(input, ilen, output, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200726#endif
727#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200728 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200729 return mbedtls_sha512(input, ilen, output, 0);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200730#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200731#if defined(MBEDTLS_SHA3_C)
732 case MBEDTLS_MD_SHA3_224:
733 return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
734 case MBEDTLS_MD_SHA3_256:
735 return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
736 case MBEDTLS_MD_SHA3_384:
737 return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
738 case MBEDTLS_MD_SHA3_512:
739 return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
740#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200741 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200742 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200743 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200744}
745
Jens Wiklander32b31802023-10-06 16:59:46 +0200746unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
747{
748 if (md_info == NULL) {
749 return 0;
750 }
751
752 return md_info->size;
753}
754
755mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
756{
757 if (md_info == NULL) {
758 return MBEDTLS_MD_NONE;
759 }
760
761 return md_info->type;
762}
763
Tom Van Eyckc1633172024-04-09 18:44:13 +0200764#if defined(MBEDTLS_PSA_CRYPTO_C)
765int mbedtls_md_error_from_psa(psa_status_t status)
766{
767 return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
768 psa_generic_status_to_mbedtls);
769}
770#endif /* MBEDTLS_PSA_CRYPTO_C */
771
772
Jens Wiklander32b31802023-10-06 16:59:46 +0200773/************************************************************************
774 * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
775 * functions below are only available when MBEDTLS_MD_C is set. *
776 ************************************************************************/
777#if defined(MBEDTLS_MD_C)
778
779/*
780 * Reminder: update profiles in x509_crt.c when adding a new hash!
781 */
782static const int supported_digests[] = {
783
784#if defined(MBEDTLS_MD_CAN_SHA512)
785 MBEDTLS_MD_SHA512,
786#endif
787
788#if defined(MBEDTLS_MD_CAN_SHA384)
789 MBEDTLS_MD_SHA384,
790#endif
791
792#if defined(MBEDTLS_MD_CAN_SHA256)
793 MBEDTLS_MD_SHA256,
794#endif
795#if defined(MBEDTLS_MD_CAN_SHA224)
796 MBEDTLS_MD_SHA224,
797#endif
798
799#if defined(MBEDTLS_MD_CAN_SHA1)
800 MBEDTLS_MD_SHA1,
801#endif
802
803#if defined(MBEDTLS_MD_CAN_RIPEMD160)
804 MBEDTLS_MD_RIPEMD160,
805#endif
806
807#if defined(MBEDTLS_MD_CAN_MD5)
808 MBEDTLS_MD_MD5,
809#endif
810
Tom Van Eyckc1633172024-04-09 18:44:13 +0200811#if defined(MBEDTLS_MD_CAN_SHA3_224)
812 MBEDTLS_MD_SHA3_224,
813#endif
814
815#if defined(MBEDTLS_MD_CAN_SHA3_256)
816 MBEDTLS_MD_SHA3_256,
817#endif
818
819#if defined(MBEDTLS_MD_CAN_SHA3_384)
820 MBEDTLS_MD_SHA3_384,
821#endif
822
823#if defined(MBEDTLS_MD_CAN_SHA3_512)
824 MBEDTLS_MD_SHA3_512,
825#endif
826
Jens Wiklander32b31802023-10-06 16:59:46 +0200827 MBEDTLS_MD_NONE
828};
829
830const int *mbedtls_md_list(void)
831{
832 return supported_digests;
833}
834
Tom Van Eyckc1633172024-04-09 18:44:13 +0200835typedef struct {
836 const char *md_name;
837 mbedtls_md_type_t md_type;
838} md_name_entry;
839
840static const md_name_entry md_names[] = {
841#if defined(MBEDTLS_MD_CAN_MD5)
842 { "MD5", MBEDTLS_MD_MD5 },
843#endif
844#if defined(MBEDTLS_MD_CAN_RIPEMD160)
845 { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
846#endif
847#if defined(MBEDTLS_MD_CAN_SHA1)
848 { "SHA1", MBEDTLS_MD_SHA1 },
849 { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
850#endif
851#if defined(MBEDTLS_MD_CAN_SHA224)
852 { "SHA224", MBEDTLS_MD_SHA224 },
853#endif
854#if defined(MBEDTLS_MD_CAN_SHA256)
855 { "SHA256", MBEDTLS_MD_SHA256 },
856#endif
857#if defined(MBEDTLS_MD_CAN_SHA384)
858 { "SHA384", MBEDTLS_MD_SHA384 },
859#endif
860#if defined(MBEDTLS_MD_CAN_SHA512)
861 { "SHA512", MBEDTLS_MD_SHA512 },
862#endif
863#if defined(MBEDTLS_MD_CAN_SHA3_224)
864 { "SHA3-224", MBEDTLS_MD_SHA3_224 },
865#endif
866#if defined(MBEDTLS_MD_CAN_SHA3_256)
867 { "SHA3-256", MBEDTLS_MD_SHA3_256 },
868#endif
869#if defined(MBEDTLS_MD_CAN_SHA3_384)
870 { "SHA3-384", MBEDTLS_MD_SHA3_384 },
871#endif
872#if defined(MBEDTLS_MD_CAN_SHA3_512)
873 { "SHA3-512", MBEDTLS_MD_SHA3_512 },
874#endif
875 { NULL, MBEDTLS_MD_NONE },
876};
877
Jens Wiklander32b31802023-10-06 16:59:46 +0200878const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
879{
880 if (NULL == md_name) {
881 return NULL;
882 }
883
Tom Van Eyckc1633172024-04-09 18:44:13 +0200884 const md_name_entry *entry = md_names;
885 while (entry->md_name != NULL &&
886 strcmp(entry->md_name, md_name) != 0) {
887 ++entry;
Jens Wiklander32b31802023-10-06 16:59:46 +0200888 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200889
890 return mbedtls_md_info_from_type(entry->md_type);
891}
892
893const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
894{
895 if (md_info == NULL) {
896 return NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200897 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200898
899 const md_name_entry *entry = md_names;
900 while (entry->md_type != MBEDTLS_MD_NONE &&
901 entry->md_type != md_info->type) {
902 ++entry;
Jens Wiklander32b31802023-10-06 16:59:46 +0200903 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200904
905 return entry->md_name;
Jens Wiklander32b31802023-10-06 16:59:46 +0200906}
907
908const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
909 const mbedtls_md_context_t *ctx)
910{
911 if (ctx == NULL) {
912 return NULL;
913 }
914
915 return ctx->MBEDTLS_PRIVATE(md_info);
916}
917
Jens Wiklander817466c2018-05-22 13:49:31 +0200918#if defined(MBEDTLS_FS_IO)
Jens Wiklander32b31802023-10-06 16:59:46 +0200919int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200920{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200921 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200922 FILE *f;
923 size_t n;
924 mbedtls_md_context_t ctx;
925 unsigned char buf[1024];
926
Jens Wiklander32b31802023-10-06 16:59:46 +0200927 if (md_info == NULL) {
928 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
929 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200930
Jens Wiklander32b31802023-10-06 16:59:46 +0200931 if ((f = fopen(path, "rb")) == NULL) {
932 return MBEDTLS_ERR_MD_FILE_IO_ERROR;
933 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200934
Jens Wiklander32b31802023-10-06 16:59:46 +0200935 /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
936 mbedtls_setbuf(f, NULL);
Jens Wiklander817466c2018-05-22 13:49:31 +0200937
Jens Wiklander32b31802023-10-06 16:59:46 +0200938 mbedtls_md_init(&ctx);
939
940 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200941 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200942 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200943
Jens Wiklander32b31802023-10-06 16:59:46 +0200944 if ((ret = mbedtls_md_starts(&ctx)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100945 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200946 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200947
Jens Wiklander32b31802023-10-06 16:59:46 +0200948 while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
949 if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100950 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200951 }
952 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200953
Jens Wiklander32b31802023-10-06 16:59:46 +0200954 if (ferror(f) != 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200955 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Jens Wiklander32b31802023-10-06 16:59:46 +0200956 } else {
957 ret = mbedtls_md_finish(&ctx, output);
958 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200959
960cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +0200961 mbedtls_platform_zeroize(buf, sizeof(buf));
962 fclose(f);
963 mbedtls_md_free(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200964
Jens Wiklander32b31802023-10-06 16:59:46 +0200965 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200966}
967#endif /* MBEDTLS_FS_IO */
968
Jens Wiklander32b31802023-10-06 16:59:46 +0200969int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
Jens Wiklander817466c2018-05-22 13:49:31 +0200970{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200971 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200972 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
973 unsigned char *ipad, *opad;
Jens Wiklander817466c2018-05-22 13:49:31 +0200974
Jens Wiklander32b31802023-10-06 16:59:46 +0200975 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
976 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
977 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200978
Jens Wiklander32b31802023-10-06 16:59:46 +0200979 if (keylen > (size_t) ctx->md_info->block_size) {
980 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100981 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200982 }
983 if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100984 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200985 }
986 if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100987 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200988 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200989
990 keylen = ctx->md_info->size;
991 key = sum;
992 }
993
994 ipad = (unsigned char *) ctx->hmac_ctx;
995 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
996
Jens Wiklander32b31802023-10-06 16:59:46 +0200997 memset(ipad, 0x36, ctx->md_info->block_size);
998 memset(opad, 0x5C, ctx->md_info->block_size);
Jens Wiklander817466c2018-05-22 13:49:31 +0200999
Jens Wiklander32b31802023-10-06 16:59:46 +02001000 mbedtls_xor(ipad, ipad, key, keylen);
1001 mbedtls_xor(opad, opad, key, keylen);
1002
1003 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1004 goto cleanup;
1005 }
1006 if ((ret = mbedtls_md_update(ctx, ipad,
1007 ctx->md_info->block_size)) != 0) {
1008 goto cleanup;
Jens Wiklander817466c2018-05-22 13:49:31 +02001009 }
1010
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001011cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +02001012 mbedtls_platform_zeroize(sum, sizeof(sum));
Jens Wiklander817466c2018-05-22 13:49:31 +02001013
Jens Wiklander32b31802023-10-06 16:59:46 +02001014 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +02001015}
1016
Jens Wiklander32b31802023-10-06 16:59:46 +02001017int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Jens Wiklander817466c2018-05-22 13:49:31 +02001018{
Jens Wiklander32b31802023-10-06 16:59:46 +02001019 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1020 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1021 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001022
Jens Wiklander32b31802023-10-06 16:59:46 +02001023 return mbedtls_md_update(ctx, input, ilen);
Jens Wiklander817466c2018-05-22 13:49:31 +02001024}
1025
Jens Wiklander32b31802023-10-06 16:59:46 +02001026int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +02001027{
Jerome Forissier11fa71b2020-04-20 17:17:56 +02001028 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +02001029 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
1030 unsigned char *opad;
1031
Jens Wiklander32b31802023-10-06 16:59:46 +02001032 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1033 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1034 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001035
1036 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
1037
Jens Wiklander32b31802023-10-06 16:59:46 +02001038 if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
1039 return ret;
1040 }
1041 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1042 return ret;
1043 }
1044 if ((ret = mbedtls_md_update(ctx, opad,
1045 ctx->md_info->block_size)) != 0) {
1046 return ret;
1047 }
1048 if ((ret = mbedtls_md_update(ctx, tmp,
1049 ctx->md_info->size)) != 0) {
1050 return ret;
1051 }
1052 return mbedtls_md_finish(ctx, output);
Jens Wiklander817466c2018-05-22 13:49:31 +02001053}
1054
Jens Wiklander32b31802023-10-06 16:59:46 +02001055int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
Jens Wiklander817466c2018-05-22 13:49:31 +02001056{
Jerome Forissier11fa71b2020-04-20 17:17:56 +02001057 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +02001058 unsigned char *ipad;
1059
Jens Wiklander32b31802023-10-06 16:59:46 +02001060 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1061 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1062 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001063
1064 ipad = (unsigned char *) ctx->hmac_ctx;
1065
Jens Wiklander32b31802023-10-06 16:59:46 +02001066 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1067 return ret;
1068 }
1069 return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
Jens Wiklander817466c2018-05-22 13:49:31 +02001070}
1071
Jens Wiklander32b31802023-10-06 16:59:46 +02001072int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1073 const unsigned char *key, size_t keylen,
1074 const unsigned char *input, size_t ilen,
1075 unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +02001076{
1077 mbedtls_md_context_t ctx;
Jerome Forissier11fa71b2020-04-20 17:17:56 +02001078 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +02001079
Jens Wiklander32b31802023-10-06 16:59:46 +02001080 if (md_info == NULL) {
1081 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1082 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001083
Jens Wiklander32b31802023-10-06 16:59:46 +02001084 mbedtls_md_init(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +02001085
Jens Wiklander32b31802023-10-06 16:59:46 +02001086 if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001087 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +02001088 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001089
Jens Wiklander32b31802023-10-06 16:59:46 +02001090 if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001091 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +02001092 }
1093 if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001094 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +02001095 }
1096 if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001097 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +02001098 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001099
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001100cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +02001101 mbedtls_md_free(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +02001102
Jens Wiklander32b31802023-10-06 16:59:46 +02001103 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +02001104}
1105
Jens Wiklander817466c2018-05-22 13:49:31 +02001106#endif /* MBEDTLS_MD_C */
Jens Wiklander32b31802023-10-06 16:59:46 +02001107
1108#endif /* MBEDTLS_MD_LIGHT */