blob: 0be1d7e4fc71e746f29be4f360b43c1f36fa0376 [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"
Manuel Pégourié-Gonnardddbf61a2023-03-28 12:14:01 +020058#include "mbedtls/psa_util.h"
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +020059#endif
60
61#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +010062#include "psa_crypto_core.h"
Gilles Peskine12612e52022-10-22 20:07:28 +020063#endif
64
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010065#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010066
Rich Evans00ab4702015-02-06 13:43:58 +000067#include <string.h>
Paul Bakker17373852011-01-06 14:20:01 +000068
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020069#if defined(MBEDTLS_FS_IO)
70#include <stdio.h>
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000071#endif
72
Manuel Pégourié-Gonnardcf61a742023-05-25 09:11:41 +020073/* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
74#if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
75#error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
76#endif
77
Gilles Peskine83d9e092022-10-22 18:32:43 +020078#if defined(MBEDTLS_MD_CAN_MD5)
Gilles Peskine84867cf2019-07-19 15:46:03 +020079const mbedtls_md_info_t mbedtls_md5_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +020080 "MD5",
Gilles Peskine2838b7b2019-07-19 16:03:39 +020081 MBEDTLS_MD_MD5,
Gilles Peskine84867cf2019-07-19 15:46:03 +020082 16,
83 64,
84};
85#endif
86
Gilles Peskine83d9e092022-10-22 18:32:43 +020087#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Gilles Peskine84867cf2019-07-19 15:46:03 +020088const mbedtls_md_info_t mbedtls_ripemd160_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +020089 "RIPEMD160",
Gilles Peskine2838b7b2019-07-19 16:03:39 +020090 MBEDTLS_MD_RIPEMD160,
Gilles Peskine84867cf2019-07-19 15:46:03 +020091 20,
92 64,
93};
94#endif
95
Gilles Peskine83d9e092022-10-22 18:32:43 +020096#if defined(MBEDTLS_MD_CAN_SHA1)
Gilles Peskine84867cf2019-07-19 15:46:03 +020097const mbedtls_md_info_t mbedtls_sha1_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +020098 "SHA1",
Gilles Peskine2838b7b2019-07-19 16:03:39 +020099 MBEDTLS_MD_SHA1,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200100 20,
101 64,
102};
103#endif
104
Gilles Peskine83d9e092022-10-22 18:32:43 +0200105#if defined(MBEDTLS_MD_CAN_SHA224)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200106const mbedtls_md_info_t mbedtls_sha224_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200107 "SHA224",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200108 MBEDTLS_MD_SHA224,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200109 28,
110 64,
111};
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200112#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200113
Gilles Peskine83d9e092022-10-22 18:32:43 +0200114#if defined(MBEDTLS_MD_CAN_SHA256)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200115const mbedtls_md_info_t mbedtls_sha256_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200116 "SHA256",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200117 MBEDTLS_MD_SHA256,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200118 32,
119 64,
120};
121#endif
122
Gilles Peskine83d9e092022-10-22 18:32:43 +0200123#if defined(MBEDTLS_MD_CAN_SHA384)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200124const mbedtls_md_info_t mbedtls_sha384_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200125 "SHA384",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200126 MBEDTLS_MD_SHA384,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200127 48,
128 128,
129};
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200130#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200131
Gilles Peskine83d9e092022-10-22 18:32:43 +0200132#if defined(MBEDTLS_MD_CAN_SHA512)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200133const mbedtls_md_info_t mbedtls_sha512_info = {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200134 "SHA512",
Gilles Peskine2838b7b2019-07-19 16:03:39 +0200135 MBEDTLS_MD_SHA512,
Gilles Peskine84867cf2019-07-19 15:46:03 +0200136 64,
137 128,
138};
139#endif
140
Gilles Peskine449bd832023-01-11 14:50:10 +0100141const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
Paul Bakker17373852011-01-06 14:20:01 +0000142{
Gilles Peskine449bd832023-01-11 14:50:10 +0100143 switch (md_type) {
Gilles Peskine83d9e092022-10-22 18:32:43 +0200144#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 return &mbedtls_md5_info;
Paul Bakker17373852011-01-06 14:20:01 +0000147#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200148#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 return &mbedtls_ripemd160_info;
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +0100151#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200152#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 return &mbedtls_sha1_info;
Paul Bakker17373852011-01-06 14:20:01 +0000155#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200156#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200157 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 return &mbedtls_sha224_info;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200159#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200160#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200161 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100162 return &mbedtls_sha256_info;
Paul Bakker17373852011-01-06 14:20:01 +0000163#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200164#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200165 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 return &mbedtls_sha384_info;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200167#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200168#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200169 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 return &mbedtls_sha512_info;
Paul Bakker17373852011-01-06 14:20:01 +0000171#endif
172 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100173 return NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000174 }
175}
176
Gilles Peskine12612e52022-10-22 20:07:28 +0200177#if defined(MBEDTLS_MD_SOME_PSA)
178static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
179{
180 switch (info->type) {
181#if defined(MBEDTLS_MD_MD5_VIA_PSA)
182 case MBEDTLS_MD_MD5:
183 return PSA_ALG_MD5;
184#endif
185#if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
186 case MBEDTLS_MD_RIPEMD160:
187 return PSA_ALG_RIPEMD160;
188#endif
189#if defined(MBEDTLS_MD_SHA1_VIA_PSA)
190 case MBEDTLS_MD_SHA1:
191 return PSA_ALG_SHA_1;
192#endif
193#if defined(MBEDTLS_MD_SHA224_VIA_PSA)
194 case MBEDTLS_MD_SHA224:
195 return PSA_ALG_SHA_224;
196#endif
197#if defined(MBEDTLS_MD_SHA256_VIA_PSA)
198 case MBEDTLS_MD_SHA256:
199 return PSA_ALG_SHA_256;
200#endif
201#if defined(MBEDTLS_MD_SHA384_VIA_PSA)
202 case MBEDTLS_MD_SHA384:
203 return PSA_ALG_SHA_384;
204#endif
205#if defined(MBEDTLS_MD_SHA512_VIA_PSA)
206 case MBEDTLS_MD_SHA512:
207 return PSA_ALG_SHA_512;
208#endif
209 default:
210 return PSA_ALG_NONE;
211 }
212}
213
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100214static int md_can_use_psa(const mbedtls_md_info_t *info)
Gilles Peskine12612e52022-10-22 20:07:28 +0200215{
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100216 psa_algorithm_t alg = psa_alg_of_md(info);
217 if (alg == PSA_ALG_NONE) {
218 return 0;
219 }
220
221 return psa_can_do_hash(alg);
Gilles Peskine12612e52022-10-22 20:07:28 +0200222}
Gilles Peskine12612e52022-10-22 20:07:28 +0200223#endif /* MBEDTLS_MD_SOME_PSA */
224
Gilles Peskine449bd832023-01-11 14:50:10 +0100225void mbedtls_md_init(mbedtls_md_context_t *ctx)
Paul Bakker84bbeb52014-07-01 14:53:22 +0200226{
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100227 /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 memset(ctx, 0, sizeof(mbedtls_md_context_t));
Paul Bakker84bbeb52014-07-01 14:53:22 +0200229}
230
Gilles Peskine449bd832023-01-11 14:50:10 +0100231void mbedtls_md_free(mbedtls_md_context_t *ctx)
Paul Bakker84bbeb52014-07-01 14:53:22 +0200232{
Gilles Peskine449bd832023-01-11 14:50:10 +0100233 if (ctx == NULL || ctx->md_info == NULL) {
Paul Bakker84bbeb52014-07-01 14:53:22 +0200234 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 }
Paul Bakker84bbeb52014-07-01 14:53:22 +0200236
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 if (ctx->md_ctx != NULL) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200238#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100239 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200240 psa_hash_abort(ctx->md_ctx);
241 } else
242#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200244#if defined(MBEDTLS_MD5_C)
245 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100246 mbedtls_md5_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200247 break;
248#endif
249#if defined(MBEDTLS_RIPEMD160_C)
250 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 mbedtls_ripemd160_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200252 break;
253#endif
254#if defined(MBEDTLS_SHA1_C)
255 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 mbedtls_sha1_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200257 break;
258#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200259#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200260 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 mbedtls_sha256_free(ctx->md_ctx);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200262 break;
263#endif
264#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200265 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 mbedtls_sha256_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200267 break;
268#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200269#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200270 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100271 mbedtls_sha512_free(ctx->md_ctx);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200272 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200273#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200274#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200275 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 mbedtls_sha512_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200277 break;
278#endif
279 default:
280 /* Shouldn't happen */
281 break;
282 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100283 mbedtls_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200284 }
Paul Bakker84bbeb52014-07-01 14:53:22 +0200285
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100286#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 if (ctx->hmac_ctx != NULL) {
288 mbedtls_platform_zeroize(ctx->hmac_ctx,
289 2 * ctx->md_info->block_size);
290 mbedtls_free(ctx->hmac_ctx);
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100291 }
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100292#endif
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100293
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
Paul Bakker84bbeb52014-07-01 14:53:22 +0200295}
296
Gilles Peskine449bd832023-01-11 14:50:10 +0100297int mbedtls_md_clone(mbedtls_md_context_t *dst,
298 const mbedtls_md_context_t *src)
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200299{
Gilles Peskine449bd832023-01-11 14:50:10 +0100300 if (dst == NULL || dst->md_info == NULL ||
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200301 src == NULL || src->md_info == NULL ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 dst->md_info != src->md_info) {
303 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200304 }
305
Gilles Peskine12612e52022-10-22 20:07:28 +0200306#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100307 if (src->engine != dst->engine) {
308 /* This can happen with src set to legacy because PSA wasn't ready
309 * yet, and dst to PSA because it became ready in the meantime.
310 * We currently don't support that case (we'd need to re-allocate
311 * md_ctx to the size of the appropriate MD context). */
312 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
313 }
314
315 if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200316 psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
317 return mbedtls_md_error_from_psa(status);
318 }
319#endif
320
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 switch (src->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200322#if defined(MBEDTLS_MD5_C)
323 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200325 break;
326#endif
327#if defined(MBEDTLS_RIPEMD160_C)
328 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200330 break;
331#endif
332#if defined(MBEDTLS_SHA1_C)
333 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200335 break;
336#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200337#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200338 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200340 break;
341#endif
342#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200343 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200345 break;
346#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200347#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200348 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100349 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200350 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200351#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200352#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200353 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100354 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200355 break;
356#endif
357 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100358 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200359 }
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200360
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 return 0;
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200362}
363
Gilles Peskine449bd832023-01-11 14:50:10 +0100364#define ALLOC(type) \
Gilles Peskine84867cf2019-07-19 15:46:03 +0200365 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
367 if (ctx->md_ctx == NULL) \
368 return MBEDTLS_ERR_MD_ALLOC_FAILED; \
369 mbedtls_##type##_init(ctx->md_ctx); \
Gilles Peskine84867cf2019-07-19 15:46:03 +0200370 } \
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 while (0)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200372
Gilles Peskine449bd832023-01-11 14:50:10 +0100373int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
Paul Bakker17373852011-01-06 14:20:01 +0000374{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100375#if defined(MBEDTLS_MD_C)
376 if (ctx == NULL) {
377 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
378 }
379#endif
380 if (md_info == NULL) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100381 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
382 }
Paul Bakker17373852011-01-06 14:20:01 +0000383
Gilles Peskined15c7402020-08-19 12:03:11 +0200384 ctx->md_info = md_info;
385 ctx->md_ctx = NULL;
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100386#if defined(MBEDTLS_MD_C)
Gilles Peskined15c7402020-08-19 12:03:11 +0200387 ctx->hmac_ctx = NULL;
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100388#else
389 if (hmac != 0) {
390 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
391 }
392#endif
Gilles Peskined15c7402020-08-19 12:03:11 +0200393
Gilles Peskine12612e52022-10-22 20:07:28 +0200394#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100395 if (md_can_use_psa(ctx->md_info)) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200396 ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
397 if (ctx->md_ctx == NULL) {
398 return MBEDTLS_ERR_MD_ALLOC_FAILED;
399 }
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100400 ctx->engine = MBEDTLS_MD_ENGINE_PSA;
Gilles Peskine12612e52022-10-22 20:07:28 +0200401 } else
402#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100403 switch (md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200404#if defined(MBEDTLS_MD5_C)
405 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100406 ALLOC(md5);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200407 break;
408#endif
409#if defined(MBEDTLS_RIPEMD160_C)
410 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 ALLOC(ripemd160);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200412 break;
413#endif
414#if defined(MBEDTLS_SHA1_C)
415 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 ALLOC(sha1);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200417 break;
418#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200419#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200420 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100421 ALLOC(sha256);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200422 break;
423#endif
424#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200425 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 ALLOC(sha256);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200427 break;
428#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200429#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200430 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100431 ALLOC(sha512);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200432 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200433#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200434#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200435 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100436 ALLOC(sha512);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200437 break;
438#endif
439 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100440 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200441 }
Paul Bakker17373852011-01-06 14:20:01 +0000442
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100443#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100444 if (hmac != 0) {
445 ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
446 if (ctx->hmac_ctx == NULL) {
447 mbedtls_md_free(ctx);
448 return MBEDTLS_ERR_MD_ALLOC_FAILED;
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +0100449 }
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100450 }
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100451#endif
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100452
Gilles Peskine449bd832023-01-11 14:50:10 +0100453 return 0;
Paul Bakker17373852011-01-06 14:20:01 +0000454}
Gilles Peskine84867cf2019-07-19 15:46:03 +0200455#undef ALLOC
Paul Bakker17373852011-01-06 14:20:01 +0000456
Gilles Peskine449bd832023-01-11 14:50:10 +0100457int mbedtls_md_starts(mbedtls_md_context_t *ctx)
Paul Bakker562535d2011-01-20 16:42:01 +0000458{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100459#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100460 if (ctx == NULL || ctx->md_info == NULL) {
461 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
462 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100463#endif
Paul Bakker562535d2011-01-20 16:42:01 +0000464
Gilles Peskine12612e52022-10-22 20:07:28 +0200465#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100466 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
467 psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
Gilles Peskine12612e52022-10-22 20:07:28 +0200468 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 }
472#endif
473
Gilles Peskine449bd832023-01-11 14:50:10 +0100474 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200475#if defined(MBEDTLS_MD5_C)
476 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 return mbedtls_md5_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200478#endif
479#if defined(MBEDTLS_RIPEMD160_C)
480 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100481 return mbedtls_ripemd160_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200482#endif
483#if defined(MBEDTLS_SHA1_C)
484 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 return mbedtls_sha1_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200486#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200487#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200488 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 return mbedtls_sha256_starts(ctx->md_ctx, 1);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200490#endif
491#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200492 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 return mbedtls_sha256_starts(ctx->md_ctx, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200494#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200495#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200496 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100497 return mbedtls_sha512_starts(ctx->md_ctx, 1);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200498#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200499#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200500 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 return mbedtls_sha512_starts(ctx->md_ctx, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200502#endif
503 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100504 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200505 }
Paul Bakker562535d2011-01-20 16:42:01 +0000506}
507
Gilles Peskine449bd832023-01-11 14:50:10 +0100508int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Paul Bakker17373852011-01-06 14:20:01 +0000509{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100510#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100511 if (ctx == NULL || ctx->md_info == NULL) {
512 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
513 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100514#endif
Paul Bakker17373852011-01-06 14:20:01 +0000515
Gilles Peskine12612e52022-10-22 20:07:28 +0200516#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100517 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200518 psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
519 return mbedtls_md_error_from_psa(status);
520 }
521#endif
522
Gilles Peskine449bd832023-01-11 14:50:10 +0100523 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200524#if defined(MBEDTLS_MD5_C)
525 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100526 return mbedtls_md5_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200527#endif
528#if defined(MBEDTLS_RIPEMD160_C)
529 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100530 return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200531#endif
532#if defined(MBEDTLS_SHA1_C)
533 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100534 return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200535#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200536#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200537 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200539#endif
540#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200541 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100542 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200543#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200544#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200545 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100546 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200547#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200548#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200549 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200551#endif
552 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100553 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200554 }
Paul Bakker17373852011-01-06 14:20:01 +0000555}
556
Gilles Peskine449bd832023-01-11 14:50:10 +0100557int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000558{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100559#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100560 if (ctx == NULL || ctx->md_info == NULL) {
561 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
562 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100563#endif
Paul Bakker17373852011-01-06 14:20:01 +0000564
Gilles Peskine12612e52022-10-22 20:07:28 +0200565#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100566 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200567 size_t size = ctx->md_info->size;
568 psa_status_t status = psa_hash_finish(ctx->md_ctx,
569 output, size, &size);
570 return mbedtls_md_error_from_psa(status);
571 }
572#endif
573
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200575#if defined(MBEDTLS_MD5_C)
576 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100577 return mbedtls_md5_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200578#endif
579#if defined(MBEDTLS_RIPEMD160_C)
580 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100581 return mbedtls_ripemd160_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200582#endif
583#if defined(MBEDTLS_SHA1_C)
584 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 return mbedtls_sha1_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200586#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200587#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200588 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 return mbedtls_sha256_finish(ctx->md_ctx, output);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200590#endif
591#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200592 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100593 return mbedtls_sha256_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200594#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200595#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200596 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 return mbedtls_sha512_finish(ctx->md_ctx, output);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200598#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200599#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200600 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 return mbedtls_sha512_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200602#endif
603 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200605 }
Paul Bakker17373852011-01-06 14:20:01 +0000606}
607
Gilles Peskine449bd832023-01-11 14:50:10 +0100608int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
609 unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000610{
Gilles Peskine449bd832023-01-11 14:50:10 +0100611 if (md_info == NULL) {
612 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
613 }
Paul Bakker17373852011-01-06 14:20:01 +0000614
Gilles Peskine12612e52022-10-22 20:07:28 +0200615#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100616 if (md_can_use_psa(md_info)) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200617 size_t size = md_info->size;
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100618 psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
Gilles Peskine12612e52022-10-22 20:07:28 +0200619 input, ilen,
620 output, size, &size);
621 return mbedtls_md_error_from_psa(status);
622 }
623#endif
624
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 switch (md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200626#if defined(MBEDTLS_MD5_C)
627 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100628 return mbedtls_md5(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200629#endif
630#if defined(MBEDTLS_RIPEMD160_C)
631 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100632 return mbedtls_ripemd160(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200633#endif
634#if defined(MBEDTLS_SHA1_C)
635 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100636 return mbedtls_sha1(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200637#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200638#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200639 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 return mbedtls_sha256(input, ilen, output, 1);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200641#endif
642#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200643 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100644 return mbedtls_sha256(input, ilen, output, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200645#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200646#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200647 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 return mbedtls_sha512(input, ilen, output, 1);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200649#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200650#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200651 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100652 return mbedtls_sha512(input, ilen, output, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200653#endif
654 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100655 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200656 }
Paul Bakker17373852011-01-06 14:20:01 +0000657}
658
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100659unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
660{
661 if (md_info == NULL) {
662 return 0;
663 }
664
665 return md_info->size;
666}
667
668mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
669{
670 if (md_info == NULL) {
671 return MBEDTLS_MD_NONE;
672 }
673
674 return md_info->type;
675}
676
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +0200677#if defined(MBEDTLS_PSA_CRYPTO_C)
678psa_algorithm_t mbedtls_md_psa_alg_from_type(mbedtls_md_type_t md_type)
679{
680 switch (md_type) {
681#if defined(MBEDTLS_MD_CAN_MD5)
682 case MBEDTLS_MD_MD5:
683 return PSA_ALG_MD5;
684#endif
685#if defined(MBEDTLS_MD_CAN_RIPEMD160)
686 case MBEDTLS_MD_RIPEMD160:
687 return PSA_ALG_RIPEMD160;
688#endif
689#if defined(MBEDTLS_MD_CAN_SHA1)
690 case MBEDTLS_MD_SHA1:
691 return PSA_ALG_SHA_1;
692#endif
693#if defined(MBEDTLS_MD_CAN_SHA224)
694 case MBEDTLS_MD_SHA224:
695 return PSA_ALG_SHA_224;
696#endif
697#if defined(MBEDTLS_MD_CAN_SHA256)
698 case MBEDTLS_MD_SHA256:
699 return PSA_ALG_SHA_256;
700#endif
701#if defined(MBEDTLS_MD_CAN_SHA384)
702 case MBEDTLS_MD_SHA384:
703 return PSA_ALG_SHA_384;
704#endif
705#if defined(MBEDTLS_MD_CAN_SHA512)
706 case MBEDTLS_MD_SHA512:
707 return PSA_ALG_SHA_512;
708#endif
709 default:
710 return PSA_ALG_NONE;
711 }
712}
713
714mbedtls_md_type_t mbedtls_md_type_from_psa_alg(psa_algorithm_t psa_alg)
715{
716 switch (psa_alg) {
717#if defined(MBEDTLS_MD_CAN_MD5)
718 case PSA_ALG_MD5:
719 return MBEDTLS_MD_MD5;
720#endif
721#if defined(MBEDTLS_MD_CAN_RIPEMD160)
722 case PSA_ALG_RIPEMD160:
723 return MBEDTLS_MD_RIPEMD160;
724#endif
725#if defined(MBEDTLS_MD_CAN_SHA1)
726 case PSA_ALG_SHA_1:
727 return MBEDTLS_MD_SHA1;
728#endif
729#if defined(MBEDTLS_MD_CAN_SHA224)
730 case PSA_ALG_SHA_224:
731 return MBEDTLS_MD_SHA224;
732#endif
733#if defined(MBEDTLS_MD_CAN_SHA256)
734 case PSA_ALG_SHA_256:
735 return MBEDTLS_MD_SHA256;
736#endif
737#if defined(MBEDTLS_MD_CAN_SHA384)
738 case PSA_ALG_SHA_384:
739 return MBEDTLS_MD_SHA384;
740#endif
741#if defined(MBEDTLS_MD_CAN_SHA512)
742 case PSA_ALG_SHA_512:
743 return MBEDTLS_MD_SHA512;
744#endif
745 default:
746 return MBEDTLS_MD_NONE;
747 }
748}
749
750int mbedtls_md_error_from_psa(psa_status_t status)
751{
Manuel Pégourié-Gonnardb3b54ab2023-03-29 12:36:34 +0200752 return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
753 psa_generic_status_to_mbedtls);
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +0200754}
755#endif /* MBEDTLS_PSA_CRYPTO_C */
756
757
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100758/************************************************************************
759 * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
760 * functions below are only available when MBEDTLS_MD_C is set. *
761 ************************************************************************/
762#if defined(MBEDTLS_MD_C)
763
764/*
765 * Reminder: update profiles in x509_crt.c when adding a new hash!
766 */
767static const int supported_digests[] = {
768
Gilles Peskine83d9e092022-10-22 18:32:43 +0200769#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100770 MBEDTLS_MD_SHA512,
771#endif
772
Gilles Peskine83d9e092022-10-22 18:32:43 +0200773#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100774 MBEDTLS_MD_SHA384,
775#endif
776
Gilles Peskine83d9e092022-10-22 18:32:43 +0200777#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100778 MBEDTLS_MD_SHA256,
779#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200780#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100781 MBEDTLS_MD_SHA224,
782#endif
783
Gilles Peskine83d9e092022-10-22 18:32:43 +0200784#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100785 MBEDTLS_MD_SHA1,
786#endif
787
Gilles Peskine83d9e092022-10-22 18:32:43 +0200788#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100789 MBEDTLS_MD_RIPEMD160,
790#endif
791
Gilles Peskine83d9e092022-10-22 18:32:43 +0200792#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100793 MBEDTLS_MD_MD5,
794#endif
795
796 MBEDTLS_MD_NONE
797};
798
799const int *mbedtls_md_list(void)
800{
801 return supported_digests;
802}
803
804const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
805{
806 if (NULL == md_name) {
807 return NULL;
808 }
809
810 /* Get the appropriate digest information */
Gilles Peskine83d9e092022-10-22 18:32:43 +0200811#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100812 if (!strcmp("MD5", md_name)) {
813 return mbedtls_md_info_from_type(MBEDTLS_MD_MD5);
814 }
815#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200816#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100817 if (!strcmp("RIPEMD160", md_name)) {
818 return mbedtls_md_info_from_type(MBEDTLS_MD_RIPEMD160);
819 }
820#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200821#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100822 if (!strcmp("SHA1", md_name) || !strcmp("SHA", md_name)) {
823 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
824 }
825#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200826#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100827 if (!strcmp("SHA224", md_name)) {
828 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA224);
829 }
830#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200831#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100832 if (!strcmp("SHA256", md_name)) {
833 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
834 }
835#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200836#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100837 if (!strcmp("SHA384", md_name)) {
838 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA384);
839 }
840#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200841#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100842 if (!strcmp("SHA512", md_name)) {
843 return mbedtls_md_info_from_type(MBEDTLS_MD_SHA512);
844 }
845#endif
846 return NULL;
847}
848
849const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
850 const mbedtls_md_context_t *ctx)
851{
852 if (ctx == NULL) {
853 return NULL;
854 }
855
856 return ctx->MBEDTLS_PRIVATE(md_info);
857}
858
859#if defined(MBEDTLS_FS_IO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100860int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000861{
Janos Follath24eed8d2019-11-22 13:21:35 +0000862 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200863 FILE *f;
864 size_t n;
865 mbedtls_md_context_t ctx;
866 unsigned char buf[1024];
Paul Bakker9c021ad2011-06-09 15:55:11 +0000867
Gilles Peskine449bd832023-01-11 14:50:10 +0100868 if (md_info == NULL) {
869 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
870 }
Paul Bakker17373852011-01-06 14:20:01 +0000871
Gilles Peskine449bd832023-01-11 14:50:10 +0100872 if ((f = fopen(path, "rb")) == NULL) {
873 return MBEDTLS_ERR_MD_FILE_IO_ERROR;
874 }
Manuel Pégourié-Gonnardbcc03082015-06-24 00:09:29 +0200875
Gilles Peskineda0913b2022-06-30 17:03:40 +0200876 /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 mbedtls_setbuf(f, NULL);
Gilles Peskineda0913b2022-06-30 17:03:40 +0200878
Gilles Peskine449bd832023-01-11 14:50:10 +0100879 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200880
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200882 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100883 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200884
Gilles Peskine449bd832023-01-11 14:50:10 +0100885 if ((ret = mbedtls_md_starts(&ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100886 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200888
Gilles Peskine449bd832023-01-11 14:50:10 +0100889 while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
890 if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100891 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100892 }
893 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200894
Gilles Peskine449bd832023-01-11 14:50:10 +0100895 if (ferror(f) != 0) {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200896 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 } else {
898 ret = mbedtls_md_finish(&ctx, output);
899 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200900
901cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +0100902 mbedtls_platform_zeroize(buf, sizeof(buf));
903 fclose(f);
904 mbedtls_md_free(&ctx);
Paul Bakker9c021ad2011-06-09 15:55:11 +0000905
Gilles Peskine449bd832023-01-11 14:50:10 +0100906 return ret;
Paul Bakker17373852011-01-06 14:20:01 +0000907}
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100908#endif /* MBEDTLS_FS_IO */
Paul Bakker17373852011-01-06 14:20:01 +0000909
Gilles Peskine449bd832023-01-11 14:50:10 +0100910int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
Paul Bakker17373852011-01-06 14:20:01 +0000911{
Janos Follath24eed8d2019-11-22 13:21:35 +0000912 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200913 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100914 unsigned char *ipad, *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100915
Gilles Peskine449bd832023-01-11 14:50:10 +0100916 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
917 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
918 }
Paul Bakker17373852011-01-06 14:20:01 +0000919
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 if (keylen > (size_t) ctx->md_info->block_size) {
921 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100922 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100923 }
924 if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100925 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100926 }
927 if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100928 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100929 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100930
931 keylen = ctx->md_info->size;
932 key = sum;
933 }
934
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100935 ipad = (unsigned char *) ctx->hmac_ctx;
936 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
937
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 memset(ipad, 0x36, ctx->md_info->block_size);
939 memset(opad, 0x5C, ctx->md_info->block_size);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100940
Gilles Peskine449bd832023-01-11 14:50:10 +0100941 mbedtls_xor(ipad, ipad, key, keylen);
942 mbedtls_xor(opad, opad, key, keylen);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100945 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 }
947 if ((ret = mbedtls_md_update(ctx, ipad,
948 ctx->md_info->block_size)) != 0) {
Andres Amaya Garcia42e5e102017-07-20 16:27:03 +0100949 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100950 }
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100951
952cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +0100953 mbedtls_platform_zeroize(sum, sizeof(sum));
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100954
Gilles Peskine449bd832023-01-11 14:50:10 +0100955 return ret;
Paul Bakker17373852011-01-06 14:20:01 +0000956}
957
Gilles Peskine449bd832023-01-11 14:50:10 +0100958int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Paul Bakker17373852011-01-06 14:20:01 +0000959{
Gilles Peskine449bd832023-01-11 14:50:10 +0100960 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
961 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
962 }
Paul Bakker17373852011-01-06 14:20:01 +0000963
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 return mbedtls_md_update(ctx, input, ilen);
Paul Bakker17373852011-01-06 14:20:01 +0000965}
966
Gilles Peskine449bd832023-01-11 14:50:10 +0100967int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000968{
Janos Follath24eed8d2019-11-22 13:21:35 +0000969 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200970 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100971 unsigned char *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100972
Gilles Peskine449bd832023-01-11 14:50:10 +0100973 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
974 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
975 }
Paul Bakker17373852011-01-06 14:20:01 +0000976
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100977 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
980 return ret;
981 }
982 if ((ret = mbedtls_md_starts(ctx)) != 0) {
983 return ret;
984 }
985 if ((ret = mbedtls_md_update(ctx, opad,
986 ctx->md_info->block_size)) != 0) {
987 return ret;
988 }
989 if ((ret = mbedtls_md_update(ctx, tmp,
990 ctx->md_info->size)) != 0) {
991 return ret;
992 }
993 return mbedtls_md_finish(ctx, output);
Paul Bakker17373852011-01-06 14:20:01 +0000994}
995
Gilles Peskine449bd832023-01-11 14:50:10 +0100996int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
Paul Bakker17373852011-01-06 14:20:01 +0000997{
Janos Follath24eed8d2019-11-22 13:21:35 +0000998 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100999 unsigned char *ipad;
1000
Gilles Peskine449bd832023-01-11 14:50:10 +01001001 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1002 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1003 }
Paul Bakker17373852011-01-06 14:20:01 +00001004
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001005 ipad = (unsigned char *) ctx->hmac_ctx;
1006
Gilles Peskine449bd832023-01-11 14:50:10 +01001007 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1008 return ret;
1009 }
1010 return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
Paul Bakker17373852011-01-06 14:20:01 +00001011}
1012
Gilles Peskine449bd832023-01-11 14:50:10 +01001013int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1014 const unsigned char *key, size_t keylen,
1015 const unsigned char *input, size_t ilen,
1016 unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +00001017{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001018 mbedtls_md_context_t ctx;
Janos Follath24eed8d2019-11-22 13:21:35 +00001019 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001020
Gilles Peskine449bd832023-01-11 14:50:10 +01001021 if (md_info == NULL) {
1022 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1023 }
Paul Bakker17373852011-01-06 14:20:01 +00001024
Gilles Peskine449bd832023-01-11 14:50:10 +01001025 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001026
Gilles Peskine449bd832023-01-11 14:50:10 +01001027 if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001028 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001029 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001030
Gilles Peskine449bd832023-01-11 14:50:10 +01001031 if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001032 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001033 }
1034 if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001035 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001036 }
1037 if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +01001038 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001039 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001040
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001041cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01001042 mbedtls_md_free(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +00001043
Gilles Peskine449bd832023-01-11 14:50:10 +01001044 return ret;
Paul Bakker17373852011-01-06 14:20:01 +00001045}
1046
Gilles Peskine449bd832023-01-11 14:50:10 +01001047const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001048{
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 if (md_info == NULL) {
1050 return NULL;
1051 }
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001052
1053 return md_info->name;
1054}
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +01001055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +01001057
1058#endif /* MBEDTLS_MD_LIGHT */