blob: c95846aa04270c7bf29a8532479a1152a249a782 [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 *
Gilles Peskinee820c0a2023-08-03 17:45:20 +02004 * \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
Dave Rodgman16799db2023-11-02 19:47:20 +00009 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker17373852011-01-06 14:20:01 +000010 */
11
Gilles Peskinedb09ef62020-06-03 01:43:33 +020012#include "common.h"
Paul Bakker17373852011-01-06 14:20:01 +000013
Manuel Pégourié-Gonnard0d415212023-02-23 13:02:13 +010014/*
15 * Availability of functions in this module is controlled by two
16 * feature macros:
17 * - MBEDTLS_MD_C enables the whole module;
18 * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
19 * most hash metadata (everything except string names); is it
20 * automatically set whenever MBEDTLS_MD_C is defined.
21 *
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +010022 * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
23 *
Manuel Pégourié-Gonnard0d415212023-02-23 13:02:13 +010024 * In the future we may want to change the contract of some functions
25 * (behaviour with NULL arguments) depending on whether MD_C is defined or
26 * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
27 *
28 * For these reasons, we're keeping MD_LIGHT internal for now.
29 */
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +010030#if defined(MBEDTLS_MD_LIGHT)
Paul Bakker17373852011-01-06 14:20:01 +000031
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/md.h"
Chris Jonesdaacb592021-03-09 17:03:29 +000033#include "md_wrap.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050034#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000035#include "mbedtls/error.h"
Paul Bakker17373852011-01-06 14:20:01 +000036
Gilles Peskine84867cf2019-07-19 15:46:03 +020037#include "mbedtls/md5.h"
38#include "mbedtls/ripemd160.h"
39#include "mbedtls/sha1.h"
40#include "mbedtls/sha256.h"
41#include "mbedtls/sha512.h"
Pol Henarejos4712d4c2022-05-20 14:17:14 +020042#include "mbedtls/sha3.h"
Gilles Peskine84867cf2019-07-19 15:46:03 +020043
Valerio Settib82fbf52024-04-30 06:53:51 +020044#if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
Gilles Peskine12612e52022-10-22 20:07:28 +020045#include <psa/crypto.h>
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +020046#include "md_psa.h"
Manuel Pégourié-Gonnard2be8c632023-06-07 13:07:21 +020047#include "psa_util_internal.h"
Pol Henarejos4712d4c2022-05-20 14:17:14 +020048#endif
Paul Bakker17373852011-01-06 14:20:01 +000049
Gilles Peskine12612e52022-10-22 20:07:28 +020050#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +010051#include "psa_crypto_core.h"
Gilles Peskine12612e52022-10-22 20:07:28 +020052#endif
53
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010054#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010055
Rich Evans00ab4702015-02-06 13:43:58 +000056#include <string.h>
Paul Bakker17373852011-01-06 14:20:01 +000057
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020058#if defined(MBEDTLS_FS_IO)
59#include <stdio.h>
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000060#endif
61
Manuel Pégourié-Gonnardcf61a742023-05-25 09:11:41 +020062/* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
63#if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
64#error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
65#endif
66
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +020067#if defined(MBEDTLS_MD_C)
68#define MD_INFO(type, out_size, block_size) type, out_size, block_size,
69#else
70#define MD_INFO(type, out_size, block_size) type, out_size,
71#endif
72
Gilles Peskine83d9e092022-10-22 18:32:43 +020073#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +020074static const mbedtls_md_info_t mbedtls_md5_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +020075 MD_INFO(MBEDTLS_MD_MD5, 16, 64)
Gilles Peskine84867cf2019-07-19 15:46:03 +020076};
77#endif
78
Gilles Peskine83d9e092022-10-22 18:32:43 +020079#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +020080static const mbedtls_md_info_t mbedtls_ripemd160_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +020081 MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64)
Gilles Peskine84867cf2019-07-19 15:46:03 +020082};
83#endif
84
Gilles Peskine83d9e092022-10-22 18:32:43 +020085#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +020086static const mbedtls_md_info_t mbedtls_sha1_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +020087 MD_INFO(MBEDTLS_MD_SHA1, 20, 64)
Gilles Peskine84867cf2019-07-19 15:46:03 +020088};
89#endif
90
Gilles Peskine83d9e092022-10-22 18:32:43 +020091#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +020092static const mbedtls_md_info_t mbedtls_sha224_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +020093 MD_INFO(MBEDTLS_MD_SHA224, 28, 64)
Gilles Peskine84867cf2019-07-19 15:46:03 +020094};
Mateusz Starzyke3c48b42021-04-19 16:46:28 +020095#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +020096
Gilles Peskine83d9e092022-10-22 18:32:43 +020097#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +020098static const mbedtls_md_info_t mbedtls_sha256_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +020099 MD_INFO(MBEDTLS_MD_SHA256, 32, 64)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200100};
101#endif
102
Gilles Peskine83d9e092022-10-22 18:32:43 +0200103#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +0200104static const mbedtls_md_info_t mbedtls_sha384_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +0200105 MD_INFO(MBEDTLS_MD_SHA384, 48, 128)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200106};
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200107#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200108
Gilles Peskine83d9e092022-10-22 18:32:43 +0200109#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +0200110static const mbedtls_md_info_t mbedtls_sha512_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +0200111 MD_INFO(MBEDTLS_MD_SHA512, 64, 128)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200112};
113#endif
114
Dave Rodgmanff45d442023-06-08 10:11:34 +0100115#if defined(MBEDTLS_MD_CAN_SHA3_224)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +0200116static const mbedtls_md_info_t mbedtls_sha3_224_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +0200117 MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200118};
Dave Rodgmanff45d442023-06-08 10:11:34 +0100119#endif
120
121#if defined(MBEDTLS_MD_CAN_SHA3_256)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +0200122static const mbedtls_md_info_t mbedtls_sha3_256_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +0200123 MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200124};
Dave Rodgmanff45d442023-06-08 10:11:34 +0100125#endif
126
127#if defined(MBEDTLS_MD_CAN_SHA3_384)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +0200128static const mbedtls_md_info_t mbedtls_sha3_384_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +0200129 MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200130};
Dave Rodgmanff45d442023-06-08 10:11:34 +0100131#endif
132
133#if defined(MBEDTLS_MD_CAN_SHA3_512)
Manuel Pégourié-Gonnard9e97e6d2023-06-20 12:47:29 +0200134static const mbedtls_md_info_t mbedtls_sha3_512_info = {
Manuel Pégourié-Gonnarda36ef6b2023-06-21 12:02:07 +0200135 MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200136};
137#endif
138
Gilles Peskine449bd832023-01-11 14:50:10 +0100139const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
Paul Bakker17373852011-01-06 14:20:01 +0000140{
Gilles Peskine449bd832023-01-11 14:50:10 +0100141 switch (md_type) {
Gilles Peskine83d9e092022-10-22 18:32:43 +0200142#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 return &mbedtls_md5_info;
Paul Bakker17373852011-01-06 14:20:01 +0000145#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200146#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200147 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 return &mbedtls_ripemd160_info;
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +0100149#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200150#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 return &mbedtls_sha1_info;
Paul Bakker17373852011-01-06 14:20:01 +0000153#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200154#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200155 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100156 return &mbedtls_sha224_info;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200157#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200158#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200159 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 return &mbedtls_sha256_info;
Paul Bakker17373852011-01-06 14:20:01 +0000161#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200162#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200163 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 return &mbedtls_sha384_info;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200165#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200166#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200167 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100168 return &mbedtls_sha512_info;
Paul Bakker17373852011-01-06 14:20:01 +0000169#endif
Dave Rodgman6d4933e2023-06-08 16:03:54 +0100170#if defined(MBEDTLS_MD_CAN_SHA3_224)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200171 case MBEDTLS_MD_SHA3_224:
Pol Henarejosa6779282023-02-08 00:50:04 +0100172 return &mbedtls_sha3_224_info;
Dave Rodgman6d4933e2023-06-08 16:03:54 +0100173#endif
174#if defined(MBEDTLS_MD_CAN_SHA3_256)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200175 case MBEDTLS_MD_SHA3_256:
Pol Henarejosa6779282023-02-08 00:50:04 +0100176 return &mbedtls_sha3_256_info;
Dave Rodgman6d4933e2023-06-08 16:03:54 +0100177#endif
178#if defined(MBEDTLS_MD_CAN_SHA3_384)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200179 case MBEDTLS_MD_SHA3_384:
Pol Henarejosa6779282023-02-08 00:50:04 +0100180 return &mbedtls_sha3_384_info;
Dave Rodgman6d4933e2023-06-08 16:03:54 +0100181#endif
182#if defined(MBEDTLS_MD_CAN_SHA3_512)
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200183 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100184 return &mbedtls_sha3_512_info;
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200185#endif
Paul Bakker17373852011-01-06 14:20:01 +0000186 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100187 return NULL;
Paul Bakker17373852011-01-06 14:20:01 +0000188 }
189}
190
Gilles Peskine12612e52022-10-22 20:07:28 +0200191#if defined(MBEDTLS_MD_SOME_PSA)
192static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
Max Fillinger0bb38332021-12-28 16:32:00 +0100193{
Gilles Peskine12612e52022-10-22 20:07:28 +0200194 switch (info->type) {
195#if defined(MBEDTLS_MD_MD5_VIA_PSA)
196 case MBEDTLS_MD_MD5:
197 return PSA_ALG_MD5;
198#endif
199#if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
200 case MBEDTLS_MD_RIPEMD160:
201 return PSA_ALG_RIPEMD160;
202#endif
203#if defined(MBEDTLS_MD_SHA1_VIA_PSA)
204 case MBEDTLS_MD_SHA1:
205 return PSA_ALG_SHA_1;
206#endif
207#if defined(MBEDTLS_MD_SHA224_VIA_PSA)
208 case MBEDTLS_MD_SHA224:
209 return PSA_ALG_SHA_224;
210#endif
211#if defined(MBEDTLS_MD_SHA256_VIA_PSA)
212 case MBEDTLS_MD_SHA256:
213 return PSA_ALG_SHA_256;
214#endif
215#if defined(MBEDTLS_MD_SHA384_VIA_PSA)
216 case MBEDTLS_MD_SHA384:
217 return PSA_ALG_SHA_384;
218#endif
219#if defined(MBEDTLS_MD_SHA512_VIA_PSA)
220 case MBEDTLS_MD_SHA512:
221 return PSA_ALG_SHA_512;
222#endif
Dave Rodgman852b6c32023-07-05 19:47:08 +0100223#if defined(MBEDTLS_MD_SHA3_224_VIA_PSA)
224 case MBEDTLS_MD_SHA3_224:
225 return PSA_ALG_SHA3_224;
226#endif
227#if defined(MBEDTLS_MD_SHA3_256_VIA_PSA)
228 case MBEDTLS_MD_SHA3_256:
229 return PSA_ALG_SHA3_256;
230#endif
231#if defined(MBEDTLS_MD_SHA3_384_VIA_PSA)
232 case MBEDTLS_MD_SHA3_384:
233 return PSA_ALG_SHA3_384;
234#endif
235#if defined(MBEDTLS_MD_SHA3_512_VIA_PSA)
236 case MBEDTLS_MD_SHA3_512:
237 return PSA_ALG_SHA3_512;
238#endif
Gilles Peskine12612e52022-10-22 20:07:28 +0200239 default:
240 return PSA_ALG_NONE;
241 }
242}
243
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100244static int md_can_use_psa(const mbedtls_md_info_t *info)
Gilles Peskine12612e52022-10-22 20:07:28 +0200245{
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100246 psa_algorithm_t alg = psa_alg_of_md(info);
247 if (alg == PSA_ALG_NONE) {
248 return 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 }
Max Fillinger0bb38332021-12-28 16:32:00 +0100250
Manuel Pégourié-Gonnard9b146392023-03-09 15:56:14 +0100251 return psa_can_do_hash(alg);
Max Fillinger0bb38332021-12-28 16:32:00 +0100252}
Gilles Peskine12612e52022-10-22 20:07:28 +0200253#endif /* MBEDTLS_MD_SOME_PSA */
254
Gilles Peskine449bd832023-01-11 14:50:10 +0100255void mbedtls_md_init(mbedtls_md_context_t *ctx)
Paul Bakker84bbeb52014-07-01 14:53:22 +0200256{
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100257 /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
Gilles Peskine449bd832023-01-11 14:50:10 +0100258 memset(ctx, 0, sizeof(mbedtls_md_context_t));
Paul Bakker84bbeb52014-07-01 14:53:22 +0200259}
260
Gilles Peskine449bd832023-01-11 14:50:10 +0100261void mbedtls_md_free(mbedtls_md_context_t *ctx)
Paul Bakker84bbeb52014-07-01 14:53:22 +0200262{
Gilles Peskine449bd832023-01-11 14:50:10 +0100263 if (ctx == NULL || ctx->md_info == NULL) {
Paul Bakker84bbeb52014-07-01 14:53:22 +0200264 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 }
Paul Bakker84bbeb52014-07-01 14:53:22 +0200266
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 if (ctx->md_ctx != NULL) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200268#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100269 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200270 psa_hash_abort(ctx->md_ctx);
271 } else
272#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200274#if defined(MBEDTLS_MD5_C)
275 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100276 mbedtls_md5_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200277 break;
278#endif
279#if defined(MBEDTLS_RIPEMD160_C)
280 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 mbedtls_ripemd160_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200282 break;
283#endif
284#if defined(MBEDTLS_SHA1_C)
285 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100286 mbedtls_sha1_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200287 break;
288#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200289#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200290 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100291 mbedtls_sha256_free(ctx->md_ctx);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200292 break;
293#endif
294#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200295 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 mbedtls_sha256_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200297 break;
298#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200299#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200300 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 mbedtls_sha512_free(ctx->md_ctx);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200302 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200303#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200304#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200305 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 mbedtls_sha512_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200307 break;
308#endif
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200309#if defined(MBEDTLS_SHA3_C)
310 case MBEDTLS_MD_SHA3_224:
311 case MBEDTLS_MD_SHA3_256:
312 case MBEDTLS_MD_SHA3_384:
313 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100314 mbedtls_sha3_free(ctx->md_ctx);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200315 break;
316#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200317 default:
318 /* Shouldn't happen */
319 break;
320 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 mbedtls_free(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200322 }
Paul Bakker84bbeb52014-07-01 14:53:22 +0200323
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100324#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100325 if (ctx->hmac_ctx != NULL) {
Tom Cosgroveca8c61b2023-07-17 15:17:40 +0100326 mbedtls_zeroize_and_free(ctx->hmac_ctx,
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 2 * ctx->md_info->block_size);
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100328 }
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100329#endif
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100330
Gilles Peskine449bd832023-01-11 14:50:10 +0100331 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
Paul Bakker84bbeb52014-07-01 14:53:22 +0200332}
333
Gilles Peskine449bd832023-01-11 14:50:10 +0100334int mbedtls_md_clone(mbedtls_md_context_t *dst,
335 const mbedtls_md_context_t *src)
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200336{
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 if (dst == NULL || dst->md_info == NULL ||
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200338 src == NULL || src->md_info == NULL ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 dst->md_info != src->md_info) {
340 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200341 }
342
Gilles Peskine12612e52022-10-22 20:07:28 +0200343#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100344 if (src->engine != dst->engine) {
345 /* This can happen with src set to legacy because PSA wasn't ready
346 * yet, and dst to PSA because it became ready in the meantime.
347 * We currently don't support that case (we'd need to re-allocate
348 * md_ctx to the size of the appropriate MD context). */
349 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
350 }
351
352 if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200353 psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
354 return mbedtls_md_error_from_psa(status);
355 }
356#endif
357
Gilles Peskine449bd832023-01-11 14:50:10 +0100358 switch (src->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200359#if defined(MBEDTLS_MD5_C)
360 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200362 break;
363#endif
364#if defined(MBEDTLS_RIPEMD160_C)
365 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200367 break;
368#endif
369#if defined(MBEDTLS_SHA1_C)
370 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200372 break;
373#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200374#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200375 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100376 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200377 break;
378#endif
379#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200380 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100381 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200382 break;
383#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200384#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200385 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200387 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200388#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200389#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200390 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100391 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200392 break;
393#endif
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200394#if defined(MBEDTLS_SHA3_C)
395 case MBEDTLS_MD_SHA3_224:
396 case MBEDTLS_MD_SHA3_256:
397 case MBEDTLS_MD_SHA3_384:
398 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100399 mbedtls_sha3_clone(dst->md_ctx, src->md_ctx);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200400 break;
401#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200402 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100403 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200404 }
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200405
Gilles Peskine449bd832023-01-11 14:50:10 +0100406 return 0;
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200407}
408
Gilles Peskine449bd832023-01-11 14:50:10 +0100409#define ALLOC(type) \
Gilles Peskine84867cf2019-07-19 15:46:03 +0200410 do { \
Gilles Peskine449bd832023-01-11 14:50:10 +0100411 ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
412 if (ctx->md_ctx == NULL) \
413 return MBEDTLS_ERR_MD_ALLOC_FAILED; \
414 mbedtls_##type##_init(ctx->md_ctx); \
Gilles Peskine84867cf2019-07-19 15:46:03 +0200415 } \
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 while (0)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200417
Gilles Peskine449bd832023-01-11 14:50:10 +0100418int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
Paul Bakker17373852011-01-06 14:20:01 +0000419{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100420#if defined(MBEDTLS_MD_C)
421 if (ctx == NULL) {
422 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
423 }
424#endif
425 if (md_info == NULL) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
427 }
Paul Bakker17373852011-01-06 14:20:01 +0000428
Gilles Peskined15c7402020-08-19 12:03:11 +0200429 ctx->md_info = md_info;
430 ctx->md_ctx = NULL;
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100431#if defined(MBEDTLS_MD_C)
Gilles Peskined15c7402020-08-19 12:03:11 +0200432 ctx->hmac_ctx = NULL;
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100433#else
434 if (hmac != 0) {
435 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
436 }
437#endif
Gilles Peskined15c7402020-08-19 12:03:11 +0200438
Gilles Peskine12612e52022-10-22 20:07:28 +0200439#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100440 if (md_can_use_psa(ctx->md_info)) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200441 ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
442 if (ctx->md_ctx == NULL) {
443 return MBEDTLS_ERR_MD_ALLOC_FAILED;
444 }
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100445 ctx->engine = MBEDTLS_MD_ENGINE_PSA;
Gilles Peskine12612e52022-10-22 20:07:28 +0200446 } else
447#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100448 switch (md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200449#if defined(MBEDTLS_MD5_C)
450 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100451 ALLOC(md5);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200452 break;
453#endif
454#if defined(MBEDTLS_RIPEMD160_C)
455 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100456 ALLOC(ripemd160);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200457 break;
458#endif
459#if defined(MBEDTLS_SHA1_C)
460 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100461 ALLOC(sha1);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200462 break;
463#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200464#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200465 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100466 ALLOC(sha256);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200467 break;
468#endif
469#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200470 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100471 ALLOC(sha256);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200472 break;
473#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200474#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200475 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100476 ALLOC(sha512);
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200477 break;
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200478#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200479#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200480 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100481 ALLOC(sha512);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200482 break;
483#endif
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200484#if defined(MBEDTLS_SHA3_C)
485 case MBEDTLS_MD_SHA3_224:
486 case MBEDTLS_MD_SHA3_256:
487 case MBEDTLS_MD_SHA3_384:
488 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100489 ALLOC(sha3);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200490 break;
491#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200492 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200494 }
Paul Bakker17373852011-01-06 14:20:01 +0000495
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100496#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100497 if (hmac != 0) {
498 ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
499 if (ctx->hmac_ctx == NULL) {
500 mbedtls_md_free(ctx);
501 return MBEDTLS_ERR_MD_ALLOC_FAILED;
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +0100502 }
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100503 }
Manuel Pégourié-Gonnard39a376a2023-03-09 17:21:40 +0100504#endif
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100505
Gilles Peskine449bd832023-01-11 14:50:10 +0100506 return 0;
Paul Bakker17373852011-01-06 14:20:01 +0000507}
Gilles Peskine84867cf2019-07-19 15:46:03 +0200508#undef ALLOC
Paul Bakker17373852011-01-06 14:20:01 +0000509
Gilles Peskine449bd832023-01-11 14:50:10 +0100510int mbedtls_md_starts(mbedtls_md_context_t *ctx)
Paul Bakker562535d2011-01-20 16:42:01 +0000511{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100512#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100513 if (ctx == NULL || ctx->md_info == NULL) {
514 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
515 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100516#endif
Paul Bakker562535d2011-01-20 16:42:01 +0000517
Gilles Peskine12612e52022-10-22 20:07:28 +0200518#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100519 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
520 psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
Gilles Peskine12612e52022-10-22 20:07:28 +0200521 psa_hash_abort(ctx->md_ctx);
522 psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
523 return mbedtls_md_error_from_psa(status);
524 }
525#endif
526
Gilles Peskine449bd832023-01-11 14:50:10 +0100527 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200528#if defined(MBEDTLS_MD5_C)
529 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100530 return mbedtls_md5_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200531#endif
532#if defined(MBEDTLS_RIPEMD160_C)
533 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100534 return mbedtls_ripemd160_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200535#endif
536#if defined(MBEDTLS_SHA1_C)
537 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 return mbedtls_sha1_starts(ctx->md_ctx);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200539#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200540#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200541 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100542 return mbedtls_sha256_starts(ctx->md_ctx, 1);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200543#endif
544#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200545 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100546 return mbedtls_sha256_starts(ctx->md_ctx, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200547#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200548#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200549 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 return mbedtls_sha512_starts(ctx->md_ctx, 1);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200551#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200552#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200553 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100554 return mbedtls_sha512_starts(ctx->md_ctx, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200555#endif
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200556#if defined(MBEDTLS_SHA3_C)
557 case MBEDTLS_MD_SHA3_224:
Pol Henarejosa6779282023-02-08 00:50:04 +0100558 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200559 case MBEDTLS_MD_SHA3_256:
Pol Henarejosa6779282023-02-08 00:50:04 +0100560 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200561 case MBEDTLS_MD_SHA3_384:
Pol Henarejosa6779282023-02-08 00:50:04 +0100562 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200563 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100564 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200565#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200566 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200568 }
Paul Bakker562535d2011-01-20 16:42:01 +0000569}
570
Gilles Peskine449bd832023-01-11 14:50:10 +0100571int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Paul Bakker17373852011-01-06 14:20:01 +0000572{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100573#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100574 if (ctx == NULL || ctx->md_info == NULL) {
575 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
576 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100577#endif
Paul Bakker17373852011-01-06 14:20:01 +0000578
Gilles Peskine12612e52022-10-22 20:07:28 +0200579#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100580 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200581 psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
582 return mbedtls_md_error_from_psa(status);
583 }
584#endif
585
Gilles Peskine449bd832023-01-11 14:50:10 +0100586 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200587#if defined(MBEDTLS_MD5_C)
588 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 return mbedtls_md5_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200590#endif
591#if defined(MBEDTLS_RIPEMD160_C)
592 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100593 return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200594#endif
595#if defined(MBEDTLS_SHA1_C)
596 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200598#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200599#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200600 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100601 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200602#endif
603#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200604 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200606#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200607#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200608 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100609 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200610#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200611#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200612 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100613 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200614#endif
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200615#if defined(MBEDTLS_SHA3_C)
616 case MBEDTLS_MD_SHA3_224:
617 case MBEDTLS_MD_SHA3_256:
618 case MBEDTLS_MD_SHA3_384:
619 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100620 return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200621#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200622 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100623 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200624 }
Paul Bakker17373852011-01-06 14:20:01 +0000625}
626
Gilles Peskine449bd832023-01-11 14:50:10 +0100627int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000628{
Thomas Daubney73cfde82023-05-30 15:34:28 +0100629#if defined(MBEDTLS_MD_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100630 if (ctx == NULL || ctx->md_info == NULL) {
631 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
632 }
Thomas Daubney73cfde82023-05-30 15:34:28 +0100633#endif
Paul Bakker17373852011-01-06 14:20:01 +0000634
Gilles Peskine12612e52022-10-22 20:07:28 +0200635#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100636 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200637 size_t size = ctx->md_info->size;
638 psa_status_t status = psa_hash_finish(ctx->md_ctx,
639 output, size, &size);
640 return mbedtls_md_error_from_psa(status);
641 }
642#endif
643
Gilles Peskine449bd832023-01-11 14:50:10 +0100644 switch (ctx->md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200645#if defined(MBEDTLS_MD5_C)
646 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100647 return mbedtls_md5_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200648#endif
649#if defined(MBEDTLS_RIPEMD160_C)
650 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100651 return mbedtls_ripemd160_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200652#endif
653#if defined(MBEDTLS_SHA1_C)
654 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100655 return mbedtls_sha1_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200656#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200657#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200658 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100659 return mbedtls_sha256_finish(ctx->md_ctx, output);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200660#endif
661#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200662 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 return mbedtls_sha256_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200664#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200665#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200666 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100667 return mbedtls_sha512_finish(ctx->md_ctx, output);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200668#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200669#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200670 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100671 return mbedtls_sha512_finish(ctx->md_ctx, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200672#endif
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200673#if defined(MBEDTLS_SHA3_C)
674 case MBEDTLS_MD_SHA3_224:
675 case MBEDTLS_MD_SHA3_256:
676 case MBEDTLS_MD_SHA3_384:
677 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100678 return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200679#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200680 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100681 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200682 }
Paul Bakker17373852011-01-06 14:20:01 +0000683}
684
Gilles Peskine449bd832023-01-11 14:50:10 +0100685int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
686 unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000687{
Gilles Peskine449bd832023-01-11 14:50:10 +0100688 if (md_info == NULL) {
689 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
690 }
Paul Bakker17373852011-01-06 14:20:01 +0000691
Gilles Peskine12612e52022-10-22 20:07:28 +0200692#if defined(MBEDTLS_MD_SOME_PSA)
Manuel Pégourié-Gonnardf48b1f82023-03-14 10:50:52 +0100693 if (md_can_use_psa(md_info)) {
Gilles Peskine12612e52022-10-22 20:07:28 +0200694 size_t size = md_info->size;
Manuel Pégourié-Gonnardd8ea37f2023-03-09 10:46:22 +0100695 psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
Gilles Peskine12612e52022-10-22 20:07:28 +0200696 input, ilen,
697 output, size, &size);
698 return mbedtls_md_error_from_psa(status);
699 }
700#endif
701
Gilles Peskine449bd832023-01-11 14:50:10 +0100702 switch (md_info->type) {
Gilles Peskine84867cf2019-07-19 15:46:03 +0200703#if defined(MBEDTLS_MD5_C)
704 case MBEDTLS_MD_MD5:
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 return mbedtls_md5(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200706#endif
707#if defined(MBEDTLS_RIPEMD160_C)
708 case MBEDTLS_MD_RIPEMD160:
Gilles Peskine449bd832023-01-11 14:50:10 +0100709 return mbedtls_ripemd160(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200710#endif
711#if defined(MBEDTLS_SHA1_C)
712 case MBEDTLS_MD_SHA1:
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 return mbedtls_sha1(input, ilen, output);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200714#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200715#if defined(MBEDTLS_SHA224_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200716 case MBEDTLS_MD_SHA224:
Gilles Peskine449bd832023-01-11 14:50:10 +0100717 return mbedtls_sha256(input, ilen, output, 1);
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200718#endif
719#if defined(MBEDTLS_SHA256_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200720 case MBEDTLS_MD_SHA256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100721 return mbedtls_sha256(input, ilen, output, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200722#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200723#if defined(MBEDTLS_SHA384_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200724 case MBEDTLS_MD_SHA384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 return mbedtls_sha512(input, ilen, output, 1);
Manuel Pégourié-Gonnardd6020842019-07-17 16:28:21 +0200726#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +0200727#if defined(MBEDTLS_SHA512_C)
Gilles Peskine84867cf2019-07-19 15:46:03 +0200728 case MBEDTLS_MD_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100729 return mbedtls_sha512(input, ilen, output, 0);
Gilles Peskine84867cf2019-07-19 15:46:03 +0200730#endif
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200731#if defined(MBEDTLS_SHA3_C)
732 case MBEDTLS_MD_SHA3_224:
Pol Henarejosa6779282023-02-08 00:50:04 +0100733 return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200734 case MBEDTLS_MD_SHA3_256:
Pol Henarejosa6779282023-02-08 00:50:04 +0100735 return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200736 case MBEDTLS_MD_SHA3_384:
Pol Henarejosa6779282023-02-08 00:50:04 +0100737 return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200738 case MBEDTLS_MD_SHA3_512:
Pol Henarejosa6779282023-02-08 00:50:04 +0100739 return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
Pol Henarejos4712d4c2022-05-20 14:17:14 +0200740#endif
Gilles Peskine84867cf2019-07-19 15:46:03 +0200741 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100742 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Gilles Peskine84867cf2019-07-19 15:46:03 +0200743 }
Paul Bakker17373852011-01-06 14:20:01 +0000744}
745
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100746unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
747{
748 if (md_info == NULL) {
749 return 0;
750 }
751
752 return md_info->size;
753}
754
755mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
756{
757 if (md_info == NULL) {
758 return MBEDTLS_MD_NONE;
759 }
760
761 return md_info->type;
762}
763
Valerio Settib82fbf52024-04-30 06:53:51 +0200764#if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +0200765int mbedtls_md_error_from_psa(psa_status_t status)
766{
Manuel Pégourié-Gonnardb3b54ab2023-03-29 12:36:34 +0200767 return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
768 psa_generic_status_to_mbedtls);
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +0200769}
Valerio Settib82fbf52024-04-30 06:53:51 +0200770#endif /* MBEDTLS_PSA_CRYPTO_CLIENT */
Manuel Pégourié-Gonnard36fb12e2023-03-28 11:33:23 +0200771
772
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100773/************************************************************************
774 * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
775 * functions below are only available when MBEDTLS_MD_C is set. *
776 ************************************************************************/
777#if defined(MBEDTLS_MD_C)
778
779/*
780 * Reminder: update profiles in x509_crt.c when adding a new hash!
781 */
782static const int supported_digests[] = {
783
Gilles Peskine83d9e092022-10-22 18:32:43 +0200784#if defined(MBEDTLS_MD_CAN_SHA512)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100785 MBEDTLS_MD_SHA512,
786#endif
787
Gilles Peskine83d9e092022-10-22 18:32:43 +0200788#if defined(MBEDTLS_MD_CAN_SHA384)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100789 MBEDTLS_MD_SHA384,
790#endif
791
Gilles Peskine83d9e092022-10-22 18:32:43 +0200792#if defined(MBEDTLS_MD_CAN_SHA256)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100793 MBEDTLS_MD_SHA256,
794#endif
Gilles Peskine83d9e092022-10-22 18:32:43 +0200795#if defined(MBEDTLS_MD_CAN_SHA224)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100796 MBEDTLS_MD_SHA224,
797#endif
798
Gilles Peskine83d9e092022-10-22 18:32:43 +0200799#if defined(MBEDTLS_MD_CAN_SHA1)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100800 MBEDTLS_MD_SHA1,
801#endif
802
Gilles Peskine83d9e092022-10-22 18:32:43 +0200803#if defined(MBEDTLS_MD_CAN_RIPEMD160)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100804 MBEDTLS_MD_RIPEMD160,
805#endif
806
Gilles Peskine83d9e092022-10-22 18:32:43 +0200807#if defined(MBEDTLS_MD_CAN_MD5)
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100808 MBEDTLS_MD_MD5,
809#endif
810
Dave Rodgmanff45d442023-06-08 10:11:34 +0100811#if defined(MBEDTLS_MD_CAN_SHA3_224)
Pol Henarejosd06c6fc2023-05-05 16:01:18 +0200812 MBEDTLS_MD_SHA3_224,
Dave Rodgmanff45d442023-06-08 10:11:34 +0100813#endif
814
815#if defined(MBEDTLS_MD_CAN_SHA3_256)
Pol Henarejosd06c6fc2023-05-05 16:01:18 +0200816 MBEDTLS_MD_SHA3_256,
Dave Rodgmanff45d442023-06-08 10:11:34 +0100817#endif
818
819#if defined(MBEDTLS_MD_CAN_SHA3_384)
Pol Henarejosd06c6fc2023-05-05 16:01:18 +0200820 MBEDTLS_MD_SHA3_384,
Dave Rodgmanff45d442023-06-08 10:11:34 +0100821#endif
822
823#if defined(MBEDTLS_MD_CAN_SHA3_512)
Pol Henarejosd06c6fc2023-05-05 16:01:18 +0200824 MBEDTLS_MD_SHA3_512,
825#endif
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100826
827 MBEDTLS_MD_NONE
828};
829
830const int *mbedtls_md_list(void)
831{
832 return supported_digests;
833}
834
Manuel Pégourié-Gonnardee7a7582023-06-20 12:12:22 +0200835typedef struct {
836 const char *md_name;
837 mbedtls_md_type_t md_type;
838} md_name_entry;
839
840static const md_name_entry md_names[] = {
841#if defined(MBEDTLS_MD_CAN_MD5)
842 { "MD5", MBEDTLS_MD_MD5 },
843#endif
844#if defined(MBEDTLS_MD_CAN_RIPEMD160)
845 { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
846#endif
847#if defined(MBEDTLS_MD_CAN_SHA1)
848 { "SHA1", MBEDTLS_MD_SHA1 },
849 { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
850#endif
851#if defined(MBEDTLS_MD_CAN_SHA224)
852 { "SHA224", MBEDTLS_MD_SHA224 },
853#endif
854#if defined(MBEDTLS_MD_CAN_SHA256)
855 { "SHA256", MBEDTLS_MD_SHA256 },
856#endif
857#if defined(MBEDTLS_MD_CAN_SHA384)
858 { "SHA384", MBEDTLS_MD_SHA384 },
859#endif
860#if defined(MBEDTLS_MD_CAN_SHA512)
861 { "SHA512", MBEDTLS_MD_SHA512 },
862#endif
863#if defined(MBEDTLS_MD_CAN_SHA3_224)
864 { "SHA3-224", MBEDTLS_MD_SHA3_224 },
865#endif
866#if defined(MBEDTLS_MD_CAN_SHA3_256)
867 { "SHA3-256", MBEDTLS_MD_SHA3_256 },
868#endif
869#if defined(MBEDTLS_MD_CAN_SHA3_384)
870 { "SHA3-384", MBEDTLS_MD_SHA3_384 },
871#endif
872#if defined(MBEDTLS_MD_CAN_SHA3_512)
873 { "SHA3-512", MBEDTLS_MD_SHA3_512 },
874#endif
875 { NULL, MBEDTLS_MD_NONE },
876};
877
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100878const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
879{
880 if (NULL == md_name) {
881 return NULL;
882 }
883
Manuel Pégourié-Gonnardee7a7582023-06-20 12:12:22 +0200884 const md_name_entry *entry = md_names;
885 while (entry->md_name != NULL &&
886 strcmp(entry->md_name, md_name) != 0) {
887 ++entry;
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100888 }
Manuel Pégourié-Gonnardee7a7582023-06-20 12:12:22 +0200889
890 return mbedtls_md_info_from_type(entry->md_type);
891}
892
893const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
894{
895 if (md_info == NULL) {
896 return NULL;
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100897 }
Manuel Pégourié-Gonnardee7a7582023-06-20 12:12:22 +0200898
899 const md_name_entry *entry = md_names;
900 while (entry->md_type != MBEDTLS_MD_NONE &&
901 entry->md_type != md_info->type) {
902 ++entry;
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100903 }
Manuel Pégourié-Gonnardee7a7582023-06-20 12:12:22 +0200904
905 return entry->md_name;
Manuel Pégourié-Gonnard1e57abd2023-02-23 20:45:26 +0100906}
907
908const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
909 const mbedtls_md_context_t *ctx)
910{
911 if (ctx == NULL) {
912 return NULL;
913 }
914
915 return ctx->MBEDTLS_PRIVATE(md_info);
916}
917
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200918#if defined(MBEDTLS_FS_IO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100919int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +0000920{
Janos Follath24eed8d2019-11-22 13:21:35 +0000921 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200922 FILE *f;
923 size_t n;
924 mbedtls_md_context_t ctx;
925 unsigned char buf[1024];
Paul Bakker9c021ad2011-06-09 15:55:11 +0000926
Gilles Peskine449bd832023-01-11 14:50:10 +0100927 if (md_info == NULL) {
928 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
929 }
Paul Bakker17373852011-01-06 14:20:01 +0000930
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 if ((f = fopen(path, "rb")) == NULL) {
932 return MBEDTLS_ERR_MD_FILE_IO_ERROR;
933 }
Manuel Pégourié-Gonnardbcc03082015-06-24 00:09:29 +0200934
Gilles Peskineda0913b2022-06-30 17:03:40 +0200935 /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 mbedtls_setbuf(f, NULL);
Gilles Peskineda0913b2022-06-30 17:03:40 +0200937
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200939
Gilles Peskine449bd832023-01-11 14:50:10 +0100940 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200941 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200943
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 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200947
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
949 if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100950 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100951 }
952 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200953
Gilles Peskine449bd832023-01-11 14:50:10 +0100954 if (ferror(f) != 0) {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200955 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 } else {
957 ret = mbedtls_md_finish(&ctx, output);
958 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200959
960cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 mbedtls_platform_zeroize(buf, sizeof(buf));
962 fclose(f);
963 mbedtls_md_free(&ctx);
Paul Bakker9c021ad2011-06-09 15:55:11 +0000964
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 return ret;
Paul Bakker17373852011-01-06 14:20:01 +0000966}
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200967#endif /* MBEDTLS_FS_IO */
Paul Bakker17373852011-01-06 14:20:01 +0000968
Gilles Peskine449bd832023-01-11 14:50:10 +0100969int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
Paul Bakker17373852011-01-06 14:20:01 +0000970{
Janos Follath24eed8d2019-11-22 13:21:35 +0000971 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200972 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100973 unsigned char *ipad, *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100974
Gilles Peskine449bd832023-01-11 14:50:10 +0100975 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
976 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
977 }
Paul Bakker17373852011-01-06 14:20:01 +0000978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 if (keylen > (size_t) ctx->md_info->block_size) {
980 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100981 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100982 }
983 if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100984 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100985 }
986 if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100987 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +0100988 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100989
990 keylen = ctx->md_info->size;
991 key = sum;
992 }
993
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100994 ipad = (unsigned char *) ctx->hmac_ctx;
995 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
996
Gilles Peskine449bd832023-01-11 14:50:10 +0100997 memset(ipad, 0x36, ctx->md_info->block_size);
998 memset(opad, 0x5C, ctx->md_info->block_size);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100999
Gilles Peskine449bd832023-01-11 14:50:10 +01001000 mbedtls_xor(ipad, ipad, key, keylen);
1001 mbedtls_xor(opad, opad, key, keylen);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001002
Gilles Peskine449bd832023-01-11 14:50:10 +01001003 if ((ret = mbedtls_md_starts(ctx)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001004 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001005 }
1006 if ((ret = mbedtls_md_update(ctx, ipad,
1007 ctx->md_info->block_size)) != 0) {
Andres Amaya Garcia42e5e102017-07-20 16:27:03 +01001008 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001009 }
1010
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001011cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01001012 mbedtls_platform_zeroize(sum, sizeof(sum));
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001013
Gilles Peskine449bd832023-01-11 14:50:10 +01001014 return ret;
Paul Bakker17373852011-01-06 14:20:01 +00001015}
1016
Gilles Peskine449bd832023-01-11 14:50:10 +01001017int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
Paul Bakker17373852011-01-06 14:20:01 +00001018{
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
Gilles Peskine449bd832023-01-11 14:50:10 +01001023 return mbedtls_md_update(ctx, input, ilen);
Paul Bakker17373852011-01-06 14:20:01 +00001024}
1025
Gilles Peskine449bd832023-01-11 14:50:10 +01001026int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +00001027{
Janos Follath24eed8d2019-11-22 13:21:35 +00001028 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001030 unsigned char *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001031
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1033 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1034 }
Paul Bakker17373852011-01-06 14:20:01 +00001035
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001036 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
1037
Gilles Peskine449bd832023-01-11 14:50:10 +01001038 if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
1039 return ret;
1040 }
1041 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1042 return ret;
1043 }
1044 if ((ret = mbedtls_md_update(ctx, opad,
1045 ctx->md_info->block_size)) != 0) {
1046 return ret;
1047 }
1048 if ((ret = mbedtls_md_update(ctx, tmp,
1049 ctx->md_info->size)) != 0) {
1050 return ret;
1051 }
1052 return mbedtls_md_finish(ctx, output);
Paul Bakker17373852011-01-06 14:20:01 +00001053}
1054
Gilles Peskine449bd832023-01-11 14:50:10 +01001055int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
Paul Bakker17373852011-01-06 14:20:01 +00001056{
Janos Follath24eed8d2019-11-22 13:21:35 +00001057 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001058 unsigned char *ipad;
1059
Gilles Peskine449bd832023-01-11 14:50:10 +01001060 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1061 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1062 }
Paul Bakker17373852011-01-06 14:20:01 +00001063
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001064 ipad = (unsigned char *) ctx->hmac_ctx;
1065
Gilles Peskine449bd832023-01-11 14:50:10 +01001066 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1067 return ret;
1068 }
1069 return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
Paul Bakker17373852011-01-06 14:20:01 +00001070}
1071
Gilles Peskine449bd832023-01-11 14:50:10 +01001072int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1073 const unsigned char *key, size_t keylen,
1074 const unsigned char *input, size_t ilen,
1075 unsigned char *output)
Paul Bakker17373852011-01-06 14:20:01 +00001076{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001077 mbedtls_md_context_t ctx;
Janos Follath24eed8d2019-11-22 13:21:35 +00001078 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001079
Gilles Peskine449bd832023-01-11 14:50:10 +01001080 if (md_info == NULL) {
1081 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1082 }
Paul Bakker17373852011-01-06 14:20:01 +00001083
Gilles Peskine449bd832023-01-11 14:50:10 +01001084 mbedtls_md_init(&ctx);
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001085
Gilles Peskine449bd832023-01-11 14:50:10 +01001086 if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001087 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001088 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001089
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001091 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001092 }
1093 if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001094 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001095 }
1096 if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +01001097 goto cleanup;
Gilles Peskine449bd832023-01-11 14:50:10 +01001098 }
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001099
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001100cleanup:
Gilles Peskine449bd832023-01-11 14:50:10 +01001101 mbedtls_md_free(&ctx);
Paul Bakker17373852011-01-06 14:20:01 +00001102
Gilles Peskine449bd832023-01-11 14:50:10 +01001103 return ret;
Paul Bakker17373852011-01-06 14:20:01 +00001104}
1105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106#endif /* MBEDTLS_MD_C */
Manuel Pégourié-Gonnardb9b630d2023-02-16 19:07:31 +01001107
1108#endif /* MBEDTLS_MD_LIGHT */