blob: 14a88ba1b3f02476ed59b46e441205bc803823c4 [file] [log] [blame]
Paul Bakker17373852011-01-06 14:20:01 +00001/**
Gilles Peskine2091f3a2021-02-12 23:34:01 +01002 * \file md.c
Paul Bakker9af723c2014-05-01 13:03:14 +02003 *
Manuel Pégourié-Gonnardb4fe3cb2015-01-22 16:11:05 +00004 * \brief Generic message digest wrapper for mbed TLS
Paul Bakker17373852011-01-06 14:20:01 +00005 *
6 * \author Adriaan de Jong <dejong@fox-it.com>
7 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02008 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02009 * SPDX-License-Identifier: Apache-2.0
10 *
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.
Paul Bakker17373852011-01-06 14:20:01 +000022 */
23
Gilles Peskinedb09ef62020-06-03 01:43:33 +020024#include "common.h"
Paul Bakker17373852011-01-06 14:20:01 +000025
Manuel Pégourié-Gonnard0d415212023-02-23 13:02:13 +010026/*
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 *
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +010034 * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
35 *
Manuel Pégourié-Gonnard0d415212023-02-23 13:02:13 +010036 * 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 */
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010042#if defined(MBEDTLS_MD_LIGHT)
Paul Bakker17373852011-01-06 14:20:01 +000043
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000044#include "mbedtls/md.h"
Chris Jonesdaacb592021-03-09 17:03:29 +000045#include "md_wrap.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050046#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000047#include "mbedtls/error.h"
Paul Bakker17373852011-01-06 14:20:01 +000048
Gilles Peskine84867cf2019-07-19 15:46:03 +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"
54
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +020055#if defined(MBEDTLS_PSA_CRYPTO_C)
Gilles Peskine12612e52022-10-22 20:07:28 +020056#include <psa/crypto.h>
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +020057#include "md_psa.h"
58#endif
59
60#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +010061#include "psa_crypto_core.h"
Gilles Peskine12612e52022-10-22 20:07:28 +020062#endif
63
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010064#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010065
Rich Evans00ab4702015-02-06 13:43:58 +000066#include <string.h>
Paul Bakker17373852011-01-06 14:20:01 +000067
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020068#if defined(MBEDTLS_FS_IO)
69#include <stdio.h>
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000070#endif
71
Gilles Peskine83d9e092022-10-22 18:32:43 +020072#if defined(MBEDTLS_MD_CAN_MD5)
Gilles Peskine84867cf2019-07-19 15:46:03 +020073const mbedtls_md_info_t mbedtls_md5_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +020074 "MD5",
Gilles Peskine2838b7b2019-07-19 16:03:39 +020075 MBEDTLS_MD_MD5,
Gilles Peskine84867cf2019-07-19 15:46:03 +020076 16,
77 64,
78};
79#endif
80
Gilles Peskine83d9e092022-10-22 18:32:43 +020081#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Gilles Peskine84867cf2019-07-19 15:46:03 +020082const mbedtls_md_info_t mbedtls_ripemd160_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +020083 "RIPEMD160",
Gilles Peskine2838b7b2019-07-19 16:03:39 +020084 MBEDTLS_MD_RIPEMD160,
Gilles Peskine84867cf2019-07-19 15:46:03 +020085 20,
86 64,
87};
88#endif
89
Gilles Peskine83d9e092022-10-22 18:32:43 +020090#if defined(MBEDTLS_MD_CAN_SHA1)
Gilles Peskine84867cf2019-07-19 15:46:03 +020091const mbedtls_md_info_t mbedtls_sha1_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +020092 "SHA1",
Gilles Peskine2838b7b2019-07-19 16:03:39 +020093 MBEDTLS_MD_SHA1,
Gilles Peskine84867cf2019-07-19 15:46:03 +020094 20,
95 64,
96};
97#endif
98
Gilles Peskine83d9e092022-10-22 18:32:43 +020099#if defined(MBEDTLS_MD_CAN_SHA224)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200100const mbedtls_md_info_t mbedtls_sha224_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200101 "SHA224",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200102 MBEDTLS_MD_SHA224,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200103 28,
104 64,
105};
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200106#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200107
Gilles Peskine83d9e092022-10-22 18:32:43 +0200108#if defined(MBEDTLS_MD_CAN_SHA256)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200109const mbedtls_md_info_t mbedtls_sha256_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200110 "SHA256",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200111 MBEDTLS_MD_SHA256,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200112 32,
113 64,
114};
115#endif
116
Gilles Peskine83d9e092022-10-22 18:32:43 +0200117#if defined(MBEDTLS_MD_CAN_SHA384)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200118const mbedtls_md_info_t mbedtls_sha384_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200119 "SHA384",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200120 MBEDTLS_MD_SHA384,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200121 48,
122 128,
123};
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200124#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200125
Gilles Peskine83d9e092022-10-22 18:32:43 +0200126#if defined(MBEDTLS_MD_CAN_SHA512)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200127const mbedtls_md_info_t mbedtls_sha512_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200128 "SHA512",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200129 MBEDTLS_MD_SHA512,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200130 64,
131 128,
132};
133#endif
134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
Paul Bakker17373852011-01-06 14:20:01 +0000136{
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 switch (md_type) {
Gilles Peskine83d9e092022-10-22 18:32:43 +0200138#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200139 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 return &mbedtls_md5_info;
Paul Bakker17373852011-01-06 14:20:01 +0000141#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200142#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 return &mbedtls_ripemd160_info;
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +0100145#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200146#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200147 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 return &mbedtls_sha1_info;
Paul Bakker17373852011-01-06 14:20:01 +0000149#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200150#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 return &mbedtls_sha224_info;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200153#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200154#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200155 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100156 return &mbedtls_sha256_info;
Paul Bakker17373852011-01-06 14:20:01 +0000157#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200158#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200159 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 return &mbedtls_sha384_info;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200161#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200162#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200163 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 return &mbedtls_sha512_info;
Paul Bakker17373852011-01-06 14:20:01 +0000165#endif
166 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100167 return NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000168 }
169}
170
Gilles Peskine12612e52022-10-22 20:07:28 +0200171#if defined(MBEDTLS_MD_SOME_PSA)
172static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
173{
174 switch (info->type) {
175#if defined(MBEDTLS_MD_MD5_VIA_PSA)
176 case MBEDTLS_MD_MD5:
177 return PSA_ALG_MD5;
178#endif
179#if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
180 case MBEDTLS_MD_RIPEMD160:
181 return PSA_ALG_RIPEMD160;
182#endif
183#if defined(MBEDTLS_MD_SHA1_VIA_PSA)
184 case MBEDTLS_MD_SHA1:
185 return PSA_ALG_SHA_1;
186#endif
187#if defined(MBEDTLS_MD_SHA224_VIA_PSA)
188 case MBEDTLS_MD_SHA224:
189 return PSA_ALG_SHA_224;
190#endif
191#if defined(MBEDTLS_MD_SHA256_VIA_PSA)
192 case MBEDTLS_MD_SHA256:
193 return PSA_ALG_SHA_256;
194#endif
195#if defined(MBEDTLS_MD_SHA384_VIA_PSA)
196 case MBEDTLS_MD_SHA384:
197 return PSA_ALG_SHA_384;
198#endif
199#if defined(MBEDTLS_MD_SHA512_VIA_PSA)
200 case MBEDTLS_MD_SHA512:
201 return PSA_ALG_SHA_512;
202#endif
203 default:
204 return PSA_ALG_NONE;
205 }
206}
207
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100208static int md_can_use_psa(const mbedtls_md_info_t *info)
Gilles Peskine12612e52022-10-22 20:07:28 +0200209{
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100210 psa_algorithm_t alg = psa_alg_of_md(info);
211 if (alg == PSA_ALG_NONE) {
212 return 0;
213 }
214
215 return psa_can_do_hash(alg);
Gilles Peskine12612e52022-10-22 20:07:28 +0200216}
217
218static int mbedtls_md_error_from_psa(psa_status_t status)
219{
220 switch (status) {
221 case PSA_SUCCESS:
222 return 0;
223 case PSA_ERROR_NOT_SUPPORTED:
224 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
225 case PSA_ERROR_INSUFFICIENT_MEMORY:
226 return MBEDTLS_ERR_MD_ALLOC_FAILED;
227 default:
228 return MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED;
229 }
230}
231#endif /* MBEDTLS_MD_SOME_PSA */
232
Gilles Peskine449bd832023-01-11 14:50:10 +0100233void mbedtls_md_init(mbedtls_md_context_t *ctx)
Paul Bakker84bbeb52014-07-01 14:53:22 +0200234{
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100235 /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 memset(ctx, 0, sizeof(mbedtls_md_context_t));
Paul Bakker84bbeb52014-07-01 14:53:22 +0200237}
238
Gilles Peskine449bd832023-01-11 14:50:10 +0100239void mbedtls_md_free(mbedtls_md_context_t *ctx)
Paul Bakker84bbeb52014-07-01 14:53:22 +0200240{
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 if (ctx == NULL || ctx->md_info == NULL) {
Paul Bakker84bbeb52014-07-01 14:53:22 +0200242 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 }
Paul Bakker84bbeb52014-07-01 14:53:22 +0200244
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 if (ctx->md_ctx != NULL) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200246#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100247 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200248 psa_hash_abort(ctx->md_ctx);
249 } else
250#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200252#if defined(MBEDTLS_MD5_C)
253 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100254 mbedtls_md5_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200255 break;
256#endif
257#if defined(MBEDTLS_RIPEMD160_C)
258 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 mbedtls_ripemd160_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200260 break;
261#endif
262#if defined(MBEDTLS_SHA1_C)
263 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 mbedtls_sha1_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200265 break;
266#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200267#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200268 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100269 mbedtls_sha256_free(ctx->md_ctx);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200270 break;
271#endif
272#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200273 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 mbedtls_sha256_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200275 break;
276#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200277#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200278 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 mbedtls_sha512_free(ctx->md_ctx);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200280 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200281#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200282#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200283 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 mbedtls_sha512_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200285 break;
286#endif
287 default:
288 /* Shouldn't happen */
289 break;
290 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 mbedtls_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200292 }
Paul Bakker84bbeb52014-07-01 14:53:22 +0200293
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100294#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100295 if (ctx->hmac_ctx != NULL) {
296 mbedtls_platform_zeroize(ctx->hmac_ctx,
297 2 * ctx->md_info->block_size);
298 mbedtls_free(ctx->hmac_ctx);
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100299 }
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100300#endif
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100301
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
Paul Bakker84bbeb52014-07-01 14:53:22 +0200303}
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305int mbedtls_md_clone(mbedtls_md_context_t *dst,
306 const mbedtls_md_context_t *src)
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200307{
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 if (dst == NULL || dst->md_info == NULL ||
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200309 src == NULL || src->md_info == NULL ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100310 dst->md_info != src->md_info) {
311 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200312 }
313
Gilles Peskine12612e52022-10-22 20:07:28 +0200314#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100315 if (src->engine != dst->engine) {
316 /* This can happen with src set to legacy because PSA wasn't ready
317 * yet, and dst to PSA because it became ready in the meantime.
318 * We currently don't support that case (we'd need to re-allocate
319 * md_ctx to the size of the appropriate MD context). */
320 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
321 }
322
323 if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200324 psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
325 return mbedtls_md_error_from_psa(status);
326 }
327#endif
328
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 switch (src->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200330#if defined(MBEDTLS_MD5_C)
331 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200333 break;
334#endif
335#if defined(MBEDTLS_RIPEMD160_C)
336 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200338 break;
339#endif
340#if defined(MBEDTLS_SHA1_C)
341 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100342 mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200343 break;
344#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200345#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200346 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100347 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200348 break;
349#endif
350#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200351 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100352 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200353 break;
354#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200355#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200356 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100357 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200358 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200359#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200360#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200361 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100362 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200363 break;
364#endif
365 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200367 }
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200368
Gilles Peskine449bd832023-01-11 14:50:10 +0100369 return 0;
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200370}
371
Gilles Peskine449bd832023-01-11 14:50:10 +0100372#define ALLOC(type) \
Gilles Peskine84867cf2019-07-19 15:46:03 +0200373 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100374 ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
375 if (ctx->md_ctx == NULL) \
376 return MBEDTLS_ERR_MD_ALLOC_FAILED; \
377 mbedtls_##type##_init(ctx->md_ctx); \
Gilles Peskine84867cf2019-07-19 15:46:03 +0200378 } \
Gilles Peskine449bd832023-01-11 14:50:10 +0100379 while (0)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200380
Gilles Peskine449bd832023-01-11 14:50:10 +0100381int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
Paul Bakker17373852011-01-06 14:20:01 +0000382{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100383#if defined(MBEDTLS_MD_C)
384 if (ctx == NULL) {
385 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
386 }
387#endif
388 if (md_info == NULL) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
390 }
Paul Bakker17373852011-01-06 14:20:01 +0000391
Gilles Peskined15c7402020-08-19 12:03:11 +0200392 ctx->md_info = md_info;
393 ctx->md_ctx = NULL;
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100394#if defined(MBEDTLS_MD_C)
Gilles Peskined15c7402020-08-19 12:03:11 +0200395 ctx->hmac_ctx = NULL;
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100396#else
397 if (hmac != 0) {
398 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
399 }
400#endif
Gilles Peskined15c7402020-08-19 12:03:11 +0200401
Gilles Peskine12612e52022-10-22 20:07:28 +0200402#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100403 if (md_can_use_psa(ctx->md_info)) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200404 ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
405 if (ctx->md_ctx == NULL) {
406 return MBEDTLS_ERR_MD_ALLOC_FAILED;
407 }
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100408 ctx->engine = MBEDTLS_MD_ENGINE_PSA;
Gilles Peskine12612e52022-10-22 20:07:28 +0200409 } else
410#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 switch (md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200412#if defined(MBEDTLS_MD5_C)
413 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100414 ALLOC(md5);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200415 break;
416#endif
417#if defined(MBEDTLS_RIPEMD160_C)
418 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100419 ALLOC(ripemd160);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200420 break;
421#endif
422#if defined(MBEDTLS_SHA1_C)
423 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100424 ALLOC(sha1);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200425 break;
426#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200427#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200428 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100429 ALLOC(sha256);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200430 break;
431#endif
432#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200433 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 ALLOC(sha256);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200435 break;
436#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200437#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200438 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100439 ALLOC(sha512);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200440 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200441#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200442#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200443 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100444 ALLOC(sha512);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200445 break;
446#endif
447 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100448 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200449 }
Paul Bakker17373852011-01-06 14:20:01 +0000450
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100451#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100452 if (hmac != 0) {
453 ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
454 if (ctx->hmac_ctx == NULL) {
455 mbedtls_md_free(ctx);
456 return MBEDTLS_ERR_MD_ALLOC_FAILED;
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +0100457 }
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100458 }
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100459#endif
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100460
Gilles Peskine449bd832023-01-11 14:50:10 +0100461 return 0;
Paul Bakker17373852011-01-06 14:20:01 +0000462}
Gilles Peskine84867cf2019-07-19 15:46:03 +0200463#undef ALLOC
Paul Bakker17373852011-01-06 14:20:01 +0000464
Gilles Peskine449bd832023-01-11 14:50:10 +0100465int mbedtls_md_starts(mbedtls_md_context_t *ctx)
Paul Bakker562535d2011-01-20 16:42:01 +0000466{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100467#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100468 if (ctx == NULL || ctx->md_info == NULL) {
469 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
470 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100471#endif
Paul Bakker562535d2011-01-20 16:42:01 +0000472
Gilles Peskine12612e52022-10-22 20:07:28 +0200473#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100474 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
475 psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
Gilles Peskine12612e52022-10-22 20:07:28 +0200476 psa_hash_abort(ctx->md_ctx);
477 psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
478 return mbedtls_md_error_from_psa(status);
479 }
480#endif
481
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200483#if defined(MBEDTLS_MD5_C)
484 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 return mbedtls_md5_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200486#endif
487#if defined(MBEDTLS_RIPEMD160_C)
488 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 return mbedtls_ripemd160_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200490#endif
491#if defined(MBEDTLS_SHA1_C)
492 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 return mbedtls_sha1_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200494#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200495#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200496 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100497 return mbedtls_sha256_starts(ctx->md_ctx, 1);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200498#endif
499#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200500 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 return mbedtls_sha256_starts(ctx->md_ctx, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200502#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200503#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200504 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 return mbedtls_sha512_starts(ctx->md_ctx, 1);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200506#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200507#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200508 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 return mbedtls_sha512_starts(ctx->md_ctx, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200510#endif
511 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100512 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200513 }
Paul Bakker562535d2011-01-20 16:42:01 +0000514}
515
Gilles Peskine449bd832023-01-11 14:50:10 +0100516int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Paul Bakker17373852011-01-06 14:20:01 +0000517{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100518#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100519 if (ctx == NULL || ctx->md_info == NULL) {
520 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
521 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100522#endif
Paul Bakker17373852011-01-06 14:20:01 +0000523
Gilles Peskine12612e52022-10-22 20:07:28 +0200524#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100525 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200526 psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
527 return mbedtls_md_error_from_psa(status);
528 }
529#endif
530
Gilles Peskine449bd832023-01-11 14:50:10 +0100531 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200532#if defined(MBEDTLS_MD5_C)
533 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100534 return mbedtls_md5_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200535#endif
536#if defined(MBEDTLS_RIPEMD160_C)
537 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200539#endif
540#if defined(MBEDTLS_SHA1_C)
541 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100542 return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200543#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200544#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200545 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100546 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200547#endif
548#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200549 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200551#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200552#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200553 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100554 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200555#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200556#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200557 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100558 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200559#endif
560 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100561 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200562 }
Paul Bakker17373852011-01-06 14:20:01 +0000563}
564
Gilles Peskine449bd832023-01-11 14:50:10 +0100565int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000566{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100567#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100568 if (ctx == NULL || ctx->md_info == NULL) {
569 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
570 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100571#endif
Paul Bakker17373852011-01-06 14:20:01 +0000572
Gilles Peskine12612e52022-10-22 20:07:28 +0200573#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100574 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200575 size_t size = ctx->md_info->size;
576 psa_status_t status = psa_hash_finish(ctx->md_ctx,
577 output, size, &size);
578 return mbedtls_md_error_from_psa(status);
579 }
580#endif
581
Gilles Peskine449bd832023-01-11 14:50:10 +0100582 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200583#if defined(MBEDTLS_MD5_C)
584 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 return mbedtls_md5_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200586#endif
587#if defined(MBEDTLS_RIPEMD160_C)
588 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 return mbedtls_ripemd160_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200590#endif
591#if defined(MBEDTLS_SHA1_C)
592 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100593 return mbedtls_sha1_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200594#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200595#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200596 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 return mbedtls_sha256_finish(ctx->md_ctx, output);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200598#endif
599#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200600 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 return mbedtls_sha256_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200602#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200603#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200604 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 return mbedtls_sha512_finish(ctx->md_ctx, output);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200606#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200607#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200608 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 return mbedtls_sha512_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200610#endif
611 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100612 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200613 }
Paul Bakker17373852011-01-06 14:20:01 +0000614}
615
Gilles Peskine449bd832023-01-11 14:50:10 +0100616int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
617 unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000618{
Gilles Peskine449bd832023-01-11 14:50:10 +0100619 if (md_info == NULL) {
620 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
621 }
Paul Bakker17373852011-01-06 14:20:01 +0000622
Gilles Peskine12612e52022-10-22 20:07:28 +0200623#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100624 if (md_can_use_psa(md_info)) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200625 size_t size = md_info->size;
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100626 psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
Gilles Peskine12612e52022-10-22 20:07:28 +0200627 input, ilen,
628 output, size, &size);
629 return mbedtls_md_error_from_psa(status);
630 }
631#endif
632
Gilles Peskine449bd832023-01-11 14:50:10 +0100633 switch (md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200634#if defined(MBEDTLS_MD5_C)
635 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 return mbedtls_md5(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200637#endif
638#if defined(MBEDTLS_RIPEMD160_C)
639 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 return mbedtls_ripemd160(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200641#endif
642#if defined(MBEDTLS_SHA1_C)
643 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100644 return mbedtls_sha1(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200645#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200646#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200647 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 return mbedtls_sha256(input, ilen, output, 1);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200649#endif
650#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200651 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100652 return mbedtls_sha256(input, ilen, output, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200653#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200654#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200655 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100656 return mbedtls_sha512(input, ilen, output, 1);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200657#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200658#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200659 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100660 return mbedtls_sha512(input, ilen, output, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200661#endif
662 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200664 }
Paul Bakker17373852011-01-06 14:20:01 +0000665}
666
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100667unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
668{
669 if (md_info == NULL) {
670 return 0;
671 }
672
673 return md_info->size;
674}
675
676mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
677{
678 if (md_info == NULL) {
679 return MBEDTLS_MD_NONE;
680 }
681
682 return md_info->type;
683}
684
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +0200685#if defined(MBEDTLS_PSA_CRYPTO_C)
686psa_algorithm_t mbedtls_md_psa_alg_from_type(mbedtls_md_type_t md_type)
687{
688 switch (md_type) {
689#if defined(MBEDTLS_MD_CAN_MD5)
690 case MBEDTLS_MD_MD5:
691 return PSA_ALG_MD5;
692#endif
693#if defined(MBEDTLS_MD_CAN_RIPEMD160)
694 case MBEDTLS_MD_RIPEMD160:
695 return PSA_ALG_RIPEMD160;
696#endif
697#if defined(MBEDTLS_MD_CAN_SHA1)
698 case MBEDTLS_MD_SHA1:
699 return PSA_ALG_SHA_1;
700#endif
701#if defined(MBEDTLS_MD_CAN_SHA224)
702 case MBEDTLS_MD_SHA224:
703 return PSA_ALG_SHA_224;
704#endif
705#if defined(MBEDTLS_MD_CAN_SHA256)
706 case MBEDTLS_MD_SHA256:
707 return PSA_ALG_SHA_256;
708#endif
709#if defined(MBEDTLS_MD_CAN_SHA384)
710 case MBEDTLS_MD_SHA384:
711 return PSA_ALG_SHA_384;
712#endif
713#if defined(MBEDTLS_MD_CAN_SHA512)
714 case MBEDTLS_MD_SHA512:
715 return PSA_ALG_SHA_512;
716#endif
717 default:
718 return PSA_ALG_NONE;
719 }
720}
721
722mbedtls_md_type_t mbedtls_md_type_from_psa_alg(psa_algorithm_t psa_alg)
723{
724 switch (psa_alg) {
725#if defined(MBEDTLS_MD_CAN_MD5)
726 case PSA_ALG_MD5:
727 return MBEDTLS_MD_MD5;
728#endif
729#if defined(MBEDTLS_MD_CAN_RIPEMD160)
730 case PSA_ALG_RIPEMD160:
731 return MBEDTLS_MD_RIPEMD160;
732#endif
733#if defined(MBEDTLS_MD_CAN_SHA1)
734 case PSA_ALG_SHA_1:
735 return MBEDTLS_MD_SHA1;
736#endif
737#if defined(MBEDTLS_MD_CAN_SHA224)
738 case PSA_ALG_SHA_224:
739 return MBEDTLS_MD_SHA224;
740#endif
741#if defined(MBEDTLS_MD_CAN_SHA256)
742 case PSA_ALG_SHA_256:
743 return MBEDTLS_MD_SHA256;
744#endif
745#if defined(MBEDTLS_MD_CAN_SHA384)
746 case PSA_ALG_SHA_384:
747 return MBEDTLS_MD_SHA384;
748#endif
749#if defined(MBEDTLS_MD_CAN_SHA512)
750 case PSA_ALG_SHA_512:
751 return MBEDTLS_MD_SHA512;
752#endif
753 default:
754 return MBEDTLS_MD_NONE;
755 }
756}
757
758int mbedtls_md_error_from_psa(psa_status_t status)
759{
760 switch (status) {
761 case PSA_SUCCESS:
762 return 0;
763 case PSA_ERROR_NOT_SUPPORTED:
764 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
765 case PSA_ERROR_INVALID_ARGUMENT:
766 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
767 case PSA_ERROR_INSUFFICIENT_MEMORY:
768 return MBEDTLS_ERR_MD_ALLOC_FAILED;
769 default:
770 return MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED;
771 }
772}
773#endif /* MBEDTLS_PSA_CRYPTO_C */
774
775
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100776/************************************************************************
777 * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
778 * functions below are only available when MBEDTLS_MD_C is set. *
779 ************************************************************************/
780#if defined(MBEDTLS_MD_C)
781
782/*
783 * Reminder: update profiles in x509_crt.c when adding a new hash!
784 */
785static const int supported_digests[] = {
786
Gilles Peskine83d9e092022-10-22 18:32:43 +0200787#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100788 MBEDTLS_MD_SHA512,
789#endif
790
Gilles Peskine83d9e092022-10-22 18:32:43 +0200791#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100792 MBEDTLS_MD_SHA384,
793#endif
794
Gilles Peskine83d9e092022-10-22 18:32:43 +0200795#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100796 MBEDTLS_MD_SHA256,
797#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200798#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100799 MBEDTLS_MD_SHA224,
800#endif
801
Gilles Peskine83d9e092022-10-22 18:32:43 +0200802#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100803 MBEDTLS_MD_SHA1,
804#endif
805
Gilles Peskine83d9e092022-10-22 18:32:43 +0200806#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100807 MBEDTLS_MD_RIPEMD160,
808#endif
809
Gilles Peskine83d9e092022-10-22 18:32:43 +0200810#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100811 MBEDTLS_MD_MD5,
812#endif
813
814 MBEDTLS_MD_NONE
815};
816
817const int *mbedtls_md_list(void)
818{
819 return supported_digests;
820}
821
822const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
823{
824 if (NULL == md_name) {
825 return NULL;
826 }
827
828 /* Get the appropriate digest information */
Gilles Peskine83d9e092022-10-22 18:32:43 +0200829#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100830 if (!strcmp("MD5", md_name)) {
831 return mbedtls_md_info_from_type(MBEDTLS_MD_MD5);
832 }
833#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200834#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100835 if (!strcmp("RIPEMD160", md_name)) {
836 return mbedtls_md_info_from_type(MBEDTLS_MD_RIPEMD160);
837 }
838#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200839#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100840 if (!strcmp("SHA1", md_name) || !strcmp("SHA", md_name)) {
841 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
842 }
843#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200844#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100845 if (!strcmp("SHA224", md_name)) {
846 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA224);
847 }
848#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200849#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100850 if (!strcmp("SHA256", md_name)) {
851 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
852 }
853#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200854#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100855 if (!strcmp("SHA384", md_name)) {
856 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA384);
857 }
858#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200859#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100860 if (!strcmp("SHA512", md_name)) {
861 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA512);
862 }
863#endif
864 return NULL;
865}
866
867const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
868 const mbedtls_md_context_t *ctx)
869{
870 if (ctx == NULL) {
871 return NULL;
872 }
873
874 return ctx->MBEDTLS_PRIVATE(md_info);
875}
876
877#if defined(MBEDTLS_FS_IO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100878int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000879{
Janos Follath24eed8d2019-11-22 13:21:35 +0000880 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200881 FILE *f;
882 size_t n;
883 mbedtls_md_context_t ctx;
884 unsigned char buf[1024];
Paul Bakker9c021ad2011-06-09 15:55:11 +0000885
Gilles Peskine449bd832023-01-11 14:50:10 +0100886 if (md_info == NULL) {
887 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
888 }
Paul Bakker17373852011-01-06 14:20:01 +0000889
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 if ((f = fopen(path, "rb")) == NULL) {
891 return MBEDTLS_ERR_MD_FILE_IO_ERROR;
892 }
Manuel Pégourié-Gonnardbcc03082015-06-24 00:09:29 +0200893
Gilles Peskineda0913b2022-06-30 17:03:40 +0200894 /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100895 mbedtls_setbuf(f, NULL);
Gilles Peskineda0913b2022-06-30 17:03:40 +0200896
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200898
Gilles Peskine449bd832023-01-11 14:50:10 +0100899 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200900 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100901 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200902
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 if ((ret = mbedtls_md_starts(&ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100904 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100905 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200906
Gilles Peskine449bd832023-01-11 14:50:10 +0100907 while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
908 if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100909 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100910 }
911 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 if (ferror(f) != 0) {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200914 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Gilles Peskine449bd832023-01-11 14:50:10 +0100915 } else {
916 ret = mbedtls_md_finish(&ctx, output);
917 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200918
919cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 mbedtls_platform_zeroize(buf, sizeof(buf));
921 fclose(f);
922 mbedtls_md_free(&ctx);
Paul Bakker9c021ad2011-06-09 15:55:11 +0000923
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 return ret;
Paul Bakker17373852011-01-06 14:20:01 +0000925}
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100926#endif /* MBEDTLS_FS_IO */
Paul Bakker17373852011-01-06 14:20:01 +0000927
Gilles Peskine449bd832023-01-11 14:50:10 +0100928int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
Paul Bakker17373852011-01-06 14:20:01 +0000929{
Janos Follath24eed8d2019-11-22 13:21:35 +0000930 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100932 unsigned char *ipad, *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100933
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
935 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
936 }
Paul Bakker17373852011-01-06 14:20:01 +0000937
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 if (keylen > (size_t) ctx->md_info->block_size) {
939 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100940 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 }
942 if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100943 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 }
945 if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100946 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100947 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100948
949 keylen = ctx->md_info->size;
950 key = sum;
951 }
952
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100953 ipad = (unsigned char *) ctx->hmac_ctx;
954 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
955
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 memset(ipad, 0x36, ctx->md_info->block_size);
957 memset(opad, 0x5C, ctx->md_info->block_size);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100958
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 mbedtls_xor(ipad, ipad, key, keylen);
960 mbedtls_xor(opad, opad, key, keylen);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100961
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100963 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 }
965 if ((ret = mbedtls_md_update(ctx, ipad,
966 ctx->md_info->block_size)) != 0) {
Andres Amaya Garcia42e5e102017-07-20 16:27:03 +0100967 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 }
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100969
970cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +0100971 mbedtls_platform_zeroize(sum, sizeof(sum));
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100972
Gilles Peskine449bd832023-01-11 14:50:10 +0100973 return ret;
Paul Bakker17373852011-01-06 14:20:01 +0000974}
975
Gilles Peskine449bd832023-01-11 14:50:10 +0100976int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Paul Bakker17373852011-01-06 14:20:01 +0000977{
Gilles Peskine449bd832023-01-11 14:50:10 +0100978 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
979 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
980 }
Paul Bakker17373852011-01-06 14:20:01 +0000981
Gilles Peskine449bd832023-01-11 14:50:10 +0100982 return mbedtls_md_update(ctx, input, ilen);
Paul Bakker17373852011-01-06 14:20:01 +0000983}
984
Gilles Peskine449bd832023-01-11 14:50:10 +0100985int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000986{
Janos Follath24eed8d2019-11-22 13:21:35 +0000987 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100989 unsigned char *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100990
Gilles Peskine449bd832023-01-11 14:50:10 +0100991 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
992 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
993 }
Paul Bakker17373852011-01-06 14:20:01 +0000994
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100995 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
996
Gilles Peskine449bd832023-01-11 14:50:10 +0100997 if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
998 return ret;
999 }
1000 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1001 return ret;
1002 }
1003 if ((ret = mbedtls_md_update(ctx, opad,
1004 ctx->md_info->block_size)) != 0) {
1005 return ret;
1006 }
1007 if ((ret = mbedtls_md_update(ctx, tmp,
1008 ctx->md_info->size)) != 0) {
1009 return ret;
1010 }
1011 return mbedtls_md_finish(ctx, output);
Paul Bakker17373852011-01-06 14:20:01 +00001012}
1013
Gilles Peskine449bd832023-01-11 14:50:10 +01001014int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
Paul Bakker17373852011-01-06 14:20:01 +00001015{
Janos Follath24eed8d2019-11-22 13:21:35 +00001016 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001017 unsigned char *ipad;
1018
Gilles Peskine449bd832023-01-11 14:50:10 +01001019 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1020 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1021 }
Paul Bakker17373852011-01-06 14:20:01 +00001022
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001023 ipad = (unsigned char *) ctx->hmac_ctx;
1024
Gilles Peskine449bd832023-01-11 14:50:10 +01001025 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1026 return ret;
1027 }
1028 return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
Paul Bakker17373852011-01-06 14:20:01 +00001029}
1030
Gilles Peskine449bd832023-01-11 14:50:10 +01001031int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1032 const unsigned char *key, size_t keylen,
1033 const unsigned char *input, size_t ilen,
1034 unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +00001035{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001036 mbedtls_md_context_t ctx;
Janos Follath24eed8d2019-11-22 13:21:35 +00001037 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001038
Gilles Peskine449bd832023-01-11 14:50:10 +01001039 if (md_info == NULL) {
1040 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1041 }
Paul Bakker17373852011-01-06 14:20:01 +00001042
Gilles Peskine449bd832023-01-11 14:50:10 +01001043 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001044
Gilles Peskine449bd832023-01-11 14:50:10 +01001045 if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001046 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001047 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001048
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001050 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001051 }
1052 if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001053 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001054 }
1055 if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +01001056 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001058
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001059cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01001060 mbedtls_md_free(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +00001061
Gilles Peskine449bd832023-01-11 14:50:10 +01001062 return ret;
Paul Bakker17373852011-01-06 14:20:01 +00001063}
1064
Gilles Peskine449bd832023-01-11 14:50:10 +01001065const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001066{
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 if (md_info == NULL) {
1068 return NULL;
1069 }
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001070
1071 return md_info->name;
1072}
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +01001073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +01001075
1076#endif /* MBEDTLS_MD_LIGHT */