1817466cbSJens Wiklander /**
27901324dSJerome Forissier * \file md.c
3817466cbSJens Wiklander *
4b0563631STom Van Eyck * \brief Generic message digest wrapper for Mbed TLS
5817466cbSJens Wiklander *
6817466cbSJens Wiklander * \author Adriaan de Jong <dejong@fox-it.com>
7817466cbSJens Wiklander *
87901324dSJerome Forissier * Copyright The Mbed TLS Contributors
9b0563631STom Van Eyck * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
10817466cbSJens Wiklander */
11817466cbSJens Wiklander
127901324dSJerome Forissier #include "common.h"
13817466cbSJens Wiklander
1432b31808SJens Wiklander /*
1532b31808SJens Wiklander * Availability of functions in this module is controlled by two
1632b31808SJens Wiklander * feature macros:
1732b31808SJens Wiklander * - MBEDTLS_MD_C enables the whole module;
1832b31808SJens Wiklander * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
1932b31808SJens Wiklander * most hash metadata (everything except string names); is it
2032b31808SJens Wiklander * automatically set whenever MBEDTLS_MD_C is defined.
2132b31808SJens Wiklander *
2232b31808SJens Wiklander * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
2332b31808SJens Wiklander *
2432b31808SJens Wiklander * In the future we may want to change the contract of some functions
2532b31808SJens Wiklander * (behaviour with NULL arguments) depending on whether MD_C is defined or
2632b31808SJens Wiklander * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
2732b31808SJens Wiklander *
2832b31808SJens Wiklander * For these reasons, we're keeping MD_LIGHT internal for now.
2932b31808SJens Wiklander */
3032b31808SJens Wiklander #if defined(MBEDTLS_MD_LIGHT)
31817466cbSJens Wiklander
32817466cbSJens Wiklander #include "mbedtls/md.h"
3332b31808SJens Wiklander #include "md_wrap.h"
343d3b0591SJens Wiklander #include "mbedtls/platform_util.h"
3511fa71b9SJerome Forissier #include "mbedtls/error.h"
3611fa71b9SJerome Forissier
3711fa71b9SJerome Forissier #include "mbedtls/md5.h"
3811fa71b9SJerome Forissier #include "mbedtls/ripemd160.h"
3911fa71b9SJerome Forissier #include "mbedtls/sha1.h"
4011fa71b9SJerome Forissier #include "mbedtls/sha256.h"
4111fa71b9SJerome Forissier #include "mbedtls/sha512.h"
42b0563631STom Van Eyck #include "mbedtls/sha3.h"
43b0563631STom Van Eyck
44*cb034002SJerome Forissier #if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
45b0563631STom Van Eyck #include <psa/crypto.h>
46b0563631STom Van Eyck #include "md_psa.h"
47b0563631STom Van Eyck #include "psa_util_internal.h"
48b0563631STom Van Eyck #endif
49817466cbSJens Wiklander
5032b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
5132b31808SJens Wiklander #include "psa_crypto_core.h"
52817466cbSJens Wiklander #endif
53817466cbSJens Wiklander
5432b31808SJens Wiklander #include "mbedtls/platform.h"
5532b31808SJens Wiklander
56817466cbSJens Wiklander #include <string.h>
57817466cbSJens Wiklander
58817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO)
59817466cbSJens Wiklander #include <stdio.h>
60817466cbSJens Wiklander #endif
61817466cbSJens Wiklander
62b0563631STom Van Eyck /* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
63b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
64b0563631STom Van Eyck #error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
65b0563631STom Van Eyck #endif
66b0563631STom Van Eyck
67b0563631STom Van Eyck #if defined(MBEDTLS_MD_C)
68b0563631STom Van Eyck #define MD_INFO(type, out_size, block_size) type, out_size, block_size,
69b0563631STom Van Eyck #else
70b0563631STom Van Eyck #define MD_INFO(type, out_size, block_size) type, out_size,
71b0563631STom Van Eyck #endif
72b0563631STom Van Eyck
7332b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_MD5)
74b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_md5_info = {
75b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_MD5, 16, 64)
7611fa71b9SJerome Forissier };
7711fa71b9SJerome Forissier #endif
7811fa71b9SJerome Forissier
7932b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_RIPEMD160)
80b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_ripemd160_info = {
81b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64)
8211fa71b9SJerome Forissier };
8311fa71b9SJerome Forissier #endif
8411fa71b9SJerome Forissier
8532b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA1)
86b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha1_info = {
87b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA1, 20, 64)
8811fa71b9SJerome Forissier };
8911fa71b9SJerome Forissier #endif
9011fa71b9SJerome Forissier
9132b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA224)
92b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha224_info = {
93b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA224, 28, 64)
9411fa71b9SJerome Forissier };
9532b31808SJens Wiklander #endif
9611fa71b9SJerome Forissier
9732b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA256)
98b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha256_info = {
99b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA256, 32, 64)
10011fa71b9SJerome Forissier };
10111fa71b9SJerome Forissier #endif
10211fa71b9SJerome Forissier
10332b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA384)
104b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha384_info = {
105b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA384, 48, 128)
10611fa71b9SJerome Forissier };
10711fa71b9SJerome Forissier #endif
10811fa71b9SJerome Forissier
10932b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512)
110b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha512_info = {
111b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA512, 64, 128)
112b0563631STom Van Eyck };
113b0563631STom Van Eyck #endif
114b0563631STom Van Eyck
115b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224)
116b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_224_info = {
117b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144)
118b0563631STom Van Eyck };
119b0563631STom Van Eyck #endif
120b0563631STom Van Eyck
121b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256)
122b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_256_info = {
123b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136)
124b0563631STom Van Eyck };
125b0563631STom Van Eyck #endif
126b0563631STom Van Eyck
127b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384)
128b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_384_info = {
129b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104)
130b0563631STom Van Eyck };
131b0563631STom Van Eyck #endif
132b0563631STom Van Eyck
133b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512)
134b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_512_info = {
135b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72)
13611fa71b9SJerome Forissier };
13711fa71b9SJerome Forissier #endif
13811fa71b9SJerome Forissier
mbedtls_md_info_from_type(mbedtls_md_type_t md_type)139817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
140817466cbSJens Wiklander {
14132b31808SJens Wiklander switch (md_type) {
14232b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_MD5)
143817466cbSJens Wiklander case MBEDTLS_MD_MD5:
14432b31808SJens Wiklander return &mbedtls_md5_info;
145817466cbSJens Wiklander #endif
14632b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_RIPEMD160)
147817466cbSJens Wiklander case MBEDTLS_MD_RIPEMD160:
14832b31808SJens Wiklander return &mbedtls_ripemd160_info;
149817466cbSJens Wiklander #endif
15032b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA1)
151817466cbSJens Wiklander case MBEDTLS_MD_SHA1:
15232b31808SJens Wiklander return &mbedtls_sha1_info;
153817466cbSJens Wiklander #endif
15432b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA224)
155817466cbSJens Wiklander case MBEDTLS_MD_SHA224:
15632b31808SJens Wiklander return &mbedtls_sha224_info;
15732b31808SJens Wiklander #endif
15832b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA256)
159817466cbSJens Wiklander case MBEDTLS_MD_SHA256:
16032b31808SJens Wiklander return &mbedtls_sha256_info;
161817466cbSJens Wiklander #endif
16232b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA384)
163817466cbSJens Wiklander case MBEDTLS_MD_SHA384:
16432b31808SJens Wiklander return &mbedtls_sha384_info;
16511fa71b9SJerome Forissier #endif
16632b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512)
167817466cbSJens Wiklander case MBEDTLS_MD_SHA512:
16832b31808SJens Wiklander return &mbedtls_sha512_info;
169817466cbSJens Wiklander #endif
170b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224)
171b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
172b0563631STom Van Eyck return &mbedtls_sha3_224_info;
173b0563631STom Van Eyck #endif
174b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256)
175b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
176b0563631STom Van Eyck return &mbedtls_sha3_256_info;
177b0563631STom Van Eyck #endif
178b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384)
179b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
180b0563631STom Van Eyck return &mbedtls_sha3_384_info;
181b0563631STom Van Eyck #endif
182b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512)
183b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
184b0563631STom Van Eyck return &mbedtls_sha3_512_info;
185b0563631STom Van Eyck #endif
186817466cbSJens Wiklander default:
18732b31808SJens Wiklander return NULL;
188817466cbSJens Wiklander }
189817466cbSJens Wiklander }
190817466cbSJens Wiklander
19132b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
psa_alg_of_md(const mbedtls_md_info_t * info)19232b31808SJens Wiklander static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
19332b31808SJens Wiklander {
19432b31808SJens Wiklander switch (info->type) {
19532b31808SJens Wiklander #if defined(MBEDTLS_MD_MD5_VIA_PSA)
19632b31808SJens Wiklander case MBEDTLS_MD_MD5:
19732b31808SJens Wiklander return PSA_ALG_MD5;
19832b31808SJens Wiklander #endif
19932b31808SJens Wiklander #if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
20032b31808SJens Wiklander case MBEDTLS_MD_RIPEMD160:
20132b31808SJens Wiklander return PSA_ALG_RIPEMD160;
20232b31808SJens Wiklander #endif
20332b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA1_VIA_PSA)
20432b31808SJens Wiklander case MBEDTLS_MD_SHA1:
20532b31808SJens Wiklander return PSA_ALG_SHA_1;
20632b31808SJens Wiklander #endif
20732b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA224_VIA_PSA)
20832b31808SJens Wiklander case MBEDTLS_MD_SHA224:
20932b31808SJens Wiklander return PSA_ALG_SHA_224;
21032b31808SJens Wiklander #endif
21132b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA256_VIA_PSA)
21232b31808SJens Wiklander case MBEDTLS_MD_SHA256:
21332b31808SJens Wiklander return PSA_ALG_SHA_256;
21432b31808SJens Wiklander #endif
21532b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA384_VIA_PSA)
21632b31808SJens Wiklander case MBEDTLS_MD_SHA384:
21732b31808SJens Wiklander return PSA_ALG_SHA_384;
21832b31808SJens Wiklander #endif
21932b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA512_VIA_PSA)
22032b31808SJens Wiklander case MBEDTLS_MD_SHA512:
22132b31808SJens Wiklander return PSA_ALG_SHA_512;
22232b31808SJens Wiklander #endif
223b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_224_VIA_PSA)
224b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
225b0563631STom Van Eyck return PSA_ALG_SHA3_224;
226b0563631STom Van Eyck #endif
227b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_256_VIA_PSA)
228b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
229b0563631STom Van Eyck return PSA_ALG_SHA3_256;
230b0563631STom Van Eyck #endif
231b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_384_VIA_PSA)
232b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
233b0563631STom Van Eyck return PSA_ALG_SHA3_384;
234b0563631STom Van Eyck #endif
235b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_512_VIA_PSA)
236b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
237b0563631STom Van Eyck return PSA_ALG_SHA3_512;
238b0563631STom Van Eyck #endif
23932b31808SJens Wiklander default:
24032b31808SJens Wiklander return PSA_ALG_NONE;
24132b31808SJens Wiklander }
24232b31808SJens Wiklander }
24332b31808SJens Wiklander
md_can_use_psa(const mbedtls_md_info_t * info)24432b31808SJens Wiklander static int md_can_use_psa(const mbedtls_md_info_t *info)
24532b31808SJens Wiklander {
24632b31808SJens Wiklander psa_algorithm_t alg = psa_alg_of_md(info);
24732b31808SJens Wiklander if (alg == PSA_ALG_NONE) {
24832b31808SJens Wiklander return 0;
24932b31808SJens Wiklander }
25032b31808SJens Wiklander
25132b31808SJens Wiklander return psa_can_do_hash(alg);
25232b31808SJens Wiklander }
25332b31808SJens Wiklander #endif /* MBEDTLS_MD_SOME_PSA */
25432b31808SJens Wiklander
mbedtls_md_init(mbedtls_md_context_t * ctx)255817466cbSJens Wiklander void mbedtls_md_init(mbedtls_md_context_t *ctx)
256817466cbSJens Wiklander {
25732b31808SJens Wiklander /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
258817466cbSJens Wiklander memset(ctx, 0, sizeof(mbedtls_md_context_t));
259817466cbSJens Wiklander }
260817466cbSJens Wiklander
mbedtls_md_free(mbedtls_md_context_t * ctx)261817466cbSJens Wiklander void mbedtls_md_free(mbedtls_md_context_t *ctx)
262817466cbSJens Wiklander {
26332b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) {
264817466cbSJens Wiklander return;
26532b31808SJens Wiklander }
266817466cbSJens Wiklander
26732b31808SJens Wiklander if (ctx->md_ctx != NULL) {
26832b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
26932b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
27032b31808SJens Wiklander psa_hash_abort(ctx->md_ctx);
27132b31808SJens Wiklander } else
27211fa71b9SJerome Forissier #endif
27332b31808SJens Wiklander switch (ctx->md_info->type) {
27411fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
27511fa71b9SJerome Forissier case MBEDTLS_MD_MD5:
27611fa71b9SJerome Forissier mbedtls_md5_free(ctx->md_ctx);
27711fa71b9SJerome Forissier break;
27811fa71b9SJerome Forissier #endif
27911fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
28011fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160:
28111fa71b9SJerome Forissier mbedtls_ripemd160_free(ctx->md_ctx);
28211fa71b9SJerome Forissier break;
28311fa71b9SJerome Forissier #endif
28411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
28511fa71b9SJerome Forissier case MBEDTLS_MD_SHA1:
28611fa71b9SJerome Forissier mbedtls_sha1_free(ctx->md_ctx);
28711fa71b9SJerome Forissier break;
28811fa71b9SJerome Forissier #endif
28932b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C)
29011fa71b9SJerome Forissier case MBEDTLS_MD_SHA224:
29132b31808SJens Wiklander mbedtls_sha256_free(ctx->md_ctx);
29232b31808SJens Wiklander break;
29332b31808SJens Wiklander #endif
29432b31808SJens Wiklander #if defined(MBEDTLS_SHA256_C)
29511fa71b9SJerome Forissier case MBEDTLS_MD_SHA256:
29611fa71b9SJerome Forissier mbedtls_sha256_free(ctx->md_ctx);
29711fa71b9SJerome Forissier break;
29811fa71b9SJerome Forissier #endif
29932b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C)
30011fa71b9SJerome Forissier case MBEDTLS_MD_SHA384:
30132b31808SJens Wiklander mbedtls_sha512_free(ctx->md_ctx);
30232b31808SJens Wiklander break;
30311fa71b9SJerome Forissier #endif
30432b31808SJens Wiklander #if defined(MBEDTLS_SHA512_C)
30511fa71b9SJerome Forissier case MBEDTLS_MD_SHA512:
30611fa71b9SJerome Forissier mbedtls_sha512_free(ctx->md_ctx);
30711fa71b9SJerome Forissier break;
30811fa71b9SJerome Forissier #endif
309b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C)
310b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
311b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
312b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
313b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
314b0563631STom Van Eyck mbedtls_sha3_free(ctx->md_ctx);
315b0563631STom Van Eyck break;
316b0563631STom Van Eyck #endif
31711fa71b9SJerome Forissier default:
31811fa71b9SJerome Forissier /* Shouldn't happen */
31911fa71b9SJerome Forissier break;
32011fa71b9SJerome Forissier }
32111fa71b9SJerome Forissier mbedtls_free(ctx->md_ctx);
32211fa71b9SJerome Forissier }
323817466cbSJens Wiklander
32432b31808SJens Wiklander #if defined(MBEDTLS_MD_C)
32532b31808SJens Wiklander if (ctx->hmac_ctx != NULL) {
326b0563631STom Van Eyck mbedtls_zeroize_and_free(ctx->hmac_ctx,
3273d3b0591SJens Wiklander 2 * ctx->md_info->block_size);
328817466cbSJens Wiklander }
32932b31808SJens Wiklander #endif
330817466cbSJens Wiklander
3313d3b0591SJens Wiklander mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
332817466cbSJens Wiklander }
333817466cbSJens Wiklander
mbedtls_md_clone(mbedtls_md_context_t * dst,const mbedtls_md_context_t * src)334817466cbSJens Wiklander int mbedtls_md_clone(mbedtls_md_context_t *dst,
335817466cbSJens Wiklander const mbedtls_md_context_t *src)
336817466cbSJens Wiklander {
337817466cbSJens Wiklander if (dst == NULL || dst->md_info == NULL ||
338817466cbSJens Wiklander src == NULL || src->md_info == NULL ||
33932b31808SJens Wiklander dst->md_info != src->md_info) {
34032b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
341817466cbSJens Wiklander }
342817466cbSJens Wiklander
34332b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
34432b31808SJens Wiklander if (src->engine != dst->engine) {
34532b31808SJens Wiklander /* This can happen with src set to legacy because PSA wasn't ready
34632b31808SJens Wiklander * yet, and dst to PSA because it became ready in the meantime.
34732b31808SJens Wiklander * We currently don't support that case (we'd need to re-allocate
34832b31808SJens Wiklander * md_ctx to the size of the appropriate MD context). */
34932b31808SJens Wiklander return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
35032b31808SJens Wiklander }
35132b31808SJens Wiklander
35232b31808SJens Wiklander if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
35332b31808SJens Wiklander psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
35432b31808SJens Wiklander return mbedtls_md_error_from_psa(status);
35532b31808SJens Wiklander }
35611fa71b9SJerome Forissier #endif
35732b31808SJens Wiklander
35832b31808SJens Wiklander switch (src->md_info->type) {
35911fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
36011fa71b9SJerome Forissier case MBEDTLS_MD_MD5:
36111fa71b9SJerome Forissier mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
36211fa71b9SJerome Forissier break;
36311fa71b9SJerome Forissier #endif
36411fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
36511fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160:
36611fa71b9SJerome Forissier mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
36711fa71b9SJerome Forissier break;
36811fa71b9SJerome Forissier #endif
36911fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
37011fa71b9SJerome Forissier case MBEDTLS_MD_SHA1:
37111fa71b9SJerome Forissier mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
37211fa71b9SJerome Forissier break;
37311fa71b9SJerome Forissier #endif
37432b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C)
37511fa71b9SJerome Forissier case MBEDTLS_MD_SHA224:
37632b31808SJens Wiklander mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
37732b31808SJens Wiklander break;
37832b31808SJens Wiklander #endif
37932b31808SJens Wiklander #if defined(MBEDTLS_SHA256_C)
38011fa71b9SJerome Forissier case MBEDTLS_MD_SHA256:
38111fa71b9SJerome Forissier mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
38211fa71b9SJerome Forissier break;
38311fa71b9SJerome Forissier #endif
38432b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C)
38511fa71b9SJerome Forissier case MBEDTLS_MD_SHA384:
38632b31808SJens Wiklander mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
38732b31808SJens Wiklander break;
38811fa71b9SJerome Forissier #endif
38932b31808SJens Wiklander #if defined(MBEDTLS_SHA512_C)
39011fa71b9SJerome Forissier case MBEDTLS_MD_SHA512:
39111fa71b9SJerome Forissier mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
39211fa71b9SJerome Forissier break;
39311fa71b9SJerome Forissier #endif
394b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C)
395b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
396b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
397b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
398b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
399b0563631STom Van Eyck mbedtls_sha3_clone(dst->md_ctx, src->md_ctx);
400b0563631STom Van Eyck break;
401b0563631STom Van Eyck #endif
40211fa71b9SJerome Forissier default:
40332b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
40411fa71b9SJerome Forissier }
405817466cbSJens Wiklander
40612484fc7SEdison Ai if (dst->hmac_ctx != NULL && src->hmac_ctx != NULL)
40712484fc7SEdison Ai memcpy(dst->hmac_ctx, src->hmac_ctx, 2 * src->md_info->block_size);
40812484fc7SEdison Ai
40932b31808SJens Wiklander return 0;
410817466cbSJens Wiklander }
411817466cbSJens Wiklander
41211fa71b9SJerome Forissier #define ALLOC(type) \
41311fa71b9SJerome Forissier do { \
41411fa71b9SJerome Forissier ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
41511fa71b9SJerome Forissier if (ctx->md_ctx == NULL) \
41632b31808SJens Wiklander return MBEDTLS_ERR_MD_ALLOC_FAILED; \
41711fa71b9SJerome Forissier mbedtls_##type##_init(ctx->md_ctx); \
41811fa71b9SJerome Forissier } \
41911fa71b9SJerome Forissier while (0)
42011fa71b9SJerome Forissier
mbedtls_md_setup(mbedtls_md_context_t * ctx,const mbedtls_md_info_t * md_info,int hmac)421817466cbSJens Wiklander int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
422817466cbSJens Wiklander {
423b0563631STom Van Eyck #if defined(MBEDTLS_MD_C)
424b0563631STom Van Eyck if (ctx == NULL) {
425b0563631STom Van Eyck return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
426b0563631STom Van Eyck }
427b0563631STom Van Eyck #endif
428b0563631STom Van Eyck if (md_info == NULL) {
42932b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
43032b31808SJens Wiklander }
431817466cbSJens Wiklander
4327901324dSJerome Forissier ctx->md_info = md_info;
4337901324dSJerome Forissier ctx->md_ctx = NULL;
43432b31808SJens Wiklander #if defined(MBEDTLS_MD_C)
4357901324dSJerome Forissier ctx->hmac_ctx = NULL;
43632b31808SJens Wiklander #else
43732b31808SJens Wiklander if (hmac != 0) {
43832b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
43932b31808SJens Wiklander }
44032b31808SJens Wiklander #endif
4417901324dSJerome Forissier
44232b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
44332b31808SJens Wiklander if (md_can_use_psa(ctx->md_info)) {
44432b31808SJens Wiklander ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
44532b31808SJens Wiklander if (ctx->md_ctx == NULL) {
44632b31808SJens Wiklander return MBEDTLS_ERR_MD_ALLOC_FAILED;
44732b31808SJens Wiklander }
44832b31808SJens Wiklander ctx->engine = MBEDTLS_MD_ENGINE_PSA;
44932b31808SJens Wiklander } else
45011fa71b9SJerome Forissier #endif
45132b31808SJens Wiklander switch (md_info->type) {
45211fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
45311fa71b9SJerome Forissier case MBEDTLS_MD_MD5:
45411fa71b9SJerome Forissier ALLOC(md5);
45511fa71b9SJerome Forissier break;
45611fa71b9SJerome Forissier #endif
45711fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
45811fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160:
45911fa71b9SJerome Forissier ALLOC(ripemd160);
46011fa71b9SJerome Forissier break;
46111fa71b9SJerome Forissier #endif
46211fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
46311fa71b9SJerome Forissier case MBEDTLS_MD_SHA1:
46411fa71b9SJerome Forissier ALLOC(sha1);
46511fa71b9SJerome Forissier break;
46611fa71b9SJerome Forissier #endif
46732b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C)
46811fa71b9SJerome Forissier case MBEDTLS_MD_SHA224:
46932b31808SJens Wiklander ALLOC(sha256);
47032b31808SJens Wiklander break;
47132b31808SJens Wiklander #endif
47232b31808SJens Wiklander #if defined(MBEDTLS_SHA256_C)
47311fa71b9SJerome Forissier case MBEDTLS_MD_SHA256:
47411fa71b9SJerome Forissier ALLOC(sha256);
47511fa71b9SJerome Forissier break;
47611fa71b9SJerome Forissier #endif
47732b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C)
47811fa71b9SJerome Forissier case MBEDTLS_MD_SHA384:
47932b31808SJens Wiklander ALLOC(sha512);
48032b31808SJens Wiklander break;
48111fa71b9SJerome Forissier #endif
48232b31808SJens Wiklander #if defined(MBEDTLS_SHA512_C)
48311fa71b9SJerome Forissier case MBEDTLS_MD_SHA512:
48411fa71b9SJerome Forissier ALLOC(sha512);
48511fa71b9SJerome Forissier break;
48611fa71b9SJerome Forissier #endif
487b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C)
488b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
489b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
490b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
491b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
492b0563631STom Van Eyck ALLOC(sha3);
493b0563631STom Van Eyck break;
494b0563631STom Van Eyck #endif
49511fa71b9SJerome Forissier default:
49632b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
49711fa71b9SJerome Forissier }
498817466cbSJens Wiklander
49932b31808SJens Wiklander #if defined(MBEDTLS_MD_C)
50032b31808SJens Wiklander if (hmac != 0) {
501817466cbSJens Wiklander ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
50232b31808SJens Wiklander if (ctx->hmac_ctx == NULL) {
50311fa71b9SJerome Forissier mbedtls_md_free(ctx);
50432b31808SJens Wiklander return MBEDTLS_ERR_MD_ALLOC_FAILED;
505817466cbSJens Wiklander }
506817466cbSJens Wiklander }
50732b31808SJens Wiklander #endif
508817466cbSJens Wiklander
50932b31808SJens Wiklander return 0;
510817466cbSJens Wiklander }
51111fa71b9SJerome Forissier #undef ALLOC
512817466cbSJens Wiklander
mbedtls_md_starts(mbedtls_md_context_t * ctx)513817466cbSJens Wiklander int mbedtls_md_starts(mbedtls_md_context_t *ctx)
514817466cbSJens Wiklander {
515b0563631STom Van Eyck #if defined(MBEDTLS_MD_C)
51632b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) {
51732b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
51832b31808SJens Wiklander }
519b0563631STom Van Eyck #endif
520817466cbSJens Wiklander
52132b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
52232b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
52332b31808SJens Wiklander psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
52432b31808SJens Wiklander psa_hash_abort(ctx->md_ctx);
52532b31808SJens Wiklander psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
52632b31808SJens Wiklander return mbedtls_md_error_from_psa(status);
52732b31808SJens Wiklander }
52811fa71b9SJerome Forissier #endif
52932b31808SJens Wiklander
53032b31808SJens Wiklander switch (ctx->md_info->type) {
53111fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
53211fa71b9SJerome Forissier case MBEDTLS_MD_MD5:
53332b31808SJens Wiklander return mbedtls_md5_starts(ctx->md_ctx);
53411fa71b9SJerome Forissier #endif
53511fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
53611fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160:
53732b31808SJens Wiklander return mbedtls_ripemd160_starts(ctx->md_ctx);
53811fa71b9SJerome Forissier #endif
53911fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
54011fa71b9SJerome Forissier case MBEDTLS_MD_SHA1:
54132b31808SJens Wiklander return mbedtls_sha1_starts(ctx->md_ctx);
54232b31808SJens Wiklander #endif
54332b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C)
54432b31808SJens Wiklander case MBEDTLS_MD_SHA224:
54532b31808SJens Wiklander return mbedtls_sha256_starts(ctx->md_ctx, 1);
54611fa71b9SJerome Forissier #endif
54711fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
54811fa71b9SJerome Forissier case MBEDTLS_MD_SHA256:
54932b31808SJens Wiklander return mbedtls_sha256_starts(ctx->md_ctx, 0);
55032b31808SJens Wiklander #endif
55132b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C)
55232b31808SJens Wiklander case MBEDTLS_MD_SHA384:
55332b31808SJens Wiklander return mbedtls_sha512_starts(ctx->md_ctx, 1);
55411fa71b9SJerome Forissier #endif
55511fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
55611fa71b9SJerome Forissier case MBEDTLS_MD_SHA512:
55732b31808SJens Wiklander return mbedtls_sha512_starts(ctx->md_ctx, 0);
55811fa71b9SJerome Forissier #endif
559b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C)
560b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
561b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
562b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
563b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
564b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
565b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
566b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
567b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
568b0563631STom Van Eyck #endif
56911fa71b9SJerome Forissier default:
57032b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
57111fa71b9SJerome Forissier }
572817466cbSJens Wiklander }
573817466cbSJens Wiklander
mbedtls_md_update(mbedtls_md_context_t * ctx,const unsigned char * input,size_t ilen)574817466cbSJens Wiklander int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
575817466cbSJens Wiklander {
576b0563631STom Van Eyck #if defined(MBEDTLS_MD_C)
57732b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) {
57832b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
57932b31808SJens Wiklander }
580b0563631STom Van Eyck #endif
581817466cbSJens Wiklander
58232b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
58332b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
58432b31808SJens Wiklander psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
58532b31808SJens Wiklander return mbedtls_md_error_from_psa(status);
58632b31808SJens Wiklander }
58711fa71b9SJerome Forissier #endif
58832b31808SJens Wiklander
58932b31808SJens Wiklander switch (ctx->md_info->type) {
59011fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
59111fa71b9SJerome Forissier case MBEDTLS_MD_MD5:
59232b31808SJens Wiklander return mbedtls_md5_update(ctx->md_ctx, input, ilen);
59311fa71b9SJerome Forissier #endif
59411fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
59511fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160:
59632b31808SJens Wiklander return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
59711fa71b9SJerome Forissier #endif
59811fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
59911fa71b9SJerome Forissier case MBEDTLS_MD_SHA1:
60032b31808SJens Wiklander return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
60132b31808SJens Wiklander #endif
60232b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C)
60332b31808SJens Wiklander case MBEDTLS_MD_SHA224:
60432b31808SJens Wiklander return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
60511fa71b9SJerome Forissier #endif
60611fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
60711fa71b9SJerome Forissier case MBEDTLS_MD_SHA256:
60832b31808SJens Wiklander return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
60932b31808SJens Wiklander #endif
61032b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C)
61132b31808SJens Wiklander case MBEDTLS_MD_SHA384:
61232b31808SJens Wiklander return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
61311fa71b9SJerome Forissier #endif
61411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
61511fa71b9SJerome Forissier case MBEDTLS_MD_SHA512:
61632b31808SJens Wiklander return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
61711fa71b9SJerome Forissier #endif
618b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C)
619b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
620b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
621b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
622b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
623b0563631STom Van Eyck return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
624b0563631STom Van Eyck #endif
62511fa71b9SJerome Forissier default:
62632b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
62711fa71b9SJerome Forissier }
628817466cbSJens Wiklander }
629817466cbSJens Wiklander
mbedtls_md_finish(mbedtls_md_context_t * ctx,unsigned char * output)630817466cbSJens Wiklander int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
631817466cbSJens Wiklander {
632b0563631STom Van Eyck #if defined(MBEDTLS_MD_C)
63332b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) {
63432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
63532b31808SJens Wiklander }
636b0563631STom Van Eyck #endif
637817466cbSJens Wiklander
63832b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
63932b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
64032b31808SJens Wiklander size_t size = ctx->md_info->size;
64132b31808SJens Wiklander psa_status_t status = psa_hash_finish(ctx->md_ctx,
64232b31808SJens Wiklander output, size, &size);
64332b31808SJens Wiklander return mbedtls_md_error_from_psa(status);
64432b31808SJens Wiklander }
64511fa71b9SJerome Forissier #endif
64632b31808SJens Wiklander
64732b31808SJens Wiklander switch (ctx->md_info->type) {
64811fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
64911fa71b9SJerome Forissier case MBEDTLS_MD_MD5:
65032b31808SJens Wiklander return mbedtls_md5_finish(ctx->md_ctx, output);
65111fa71b9SJerome Forissier #endif
65211fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
65311fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160:
65432b31808SJens Wiklander return mbedtls_ripemd160_finish(ctx->md_ctx, output);
65511fa71b9SJerome Forissier #endif
65611fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
65711fa71b9SJerome Forissier case MBEDTLS_MD_SHA1:
65832b31808SJens Wiklander return mbedtls_sha1_finish(ctx->md_ctx, output);
65932b31808SJens Wiklander #endif
66032b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C)
66132b31808SJens Wiklander case MBEDTLS_MD_SHA224:
66232b31808SJens Wiklander return mbedtls_sha256_finish(ctx->md_ctx, output);
66311fa71b9SJerome Forissier #endif
66411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
66511fa71b9SJerome Forissier case MBEDTLS_MD_SHA256:
66632b31808SJens Wiklander return mbedtls_sha256_finish(ctx->md_ctx, output);
66732b31808SJens Wiklander #endif
66832b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C)
66932b31808SJens Wiklander case MBEDTLS_MD_SHA384:
67032b31808SJens Wiklander return mbedtls_sha512_finish(ctx->md_ctx, output);
67111fa71b9SJerome Forissier #endif
67211fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
67311fa71b9SJerome Forissier case MBEDTLS_MD_SHA512:
67432b31808SJens Wiklander return mbedtls_sha512_finish(ctx->md_ctx, output);
67511fa71b9SJerome Forissier #endif
676b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C)
677b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
678b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
679b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
680b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
681b0563631STom Van Eyck return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
682b0563631STom Van Eyck #endif
68311fa71b9SJerome Forissier default:
68432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
68511fa71b9SJerome Forissier }
686817466cbSJens Wiklander }
687817466cbSJens Wiklander
mbedtls_md(const mbedtls_md_info_t * md_info,const unsigned char * input,size_t ilen,unsigned char * output)688817466cbSJens Wiklander int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
689817466cbSJens Wiklander unsigned char *output)
690817466cbSJens Wiklander {
69132b31808SJens Wiklander if (md_info == NULL) {
69232b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
69332b31808SJens Wiklander }
694817466cbSJens Wiklander
69532b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA)
69632b31808SJens Wiklander if (md_can_use_psa(md_info)) {
69732b31808SJens Wiklander size_t size = md_info->size;
69832b31808SJens Wiklander psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
69932b31808SJens Wiklander input, ilen,
70032b31808SJens Wiklander output, size, &size);
70132b31808SJens Wiklander return mbedtls_md_error_from_psa(status);
70232b31808SJens Wiklander }
70311fa71b9SJerome Forissier #endif
70432b31808SJens Wiklander
70532b31808SJens Wiklander switch (md_info->type) {
70611fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
70711fa71b9SJerome Forissier case MBEDTLS_MD_MD5:
70832b31808SJens Wiklander return mbedtls_md5(input, ilen, output);
70911fa71b9SJerome Forissier #endif
71011fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
71111fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160:
71232b31808SJens Wiklander return mbedtls_ripemd160(input, ilen, output);
71311fa71b9SJerome Forissier #endif
71411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
71511fa71b9SJerome Forissier case MBEDTLS_MD_SHA1:
71632b31808SJens Wiklander return mbedtls_sha1(input, ilen, output);
71732b31808SJens Wiklander #endif
71832b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C)
71932b31808SJens Wiklander case MBEDTLS_MD_SHA224:
72032b31808SJens Wiklander return mbedtls_sha256(input, ilen, output, 1);
72111fa71b9SJerome Forissier #endif
72211fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
72311fa71b9SJerome Forissier case MBEDTLS_MD_SHA256:
72432b31808SJens Wiklander return mbedtls_sha256(input, ilen, output, 0);
72532b31808SJens Wiklander #endif
72632b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C)
72732b31808SJens Wiklander case MBEDTLS_MD_SHA384:
72832b31808SJens Wiklander return mbedtls_sha512(input, ilen, output, 1);
72911fa71b9SJerome Forissier #endif
73011fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
73111fa71b9SJerome Forissier case MBEDTLS_MD_SHA512:
73232b31808SJens Wiklander return mbedtls_sha512(input, ilen, output, 0);
73311fa71b9SJerome Forissier #endif
734b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C)
735b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224:
736b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
737b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256:
738b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
739b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384:
740b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
741b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512:
742b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
743b0563631STom Van Eyck #endif
74411fa71b9SJerome Forissier default:
74532b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
74611fa71b9SJerome Forissier }
747817466cbSJens Wiklander }
748817466cbSJens Wiklander
mbedtls_md_get_size(const mbedtls_md_info_t * md_info)74932b31808SJens Wiklander unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
75032b31808SJens Wiklander {
75132b31808SJens Wiklander if (md_info == NULL) {
75232b31808SJens Wiklander return 0;
75332b31808SJens Wiklander }
75432b31808SJens Wiklander
75532b31808SJens Wiklander return md_info->size;
75632b31808SJens Wiklander }
75732b31808SJens Wiklander
mbedtls_md_get_type(const mbedtls_md_info_t * md_info)75832b31808SJens Wiklander mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
75932b31808SJens Wiklander {
76032b31808SJens Wiklander if (md_info == NULL) {
76132b31808SJens Wiklander return MBEDTLS_MD_NONE;
76232b31808SJens Wiklander }
76332b31808SJens Wiklander
76432b31808SJens Wiklander return md_info->type;
76532b31808SJens Wiklander }
76632b31808SJens Wiklander
767*cb034002SJerome Forissier #if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
mbedtls_md_error_from_psa(psa_status_t status)768b0563631STom Van Eyck int mbedtls_md_error_from_psa(psa_status_t status)
769b0563631STom Van Eyck {
770b0563631STom Van Eyck return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
771b0563631STom Van Eyck psa_generic_status_to_mbedtls);
772b0563631STom Van Eyck }
773*cb034002SJerome Forissier #endif /* MBEDTLS_PSA_CRYPTO_CLIENT */
774b0563631STom Van Eyck
775b0563631STom Van Eyck
77632b31808SJens Wiklander /************************************************************************
77732b31808SJens Wiklander * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
77832b31808SJens Wiklander * functions below are only available when MBEDTLS_MD_C is set. *
77932b31808SJens Wiklander ************************************************************************/
78032b31808SJens Wiklander #if defined(MBEDTLS_MD_C)
78132b31808SJens Wiklander
78232b31808SJens Wiklander /*
78332b31808SJens Wiklander * Reminder: update profiles in x509_crt.c when adding a new hash!
78432b31808SJens Wiklander */
78532b31808SJens Wiklander static const int supported_digests[] = {
78632b31808SJens Wiklander
78732b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512)
78832b31808SJens Wiklander MBEDTLS_MD_SHA512,
78932b31808SJens Wiklander #endif
79032b31808SJens Wiklander
79132b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA384)
79232b31808SJens Wiklander MBEDTLS_MD_SHA384,
79332b31808SJens Wiklander #endif
79432b31808SJens Wiklander
79532b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA256)
79632b31808SJens Wiklander MBEDTLS_MD_SHA256,
79732b31808SJens Wiklander #endif
79832b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA224)
79932b31808SJens Wiklander MBEDTLS_MD_SHA224,
80032b31808SJens Wiklander #endif
80132b31808SJens Wiklander
80232b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA1)
80332b31808SJens Wiklander MBEDTLS_MD_SHA1,
80432b31808SJens Wiklander #endif
80532b31808SJens Wiklander
80632b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_RIPEMD160)
80732b31808SJens Wiklander MBEDTLS_MD_RIPEMD160,
80832b31808SJens Wiklander #endif
80932b31808SJens Wiklander
81032b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_MD5)
81132b31808SJens Wiklander MBEDTLS_MD_MD5,
81232b31808SJens Wiklander #endif
81332b31808SJens Wiklander
814b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224)
815b0563631STom Van Eyck MBEDTLS_MD_SHA3_224,
816b0563631STom Van Eyck #endif
817b0563631STom Van Eyck
818b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256)
819b0563631STom Van Eyck MBEDTLS_MD_SHA3_256,
820b0563631STom Van Eyck #endif
821b0563631STom Van Eyck
822b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384)
823b0563631STom Van Eyck MBEDTLS_MD_SHA3_384,
824b0563631STom Van Eyck #endif
825b0563631STom Van Eyck
826b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512)
827b0563631STom Van Eyck MBEDTLS_MD_SHA3_512,
828b0563631STom Van Eyck #endif
829b0563631STom Van Eyck
83032b31808SJens Wiklander MBEDTLS_MD_NONE
83132b31808SJens Wiklander };
83232b31808SJens Wiklander
mbedtls_md_list(void)83332b31808SJens Wiklander const int *mbedtls_md_list(void)
83432b31808SJens Wiklander {
83532b31808SJens Wiklander return supported_digests;
83632b31808SJens Wiklander }
83732b31808SJens Wiklander
838b0563631STom Van Eyck typedef struct {
839b0563631STom Van Eyck const char *md_name;
840b0563631STom Van Eyck mbedtls_md_type_t md_type;
841b0563631STom Van Eyck } md_name_entry;
842b0563631STom Van Eyck
843b0563631STom Van Eyck static const md_name_entry md_names[] = {
844b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_MD5)
845b0563631STom Van Eyck { "MD5", MBEDTLS_MD_MD5 },
846b0563631STom Van Eyck #endif
847b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_RIPEMD160)
848b0563631STom Van Eyck { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
849b0563631STom Van Eyck #endif
850b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA1)
851b0563631STom Van Eyck { "SHA1", MBEDTLS_MD_SHA1 },
852b0563631STom Van Eyck { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
853b0563631STom Van Eyck #endif
854b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA224)
855b0563631STom Van Eyck { "SHA224", MBEDTLS_MD_SHA224 },
856b0563631STom Van Eyck #endif
857b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA256)
858b0563631STom Van Eyck { "SHA256", MBEDTLS_MD_SHA256 },
859b0563631STom Van Eyck #endif
860b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA384)
861b0563631STom Van Eyck { "SHA384", MBEDTLS_MD_SHA384 },
862b0563631STom Van Eyck #endif
863b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA512)
864b0563631STom Van Eyck { "SHA512", MBEDTLS_MD_SHA512 },
865b0563631STom Van Eyck #endif
866b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224)
867b0563631STom Van Eyck { "SHA3-224", MBEDTLS_MD_SHA3_224 },
868b0563631STom Van Eyck #endif
869b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256)
870b0563631STom Van Eyck { "SHA3-256", MBEDTLS_MD_SHA3_256 },
871b0563631STom Van Eyck #endif
872b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384)
873b0563631STom Van Eyck { "SHA3-384", MBEDTLS_MD_SHA3_384 },
874b0563631STom Van Eyck #endif
875b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512)
876b0563631STom Van Eyck { "SHA3-512", MBEDTLS_MD_SHA3_512 },
877b0563631STom Van Eyck #endif
878b0563631STom Van Eyck { NULL, MBEDTLS_MD_NONE },
879b0563631STom Van Eyck };
880b0563631STom Van Eyck
mbedtls_md_info_from_string(const char * md_name)88132b31808SJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
88232b31808SJens Wiklander {
88332b31808SJens Wiklander if (NULL == md_name) {
88432b31808SJens Wiklander return NULL;
88532b31808SJens Wiklander }
88632b31808SJens Wiklander
887b0563631STom Van Eyck const md_name_entry *entry = md_names;
888b0563631STom Van Eyck while (entry->md_name != NULL &&
889b0563631STom Van Eyck strcmp(entry->md_name, md_name) != 0) {
890b0563631STom Van Eyck ++entry;
89132b31808SJens Wiklander }
892b0563631STom Van Eyck
893b0563631STom Van Eyck return mbedtls_md_info_from_type(entry->md_type);
89432b31808SJens Wiklander }
895b0563631STom Van Eyck
mbedtls_md_get_name(const mbedtls_md_info_t * md_info)896b0563631STom Van Eyck const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
897b0563631STom Van Eyck {
898b0563631STom Van Eyck if (md_info == NULL) {
89932b31808SJens Wiklander return NULL;
90032b31808SJens Wiklander }
90132b31808SJens Wiklander
902b0563631STom Van Eyck const md_name_entry *entry = md_names;
903b0563631STom Van Eyck while (entry->md_type != MBEDTLS_MD_NONE &&
904b0563631STom Van Eyck entry->md_type != md_info->type) {
905b0563631STom Van Eyck ++entry;
906b0563631STom Van Eyck }
907b0563631STom Van Eyck
908b0563631STom Van Eyck return entry->md_name;
909b0563631STom Van Eyck }
910b0563631STom Van Eyck
mbedtls_md_info_from_ctx(const mbedtls_md_context_t * ctx)91132b31808SJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
91232b31808SJens Wiklander const mbedtls_md_context_t *ctx)
91332b31808SJens Wiklander {
91432b31808SJens Wiklander if (ctx == NULL) {
91532b31808SJens Wiklander return NULL;
91632b31808SJens Wiklander }
91732b31808SJens Wiklander
91832b31808SJens Wiklander return ctx->MBEDTLS_PRIVATE(md_info);
91932b31808SJens Wiklander }
92032b31808SJens Wiklander
921817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO)
mbedtls_md_file(const mbedtls_md_info_t * md_info,const char * path,unsigned char * output)922817466cbSJens Wiklander int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
923817466cbSJens Wiklander {
92411fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
925817466cbSJens Wiklander FILE *f;
926817466cbSJens Wiklander size_t n;
927817466cbSJens Wiklander mbedtls_md_context_t ctx;
928817466cbSJens Wiklander unsigned char buf[1024];
929817466cbSJens Wiklander
93032b31808SJens Wiklander if (md_info == NULL) {
93132b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
93232b31808SJens Wiklander }
933817466cbSJens Wiklander
93432b31808SJens Wiklander if ((f = fopen(path, "rb")) == NULL) {
93532b31808SJens Wiklander return MBEDTLS_ERR_MD_FILE_IO_ERROR;
93632b31808SJens Wiklander }
93732b31808SJens Wiklander
93832b31808SJens Wiklander /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
93932b31808SJens Wiklander mbedtls_setbuf(f, NULL);
940817466cbSJens Wiklander
941817466cbSJens Wiklander mbedtls_md_init(&ctx);
942817466cbSJens Wiklander
94332b31808SJens Wiklander if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
944817466cbSJens Wiklander goto cleanup;
94532b31808SJens Wiklander }
946817466cbSJens Wiklander
94732b31808SJens Wiklander if ((ret = mbedtls_md_starts(&ctx)) != 0) {
9483d3b0591SJens Wiklander goto cleanup;
94932b31808SJens Wiklander }
950817466cbSJens Wiklander
95132b31808SJens Wiklander while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
95232b31808SJens Wiklander if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
9533d3b0591SJens Wiklander goto cleanup;
95432b31808SJens Wiklander }
95532b31808SJens Wiklander }
956817466cbSJens Wiklander
95732b31808SJens Wiklander if (ferror(f) != 0) {
958817466cbSJens Wiklander ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
95932b31808SJens Wiklander } else {
96011fa71b9SJerome Forissier ret = mbedtls_md_finish(&ctx, output);
96132b31808SJens Wiklander }
962817466cbSJens Wiklander
963817466cbSJens Wiklander cleanup:
9643d3b0591SJens Wiklander mbedtls_platform_zeroize(buf, sizeof(buf));
965817466cbSJens Wiklander fclose(f);
966817466cbSJens Wiklander mbedtls_md_free(&ctx);
967817466cbSJens Wiklander
96832b31808SJens Wiklander return ret;
969817466cbSJens Wiklander }
970817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */
971817466cbSJens Wiklander
mbedtls_md_hmac_starts(mbedtls_md_context_t * ctx,const unsigned char * key,size_t keylen)972817466cbSJens Wiklander int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
973817466cbSJens Wiklander {
97411fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
975817466cbSJens Wiklander unsigned char sum[MBEDTLS_MD_MAX_SIZE];
976817466cbSJens Wiklander unsigned char *ipad, *opad;
977817466cbSJens Wiklander
97832b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
97932b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
98032b31808SJens Wiklander }
981817466cbSJens Wiklander
98232b31808SJens Wiklander if (keylen > (size_t) ctx->md_info->block_size) {
98332b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) {
9843d3b0591SJens Wiklander goto cleanup;
98532b31808SJens Wiklander }
98632b31808SJens Wiklander if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
9873d3b0591SJens Wiklander goto cleanup;
98832b31808SJens Wiklander }
98932b31808SJens Wiklander if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
9903d3b0591SJens Wiklander goto cleanup;
99132b31808SJens Wiklander }
992817466cbSJens Wiklander
993817466cbSJens Wiklander keylen = ctx->md_info->size;
994817466cbSJens Wiklander key = sum;
995817466cbSJens Wiklander }
996817466cbSJens Wiklander
997817466cbSJens Wiklander ipad = (unsigned char *) ctx->hmac_ctx;
998817466cbSJens Wiklander opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
999817466cbSJens Wiklander
1000817466cbSJens Wiklander memset(ipad, 0x36, ctx->md_info->block_size);
1001817466cbSJens Wiklander memset(opad, 0x5C, ctx->md_info->block_size);
1002817466cbSJens Wiklander
100332b31808SJens Wiklander mbedtls_xor(ipad, ipad, key, keylen);
100432b31808SJens Wiklander mbedtls_xor(opad, opad, key, keylen);
1005817466cbSJens Wiklander
100632b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) {
10073d3b0591SJens Wiklander goto cleanup;
100832b31808SJens Wiklander }
100911fa71b9SJerome Forissier if ((ret = mbedtls_md_update(ctx, ipad,
101032b31808SJens Wiklander ctx->md_info->block_size)) != 0) {
10113d3b0591SJens Wiklander goto cleanup;
101232b31808SJens Wiklander }
1013817466cbSJens Wiklander
10143d3b0591SJens Wiklander cleanup:
10153d3b0591SJens Wiklander mbedtls_platform_zeroize(sum, sizeof(sum));
1016817466cbSJens Wiklander
101732b31808SJens Wiklander return ret;
1018817466cbSJens Wiklander }
1019817466cbSJens Wiklander
mbedtls_md_hmac_update(mbedtls_md_context_t * ctx,const unsigned char * input,size_t ilen)1020817466cbSJens Wiklander int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
1021817466cbSJens Wiklander {
102232b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
102332b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
102432b31808SJens Wiklander }
1025817466cbSJens Wiklander
102632b31808SJens Wiklander return mbedtls_md_update(ctx, input, ilen);
1027817466cbSJens Wiklander }
1028817466cbSJens Wiklander
mbedtls_md_hmac_finish(mbedtls_md_context_t * ctx,unsigned char * output)1029817466cbSJens Wiklander int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
1030817466cbSJens Wiklander {
103111fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1032817466cbSJens Wiklander unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
1033817466cbSJens Wiklander unsigned char *opad;
1034817466cbSJens Wiklander
103532b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
103632b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
103732b31808SJens Wiklander }
1038817466cbSJens Wiklander
1039817466cbSJens Wiklander opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
1040817466cbSJens Wiklander
104132b31808SJens Wiklander if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
104232b31808SJens Wiklander return ret;
104332b31808SJens Wiklander }
104432b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) {
104532b31808SJens Wiklander return ret;
104632b31808SJens Wiklander }
104711fa71b9SJerome Forissier if ((ret = mbedtls_md_update(ctx, opad,
104832b31808SJens Wiklander ctx->md_info->block_size)) != 0) {
104932b31808SJens Wiklander return ret;
105032b31808SJens Wiklander }
105111fa71b9SJerome Forissier if ((ret = mbedtls_md_update(ctx, tmp,
105232b31808SJens Wiklander ctx->md_info->size)) != 0) {
105332b31808SJens Wiklander return ret;
105432b31808SJens Wiklander }
105532b31808SJens Wiklander return mbedtls_md_finish(ctx, output);
1056817466cbSJens Wiklander }
1057817466cbSJens Wiklander
mbedtls_md_hmac_reset(mbedtls_md_context_t * ctx)1058817466cbSJens Wiklander int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
1059817466cbSJens Wiklander {
106011fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1061817466cbSJens Wiklander unsigned char *ipad;
1062817466cbSJens Wiklander
106332b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
106432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
106532b31808SJens Wiklander }
1066817466cbSJens Wiklander
1067817466cbSJens Wiklander ipad = (unsigned char *) ctx->hmac_ctx;
1068817466cbSJens Wiklander
106932b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) {
107032b31808SJens Wiklander return ret;
107132b31808SJens Wiklander }
107232b31808SJens Wiklander return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
1073817466cbSJens Wiklander }
1074817466cbSJens Wiklander
mbedtls_md_hmac(const mbedtls_md_info_t * md_info,const unsigned char * key,size_t keylen,const unsigned char * input,size_t ilen,unsigned char * output)10753d3b0591SJens Wiklander int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
10763d3b0591SJens Wiklander const unsigned char *key, size_t keylen,
1077817466cbSJens Wiklander const unsigned char *input, size_t ilen,
1078817466cbSJens Wiklander unsigned char *output)
1079817466cbSJens Wiklander {
1080817466cbSJens Wiklander mbedtls_md_context_t ctx;
108111fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1082817466cbSJens Wiklander
108332b31808SJens Wiklander if (md_info == NULL) {
108432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
108532b31808SJens Wiklander }
1086817466cbSJens Wiklander
1087817466cbSJens Wiklander mbedtls_md_init(&ctx);
1088817466cbSJens Wiklander
108932b31808SJens Wiklander if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
10903d3b0591SJens Wiklander goto cleanup;
109132b31808SJens Wiklander }
1092817466cbSJens Wiklander
109332b31808SJens Wiklander if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
10943d3b0591SJens Wiklander goto cleanup;
109532b31808SJens Wiklander }
109632b31808SJens Wiklander if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
10973d3b0591SJens Wiklander goto cleanup;
109832b31808SJens Wiklander }
109932b31808SJens Wiklander if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
11003d3b0591SJens Wiklander goto cleanup;
110132b31808SJens Wiklander }
1102817466cbSJens Wiklander
11033d3b0591SJens Wiklander cleanup:
1104817466cbSJens Wiklander mbedtls_md_free(&ctx);
1105817466cbSJens Wiklander
110632b31808SJens Wiklander return ret;
1107817466cbSJens Wiklander }
1108817466cbSJens Wiklander
1109817466cbSJens Wiklander #endif /* MBEDTLS_MD_C */
111032b31808SJens Wiklander
111132b31808SJens Wiklander #endif /* MBEDTLS_MD_LIGHT */
1112