blob: 89295de755cf3eebc1f4a6f72faff26a0eeec4e8 [file] [log] [blame]
Jens Wiklander817466c2018-05-22 13:49:31 +02001/**
Jerome Forissier79013242021-07-28 10:24:04 +02002 * \file md.c
Jens Wiklander817466c2018-05-22 13:49:31 +02003 *
4 * \brief Generic message digest wrapper for mbed TLS
5 *
6 * \author Adriaan de Jong <dejong@fox-it.com>
7 *
Jerome Forissier79013242021-07-28 10:24:04 +02008 * Copyright The Mbed TLS Contributors
9 * SPDX-License-Identifier: Apache-2.0
Jens Wiklander817466c2018-05-22 13:49:31 +020010 *
11 * Licensed under the Apache License, Version 2.0 (the "License"); you may
12 * not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
Jens Wiklander817466c2018-05-22 13:49:31 +020022 */
23
Jerome Forissier79013242021-07-28 10:24:04 +020024#include "common.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020025
Jens Wiklander32b31802023-10-06 16:59:46 +020026/*
27 * Availability of functions in this module is controlled by two
28 * feature macros:
29 * - MBEDTLS_MD_C enables the whole module;
30 * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
31 * most hash metadata (everything except string names); is it
32 * automatically set whenever MBEDTLS_MD_C is defined.
33 *
34 * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
35 *
36 * In the future we may want to change the contract of some functions
37 * (behaviour with NULL arguments) depending on whether MD_C is defined or
38 * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
39 *
40 * For these reasons, we're keeping MD_LIGHT internal for now.
41 */
42#if defined(MBEDTLS_MD_LIGHT)
Jens Wiklander817466c2018-05-22 13:49:31 +020043
44#include "mbedtls/md.h"
Jens Wiklander32b31802023-10-06 16:59:46 +020045#include "md_wrap.h"
Jens Wiklander3d3b0592019-03-20 15:30:29 +010046#include "mbedtls/platform_util.h"
Jerome Forissier11fa71b2020-04-20 17:17:56 +020047#include "mbedtls/error.h"
48
Jerome Forissier11fa71b2020-04-20 17:17:56 +020049#include "mbedtls/md5.h"
50#include "mbedtls/ripemd160.h"
51#include "mbedtls/sha1.h"
52#include "mbedtls/sha256.h"
53#include "mbedtls/sha512.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020054
Jens Wiklander32b31802023-10-06 16:59:46 +020055#if defined(MBEDTLS_MD_SOME_PSA)
56#include <psa/crypto.h>
57#include "psa_crypto_core.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020058#endif
59
Jens Wiklander32b31802023-10-06 16:59:46 +020060#include "mbedtls/platform.h"
61
Jens Wiklander817466c2018-05-22 13:49:31 +020062#include <string.h>
63
64#if defined(MBEDTLS_FS_IO)
65#include <stdio.h>
66#endif
67
Jens Wiklander32b31802023-10-06 16:59:46 +020068#if defined(MBEDTLS_MD_CAN_MD5)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020069const mbedtls_md_info_t mbedtls_md5_info = {
70 "MD5",
71 MBEDTLS_MD_MD5,
72 16,
73 64,
74};
75#endif
76
Jens Wiklander32b31802023-10-06 16:59:46 +020077#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020078const mbedtls_md_info_t mbedtls_ripemd160_info = {
79 "RIPEMD160",
80 MBEDTLS_MD_RIPEMD160,
81 20,
82 64,
83};
84#endif
85
Jens Wiklander32b31802023-10-06 16:59:46 +020086#if defined(MBEDTLS_MD_CAN_SHA1)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020087const mbedtls_md_info_t mbedtls_sha1_info = {
88 "SHA1",
89 MBEDTLS_MD_SHA1,
90 20,
91 64,
92};
93#endif
94
Jens Wiklander32b31802023-10-06 16:59:46 +020095#if defined(MBEDTLS_MD_CAN_SHA224)
Jerome Forissier11fa71b2020-04-20 17:17:56 +020096const mbedtls_md_info_t mbedtls_sha224_info = {
97 "SHA224",
98 MBEDTLS_MD_SHA224,
99 28,
100 64,
101};
Jens Wiklander32b31802023-10-06 16:59:46 +0200102#endif
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200103
Jens Wiklander32b31802023-10-06 16:59:46 +0200104#if defined(MBEDTLS_MD_CAN_SHA256)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200105const mbedtls_md_info_t mbedtls_sha256_info = {
106 "SHA256",
107 MBEDTLS_MD_SHA256,
108 32,
109 64,
110};
111#endif
112
Jens Wiklander32b31802023-10-06 16:59:46 +0200113#if defined(MBEDTLS_MD_CAN_SHA384)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200114const mbedtls_md_info_t mbedtls_sha384_info = {
115 "SHA384",
116 MBEDTLS_MD_SHA384,
117 48,
118 128,
119};
120#endif
121
Jens Wiklander32b31802023-10-06 16:59:46 +0200122#if defined(MBEDTLS_MD_CAN_SHA512)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200123const mbedtls_md_info_t mbedtls_sha512_info = {
124 "SHA512",
125 MBEDTLS_MD_SHA512,
126 64,
127 128,
128};
129#endif
130
Jens Wiklander32b31802023-10-06 16:59:46 +0200131const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
Jens Wiklander817466c2018-05-22 13:49:31 +0200132{
Jens Wiklander32b31802023-10-06 16:59:46 +0200133 switch (md_type) {
134#if defined(MBEDTLS_MD_CAN_MD5)
Jens Wiklander817466c2018-05-22 13:49:31 +0200135 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200136 return &mbedtls_md5_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200137#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200138#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Jens Wiklander817466c2018-05-22 13:49:31 +0200139 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200140 return &mbedtls_ripemd160_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200141#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200142#if defined(MBEDTLS_MD_CAN_SHA1)
Jens Wiklander817466c2018-05-22 13:49:31 +0200143 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200144 return &mbedtls_sha1_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200145#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200146#if defined(MBEDTLS_MD_CAN_SHA224)
Jens Wiklander817466c2018-05-22 13:49:31 +0200147 case MBEDTLS_MD_SHA224:
Jens Wiklander32b31802023-10-06 16:59:46 +0200148 return &mbedtls_sha224_info;
149#endif
150#if defined(MBEDTLS_MD_CAN_SHA256)
Jens Wiklander817466c2018-05-22 13:49:31 +0200151 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200152 return &mbedtls_sha256_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200153#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200154#if defined(MBEDTLS_MD_CAN_SHA384)
Jens Wiklander817466c2018-05-22 13:49:31 +0200155 case MBEDTLS_MD_SHA384:
Jens Wiklander32b31802023-10-06 16:59:46 +0200156 return &mbedtls_sha384_info;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200157#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200158#if defined(MBEDTLS_MD_CAN_SHA512)
Jens Wiklander817466c2018-05-22 13:49:31 +0200159 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200160 return &mbedtls_sha512_info;
Jens Wiklander817466c2018-05-22 13:49:31 +0200161#endif
162 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200163 return NULL;
Jens Wiklander817466c2018-05-22 13:49:31 +0200164 }
165}
166
Jens Wiklander32b31802023-10-06 16:59:46 +0200167#if defined(MBEDTLS_MD_SOME_PSA)
168static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
Jens Wiklander817466c2018-05-22 13:49:31 +0200169{
Jens Wiklander32b31802023-10-06 16:59:46 +0200170 switch (info->type) {
171#if defined(MBEDTLS_MD_MD5_VIA_PSA)
172 case MBEDTLS_MD_MD5:
173 return PSA_ALG_MD5;
174#endif
175#if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
176 case MBEDTLS_MD_RIPEMD160:
177 return PSA_ALG_RIPEMD160;
178#endif
179#if defined(MBEDTLS_MD_SHA1_VIA_PSA)
180 case MBEDTLS_MD_SHA1:
181 return PSA_ALG_SHA_1;
182#endif
183#if defined(MBEDTLS_MD_SHA224_VIA_PSA)
184 case MBEDTLS_MD_SHA224:
185 return PSA_ALG_SHA_224;
186#endif
187#if defined(MBEDTLS_MD_SHA256_VIA_PSA)
188 case MBEDTLS_MD_SHA256:
189 return PSA_ALG_SHA_256;
190#endif
191#if defined(MBEDTLS_MD_SHA384_VIA_PSA)
192 case MBEDTLS_MD_SHA384:
193 return PSA_ALG_SHA_384;
194#endif
195#if defined(MBEDTLS_MD_SHA512_VIA_PSA)
196 case MBEDTLS_MD_SHA512:
197 return PSA_ALG_SHA_512;
198#endif
199 default:
200 return PSA_ALG_NONE;
201 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200202}
203
Jens Wiklander32b31802023-10-06 16:59:46 +0200204static int md_can_use_psa(const mbedtls_md_info_t *info)
Jens Wiklander817466c2018-05-22 13:49:31 +0200205{
Jens Wiklander32b31802023-10-06 16:59:46 +0200206 psa_algorithm_t alg = psa_alg_of_md(info);
207 if (alg == PSA_ALG_NONE) {
208 return 0;
209 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200210
Jens Wiklander32b31802023-10-06 16:59:46 +0200211 return psa_can_do_hash(alg);
212}
213
214static int mbedtls_md_error_from_psa(psa_status_t status)
215{
216 switch (status) {
217 case PSA_SUCCESS:
218 return 0;
219 case PSA_ERROR_NOT_SUPPORTED:
220 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
221 case PSA_ERROR_INSUFFICIENT_MEMORY:
222 return MBEDTLS_ERR_MD_ALLOC_FAILED;
223 default:
224 return MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED;
225 }
226}
227#endif /* MBEDTLS_MD_SOME_PSA */
228
229void mbedtls_md_init(mbedtls_md_context_t *ctx)
230{
231 /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
232 memset(ctx, 0, sizeof(mbedtls_md_context_t));
233}
234
235void mbedtls_md_free(mbedtls_md_context_t *ctx)
236{
237 if (ctx == NULL || ctx->md_info == NULL) {
238 return;
239 }
240
241 if (ctx->md_ctx != NULL) {
242#if defined(MBEDTLS_MD_SOME_PSA)
243 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
244 psa_hash_abort(ctx->md_ctx);
245 } else
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200246#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200247 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200248#if defined(MBEDTLS_MD5_C)
249 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200250 mbedtls_md5_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200251 break;
252#endif
253#if defined(MBEDTLS_RIPEMD160_C)
254 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200255 mbedtls_ripemd160_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200256 break;
257#endif
258#if defined(MBEDTLS_SHA1_C)
259 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200260 mbedtls_sha1_free(ctx->md_ctx);
261 break;
262#endif
263#if defined(MBEDTLS_SHA224_C)
264 case MBEDTLS_MD_SHA224:
265 mbedtls_sha256_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200266 break;
267#endif
268#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200269 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200270 mbedtls_sha256_free(ctx->md_ctx);
271 break;
272#endif
273#if defined(MBEDTLS_SHA384_C)
274 case MBEDTLS_MD_SHA384:
275 mbedtls_sha512_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200276 break;
277#endif
278#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200279 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200280 mbedtls_sha512_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200281 break;
282#endif
283 default:
284 /* Shouldn't happen */
285 break;
286 }
Jens Wiklander32b31802023-10-06 16:59:46 +0200287 mbedtls_free(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200288 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200289
Jens Wiklander32b31802023-10-06 16:59:46 +0200290#if defined(MBEDTLS_MD_C)
291 if (ctx->hmac_ctx != NULL) {
292 mbedtls_platform_zeroize(ctx->hmac_ctx,
293 2 * ctx->md_info->block_size);
294 mbedtls_free(ctx->hmac_ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200295 }
Jens Wiklander32b31802023-10-06 16:59:46 +0200296#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200297
Jens Wiklander32b31802023-10-06 16:59:46 +0200298 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
Jens Wiklander817466c2018-05-22 13:49:31 +0200299}
300
Jens Wiklander32b31802023-10-06 16:59:46 +0200301int mbedtls_md_clone(mbedtls_md_context_t *dst,
302 const mbedtls_md_context_t *src)
Jens Wiklander817466c2018-05-22 13:49:31 +0200303{
Jens Wiklander32b31802023-10-06 16:59:46 +0200304 if (dst == NULL || dst->md_info == NULL ||
Jens Wiklander817466c2018-05-22 13:49:31 +0200305 src == NULL || src->md_info == NULL ||
Jens Wiklander32b31802023-10-06 16:59:46 +0200306 dst->md_info != src->md_info) {
307 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jens Wiklander817466c2018-05-22 13:49:31 +0200308 }
309
Jens Wiklander32b31802023-10-06 16:59:46 +0200310#if defined(MBEDTLS_MD_SOME_PSA)
311 if (src->engine != dst->engine) {
312 /* This can happen with src set to legacy because PSA wasn't ready
313 * yet, and dst to PSA because it became ready in the meantime.
314 * We currently don't support that case (we'd need to re-allocate
315 * md_ctx to the size of the appropriate MD context). */
316 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
317 }
318
319 if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
320 psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
321 return mbedtls_md_error_from_psa(status);
322 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200323#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200324
325 switch (src->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200326#if defined(MBEDTLS_MD5_C)
327 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200328 mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200329 break;
330#endif
331#if defined(MBEDTLS_RIPEMD160_C)
332 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200333 mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200334 break;
335#endif
336#if defined(MBEDTLS_SHA1_C)
337 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200338 mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
339 break;
340#endif
341#if defined(MBEDTLS_SHA224_C)
342 case MBEDTLS_MD_SHA224:
343 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200344 break;
345#endif
346#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200347 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200348 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
349 break;
350#endif
351#if defined(MBEDTLS_SHA384_C)
352 case MBEDTLS_MD_SHA384:
353 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200354 break;
355#endif
356#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200357 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200358 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200359 break;
360#endif
361 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200362 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200363 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200364
Jens Wiklander32b31802023-10-06 16:59:46 +0200365 if (dst->hmac_ctx != NULL && src->hmac_ctx != NULL)
366 memcpy(dst->hmac_ctx, src->hmac_ctx, 2 * src->md_info->block_size);
Edison Ai12484fc2018-12-19 15:36:28 +0800367
Jens Wiklander32b31802023-10-06 16:59:46 +0200368 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200369}
370
Jens Wiklander32b31802023-10-06 16:59:46 +0200371#define ALLOC(type) \
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200372 do { \
Jens Wiklander32b31802023-10-06 16:59:46 +0200373 ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
374 if (ctx->md_ctx == NULL) \
375 return MBEDTLS_ERR_MD_ALLOC_FAILED; \
376 mbedtls_##type##_init(ctx->md_ctx); \
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200377 } \
Jens Wiklander32b31802023-10-06 16:59:46 +0200378 while (0)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200379
Jens Wiklander32b31802023-10-06 16:59:46 +0200380int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
Jens Wiklander817466c2018-05-22 13:49:31 +0200381{
Jens Wiklander32b31802023-10-06 16:59:46 +0200382 if (md_info == NULL || ctx == NULL) {
383 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
384 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200385
Jerome Forissier79013242021-07-28 10:24:04 +0200386 ctx->md_info = md_info;
387 ctx->md_ctx = NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200388#if defined(MBEDTLS_MD_C)
Jerome Forissier79013242021-07-28 10:24:04 +0200389 ctx->hmac_ctx = NULL;
Jens Wiklander32b31802023-10-06 16:59:46 +0200390#else
391 if (hmac != 0) {
392 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
393 }
394#endif
Jerome Forissier79013242021-07-28 10:24:04 +0200395
Jens Wiklander32b31802023-10-06 16:59:46 +0200396#if defined(MBEDTLS_MD_SOME_PSA)
397 if (md_can_use_psa(ctx->md_info)) {
398 ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
399 if (ctx->md_ctx == NULL) {
400 return MBEDTLS_ERR_MD_ALLOC_FAILED;
401 }
402 ctx->engine = MBEDTLS_MD_ENGINE_PSA;
403 } else
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200404#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200405 switch (md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200406#if defined(MBEDTLS_MD5_C)
407 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200408 ALLOC(md5);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200409 break;
410#endif
411#if defined(MBEDTLS_RIPEMD160_C)
412 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200413 ALLOC(ripemd160);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200414 break;
415#endif
416#if defined(MBEDTLS_SHA1_C)
417 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200418 ALLOC(sha1);
419 break;
420#endif
421#if defined(MBEDTLS_SHA224_C)
422 case MBEDTLS_MD_SHA224:
423 ALLOC(sha256);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200424 break;
425#endif
426#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200427 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200428 ALLOC(sha256);
429 break;
430#endif
431#if defined(MBEDTLS_SHA384_C)
432 case MBEDTLS_MD_SHA384:
433 ALLOC(sha512);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200434 break;
435#endif
436#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200437 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200438 ALLOC(sha512);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200439 break;
440#endif
441 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200442 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200443 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200444
Jens Wiklander32b31802023-10-06 16:59:46 +0200445#if defined(MBEDTLS_MD_C)
446 if (hmac != 0) {
447 ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
448 if (ctx->hmac_ctx == NULL) {
449 mbedtls_md_free(ctx);
450 return MBEDTLS_ERR_MD_ALLOC_FAILED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200451 }
452 }
Jens Wiklander32b31802023-10-06 16:59:46 +0200453#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200454
Jens Wiklander32b31802023-10-06 16:59:46 +0200455 return 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200456}
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200457#undef ALLOC
Jens Wiklander817466c2018-05-22 13:49:31 +0200458
Jens Wiklander32b31802023-10-06 16:59:46 +0200459int mbedtls_md_starts(mbedtls_md_context_t *ctx)
Jens Wiklander817466c2018-05-22 13:49:31 +0200460{
Jens Wiklander32b31802023-10-06 16:59:46 +0200461 if (ctx == NULL || ctx->md_info == NULL) {
462 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
463 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200464
Jens Wiklander32b31802023-10-06 16:59:46 +0200465#if defined(MBEDTLS_MD_SOME_PSA)
466 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
467 psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
468 psa_hash_abort(ctx->md_ctx);
469 psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
470 return mbedtls_md_error_from_psa(status);
471 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200472#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200473
474 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200475#if defined(MBEDTLS_MD5_C)
476 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200477 return mbedtls_md5_starts(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200478#endif
479#if defined(MBEDTLS_RIPEMD160_C)
480 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200481 return mbedtls_ripemd160_starts(ctx->md_ctx);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200482#endif
483#if defined(MBEDTLS_SHA1_C)
484 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200485 return mbedtls_sha1_starts(ctx->md_ctx);
486#endif
487#if defined(MBEDTLS_SHA224_C)
488 case MBEDTLS_MD_SHA224:
489 return mbedtls_sha256_starts(ctx->md_ctx, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200490#endif
491#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200492 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200493 return mbedtls_sha256_starts(ctx->md_ctx, 0);
494#endif
495#if defined(MBEDTLS_SHA384_C)
496 case MBEDTLS_MD_SHA384:
497 return mbedtls_sha512_starts(ctx->md_ctx, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200498#endif
499#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200500 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200501 return mbedtls_sha512_starts(ctx->md_ctx, 0);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200502#endif
503 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200504 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200505 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200506}
507
Jens Wiklander32b31802023-10-06 16:59:46 +0200508int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Jens Wiklander817466c2018-05-22 13:49:31 +0200509{
Jens Wiklander32b31802023-10-06 16:59:46 +0200510 if (ctx == NULL || ctx->md_info == NULL) {
511 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
512 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200513
Jens Wiklander32b31802023-10-06 16:59:46 +0200514#if defined(MBEDTLS_MD_SOME_PSA)
515 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
516 psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
517 return mbedtls_md_error_from_psa(status);
518 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200519#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200520
521 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200522#if defined(MBEDTLS_MD5_C)
523 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200524 return mbedtls_md5_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200525#endif
526#if defined(MBEDTLS_RIPEMD160_C)
527 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200528 return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200529#endif
530#if defined(MBEDTLS_SHA1_C)
531 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200532 return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
533#endif
534#if defined(MBEDTLS_SHA224_C)
535 case MBEDTLS_MD_SHA224:
536 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200537#endif
538#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200539 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200540 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
541#endif
542#if defined(MBEDTLS_SHA384_C)
543 case MBEDTLS_MD_SHA384:
544 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200545#endif
546#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200547 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200548 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200549#endif
550 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200551 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200552 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200553}
554
Jens Wiklander32b31802023-10-06 16:59:46 +0200555int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200556{
Jens Wiklander32b31802023-10-06 16:59:46 +0200557 if (ctx == NULL || ctx->md_info == NULL) {
558 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
559 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200560
Jens Wiklander32b31802023-10-06 16:59:46 +0200561#if defined(MBEDTLS_MD_SOME_PSA)
562 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
563 size_t size = ctx->md_info->size;
564 psa_status_t status = psa_hash_finish(ctx->md_ctx,
565 output, size, &size);
566 return mbedtls_md_error_from_psa(status);
567 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200568#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200569
570 switch (ctx->md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200571#if defined(MBEDTLS_MD5_C)
572 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200573 return mbedtls_md5_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200574#endif
575#if defined(MBEDTLS_RIPEMD160_C)
576 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200577 return mbedtls_ripemd160_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200578#endif
579#if defined(MBEDTLS_SHA1_C)
580 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200581 return mbedtls_sha1_finish(ctx->md_ctx, output);
582#endif
583#if defined(MBEDTLS_SHA224_C)
584 case MBEDTLS_MD_SHA224:
585 return mbedtls_sha256_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200586#endif
587#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200588 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200589 return mbedtls_sha256_finish(ctx->md_ctx, output);
590#endif
591#if defined(MBEDTLS_SHA384_C)
592 case MBEDTLS_MD_SHA384:
593 return mbedtls_sha512_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200594#endif
595#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200596 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200597 return mbedtls_sha512_finish(ctx->md_ctx, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200598#endif
599 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200600 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200601 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200602}
603
Jens Wiklander32b31802023-10-06 16:59:46 +0200604int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
605 unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200606{
Jens Wiklander32b31802023-10-06 16:59:46 +0200607 if (md_info == NULL) {
608 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
609 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200610
Jens Wiklander32b31802023-10-06 16:59:46 +0200611#if defined(MBEDTLS_MD_SOME_PSA)
612 if (md_can_use_psa(md_info)) {
613 size_t size = md_info->size;
614 psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
615 input, ilen,
616 output, size, &size);
617 return mbedtls_md_error_from_psa(status);
618 }
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200619#endif
Jens Wiklander32b31802023-10-06 16:59:46 +0200620
621 switch (md_info->type) {
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200622#if defined(MBEDTLS_MD5_C)
623 case MBEDTLS_MD_MD5:
Jens Wiklander32b31802023-10-06 16:59:46 +0200624 return mbedtls_md5(input, ilen, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200625#endif
626#if defined(MBEDTLS_RIPEMD160_C)
627 case MBEDTLS_MD_RIPEMD160:
Jens Wiklander32b31802023-10-06 16:59:46 +0200628 return mbedtls_ripemd160(input, ilen, output);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200629#endif
630#if defined(MBEDTLS_SHA1_C)
631 case MBEDTLS_MD_SHA1:
Jens Wiklander32b31802023-10-06 16:59:46 +0200632 return mbedtls_sha1(input, ilen, output);
633#endif
634#if defined(MBEDTLS_SHA224_C)
635 case MBEDTLS_MD_SHA224:
636 return mbedtls_sha256(input, ilen, output, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200637#endif
638#if defined(MBEDTLS_SHA256_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200639 case MBEDTLS_MD_SHA256:
Jens Wiklander32b31802023-10-06 16:59:46 +0200640 return mbedtls_sha256(input, ilen, output, 0);
641#endif
642#if defined(MBEDTLS_SHA384_C)
643 case MBEDTLS_MD_SHA384:
644 return mbedtls_sha512(input, ilen, output, 1);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200645#endif
646#if defined(MBEDTLS_SHA512_C)
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200647 case MBEDTLS_MD_SHA512:
Jens Wiklander32b31802023-10-06 16:59:46 +0200648 return mbedtls_sha512(input, ilen, output, 0);
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200649#endif
650 default:
Jens Wiklander32b31802023-10-06 16:59:46 +0200651 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200652 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200653}
654
Jens Wiklander32b31802023-10-06 16:59:46 +0200655unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
656{
657 if (md_info == NULL) {
658 return 0;
659 }
660
661 return md_info->size;
662}
663
664mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
665{
666 if (md_info == NULL) {
667 return MBEDTLS_MD_NONE;
668 }
669
670 return md_info->type;
671}
672
673/************************************************************************
674 * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
675 * functions below are only available when MBEDTLS_MD_C is set. *
676 ************************************************************************/
677#if defined(MBEDTLS_MD_C)
678
679/*
680 * Reminder: update profiles in x509_crt.c when adding a new hash!
681 */
682static const int supported_digests[] = {
683
684#if defined(MBEDTLS_MD_CAN_SHA512)
685 MBEDTLS_MD_SHA512,
686#endif
687
688#if defined(MBEDTLS_MD_CAN_SHA384)
689 MBEDTLS_MD_SHA384,
690#endif
691
692#if defined(MBEDTLS_MD_CAN_SHA256)
693 MBEDTLS_MD_SHA256,
694#endif
695#if defined(MBEDTLS_MD_CAN_SHA224)
696 MBEDTLS_MD_SHA224,
697#endif
698
699#if defined(MBEDTLS_MD_CAN_SHA1)
700 MBEDTLS_MD_SHA1,
701#endif
702
703#if defined(MBEDTLS_MD_CAN_RIPEMD160)
704 MBEDTLS_MD_RIPEMD160,
705#endif
706
707#if defined(MBEDTLS_MD_CAN_MD5)
708 MBEDTLS_MD_MD5,
709#endif
710
711 MBEDTLS_MD_NONE
712};
713
714const int *mbedtls_md_list(void)
715{
716 return supported_digests;
717}
718
719const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
720{
721 if (NULL == md_name) {
722 return NULL;
723 }
724
725 /* Get the appropriate digest information */
726#if defined(MBEDTLS_MD_CAN_MD5)
727 if (!strcmp("MD5", md_name)) {
728 return mbedtls_md_info_from_type(MBEDTLS_MD_MD5);
729 }
730#endif
731#if defined(MBEDTLS_MD_CAN_RIPEMD160)
732 if (!strcmp("RIPEMD160", md_name)) {
733 return mbedtls_md_info_from_type(MBEDTLS_MD_RIPEMD160);
734 }
735#endif
736#if defined(MBEDTLS_MD_CAN_SHA1)
737 if (!strcmp("SHA1", md_name) || !strcmp("SHA", md_name)) {
738 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
739 }
740#endif
741#if defined(MBEDTLS_MD_CAN_SHA224)
742 if (!strcmp("SHA224", md_name)) {
743 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA224);
744 }
745#endif
746#if defined(MBEDTLS_MD_CAN_SHA256)
747 if (!strcmp("SHA256", md_name)) {
748 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
749 }
750#endif
751#if defined(MBEDTLS_MD_CAN_SHA384)
752 if (!strcmp("SHA384", md_name)) {
753 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA384);
754 }
755#endif
756#if defined(MBEDTLS_MD_CAN_SHA512)
757 if (!strcmp("SHA512", md_name)) {
758 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA512);
759 }
760#endif
761 return NULL;
762}
763
764const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
765 const mbedtls_md_context_t *ctx)
766{
767 if (ctx == NULL) {
768 return NULL;
769 }
770
771 return ctx->MBEDTLS_PRIVATE(md_info);
772}
773
Jens Wiklander817466c2018-05-22 13:49:31 +0200774#if defined(MBEDTLS_FS_IO)
Jens Wiklander32b31802023-10-06 16:59:46 +0200775int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200776{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200777 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200778 FILE *f;
779 size_t n;
780 mbedtls_md_context_t ctx;
781 unsigned char buf[1024];
782
Jens Wiklander32b31802023-10-06 16:59:46 +0200783 if (md_info == NULL) {
784 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
785 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200786
Jens Wiklander32b31802023-10-06 16:59:46 +0200787 if ((f = fopen(path, "rb")) == NULL) {
788 return MBEDTLS_ERR_MD_FILE_IO_ERROR;
789 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200790
Jens Wiklander32b31802023-10-06 16:59:46 +0200791 /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
792 mbedtls_setbuf(f, NULL);
Jens Wiklander817466c2018-05-22 13:49:31 +0200793
Jens Wiklander32b31802023-10-06 16:59:46 +0200794 mbedtls_md_init(&ctx);
795
796 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200797 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200798 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200799
Jens Wiklander32b31802023-10-06 16:59:46 +0200800 if ((ret = mbedtls_md_starts(&ctx)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100801 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200802 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200803
Jens Wiklander32b31802023-10-06 16:59:46 +0200804 while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
805 if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100806 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200807 }
808 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200809
Jens Wiklander32b31802023-10-06 16:59:46 +0200810 if (ferror(f) != 0) {
Jens Wiklander817466c2018-05-22 13:49:31 +0200811 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Jens Wiklander32b31802023-10-06 16:59:46 +0200812 } else {
813 ret = mbedtls_md_finish(&ctx, output);
814 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200815
816cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +0200817 mbedtls_platform_zeroize(buf, sizeof(buf));
818 fclose(f);
819 mbedtls_md_free(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200820
Jens Wiklander32b31802023-10-06 16:59:46 +0200821 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200822}
823#endif /* MBEDTLS_FS_IO */
824
Jens Wiklander32b31802023-10-06 16:59:46 +0200825int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
Jens Wiklander817466c2018-05-22 13:49:31 +0200826{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200827 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200828 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
829 unsigned char *ipad, *opad;
Jens Wiklander817466c2018-05-22 13:49:31 +0200830
Jens Wiklander32b31802023-10-06 16:59:46 +0200831 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
832 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
833 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200834
Jens Wiklander32b31802023-10-06 16:59:46 +0200835 if (keylen > (size_t) ctx->md_info->block_size) {
836 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100837 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200838 }
839 if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100840 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200841 }
842 if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100843 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200844 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200845
846 keylen = ctx->md_info->size;
847 key = sum;
848 }
849
850 ipad = (unsigned char *) ctx->hmac_ctx;
851 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
852
Jens Wiklander32b31802023-10-06 16:59:46 +0200853 memset(ipad, 0x36, ctx->md_info->block_size);
854 memset(opad, 0x5C, ctx->md_info->block_size);
Jens Wiklander817466c2018-05-22 13:49:31 +0200855
Jens Wiklander32b31802023-10-06 16:59:46 +0200856 mbedtls_xor(ipad, ipad, key, keylen);
857 mbedtls_xor(opad, opad, key, keylen);
858
859 if ((ret = mbedtls_md_starts(ctx)) != 0) {
860 goto cleanup;
861 }
862 if ((ret = mbedtls_md_update(ctx, ipad,
863 ctx->md_info->block_size)) != 0) {
864 goto cleanup;
Jens Wiklander817466c2018-05-22 13:49:31 +0200865 }
866
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100867cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +0200868 mbedtls_platform_zeroize(sum, sizeof(sum));
Jens Wiklander817466c2018-05-22 13:49:31 +0200869
Jens Wiklander32b31802023-10-06 16:59:46 +0200870 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200871}
872
Jens Wiklander32b31802023-10-06 16:59:46 +0200873int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Jens Wiklander817466c2018-05-22 13:49:31 +0200874{
Jens Wiklander32b31802023-10-06 16:59:46 +0200875 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
876 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
877 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200878
Jens Wiklander32b31802023-10-06 16:59:46 +0200879 return mbedtls_md_update(ctx, input, ilen);
Jens Wiklander817466c2018-05-22 13:49:31 +0200880}
881
Jens Wiklander32b31802023-10-06 16:59:46 +0200882int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200883{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200884 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200885 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
886 unsigned char *opad;
887
Jens Wiklander32b31802023-10-06 16:59:46 +0200888 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
889 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
890 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200891
892 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
893
Jens Wiklander32b31802023-10-06 16:59:46 +0200894 if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
895 return ret;
896 }
897 if ((ret = mbedtls_md_starts(ctx)) != 0) {
898 return ret;
899 }
900 if ((ret = mbedtls_md_update(ctx, opad,
901 ctx->md_info->block_size)) != 0) {
902 return ret;
903 }
904 if ((ret = mbedtls_md_update(ctx, tmp,
905 ctx->md_info->size)) != 0) {
906 return ret;
907 }
908 return mbedtls_md_finish(ctx, output);
Jens Wiklander817466c2018-05-22 13:49:31 +0200909}
910
Jens Wiklander32b31802023-10-06 16:59:46 +0200911int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
Jens Wiklander817466c2018-05-22 13:49:31 +0200912{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200913 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200914 unsigned char *ipad;
915
Jens Wiklander32b31802023-10-06 16:59:46 +0200916 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
917 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
918 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200919
920 ipad = (unsigned char *) ctx->hmac_ctx;
921
Jens Wiklander32b31802023-10-06 16:59:46 +0200922 if ((ret = mbedtls_md_starts(ctx)) != 0) {
923 return ret;
924 }
925 return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
Jens Wiklander817466c2018-05-22 13:49:31 +0200926}
927
Jens Wiklander32b31802023-10-06 16:59:46 +0200928int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
929 const unsigned char *key, size_t keylen,
930 const unsigned char *input, size_t ilen,
931 unsigned char *output)
Jens Wiklander817466c2018-05-22 13:49:31 +0200932{
933 mbedtls_md_context_t ctx;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200934 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200935
Jens Wiklander32b31802023-10-06 16:59:46 +0200936 if (md_info == NULL) {
937 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
938 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200939
Jens Wiklander32b31802023-10-06 16:59:46 +0200940 mbedtls_md_init(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200941
Jens Wiklander32b31802023-10-06 16:59:46 +0200942 if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100943 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200944 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200945
Jens Wiklander32b31802023-10-06 16:59:46 +0200946 if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100947 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200948 }
949 if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100950 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200951 }
952 if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100953 goto cleanup;
Jens Wiklander32b31802023-10-06 16:59:46 +0200954 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200955
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100956cleanup:
Jens Wiklander32b31802023-10-06 16:59:46 +0200957 mbedtls_md_free(&ctx);
Jens Wiklander817466c2018-05-22 13:49:31 +0200958
Jens Wiklander32b31802023-10-06 16:59:46 +0200959 return ret;
Jens Wiklander817466c2018-05-22 13:49:31 +0200960}
961
Jens Wiklander32b31802023-10-06 16:59:46 +0200962const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
Jens Wiklander817466c2018-05-22 13:49:31 +0200963{
Jens Wiklander32b31802023-10-06 16:59:46 +0200964 if (md_info == NULL) {
965 return NULL;
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200966 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200967
968 return md_info->name;
969}
970
971#endif /* MBEDTLS_MD_C */
Jens Wiklander32b31802023-10-06 16:59:46 +0200972
973#endif /* MBEDTLS_MD_LIGHT */