1*62c56f98SSadaf Ebrahimi /**
2*62c56f98SSadaf Ebrahimi * \file md.c
3*62c56f98SSadaf Ebrahimi *
4*62c56f98SSadaf Ebrahimi * \brief Generic message digest wrapper for Mbed TLS
5*62c56f98SSadaf Ebrahimi *
6*62c56f98SSadaf Ebrahimi * \author Adriaan de Jong <[email protected]>
7*62c56f98SSadaf Ebrahimi *
8*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors
9*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
10*62c56f98SSadaf Ebrahimi */
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimi #include "common.h"
13*62c56f98SSadaf Ebrahimi
14*62c56f98SSadaf Ebrahimi /*
15*62c56f98SSadaf Ebrahimi * Availability of functions in this module is controlled by two
16*62c56f98SSadaf Ebrahimi * feature macros:
17*62c56f98SSadaf Ebrahimi * - MBEDTLS_MD_C enables the whole module;
18*62c56f98SSadaf Ebrahimi * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
19*62c56f98SSadaf Ebrahimi * most hash metadata (everything except string names); is it
20*62c56f98SSadaf Ebrahimi * automatically set whenever MBEDTLS_MD_C is defined.
21*62c56f98SSadaf Ebrahimi *
22*62c56f98SSadaf Ebrahimi * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
23*62c56f98SSadaf Ebrahimi *
24*62c56f98SSadaf Ebrahimi * In the future we may want to change the contract of some functions
25*62c56f98SSadaf Ebrahimi * (behaviour with NULL arguments) depending on whether MD_C is defined or
26*62c56f98SSadaf Ebrahimi * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
27*62c56f98SSadaf Ebrahimi *
28*62c56f98SSadaf Ebrahimi * For these reasons, we're keeping MD_LIGHT internal for now.
29*62c56f98SSadaf Ebrahimi */
30*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_LIGHT)
31*62c56f98SSadaf Ebrahimi
32*62c56f98SSadaf Ebrahimi #include "mbedtls/md.h"
33*62c56f98SSadaf Ebrahimi #include "md_wrap.h"
34*62c56f98SSadaf Ebrahimi #include "mbedtls/platform_util.h"
35*62c56f98SSadaf Ebrahimi #include "mbedtls/error.h"
36*62c56f98SSadaf Ebrahimi
37*62c56f98SSadaf Ebrahimi #include "mbedtls/md5.h"
38*62c56f98SSadaf Ebrahimi #include "mbedtls/ripemd160.h"
39*62c56f98SSadaf Ebrahimi #include "mbedtls/sha1.h"
40*62c56f98SSadaf Ebrahimi #include "mbedtls/sha256.h"
41*62c56f98SSadaf Ebrahimi #include "mbedtls/sha512.h"
42*62c56f98SSadaf Ebrahimi #include "mbedtls/sha3.h"
43*62c56f98SSadaf Ebrahimi
44*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_C)
45*62c56f98SSadaf Ebrahimi #include <psa/crypto.h>
46*62c56f98SSadaf Ebrahimi #include "md_psa.h"
47*62c56f98SSadaf Ebrahimi #include "psa_util_internal.h"
48*62c56f98SSadaf Ebrahimi #endif
49*62c56f98SSadaf Ebrahimi
50*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
51*62c56f98SSadaf Ebrahimi #include "psa_crypto_core.h"
52*62c56f98SSadaf Ebrahimi #endif
53*62c56f98SSadaf Ebrahimi
54*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
55*62c56f98SSadaf Ebrahimi
56*62c56f98SSadaf Ebrahimi #include <string.h>
57*62c56f98SSadaf Ebrahimi
58*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_FS_IO)
59*62c56f98SSadaf Ebrahimi #include <stdio.h>
60*62c56f98SSadaf Ebrahimi #endif
61*62c56f98SSadaf Ebrahimi
62*62c56f98SSadaf Ebrahimi /* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
63*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
64*62c56f98SSadaf Ebrahimi #error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
65*62c56f98SSadaf Ebrahimi #endif
66*62c56f98SSadaf Ebrahimi
67*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
68*62c56f98SSadaf Ebrahimi #define MD_INFO(type, out_size, block_size) type, out_size, block_size,
69*62c56f98SSadaf Ebrahimi #else
70*62c56f98SSadaf Ebrahimi #define MD_INFO(type, out_size, block_size) type, out_size,
71*62c56f98SSadaf Ebrahimi #endif
72*62c56f98SSadaf Ebrahimi
73*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_MD5)
74*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_md5_info = {
75*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_MD5, 16, 64)
76*62c56f98SSadaf Ebrahimi };
77*62c56f98SSadaf Ebrahimi #endif
78*62c56f98SSadaf Ebrahimi
79*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_RIPEMD160)
80*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_ripemd160_info = {
81*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64)
82*62c56f98SSadaf Ebrahimi };
83*62c56f98SSadaf Ebrahimi #endif
84*62c56f98SSadaf Ebrahimi
85*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA1)
86*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha1_info = {
87*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA1, 20, 64)
88*62c56f98SSadaf Ebrahimi };
89*62c56f98SSadaf Ebrahimi #endif
90*62c56f98SSadaf Ebrahimi
91*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA224)
92*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha224_info = {
93*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA224, 28, 64)
94*62c56f98SSadaf Ebrahimi };
95*62c56f98SSadaf Ebrahimi #endif
96*62c56f98SSadaf Ebrahimi
97*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
98*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha256_info = {
99*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA256, 32, 64)
100*62c56f98SSadaf Ebrahimi };
101*62c56f98SSadaf Ebrahimi #endif
102*62c56f98SSadaf Ebrahimi
103*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
104*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha384_info = {
105*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA384, 48, 128)
106*62c56f98SSadaf Ebrahimi };
107*62c56f98SSadaf Ebrahimi #endif
108*62c56f98SSadaf Ebrahimi
109*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA512)
110*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha512_info = {
111*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA512, 64, 128)
112*62c56f98SSadaf Ebrahimi };
113*62c56f98SSadaf Ebrahimi #endif
114*62c56f98SSadaf Ebrahimi
115*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_224)
116*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha3_224_info = {
117*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144)
118*62c56f98SSadaf Ebrahimi };
119*62c56f98SSadaf Ebrahimi #endif
120*62c56f98SSadaf Ebrahimi
121*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_256)
122*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha3_256_info = {
123*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136)
124*62c56f98SSadaf Ebrahimi };
125*62c56f98SSadaf Ebrahimi #endif
126*62c56f98SSadaf Ebrahimi
127*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_384)
128*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha3_384_info = {
129*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104)
130*62c56f98SSadaf Ebrahimi };
131*62c56f98SSadaf Ebrahimi #endif
132*62c56f98SSadaf Ebrahimi
133*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_512)
134*62c56f98SSadaf Ebrahimi static const mbedtls_md_info_t mbedtls_sha3_512_info = {
135*62c56f98SSadaf Ebrahimi MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72)
136*62c56f98SSadaf Ebrahimi };
137*62c56f98SSadaf Ebrahimi #endif
138*62c56f98SSadaf Ebrahimi
mbedtls_md_info_from_type(mbedtls_md_type_t md_type)139*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
140*62c56f98SSadaf Ebrahimi {
141*62c56f98SSadaf Ebrahimi switch (md_type) {
142*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_MD5)
143*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
144*62c56f98SSadaf Ebrahimi return &mbedtls_md5_info;
145*62c56f98SSadaf Ebrahimi #endif
146*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_RIPEMD160)
147*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
148*62c56f98SSadaf Ebrahimi return &mbedtls_ripemd160_info;
149*62c56f98SSadaf Ebrahimi #endif
150*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA1)
151*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
152*62c56f98SSadaf Ebrahimi return &mbedtls_sha1_info;
153*62c56f98SSadaf Ebrahimi #endif
154*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA224)
155*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
156*62c56f98SSadaf Ebrahimi return &mbedtls_sha224_info;
157*62c56f98SSadaf Ebrahimi #endif
158*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
159*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
160*62c56f98SSadaf Ebrahimi return &mbedtls_sha256_info;
161*62c56f98SSadaf Ebrahimi #endif
162*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
163*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
164*62c56f98SSadaf Ebrahimi return &mbedtls_sha384_info;
165*62c56f98SSadaf Ebrahimi #endif
166*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA512)
167*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
168*62c56f98SSadaf Ebrahimi return &mbedtls_sha512_info;
169*62c56f98SSadaf Ebrahimi #endif
170*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_224)
171*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
172*62c56f98SSadaf Ebrahimi return &mbedtls_sha3_224_info;
173*62c56f98SSadaf Ebrahimi #endif
174*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_256)
175*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
176*62c56f98SSadaf Ebrahimi return &mbedtls_sha3_256_info;
177*62c56f98SSadaf Ebrahimi #endif
178*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_384)
179*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
180*62c56f98SSadaf Ebrahimi return &mbedtls_sha3_384_info;
181*62c56f98SSadaf Ebrahimi #endif
182*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_512)
183*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
184*62c56f98SSadaf Ebrahimi return &mbedtls_sha3_512_info;
185*62c56f98SSadaf Ebrahimi #endif
186*62c56f98SSadaf Ebrahimi default:
187*62c56f98SSadaf Ebrahimi return NULL;
188*62c56f98SSadaf Ebrahimi }
189*62c56f98SSadaf Ebrahimi }
190*62c56f98SSadaf Ebrahimi
191*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
psa_alg_of_md(const mbedtls_md_info_t * info)192*62c56f98SSadaf Ebrahimi static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
193*62c56f98SSadaf Ebrahimi {
194*62c56f98SSadaf Ebrahimi switch (info->type) {
195*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_MD5_VIA_PSA)
196*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
197*62c56f98SSadaf Ebrahimi return PSA_ALG_MD5;
198*62c56f98SSadaf Ebrahimi #endif
199*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
200*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
201*62c56f98SSadaf Ebrahimi return PSA_ALG_RIPEMD160;
202*62c56f98SSadaf Ebrahimi #endif
203*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA1_VIA_PSA)
204*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
205*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA_1;
206*62c56f98SSadaf Ebrahimi #endif
207*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA224_VIA_PSA)
208*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
209*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA_224;
210*62c56f98SSadaf Ebrahimi #endif
211*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA256_VIA_PSA)
212*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
213*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA_256;
214*62c56f98SSadaf Ebrahimi #endif
215*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA384_VIA_PSA)
216*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
217*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA_384;
218*62c56f98SSadaf Ebrahimi #endif
219*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA512_VIA_PSA)
220*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
221*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA_512;
222*62c56f98SSadaf Ebrahimi #endif
223*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA3_224_VIA_PSA)
224*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
225*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA3_224;
226*62c56f98SSadaf Ebrahimi #endif
227*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA3_256_VIA_PSA)
228*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
229*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA3_256;
230*62c56f98SSadaf Ebrahimi #endif
231*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA3_384_VIA_PSA)
232*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
233*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA3_384;
234*62c56f98SSadaf Ebrahimi #endif
235*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SHA3_512_VIA_PSA)
236*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
237*62c56f98SSadaf Ebrahimi return PSA_ALG_SHA3_512;
238*62c56f98SSadaf Ebrahimi #endif
239*62c56f98SSadaf Ebrahimi default:
240*62c56f98SSadaf Ebrahimi return PSA_ALG_NONE;
241*62c56f98SSadaf Ebrahimi }
242*62c56f98SSadaf Ebrahimi }
243*62c56f98SSadaf Ebrahimi
md_can_use_psa(const mbedtls_md_info_t * info)244*62c56f98SSadaf Ebrahimi static int md_can_use_psa(const mbedtls_md_info_t *info)
245*62c56f98SSadaf Ebrahimi {
246*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = psa_alg_of_md(info);
247*62c56f98SSadaf Ebrahimi if (alg == PSA_ALG_NONE) {
248*62c56f98SSadaf Ebrahimi return 0;
249*62c56f98SSadaf Ebrahimi }
250*62c56f98SSadaf Ebrahimi
251*62c56f98SSadaf Ebrahimi return psa_can_do_hash(alg);
252*62c56f98SSadaf Ebrahimi }
253*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_SOME_PSA */
254*62c56f98SSadaf Ebrahimi
mbedtls_md_init(mbedtls_md_context_t * ctx)255*62c56f98SSadaf Ebrahimi void mbedtls_md_init(mbedtls_md_context_t *ctx)
256*62c56f98SSadaf Ebrahimi {
257*62c56f98SSadaf Ebrahimi /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
258*62c56f98SSadaf Ebrahimi memset(ctx, 0, sizeof(mbedtls_md_context_t));
259*62c56f98SSadaf Ebrahimi }
260*62c56f98SSadaf Ebrahimi
mbedtls_md_free(mbedtls_md_context_t * ctx)261*62c56f98SSadaf Ebrahimi void mbedtls_md_free(mbedtls_md_context_t *ctx)
262*62c56f98SSadaf Ebrahimi {
263*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL) {
264*62c56f98SSadaf Ebrahimi return;
265*62c56f98SSadaf Ebrahimi }
266*62c56f98SSadaf Ebrahimi
267*62c56f98SSadaf Ebrahimi if (ctx->md_ctx != NULL) {
268*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
269*62c56f98SSadaf Ebrahimi if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
270*62c56f98SSadaf Ebrahimi psa_hash_abort(ctx->md_ctx);
271*62c56f98SSadaf Ebrahimi } else
272*62c56f98SSadaf Ebrahimi #endif
273*62c56f98SSadaf Ebrahimi switch (ctx->md_info->type) {
274*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
275*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
276*62c56f98SSadaf Ebrahimi mbedtls_md5_free(ctx->md_ctx);
277*62c56f98SSadaf Ebrahimi break;
278*62c56f98SSadaf Ebrahimi #endif
279*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
280*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
281*62c56f98SSadaf Ebrahimi mbedtls_ripemd160_free(ctx->md_ctx);
282*62c56f98SSadaf Ebrahimi break;
283*62c56f98SSadaf Ebrahimi #endif
284*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
285*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
286*62c56f98SSadaf Ebrahimi mbedtls_sha1_free(ctx->md_ctx);
287*62c56f98SSadaf Ebrahimi break;
288*62c56f98SSadaf Ebrahimi #endif
289*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA224_C)
290*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
291*62c56f98SSadaf Ebrahimi mbedtls_sha256_free(ctx->md_ctx);
292*62c56f98SSadaf Ebrahimi break;
293*62c56f98SSadaf Ebrahimi #endif
294*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
295*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
296*62c56f98SSadaf Ebrahimi mbedtls_sha256_free(ctx->md_ctx);
297*62c56f98SSadaf Ebrahimi break;
298*62c56f98SSadaf Ebrahimi #endif
299*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA384_C)
300*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
301*62c56f98SSadaf Ebrahimi mbedtls_sha512_free(ctx->md_ctx);
302*62c56f98SSadaf Ebrahimi break;
303*62c56f98SSadaf Ebrahimi #endif
304*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
305*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
306*62c56f98SSadaf Ebrahimi mbedtls_sha512_free(ctx->md_ctx);
307*62c56f98SSadaf Ebrahimi break;
308*62c56f98SSadaf Ebrahimi #endif
309*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
310*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
311*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
312*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
313*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
314*62c56f98SSadaf Ebrahimi mbedtls_sha3_free(ctx->md_ctx);
315*62c56f98SSadaf Ebrahimi break;
316*62c56f98SSadaf Ebrahimi #endif
317*62c56f98SSadaf Ebrahimi default:
318*62c56f98SSadaf Ebrahimi /* Shouldn't happen */
319*62c56f98SSadaf Ebrahimi break;
320*62c56f98SSadaf Ebrahimi }
321*62c56f98SSadaf Ebrahimi mbedtls_free(ctx->md_ctx);
322*62c56f98SSadaf Ebrahimi }
323*62c56f98SSadaf Ebrahimi
324*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
325*62c56f98SSadaf Ebrahimi if (ctx->hmac_ctx != NULL) {
326*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(ctx->hmac_ctx,
327*62c56f98SSadaf Ebrahimi 2 * ctx->md_info->block_size);
328*62c56f98SSadaf Ebrahimi }
329*62c56f98SSadaf Ebrahimi #endif
330*62c56f98SSadaf Ebrahimi
331*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
332*62c56f98SSadaf Ebrahimi }
333*62c56f98SSadaf Ebrahimi
mbedtls_md_clone(mbedtls_md_context_t * dst,const mbedtls_md_context_t * src)334*62c56f98SSadaf Ebrahimi int mbedtls_md_clone(mbedtls_md_context_t *dst,
335*62c56f98SSadaf Ebrahimi const mbedtls_md_context_t *src)
336*62c56f98SSadaf Ebrahimi {
337*62c56f98SSadaf Ebrahimi if (dst == NULL || dst->md_info == NULL ||
338*62c56f98SSadaf Ebrahimi src == NULL || src->md_info == NULL ||
339*62c56f98SSadaf Ebrahimi dst->md_info != src->md_info) {
340*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
341*62c56f98SSadaf Ebrahimi }
342*62c56f98SSadaf Ebrahimi
343*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
344*62c56f98SSadaf Ebrahimi if (src->engine != dst->engine) {
345*62c56f98SSadaf Ebrahimi /* This can happen with src set to legacy because PSA wasn't ready
346*62c56f98SSadaf Ebrahimi * yet, and dst to PSA because it became ready in the meantime.
347*62c56f98SSadaf Ebrahimi * We currently don't support that case (we'd need to re-allocate
348*62c56f98SSadaf Ebrahimi * md_ctx to the size of the appropriate MD context). */
349*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
350*62c56f98SSadaf Ebrahimi }
351*62c56f98SSadaf Ebrahimi
352*62c56f98SSadaf Ebrahimi if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
353*62c56f98SSadaf Ebrahimi psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
354*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
355*62c56f98SSadaf Ebrahimi }
356*62c56f98SSadaf Ebrahimi #endif
357*62c56f98SSadaf Ebrahimi
358*62c56f98SSadaf Ebrahimi switch (src->md_info->type) {
359*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
360*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
361*62c56f98SSadaf Ebrahimi mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
362*62c56f98SSadaf Ebrahimi break;
363*62c56f98SSadaf Ebrahimi #endif
364*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
365*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
366*62c56f98SSadaf Ebrahimi mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
367*62c56f98SSadaf Ebrahimi break;
368*62c56f98SSadaf Ebrahimi #endif
369*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
370*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
371*62c56f98SSadaf Ebrahimi mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
372*62c56f98SSadaf Ebrahimi break;
373*62c56f98SSadaf Ebrahimi #endif
374*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA224_C)
375*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
376*62c56f98SSadaf Ebrahimi mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
377*62c56f98SSadaf Ebrahimi break;
378*62c56f98SSadaf Ebrahimi #endif
379*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
380*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
381*62c56f98SSadaf Ebrahimi mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
382*62c56f98SSadaf Ebrahimi break;
383*62c56f98SSadaf Ebrahimi #endif
384*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA384_C)
385*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
386*62c56f98SSadaf Ebrahimi mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
387*62c56f98SSadaf Ebrahimi break;
388*62c56f98SSadaf Ebrahimi #endif
389*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
390*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
391*62c56f98SSadaf Ebrahimi mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
392*62c56f98SSadaf Ebrahimi break;
393*62c56f98SSadaf Ebrahimi #endif
394*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
395*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
396*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
397*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
398*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
399*62c56f98SSadaf Ebrahimi mbedtls_sha3_clone(dst->md_ctx, src->md_ctx);
400*62c56f98SSadaf Ebrahimi break;
401*62c56f98SSadaf Ebrahimi #endif
402*62c56f98SSadaf Ebrahimi default:
403*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
404*62c56f98SSadaf Ebrahimi }
405*62c56f98SSadaf Ebrahimi
406*62c56f98SSadaf Ebrahimi return 0;
407*62c56f98SSadaf Ebrahimi }
408*62c56f98SSadaf Ebrahimi
409*62c56f98SSadaf Ebrahimi #define ALLOC(type) \
410*62c56f98SSadaf Ebrahimi do { \
411*62c56f98SSadaf Ebrahimi ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
412*62c56f98SSadaf Ebrahimi if (ctx->md_ctx == NULL) \
413*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_ALLOC_FAILED; \
414*62c56f98SSadaf Ebrahimi mbedtls_##type##_init(ctx->md_ctx); \
415*62c56f98SSadaf Ebrahimi } \
416*62c56f98SSadaf Ebrahimi while (0)
417*62c56f98SSadaf Ebrahimi
mbedtls_md_setup(mbedtls_md_context_t * ctx,const mbedtls_md_info_t * md_info,int hmac)418*62c56f98SSadaf Ebrahimi int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
419*62c56f98SSadaf Ebrahimi {
420*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
421*62c56f98SSadaf Ebrahimi if (ctx == NULL) {
422*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
423*62c56f98SSadaf Ebrahimi }
424*62c56f98SSadaf Ebrahimi #endif
425*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
426*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
427*62c56f98SSadaf Ebrahimi }
428*62c56f98SSadaf Ebrahimi
429*62c56f98SSadaf Ebrahimi ctx->md_info = md_info;
430*62c56f98SSadaf Ebrahimi ctx->md_ctx = NULL;
431*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
432*62c56f98SSadaf Ebrahimi ctx->hmac_ctx = NULL;
433*62c56f98SSadaf Ebrahimi #else
434*62c56f98SSadaf Ebrahimi if (hmac != 0) {
435*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
436*62c56f98SSadaf Ebrahimi }
437*62c56f98SSadaf Ebrahimi #endif
438*62c56f98SSadaf Ebrahimi
439*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
440*62c56f98SSadaf Ebrahimi if (md_can_use_psa(ctx->md_info)) {
441*62c56f98SSadaf Ebrahimi ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
442*62c56f98SSadaf Ebrahimi if (ctx->md_ctx == NULL) {
443*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_ALLOC_FAILED;
444*62c56f98SSadaf Ebrahimi }
445*62c56f98SSadaf Ebrahimi ctx->engine = MBEDTLS_MD_ENGINE_PSA;
446*62c56f98SSadaf Ebrahimi } else
447*62c56f98SSadaf Ebrahimi #endif
448*62c56f98SSadaf Ebrahimi switch (md_info->type) {
449*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
450*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
451*62c56f98SSadaf Ebrahimi ALLOC(md5);
452*62c56f98SSadaf Ebrahimi break;
453*62c56f98SSadaf Ebrahimi #endif
454*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
455*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
456*62c56f98SSadaf Ebrahimi ALLOC(ripemd160);
457*62c56f98SSadaf Ebrahimi break;
458*62c56f98SSadaf Ebrahimi #endif
459*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
460*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
461*62c56f98SSadaf Ebrahimi ALLOC(sha1);
462*62c56f98SSadaf Ebrahimi break;
463*62c56f98SSadaf Ebrahimi #endif
464*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA224_C)
465*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
466*62c56f98SSadaf Ebrahimi ALLOC(sha256);
467*62c56f98SSadaf Ebrahimi break;
468*62c56f98SSadaf Ebrahimi #endif
469*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
470*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
471*62c56f98SSadaf Ebrahimi ALLOC(sha256);
472*62c56f98SSadaf Ebrahimi break;
473*62c56f98SSadaf Ebrahimi #endif
474*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA384_C)
475*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
476*62c56f98SSadaf Ebrahimi ALLOC(sha512);
477*62c56f98SSadaf Ebrahimi break;
478*62c56f98SSadaf Ebrahimi #endif
479*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
480*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
481*62c56f98SSadaf Ebrahimi ALLOC(sha512);
482*62c56f98SSadaf Ebrahimi break;
483*62c56f98SSadaf Ebrahimi #endif
484*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
485*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
486*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
487*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
488*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
489*62c56f98SSadaf Ebrahimi ALLOC(sha3);
490*62c56f98SSadaf Ebrahimi break;
491*62c56f98SSadaf Ebrahimi #endif
492*62c56f98SSadaf Ebrahimi default:
493*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
494*62c56f98SSadaf Ebrahimi }
495*62c56f98SSadaf Ebrahimi
496*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
497*62c56f98SSadaf Ebrahimi if (hmac != 0) {
498*62c56f98SSadaf Ebrahimi ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
499*62c56f98SSadaf Ebrahimi if (ctx->hmac_ctx == NULL) {
500*62c56f98SSadaf Ebrahimi mbedtls_md_free(ctx);
501*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_ALLOC_FAILED;
502*62c56f98SSadaf Ebrahimi }
503*62c56f98SSadaf Ebrahimi }
504*62c56f98SSadaf Ebrahimi #endif
505*62c56f98SSadaf Ebrahimi
506*62c56f98SSadaf Ebrahimi return 0;
507*62c56f98SSadaf Ebrahimi }
508*62c56f98SSadaf Ebrahimi #undef ALLOC
509*62c56f98SSadaf Ebrahimi
mbedtls_md_starts(mbedtls_md_context_t * ctx)510*62c56f98SSadaf Ebrahimi int mbedtls_md_starts(mbedtls_md_context_t *ctx)
511*62c56f98SSadaf Ebrahimi {
512*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
513*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL) {
514*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
515*62c56f98SSadaf Ebrahimi }
516*62c56f98SSadaf Ebrahimi #endif
517*62c56f98SSadaf Ebrahimi
518*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
519*62c56f98SSadaf Ebrahimi if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
520*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
521*62c56f98SSadaf Ebrahimi psa_hash_abort(ctx->md_ctx);
522*62c56f98SSadaf Ebrahimi psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
523*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
524*62c56f98SSadaf Ebrahimi }
525*62c56f98SSadaf Ebrahimi #endif
526*62c56f98SSadaf Ebrahimi
527*62c56f98SSadaf Ebrahimi switch (ctx->md_info->type) {
528*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
529*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
530*62c56f98SSadaf Ebrahimi return mbedtls_md5_starts(ctx->md_ctx);
531*62c56f98SSadaf Ebrahimi #endif
532*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
533*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
534*62c56f98SSadaf Ebrahimi return mbedtls_ripemd160_starts(ctx->md_ctx);
535*62c56f98SSadaf Ebrahimi #endif
536*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
537*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
538*62c56f98SSadaf Ebrahimi return mbedtls_sha1_starts(ctx->md_ctx);
539*62c56f98SSadaf Ebrahimi #endif
540*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA224_C)
541*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
542*62c56f98SSadaf Ebrahimi return mbedtls_sha256_starts(ctx->md_ctx, 1);
543*62c56f98SSadaf Ebrahimi #endif
544*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
545*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
546*62c56f98SSadaf Ebrahimi return mbedtls_sha256_starts(ctx->md_ctx, 0);
547*62c56f98SSadaf Ebrahimi #endif
548*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA384_C)
549*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
550*62c56f98SSadaf Ebrahimi return mbedtls_sha512_starts(ctx->md_ctx, 1);
551*62c56f98SSadaf Ebrahimi #endif
552*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
553*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
554*62c56f98SSadaf Ebrahimi return mbedtls_sha512_starts(ctx->md_ctx, 0);
555*62c56f98SSadaf Ebrahimi #endif
556*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
557*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
558*62c56f98SSadaf Ebrahimi return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
559*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
560*62c56f98SSadaf Ebrahimi return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
561*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
562*62c56f98SSadaf Ebrahimi return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
563*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
564*62c56f98SSadaf Ebrahimi return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
565*62c56f98SSadaf Ebrahimi #endif
566*62c56f98SSadaf Ebrahimi default:
567*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
568*62c56f98SSadaf Ebrahimi }
569*62c56f98SSadaf Ebrahimi }
570*62c56f98SSadaf Ebrahimi
mbedtls_md_update(mbedtls_md_context_t * ctx,const unsigned char * input,size_t ilen)571*62c56f98SSadaf Ebrahimi int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
572*62c56f98SSadaf Ebrahimi {
573*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
574*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL) {
575*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
576*62c56f98SSadaf Ebrahimi }
577*62c56f98SSadaf Ebrahimi #endif
578*62c56f98SSadaf Ebrahimi
579*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
580*62c56f98SSadaf Ebrahimi if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
581*62c56f98SSadaf Ebrahimi psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
582*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
583*62c56f98SSadaf Ebrahimi }
584*62c56f98SSadaf Ebrahimi #endif
585*62c56f98SSadaf Ebrahimi
586*62c56f98SSadaf Ebrahimi switch (ctx->md_info->type) {
587*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
588*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
589*62c56f98SSadaf Ebrahimi return mbedtls_md5_update(ctx->md_ctx, input, ilen);
590*62c56f98SSadaf Ebrahimi #endif
591*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
592*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
593*62c56f98SSadaf Ebrahimi return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
594*62c56f98SSadaf Ebrahimi #endif
595*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
596*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
597*62c56f98SSadaf Ebrahimi return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
598*62c56f98SSadaf Ebrahimi #endif
599*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA224_C)
600*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
601*62c56f98SSadaf Ebrahimi return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
602*62c56f98SSadaf Ebrahimi #endif
603*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
604*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
605*62c56f98SSadaf Ebrahimi return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
606*62c56f98SSadaf Ebrahimi #endif
607*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA384_C)
608*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
609*62c56f98SSadaf Ebrahimi return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
610*62c56f98SSadaf Ebrahimi #endif
611*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
612*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
613*62c56f98SSadaf Ebrahimi return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
614*62c56f98SSadaf Ebrahimi #endif
615*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
616*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
617*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
618*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
619*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
620*62c56f98SSadaf Ebrahimi return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
621*62c56f98SSadaf Ebrahimi #endif
622*62c56f98SSadaf Ebrahimi default:
623*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
624*62c56f98SSadaf Ebrahimi }
625*62c56f98SSadaf Ebrahimi }
626*62c56f98SSadaf Ebrahimi
mbedtls_md_finish(mbedtls_md_context_t * ctx,unsigned char * output)627*62c56f98SSadaf Ebrahimi int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
628*62c56f98SSadaf Ebrahimi {
629*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
630*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL) {
631*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
632*62c56f98SSadaf Ebrahimi }
633*62c56f98SSadaf Ebrahimi #endif
634*62c56f98SSadaf Ebrahimi
635*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
636*62c56f98SSadaf Ebrahimi if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
637*62c56f98SSadaf Ebrahimi size_t size = ctx->md_info->size;
638*62c56f98SSadaf Ebrahimi psa_status_t status = psa_hash_finish(ctx->md_ctx,
639*62c56f98SSadaf Ebrahimi output, size, &size);
640*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
641*62c56f98SSadaf Ebrahimi }
642*62c56f98SSadaf Ebrahimi #endif
643*62c56f98SSadaf Ebrahimi
644*62c56f98SSadaf Ebrahimi switch (ctx->md_info->type) {
645*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
646*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
647*62c56f98SSadaf Ebrahimi return mbedtls_md5_finish(ctx->md_ctx, output);
648*62c56f98SSadaf Ebrahimi #endif
649*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
650*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
651*62c56f98SSadaf Ebrahimi return mbedtls_ripemd160_finish(ctx->md_ctx, output);
652*62c56f98SSadaf Ebrahimi #endif
653*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
654*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
655*62c56f98SSadaf Ebrahimi return mbedtls_sha1_finish(ctx->md_ctx, output);
656*62c56f98SSadaf Ebrahimi #endif
657*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA224_C)
658*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
659*62c56f98SSadaf Ebrahimi return mbedtls_sha256_finish(ctx->md_ctx, output);
660*62c56f98SSadaf Ebrahimi #endif
661*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
662*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
663*62c56f98SSadaf Ebrahimi return mbedtls_sha256_finish(ctx->md_ctx, output);
664*62c56f98SSadaf Ebrahimi #endif
665*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA384_C)
666*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
667*62c56f98SSadaf Ebrahimi return mbedtls_sha512_finish(ctx->md_ctx, output);
668*62c56f98SSadaf Ebrahimi #endif
669*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
670*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
671*62c56f98SSadaf Ebrahimi return mbedtls_sha512_finish(ctx->md_ctx, output);
672*62c56f98SSadaf Ebrahimi #endif
673*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
674*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
675*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
676*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
677*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
678*62c56f98SSadaf Ebrahimi return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
679*62c56f98SSadaf Ebrahimi #endif
680*62c56f98SSadaf Ebrahimi default:
681*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
682*62c56f98SSadaf Ebrahimi }
683*62c56f98SSadaf Ebrahimi }
684*62c56f98SSadaf Ebrahimi
mbedtls_md(const mbedtls_md_info_t * md_info,const unsigned char * input,size_t ilen,unsigned char * output)685*62c56f98SSadaf Ebrahimi int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
686*62c56f98SSadaf Ebrahimi unsigned char *output)
687*62c56f98SSadaf Ebrahimi {
688*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
689*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
690*62c56f98SSadaf Ebrahimi }
691*62c56f98SSadaf Ebrahimi
692*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_SOME_PSA)
693*62c56f98SSadaf Ebrahimi if (md_can_use_psa(md_info)) {
694*62c56f98SSadaf Ebrahimi size_t size = md_info->size;
695*62c56f98SSadaf Ebrahimi psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
696*62c56f98SSadaf Ebrahimi input, ilen,
697*62c56f98SSadaf Ebrahimi output, size, &size);
698*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
699*62c56f98SSadaf Ebrahimi }
700*62c56f98SSadaf Ebrahimi #endif
701*62c56f98SSadaf Ebrahimi
702*62c56f98SSadaf Ebrahimi switch (md_info->type) {
703*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD5_C)
704*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
705*62c56f98SSadaf Ebrahimi return mbedtls_md5(input, ilen, output);
706*62c56f98SSadaf Ebrahimi #endif
707*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RIPEMD160_C)
708*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_RIPEMD160:
709*62c56f98SSadaf Ebrahimi return mbedtls_ripemd160(input, ilen, output);
710*62c56f98SSadaf Ebrahimi #endif
711*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA1_C)
712*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
713*62c56f98SSadaf Ebrahimi return mbedtls_sha1(input, ilen, output);
714*62c56f98SSadaf Ebrahimi #endif
715*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA224_C)
716*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
717*62c56f98SSadaf Ebrahimi return mbedtls_sha256(input, ilen, output, 1);
718*62c56f98SSadaf Ebrahimi #endif
719*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA256_C)
720*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
721*62c56f98SSadaf Ebrahimi return mbedtls_sha256(input, ilen, output, 0);
722*62c56f98SSadaf Ebrahimi #endif
723*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA384_C)
724*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
725*62c56f98SSadaf Ebrahimi return mbedtls_sha512(input, ilen, output, 1);
726*62c56f98SSadaf Ebrahimi #endif
727*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA512_C)
728*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
729*62c56f98SSadaf Ebrahimi return mbedtls_sha512(input, ilen, output, 0);
730*62c56f98SSadaf Ebrahimi #endif
731*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SHA3_C)
732*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_224:
733*62c56f98SSadaf Ebrahimi return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
734*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_256:
735*62c56f98SSadaf Ebrahimi return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
736*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_384:
737*62c56f98SSadaf Ebrahimi return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
738*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA3_512:
739*62c56f98SSadaf Ebrahimi return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
740*62c56f98SSadaf Ebrahimi #endif
741*62c56f98SSadaf Ebrahimi default:
742*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
743*62c56f98SSadaf Ebrahimi }
744*62c56f98SSadaf Ebrahimi }
745*62c56f98SSadaf Ebrahimi
mbedtls_md_get_size(const mbedtls_md_info_t * md_info)746*62c56f98SSadaf Ebrahimi unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
747*62c56f98SSadaf Ebrahimi {
748*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
749*62c56f98SSadaf Ebrahimi return 0;
750*62c56f98SSadaf Ebrahimi }
751*62c56f98SSadaf Ebrahimi
752*62c56f98SSadaf Ebrahimi return md_info->size;
753*62c56f98SSadaf Ebrahimi }
754*62c56f98SSadaf Ebrahimi
mbedtls_md_get_type(const mbedtls_md_info_t * md_info)755*62c56f98SSadaf Ebrahimi mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
756*62c56f98SSadaf Ebrahimi {
757*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
758*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_NONE;
759*62c56f98SSadaf Ebrahimi }
760*62c56f98SSadaf Ebrahimi
761*62c56f98SSadaf Ebrahimi return md_info->type;
762*62c56f98SSadaf Ebrahimi }
763*62c56f98SSadaf Ebrahimi
764*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_C)
mbedtls_md_error_from_psa(psa_status_t status)765*62c56f98SSadaf Ebrahimi int mbedtls_md_error_from_psa(psa_status_t status)
766*62c56f98SSadaf Ebrahimi {
767*62c56f98SSadaf Ebrahimi return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
768*62c56f98SSadaf Ebrahimi psa_generic_status_to_mbedtls);
769*62c56f98SSadaf Ebrahimi }
770*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_C */
771*62c56f98SSadaf Ebrahimi
772*62c56f98SSadaf Ebrahimi
773*62c56f98SSadaf Ebrahimi /************************************************************************
774*62c56f98SSadaf Ebrahimi * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
775*62c56f98SSadaf Ebrahimi * functions below are only available when MBEDTLS_MD_C is set. *
776*62c56f98SSadaf Ebrahimi ************************************************************************/
777*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
778*62c56f98SSadaf Ebrahimi
779*62c56f98SSadaf Ebrahimi /*
780*62c56f98SSadaf Ebrahimi * Reminder: update profiles in x509_crt.c when adding a new hash!
781*62c56f98SSadaf Ebrahimi */
782*62c56f98SSadaf Ebrahimi static const int supported_digests[] = {
783*62c56f98SSadaf Ebrahimi
784*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA512)
785*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA512,
786*62c56f98SSadaf Ebrahimi #endif
787*62c56f98SSadaf Ebrahimi
788*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
789*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA384,
790*62c56f98SSadaf Ebrahimi #endif
791*62c56f98SSadaf Ebrahimi
792*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
793*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA256,
794*62c56f98SSadaf Ebrahimi #endif
795*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA224)
796*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA224,
797*62c56f98SSadaf Ebrahimi #endif
798*62c56f98SSadaf Ebrahimi
799*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA1)
800*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA1,
801*62c56f98SSadaf Ebrahimi #endif
802*62c56f98SSadaf Ebrahimi
803*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_RIPEMD160)
804*62c56f98SSadaf Ebrahimi MBEDTLS_MD_RIPEMD160,
805*62c56f98SSadaf Ebrahimi #endif
806*62c56f98SSadaf Ebrahimi
807*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_MD5)
808*62c56f98SSadaf Ebrahimi MBEDTLS_MD_MD5,
809*62c56f98SSadaf Ebrahimi #endif
810*62c56f98SSadaf Ebrahimi
811*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_224)
812*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA3_224,
813*62c56f98SSadaf Ebrahimi #endif
814*62c56f98SSadaf Ebrahimi
815*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_256)
816*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA3_256,
817*62c56f98SSadaf Ebrahimi #endif
818*62c56f98SSadaf Ebrahimi
819*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_384)
820*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA3_384,
821*62c56f98SSadaf Ebrahimi #endif
822*62c56f98SSadaf Ebrahimi
823*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_512)
824*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA3_512,
825*62c56f98SSadaf Ebrahimi #endif
826*62c56f98SSadaf Ebrahimi
827*62c56f98SSadaf Ebrahimi MBEDTLS_MD_NONE
828*62c56f98SSadaf Ebrahimi };
829*62c56f98SSadaf Ebrahimi
mbedtls_md_list(void)830*62c56f98SSadaf Ebrahimi const int *mbedtls_md_list(void)
831*62c56f98SSadaf Ebrahimi {
832*62c56f98SSadaf Ebrahimi return supported_digests;
833*62c56f98SSadaf Ebrahimi }
834*62c56f98SSadaf Ebrahimi
835*62c56f98SSadaf Ebrahimi typedef struct {
836*62c56f98SSadaf Ebrahimi const char *md_name;
837*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_type;
838*62c56f98SSadaf Ebrahimi } md_name_entry;
839*62c56f98SSadaf Ebrahimi
840*62c56f98SSadaf Ebrahimi static const md_name_entry md_names[] = {
841*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_MD5)
842*62c56f98SSadaf Ebrahimi { "MD5", MBEDTLS_MD_MD5 },
843*62c56f98SSadaf Ebrahimi #endif
844*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_RIPEMD160)
845*62c56f98SSadaf Ebrahimi { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
846*62c56f98SSadaf Ebrahimi #endif
847*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA1)
848*62c56f98SSadaf Ebrahimi { "SHA1", MBEDTLS_MD_SHA1 },
849*62c56f98SSadaf Ebrahimi { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
850*62c56f98SSadaf Ebrahimi #endif
851*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA224)
852*62c56f98SSadaf Ebrahimi { "SHA224", MBEDTLS_MD_SHA224 },
853*62c56f98SSadaf Ebrahimi #endif
854*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
855*62c56f98SSadaf Ebrahimi { "SHA256", MBEDTLS_MD_SHA256 },
856*62c56f98SSadaf Ebrahimi #endif
857*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
858*62c56f98SSadaf Ebrahimi { "SHA384", MBEDTLS_MD_SHA384 },
859*62c56f98SSadaf Ebrahimi #endif
860*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA512)
861*62c56f98SSadaf Ebrahimi { "SHA512", MBEDTLS_MD_SHA512 },
862*62c56f98SSadaf Ebrahimi #endif
863*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_224)
864*62c56f98SSadaf Ebrahimi { "SHA3-224", MBEDTLS_MD_SHA3_224 },
865*62c56f98SSadaf Ebrahimi #endif
866*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_256)
867*62c56f98SSadaf Ebrahimi { "SHA3-256", MBEDTLS_MD_SHA3_256 },
868*62c56f98SSadaf Ebrahimi #endif
869*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_384)
870*62c56f98SSadaf Ebrahimi { "SHA3-384", MBEDTLS_MD_SHA3_384 },
871*62c56f98SSadaf Ebrahimi #endif
872*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA3_512)
873*62c56f98SSadaf Ebrahimi { "SHA3-512", MBEDTLS_MD_SHA3_512 },
874*62c56f98SSadaf Ebrahimi #endif
875*62c56f98SSadaf Ebrahimi { NULL, MBEDTLS_MD_NONE },
876*62c56f98SSadaf Ebrahimi };
877*62c56f98SSadaf Ebrahimi
mbedtls_md_info_from_string(const char * md_name)878*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
879*62c56f98SSadaf Ebrahimi {
880*62c56f98SSadaf Ebrahimi if (NULL == md_name) {
881*62c56f98SSadaf Ebrahimi return NULL;
882*62c56f98SSadaf Ebrahimi }
883*62c56f98SSadaf Ebrahimi
884*62c56f98SSadaf Ebrahimi const md_name_entry *entry = md_names;
885*62c56f98SSadaf Ebrahimi while (entry->md_name != NULL &&
886*62c56f98SSadaf Ebrahimi strcmp(entry->md_name, md_name) != 0) {
887*62c56f98SSadaf Ebrahimi ++entry;
888*62c56f98SSadaf Ebrahimi }
889*62c56f98SSadaf Ebrahimi
890*62c56f98SSadaf Ebrahimi return mbedtls_md_info_from_type(entry->md_type);
891*62c56f98SSadaf Ebrahimi }
892*62c56f98SSadaf Ebrahimi
mbedtls_md_get_name(const mbedtls_md_info_t * md_info)893*62c56f98SSadaf Ebrahimi const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
894*62c56f98SSadaf Ebrahimi {
895*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
896*62c56f98SSadaf Ebrahimi return NULL;
897*62c56f98SSadaf Ebrahimi }
898*62c56f98SSadaf Ebrahimi
899*62c56f98SSadaf Ebrahimi const md_name_entry *entry = md_names;
900*62c56f98SSadaf Ebrahimi while (entry->md_type != MBEDTLS_MD_NONE &&
901*62c56f98SSadaf Ebrahimi entry->md_type != md_info->type) {
902*62c56f98SSadaf Ebrahimi ++entry;
903*62c56f98SSadaf Ebrahimi }
904*62c56f98SSadaf Ebrahimi
905*62c56f98SSadaf Ebrahimi return entry->md_name;
906*62c56f98SSadaf Ebrahimi }
907*62c56f98SSadaf Ebrahimi
mbedtls_md_info_from_ctx(const mbedtls_md_context_t * ctx)908*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
909*62c56f98SSadaf Ebrahimi const mbedtls_md_context_t *ctx)
910*62c56f98SSadaf Ebrahimi {
911*62c56f98SSadaf Ebrahimi if (ctx == NULL) {
912*62c56f98SSadaf Ebrahimi return NULL;
913*62c56f98SSadaf Ebrahimi }
914*62c56f98SSadaf Ebrahimi
915*62c56f98SSadaf Ebrahimi return ctx->MBEDTLS_PRIVATE(md_info);
916*62c56f98SSadaf Ebrahimi }
917*62c56f98SSadaf Ebrahimi
918*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_FS_IO)
mbedtls_md_file(const mbedtls_md_info_t * md_info,const char * path,unsigned char * output)919*62c56f98SSadaf Ebrahimi int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
920*62c56f98SSadaf Ebrahimi {
921*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
922*62c56f98SSadaf Ebrahimi FILE *f;
923*62c56f98SSadaf Ebrahimi size_t n;
924*62c56f98SSadaf Ebrahimi mbedtls_md_context_t ctx;
925*62c56f98SSadaf Ebrahimi unsigned char buf[1024];
926*62c56f98SSadaf Ebrahimi
927*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
928*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
929*62c56f98SSadaf Ebrahimi }
930*62c56f98SSadaf Ebrahimi
931*62c56f98SSadaf Ebrahimi if ((f = fopen(path, "rb")) == NULL) {
932*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_FILE_IO_ERROR;
933*62c56f98SSadaf Ebrahimi }
934*62c56f98SSadaf Ebrahimi
935*62c56f98SSadaf Ebrahimi /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
936*62c56f98SSadaf Ebrahimi mbedtls_setbuf(f, NULL);
937*62c56f98SSadaf Ebrahimi
938*62c56f98SSadaf Ebrahimi mbedtls_md_init(&ctx);
939*62c56f98SSadaf Ebrahimi
940*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
941*62c56f98SSadaf Ebrahimi goto cleanup;
942*62c56f98SSadaf Ebrahimi }
943*62c56f98SSadaf Ebrahimi
944*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_starts(&ctx)) != 0) {
945*62c56f98SSadaf Ebrahimi goto cleanup;
946*62c56f98SSadaf Ebrahimi }
947*62c56f98SSadaf Ebrahimi
948*62c56f98SSadaf Ebrahimi while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
949*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
950*62c56f98SSadaf Ebrahimi goto cleanup;
951*62c56f98SSadaf Ebrahimi }
952*62c56f98SSadaf Ebrahimi }
953*62c56f98SSadaf Ebrahimi
954*62c56f98SSadaf Ebrahimi if (ferror(f) != 0) {
955*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
956*62c56f98SSadaf Ebrahimi } else {
957*62c56f98SSadaf Ebrahimi ret = mbedtls_md_finish(&ctx, output);
958*62c56f98SSadaf Ebrahimi }
959*62c56f98SSadaf Ebrahimi
960*62c56f98SSadaf Ebrahimi cleanup:
961*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(buf, sizeof(buf));
962*62c56f98SSadaf Ebrahimi fclose(f);
963*62c56f98SSadaf Ebrahimi mbedtls_md_free(&ctx);
964*62c56f98SSadaf Ebrahimi
965*62c56f98SSadaf Ebrahimi return ret;
966*62c56f98SSadaf Ebrahimi }
967*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_FS_IO */
968*62c56f98SSadaf Ebrahimi
mbedtls_md_hmac_starts(mbedtls_md_context_t * ctx,const unsigned char * key,size_t keylen)969*62c56f98SSadaf Ebrahimi int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
970*62c56f98SSadaf Ebrahimi {
971*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
972*62c56f98SSadaf Ebrahimi unsigned char sum[MBEDTLS_MD_MAX_SIZE];
973*62c56f98SSadaf Ebrahimi unsigned char *ipad, *opad;
974*62c56f98SSadaf Ebrahimi
975*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
976*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
977*62c56f98SSadaf Ebrahimi }
978*62c56f98SSadaf Ebrahimi
979*62c56f98SSadaf Ebrahimi if (keylen > (size_t) ctx->md_info->block_size) {
980*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_starts(ctx)) != 0) {
981*62c56f98SSadaf Ebrahimi goto cleanup;
982*62c56f98SSadaf Ebrahimi }
983*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
984*62c56f98SSadaf Ebrahimi goto cleanup;
985*62c56f98SSadaf Ebrahimi }
986*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
987*62c56f98SSadaf Ebrahimi goto cleanup;
988*62c56f98SSadaf Ebrahimi }
989*62c56f98SSadaf Ebrahimi
990*62c56f98SSadaf Ebrahimi keylen = ctx->md_info->size;
991*62c56f98SSadaf Ebrahimi key = sum;
992*62c56f98SSadaf Ebrahimi }
993*62c56f98SSadaf Ebrahimi
994*62c56f98SSadaf Ebrahimi ipad = (unsigned char *) ctx->hmac_ctx;
995*62c56f98SSadaf Ebrahimi opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
996*62c56f98SSadaf Ebrahimi
997*62c56f98SSadaf Ebrahimi memset(ipad, 0x36, ctx->md_info->block_size);
998*62c56f98SSadaf Ebrahimi memset(opad, 0x5C, ctx->md_info->block_size);
999*62c56f98SSadaf Ebrahimi
1000*62c56f98SSadaf Ebrahimi mbedtls_xor(ipad, ipad, key, keylen);
1001*62c56f98SSadaf Ebrahimi mbedtls_xor(opad, opad, key, keylen);
1002*62c56f98SSadaf Ebrahimi
1003*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_starts(ctx)) != 0) {
1004*62c56f98SSadaf Ebrahimi goto cleanup;
1005*62c56f98SSadaf Ebrahimi }
1006*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_update(ctx, ipad,
1007*62c56f98SSadaf Ebrahimi ctx->md_info->block_size)) != 0) {
1008*62c56f98SSadaf Ebrahimi goto cleanup;
1009*62c56f98SSadaf Ebrahimi }
1010*62c56f98SSadaf Ebrahimi
1011*62c56f98SSadaf Ebrahimi cleanup:
1012*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(sum, sizeof(sum));
1013*62c56f98SSadaf Ebrahimi
1014*62c56f98SSadaf Ebrahimi return ret;
1015*62c56f98SSadaf Ebrahimi }
1016*62c56f98SSadaf Ebrahimi
mbedtls_md_hmac_update(mbedtls_md_context_t * ctx,const unsigned char * input,size_t ilen)1017*62c56f98SSadaf Ebrahimi int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
1018*62c56f98SSadaf Ebrahimi {
1019*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1020*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1021*62c56f98SSadaf Ebrahimi }
1022*62c56f98SSadaf Ebrahimi
1023*62c56f98SSadaf Ebrahimi return mbedtls_md_update(ctx, input, ilen);
1024*62c56f98SSadaf Ebrahimi }
1025*62c56f98SSadaf Ebrahimi
mbedtls_md_hmac_finish(mbedtls_md_context_t * ctx,unsigned char * output)1026*62c56f98SSadaf Ebrahimi int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
1027*62c56f98SSadaf Ebrahimi {
1028*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1029*62c56f98SSadaf Ebrahimi unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
1030*62c56f98SSadaf Ebrahimi unsigned char *opad;
1031*62c56f98SSadaf Ebrahimi
1032*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1033*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1034*62c56f98SSadaf Ebrahimi }
1035*62c56f98SSadaf Ebrahimi
1036*62c56f98SSadaf Ebrahimi opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
1037*62c56f98SSadaf Ebrahimi
1038*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
1039*62c56f98SSadaf Ebrahimi return ret;
1040*62c56f98SSadaf Ebrahimi }
1041*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_starts(ctx)) != 0) {
1042*62c56f98SSadaf Ebrahimi return ret;
1043*62c56f98SSadaf Ebrahimi }
1044*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_update(ctx, opad,
1045*62c56f98SSadaf Ebrahimi ctx->md_info->block_size)) != 0) {
1046*62c56f98SSadaf Ebrahimi return ret;
1047*62c56f98SSadaf Ebrahimi }
1048*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_update(ctx, tmp,
1049*62c56f98SSadaf Ebrahimi ctx->md_info->size)) != 0) {
1050*62c56f98SSadaf Ebrahimi return ret;
1051*62c56f98SSadaf Ebrahimi }
1052*62c56f98SSadaf Ebrahimi return mbedtls_md_finish(ctx, output);
1053*62c56f98SSadaf Ebrahimi }
1054*62c56f98SSadaf Ebrahimi
mbedtls_md_hmac_reset(mbedtls_md_context_t * ctx)1055*62c56f98SSadaf Ebrahimi int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
1056*62c56f98SSadaf Ebrahimi {
1057*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1058*62c56f98SSadaf Ebrahimi unsigned char *ipad;
1059*62c56f98SSadaf Ebrahimi
1060*62c56f98SSadaf Ebrahimi if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1061*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1062*62c56f98SSadaf Ebrahimi }
1063*62c56f98SSadaf Ebrahimi
1064*62c56f98SSadaf Ebrahimi ipad = (unsigned char *) ctx->hmac_ctx;
1065*62c56f98SSadaf Ebrahimi
1066*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_starts(ctx)) != 0) {
1067*62c56f98SSadaf Ebrahimi return ret;
1068*62c56f98SSadaf Ebrahimi }
1069*62c56f98SSadaf Ebrahimi return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
1070*62c56f98SSadaf Ebrahimi }
1071*62c56f98SSadaf Ebrahimi
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)1072*62c56f98SSadaf Ebrahimi int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1073*62c56f98SSadaf Ebrahimi const unsigned char *key, size_t keylen,
1074*62c56f98SSadaf Ebrahimi const unsigned char *input, size_t ilen,
1075*62c56f98SSadaf Ebrahimi unsigned char *output)
1076*62c56f98SSadaf Ebrahimi {
1077*62c56f98SSadaf Ebrahimi mbedtls_md_context_t ctx;
1078*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1079*62c56f98SSadaf Ebrahimi
1080*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
1081*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1082*62c56f98SSadaf Ebrahimi }
1083*62c56f98SSadaf Ebrahimi
1084*62c56f98SSadaf Ebrahimi mbedtls_md_init(&ctx);
1085*62c56f98SSadaf Ebrahimi
1086*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
1087*62c56f98SSadaf Ebrahimi goto cleanup;
1088*62c56f98SSadaf Ebrahimi }
1089*62c56f98SSadaf Ebrahimi
1090*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
1091*62c56f98SSadaf Ebrahimi goto cleanup;
1092*62c56f98SSadaf Ebrahimi }
1093*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
1094*62c56f98SSadaf Ebrahimi goto cleanup;
1095*62c56f98SSadaf Ebrahimi }
1096*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
1097*62c56f98SSadaf Ebrahimi goto cleanup;
1098*62c56f98SSadaf Ebrahimi }
1099*62c56f98SSadaf Ebrahimi
1100*62c56f98SSadaf Ebrahimi cleanup:
1101*62c56f98SSadaf Ebrahimi mbedtls_md_free(&ctx);
1102*62c56f98SSadaf Ebrahimi
1103*62c56f98SSadaf Ebrahimi return ret;
1104*62c56f98SSadaf Ebrahimi }
1105*62c56f98SSadaf Ebrahimi
1106*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_C */
1107*62c56f98SSadaf Ebrahimi
1108*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_LIGHT */
1109