blob: dbd4e91aa21f07bb39b804dd88ffebfe29f5caa9 [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
Edison Aiab0eb552018-12-19 15:36:28 +0800406 if (dst->hmac_ctx != NULL && src->hmac_ctx != NULL)
407 memcpy(dst->hmac_ctx, src->hmac_ctx, 2 * src->md_info->block_size);
408
Jens Wiklander32b31802023-10-06 16:59:46 +0200409 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200410}
411
Jens Wiklander32b31802023-10-06 16:59:46 +0200412#define ALLOC(type) \
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200413 do { \
Jens Wiklander32b31802023-10-06 16:59:46 +0200414 ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
415 if (ctx->md_ctx == NULL) \
416 return MBEDTLS_ERR_MD_ALLOC_FAILED; \
417 mbedtls_##type##_init(ctx->md_ctx); \
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200418 } \
Jens Wiklander32b31802023-10-06 16:59:46 +0200419 while (0)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200420
Jens Wiklander32b31802023-10-06 16:59:46 +0200421int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
Jens Wiklander817466c2018-05-22 13:49:31 +0200422{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200423#if defined(MBEDTLS_MD_C)
424 if (ctx == NULL) {
425 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
426 }
427#endif
428 if (md_info == NULL) {
Jens Wiklander32b31802023-10-06 16:59:46 +0200429 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
430 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200431
Jerome Forissier79013242021-07-28 10:24:04 +0200432 ctx->md_info = md_info;
433 ctx->md_ctx = NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200434#if defined(MBEDTLS_MD_C)
Jerome Forissier79013242021-07-28 10:24:04 +0200435 ctx->hmac_ctx = NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200436#else
437 if (hmac != 0) {
438 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
439 }
440#endif
Jerome Forissier79013242021-07-28 10:24:04 +0200441
Jens Wiklander32b31802023-10-06 16:59:46 +0200442#if defined(MBEDTLS_MD_SOME_PSA)
443 if (md_can_use_psa(ctx->md_info)) {
444 ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
445 if (ctx->md_ctx == NULL) {
446 return MBEDTLS_ERR_MD_ALLOC_FAILED;
447 }
448 ctx->engine = MBEDTLS_MD_ENGINE_PSA;
449 } else
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200450#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200451 switch (md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200452#if defined(MBEDTLS_MD5_C)
453 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200454 ALLOC(md5);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200455 break;
456#endif
457#if defined(MBEDTLS_RIPEMD160_C)
458 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200459 ALLOC(ripemd160);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200460 break;
461#endif
462#if defined(MBEDTLS_SHA1_C)
463 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200464 ALLOC(sha1);
465 break;
466#endif
467#if defined(MBEDTLS_SHA224_C)
468 case MBEDTLS_MD_SHA224:
469 ALLOC(sha256);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200470 break;
471#endif
472#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200473 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200474 ALLOC(sha256);
475 break;
476#endif
477#if defined(MBEDTLS_SHA384_C)
478 case MBEDTLS_MD_SHA384:
479 ALLOC(sha512);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200480 break;
481#endif
482#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200483 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200484 ALLOC(sha512);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200485 break;
486#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200487#if defined(MBEDTLS_SHA3_C)
488 case MBEDTLS_MD_SHA3_224:
489 case MBEDTLS_MD_SHA3_256:
490 case MBEDTLS_MD_SHA3_384:
491 case MBEDTLS_MD_SHA3_512:
492 ALLOC(sha3);
493 break;
494#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200495 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200496 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200497 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200498
Jens Wiklander32b31802023-10-06 16:59:46 +0200499#if defined(MBEDTLS_MD_C)
500 if (hmac != 0) {
501 ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
502 if (ctx->hmac_ctx == NULL) {
503 mbedtls_md_free(ctx);
504 return MBEDTLS_ERR_MD_ALLOC_FAILED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200505 }
506 }
Jens Wiklander32b31802023-10-06 16:59:46 +0200507#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200508
Jens Wiklander32b31802023-10-06 16:59:46 +0200509 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200510}
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200511#undef ALLOC
Jens Wiklander817466c2018-05-22 13:49:31 +0200512
Jens Wiklander32b31802023-10-06 16:59:46 +0200513int mbedtls_md_starts(mbedtls_md_context_t *ctx)
Jens Wiklander817466c2018-05-22 13:49:31 +0200514{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200515#if defined(MBEDTLS_MD_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200516 if (ctx == NULL || ctx->md_info == NULL) {
517 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
518 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200519#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200520
Jens Wiklander32b31802023-10-06 16:59:46 +0200521#if defined(MBEDTLS_MD_SOME_PSA)
522 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
523 psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
524 psa_hash_abort(ctx->md_ctx);
525 psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
526 return mbedtls_md_error_from_psa(status);
527 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200528#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200529
530 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200531#if defined(MBEDTLS_MD5_C)
532 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200533 return mbedtls_md5_starts(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200534#endif
535#if defined(MBEDTLS_RIPEMD160_C)
536 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200537 return mbedtls_ripemd160_starts(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200538#endif
539#if defined(MBEDTLS_SHA1_C)
540 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200541 return mbedtls_sha1_starts(ctx->md_ctx);
542#endif
543#if defined(MBEDTLS_SHA224_C)
544 case MBEDTLS_MD_SHA224:
545 return mbedtls_sha256_starts(ctx->md_ctx, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200546#endif
547#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200548 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200549 return mbedtls_sha256_starts(ctx->md_ctx, 0);
550#endif
551#if defined(MBEDTLS_SHA384_C)
552 case MBEDTLS_MD_SHA384:
553 return mbedtls_sha512_starts(ctx->md_ctx, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200554#endif
555#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200556 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200557 return mbedtls_sha512_starts(ctx->md_ctx, 0);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200558#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200559#if defined(MBEDTLS_SHA3_C)
560 case MBEDTLS_MD_SHA3_224:
561 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
562 case MBEDTLS_MD_SHA3_256:
563 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
564 case MBEDTLS_MD_SHA3_384:
565 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
566 case MBEDTLS_MD_SHA3_512:
567 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
568#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200569 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200570 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200571 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200572}
573
Jens Wiklander32b31802023-10-06 16:59:46 +0200574int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Jens Wiklander817466c2018-05-22 13:49:31 +0200575{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200576#if defined(MBEDTLS_MD_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200577 if (ctx == NULL || ctx->md_info == NULL) {
578 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
579 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200580#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200581
Jens Wiklander32b31802023-10-06 16:59:46 +0200582#if defined(MBEDTLS_MD_SOME_PSA)
583 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
584 psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
585 return mbedtls_md_error_from_psa(status);
586 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200587#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200588
589 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200590#if defined(MBEDTLS_MD5_C)
591 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200592 return mbedtls_md5_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200593#endif
594#if defined(MBEDTLS_RIPEMD160_C)
595 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200596 return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200597#endif
598#if defined(MBEDTLS_SHA1_C)
599 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200600 return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
601#endif
602#if defined(MBEDTLS_SHA224_C)
603 case MBEDTLS_MD_SHA224:
604 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200605#endif
606#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200607 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200608 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
609#endif
610#if defined(MBEDTLS_SHA384_C)
611 case MBEDTLS_MD_SHA384:
612 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200613#endif
614#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200615 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200616 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200617#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200618#if defined(MBEDTLS_SHA3_C)
619 case MBEDTLS_MD_SHA3_224:
620 case MBEDTLS_MD_SHA3_256:
621 case MBEDTLS_MD_SHA3_384:
622 case MBEDTLS_MD_SHA3_512:
623 return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
624#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200625 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200626 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200627 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200628}
629
Jens Wiklander32b31802023-10-06 16:59:46 +0200630int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200631{
Tom Van Eyckc1633172024-04-09 18:44:13 +0200632#if defined(MBEDTLS_MD_C)
Jens Wiklander32b31802023-10-06 16:59:46 +0200633 if (ctx == NULL || ctx->md_info == NULL) {
634 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
635 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200636#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200637
Jens Wiklander32b31802023-10-06 16:59:46 +0200638#if defined(MBEDTLS_MD_SOME_PSA)
639 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
640 size_t size = ctx->md_info->size;
641 psa_status_t status = psa_hash_finish(ctx->md_ctx,
642 output, size, &size);
643 return mbedtls_md_error_from_psa(status);
644 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200645#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200646
647 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200648#if defined(MBEDTLS_MD5_C)
649 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200650 return mbedtls_md5_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200651#endif
652#if defined(MBEDTLS_RIPEMD160_C)
653 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200654 return mbedtls_ripemd160_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200655#endif
656#if defined(MBEDTLS_SHA1_C)
657 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200658 return mbedtls_sha1_finish(ctx->md_ctx, output);
659#endif
660#if defined(MBEDTLS_SHA224_C)
661 case MBEDTLS_MD_SHA224:
662 return mbedtls_sha256_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200663#endif
664#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200665 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200666 return mbedtls_sha256_finish(ctx->md_ctx, output);
667#endif
668#if defined(MBEDTLS_SHA384_C)
669 case MBEDTLS_MD_SHA384:
670 return mbedtls_sha512_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200671#endif
672#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200673 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200674 return mbedtls_sha512_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200675#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200676#if defined(MBEDTLS_SHA3_C)
677 case MBEDTLS_MD_SHA3_224:
678 case MBEDTLS_MD_SHA3_256:
679 case MBEDTLS_MD_SHA3_384:
680 case MBEDTLS_MD_SHA3_512:
681 return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
682#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200683 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200684 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200685 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200686}
687
Jens Wiklander32b31802023-10-06 16:59:46 +0200688int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
689 unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200690{
Jens Wiklander32b31802023-10-06 16:59:46 +0200691 if (md_info == NULL) {
692 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
693 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200694
Jens Wiklander32b31802023-10-06 16:59:46 +0200695#if defined(MBEDTLS_MD_SOME_PSA)
696 if (md_can_use_psa(md_info)) {
697 size_t size = md_info->size;
698 psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
699 input, ilen,
700 output, size, &size);
701 return mbedtls_md_error_from_psa(status);
702 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200703#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200704
705 switch (md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200706#if defined(MBEDTLS_MD5_C)
707 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200708 return mbedtls_md5(input, ilen, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200709#endif
710#if defined(MBEDTLS_RIPEMD160_C)
711 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200712 return mbedtls_ripemd160(input, ilen, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200713#endif
714#if defined(MBEDTLS_SHA1_C)
715 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200716 return mbedtls_sha1(input, ilen, output);
717#endif
718#if defined(MBEDTLS_SHA224_C)
719 case MBEDTLS_MD_SHA224:
720 return mbedtls_sha256(input, ilen, output, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200721#endif
722#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200723 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200724 return mbedtls_sha256(input, ilen, output, 0);
725#endif
726#if defined(MBEDTLS_SHA384_C)
727 case MBEDTLS_MD_SHA384:
728 return mbedtls_sha512(input, ilen, output, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200729#endif
730#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200731 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200732 return mbedtls_sha512(input, ilen, output, 0);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200733#endif
Tom Van Eyckc1633172024-04-09 18:44:13 +0200734#if defined(MBEDTLS_SHA3_C)
735 case MBEDTLS_MD_SHA3_224:
736 return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
737 case MBEDTLS_MD_SHA3_256:
738 return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
739 case MBEDTLS_MD_SHA3_384:
740 return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
741 case MBEDTLS_MD_SHA3_512:
742 return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
743#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200744 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200745 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200746 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200747}
748
Jens Wiklander32b31802023-10-06 16:59:46 +0200749unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
750{
751 if (md_info == NULL) {
752 return 0;
753 }
754
755 return md_info->size;
756}
757
758mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
759{
760 if (md_info == NULL) {
761 return MBEDTLS_MD_NONE;
762 }
763
764 return md_info->type;
765}
766
Tom Van Eyckc1633172024-04-09 18:44:13 +0200767#if defined(MBEDTLS_PSA_CRYPTO_C)
768int mbedtls_md_error_from_psa(psa_status_t status)
769{
770 return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
771 psa_generic_status_to_mbedtls);
772}
773#endif /* MBEDTLS_PSA_CRYPTO_C */
774
775
Jens Wiklander32b31802023-10-06 16:59:46 +0200776/************************************************************************
777 * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
778 * functions below are only available when MBEDTLS_MD_C is set. *
779 ************************************************************************/
780#if defined(MBEDTLS_MD_C)
781
782/*
783 * Reminder: update profiles in x509_crt.c when adding a new hash!
784 */
785static const int supported_digests[] = {
786
787#if defined(MBEDTLS_MD_CAN_SHA512)
788 MBEDTLS_MD_SHA512,
789#endif
790
791#if defined(MBEDTLS_MD_CAN_SHA384)
792 MBEDTLS_MD_SHA384,
793#endif
794
795#if defined(MBEDTLS_MD_CAN_SHA256)
796 MBEDTLS_MD_SHA256,
797#endif
798#if defined(MBEDTLS_MD_CAN_SHA224)
799 MBEDTLS_MD_SHA224,
800#endif
801
802#if defined(MBEDTLS_MD_CAN_SHA1)
803 MBEDTLS_MD_SHA1,
804#endif
805
806#if defined(MBEDTLS_MD_CAN_RIPEMD160)
807 MBEDTLS_MD_RIPEMD160,
808#endif
809
810#if defined(MBEDTLS_MD_CAN_MD5)
811 MBEDTLS_MD_MD5,
812#endif
813
Tom Van Eyckc1633172024-04-09 18:44:13 +0200814#if defined(MBEDTLS_MD_CAN_SHA3_224)
815 MBEDTLS_MD_SHA3_224,
816#endif
817
818#if defined(MBEDTLS_MD_CAN_SHA3_256)
819 MBEDTLS_MD_SHA3_256,
820#endif
821
822#if defined(MBEDTLS_MD_CAN_SHA3_384)
823 MBEDTLS_MD_SHA3_384,
824#endif
825
826#if defined(MBEDTLS_MD_CAN_SHA3_512)
827 MBEDTLS_MD_SHA3_512,
828#endif
829
Jens Wiklander32b31802023-10-06 16:59:46 +0200830 MBEDTLS_MD_NONE
831};
832
833const int *mbedtls_md_list(void)
834{
835 return supported_digests;
836}
837
Tom Van Eyckc1633172024-04-09 18:44:13 +0200838typedef struct {
839 const char *md_name;
840 mbedtls_md_type_t md_type;
841} md_name_entry;
842
843static const md_name_entry md_names[] = {
844#if defined(MBEDTLS_MD_CAN_MD5)
845 { "MD5", MBEDTLS_MD_MD5 },
846#endif
847#if defined(MBEDTLS_MD_CAN_RIPEMD160)
848 { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
849#endif
850#if defined(MBEDTLS_MD_CAN_SHA1)
851 { "SHA1", MBEDTLS_MD_SHA1 },
852 { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
853#endif
854#if defined(MBEDTLS_MD_CAN_SHA224)
855 { "SHA224", MBEDTLS_MD_SHA224 },
856#endif
857#if defined(MBEDTLS_MD_CAN_SHA256)
858 { "SHA256", MBEDTLS_MD_SHA256 },
859#endif
860#if defined(MBEDTLS_MD_CAN_SHA384)
861 { "SHA384", MBEDTLS_MD_SHA384 },
862#endif
863#if defined(MBEDTLS_MD_CAN_SHA512)
864 { "SHA512", MBEDTLS_MD_SHA512 },
865#endif
866#if defined(MBEDTLS_MD_CAN_SHA3_224)
867 { "SHA3-224", MBEDTLS_MD_SHA3_224 },
868#endif
869#if defined(MBEDTLS_MD_CAN_SHA3_256)
870 { "SHA3-256", MBEDTLS_MD_SHA3_256 },
871#endif
872#if defined(MBEDTLS_MD_CAN_SHA3_384)
873 { "SHA3-384", MBEDTLS_MD_SHA3_384 },
874#endif
875#if defined(MBEDTLS_MD_CAN_SHA3_512)
876 { "SHA3-512", MBEDTLS_MD_SHA3_512 },
877#endif
878 { NULL, MBEDTLS_MD_NONE },
879};
880
Jens Wiklander32b31802023-10-06 16:59:46 +0200881const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
882{
883 if (NULL == md_name) {
884 return NULL;
885 }
886
Tom Van Eyckc1633172024-04-09 18:44:13 +0200887 const md_name_entry *entry = md_names;
888 while (entry->md_name != NULL &&
889 strcmp(entry->md_name, md_name) != 0) {
890 ++entry;
Jens Wiklander32b31802023-10-06 16:59:46 +0200891 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200892
893 return mbedtls_md_info_from_type(entry->md_type);
894}
895
896const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
897{
898 if (md_info == NULL) {
899 return NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200900 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200901
902 const md_name_entry *entry = md_names;
903 while (entry->md_type != MBEDTLS_MD_NONE &&
904 entry->md_type != md_info->type) {
905 ++entry;
Jens Wiklander32b31802023-10-06 16:59:46 +0200906 }
Tom Van Eyckc1633172024-04-09 18:44:13 +0200907
908 return entry->md_name;
Jens Wiklander32b31802023-10-06 16:59:46 +0200909}
910
911const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
912 const mbedtls_md_context_t *ctx)
913{
914 if (ctx == NULL) {
915 return NULL;
916 }
917
918 return ctx->MBEDTLS_PRIVATE(md_info);
919}
920
Jens Wiklander817466c2018-05-22 13:49:31 +0200921#if defined(MBEDTLS_FS_IO)
Jens Wiklander32b31802023-10-06 16:59:46 +0200922int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200923{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200924 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200925 FILE *f;
926 size_t n;
927 mbedtls_md_context_t ctx;
928 unsigned char buf[1024];
929
Jens Wiklander32b31802023-10-06 16:59:46 +0200930 if (md_info == NULL) {
931 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
932 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200933
Jens Wiklander32b31802023-10-06 16:59:46 +0200934 if ((f = fopen(path, "rb")) == NULL) {
935 return MBEDTLS_ERR_MD_FILE_IO_ERROR;
936 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200937
Jens Wiklander32b31802023-10-06 16:59:46 +0200938 /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
939 mbedtls_setbuf(f, NULL);
Jens Wiklander817466c2018-05-22 13:49:31 +0200940
Jens Wiklander32b31802023-10-06 16:59:46 +0200941 mbedtls_md_init(&ctx);
942
943 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200944 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200945 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200946
Jens Wiklander32b31802023-10-06 16:59:46 +0200947 if ((ret = mbedtls_md_starts(&ctx)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100948 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200949 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200950
Jens Wiklander32b31802023-10-06 16:59:46 +0200951 while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
952 if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100953 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200954 }
955 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200956
Jens Wiklander32b31802023-10-06 16:59:46 +0200957 if (ferror(f) != 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200958 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Jens Wiklander32b31802023-10-06 16:59:46 +0200959 } else {
960 ret = mbedtls_md_finish(&ctx, output);
961 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200962
963cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +0200964 mbedtls_platform_zeroize(buf, sizeof(buf));
965 fclose(f);
966 mbedtls_md_free(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200967
Jens Wiklander32b31802023-10-06 16:59:46 +0200968 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200969}
970#endif /* MBEDTLS_FS_IO */
971
Jens Wiklander32b31802023-10-06 16:59:46 +0200972int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
Jens Wiklander817466c2018-05-22 13:49:31 +0200973{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200974 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200975 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
976 unsigned char *ipad, *opad;
Jens Wiklander817466c2018-05-22 13:49:31 +0200977
Jens Wiklander32b31802023-10-06 16:59:46 +0200978 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
979 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
980 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200981
Jens Wiklander32b31802023-10-06 16:59:46 +0200982 if (keylen > (size_t) ctx->md_info->block_size) {
983 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100984 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200985 }
986 if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100987 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200988 }
989 if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100990 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200991 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200992
993 keylen = ctx->md_info->size;
994 key = sum;
995 }
996
997 ipad = (unsigned char *) ctx->hmac_ctx;
998 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
999
Jens Wiklander32b31802023-10-06 16:59:46 +02001000 memset(ipad, 0x36, ctx->md_info->block_size);
1001 memset(opad, 0x5C, ctx->md_info->block_size);
Jens Wiklander817466c2018-05-22 13:49:31 +02001002
Jens Wiklander32b31802023-10-06 16:59:46 +02001003 mbedtls_xor(ipad, ipad, key, keylen);
1004 mbedtls_xor(opad, opad, key, keylen);
1005
1006 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1007 goto cleanup;
1008 }
1009 if ((ret = mbedtls_md_update(ctx, ipad,
1010 ctx->md_info->block_size)) != 0) {
1011 goto cleanup;
Jens Wiklander817466c2018-05-22 13:49:31 +02001012 }
1013
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001014cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +02001015 mbedtls_platform_zeroize(sum, sizeof(sum));
Jens Wiklander817466c2018-05-22 13:49:31 +02001016
Jens Wiklander32b31802023-10-06 16:59:46 +02001017 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +02001018}
1019
Jens Wiklander32b31802023-10-06 16:59:46 +02001020int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Jens Wiklander817466c2018-05-22 13:49:31 +02001021{
Jens Wiklander32b31802023-10-06 16:59:46 +02001022 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1023 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1024 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001025
Jens Wiklander32b31802023-10-06 16:59:46 +02001026 return mbedtls_md_update(ctx, input, ilen);
Jens Wiklander817466c2018-05-22 13:49:31 +02001027}
1028
Jens Wiklander32b31802023-10-06 16:59:46 +02001029int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +02001030{
Jerome Forissier11fa71b2020-04-20 17:17:56 +02001031 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +02001032 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
1033 unsigned char *opad;
1034
Jens Wiklander32b31802023-10-06 16:59:46 +02001035 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1036 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1037 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001038
1039 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
1040
Jens Wiklander32b31802023-10-06 16:59:46 +02001041 if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
1042 return ret;
1043 }
1044 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1045 return ret;
1046 }
1047 if ((ret = mbedtls_md_update(ctx, opad,
1048 ctx->md_info->block_size)) != 0) {
1049 return ret;
1050 }
1051 if ((ret = mbedtls_md_update(ctx, tmp,
1052 ctx->md_info->size)) != 0) {
1053 return ret;
1054 }
1055 return mbedtls_md_finish(ctx, output);
Jens Wiklander817466c2018-05-22 13:49:31 +02001056}
1057
Jens Wiklander32b31802023-10-06 16:59:46 +02001058int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
Jens Wiklander817466c2018-05-22 13:49:31 +02001059{
Jerome Forissier11fa71b2020-04-20 17:17:56 +02001060 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +02001061 unsigned char *ipad;
1062
Jens Wiklander32b31802023-10-06 16:59:46 +02001063 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1064 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1065 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001066
1067 ipad = (unsigned char *) ctx->hmac_ctx;
1068
Jens Wiklander32b31802023-10-06 16:59:46 +02001069 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1070 return ret;
1071 }
1072 return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
Jens Wiklander817466c2018-05-22 13:49:31 +02001073}
1074
Jens Wiklander32b31802023-10-06 16:59:46 +02001075int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1076 const unsigned char *key, size_t keylen,
1077 const unsigned char *input, size_t ilen,
1078 unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +02001079{
1080 mbedtls_md_context_t ctx;
Jerome Forissier11fa71b2020-04-20 17:17:56 +02001081 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +02001082
Jens Wiklander32b31802023-10-06 16:59:46 +02001083 if (md_info == NULL) {
1084 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1085 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001086
Jens Wiklander32b31802023-10-06 16:59:46 +02001087 mbedtls_md_init(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +02001088
Jens Wiklander32b31802023-10-06 16:59:46 +02001089 if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001090 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +02001091 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001092
Jens Wiklander32b31802023-10-06 16:59:46 +02001093 if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 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_update(&ctx, input, ilen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001097 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +02001098 }
1099 if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001100 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +02001101 }
Jens Wiklander817466c2018-05-22 13:49:31 +02001102
Jens Wiklander3d3b0592019-03-20 15:30:29 +01001103cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +02001104 mbedtls_md_free(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +02001105
Jens Wiklander32b31802023-10-06 16:59:46 +02001106 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +02001107}
1108
Jens Wiklander817466c2018-05-22 13:49:31 +02001109#endif /* MBEDTLS_MD_C */
Jens Wiklander32b31802023-10-06 16:59:46 +02001110
1111#endif /* MBEDTLS_MD_LIGHT */