blob: 4f03acc38be53e305f78ecdf8dc5cc658d172b73 [file] [log] [blame]
Paul Bakker17373852011-01-06 14:20:01 +00001/**
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002 * \file mbedtls_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 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02008 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000023 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker17373852011-01-06 14:20:01 +000024 */
25
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020026#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000027#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020028#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#endif
Paul Bakker17373852011-01-06 14:20:01 +000031
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032#if defined(MBEDTLS_MD_C)
Paul Bakker17373852011-01-06 14:20:01 +000033
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000034#include "mbedtls/md.h"
Arto Kinnunenc5bbdd42019-11-25 17:32:28 +020035#include "mbedtls/platform.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050036#include "mbedtls/platform_util.h"
Paul Bakker17373852011-01-06 14:20:01 +000037
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020038#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010039#include "mbedtls/platform.h"
40#else
Paul Bakker17373852011-01-06 14:20:01 +000041#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020042#define mbedtls_calloc calloc
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#define mbedtls_free free
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010044#endif
45
Rich Evans00ab4702015-02-06 13:43:58 +000046#include <string.h>
Paul Bakker17373852011-01-06 14:20:01 +000047
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020048#if defined(MBEDTLS_FS_IO)
49#include <stdio.h>
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000050#endif
51
Hanno Becker1292c352019-08-13 15:43:26 +010052#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +010053/*
54 *
55 * Definitions of MD information structures for various digests.
56 *
57 */
58
59/*
60 * MD-2
61 */
Hanno Beckerd03949e2019-07-26 14:38:44 +010062#if defined(MBEDTLS_MD2_C)
Hanno Beckerd73aabd2019-09-04 15:14:51 +010063static const mbedtls_md_info_t mbedtls_md2_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +010064 MBEDTLS_MD_MD2,
65 "MD2",
66 16,
67 16,
Hanno Beckerc4e42102019-09-04 12:43:22 +010068 mbedtls_md2_starts_wrap,
69 mbedtls_md2_update_wrap,
70 mbedtls_md2_finish_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +010071 mbedtls_md2_ret,
Hanno Beckerc4e42102019-09-04 12:43:22 +010072 mbedtls_md2_ctx_alloc,
73 mbedtls_md2_ctx_free,
74 mbedtls_md2_clone_wrap,
75 mbedtls_md2_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +010076};
Hanno Beckerd03949e2019-07-26 14:38:44 +010077#endif /* MBEDTLS_MD2_C */
78
79/*
80 * MD-4
81 */
82
83#if defined(MBEDTLS_MD4_C)
Hanno Beckerd73aabd2019-09-04 15:14:51 +010084static const mbedtls_md_info_t mbedtls_md4_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +010085 MBEDTLS_MD_MD4,
86 "MD4",
87 16,
88 64,
Hanno Beckerc4e42102019-09-04 12:43:22 +010089 mbedtls_md4_starts_wrap,
90 mbedtls_md4_update_wrap,
91 mbedtls_md4_finish_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +010092 mbedtls_md4_ret,
Hanno Beckerc4e42102019-09-04 12:43:22 +010093 mbedtls_md4_ctx_alloc,
94 mbedtls_md4_ctx_free,
95 mbedtls_md4_clone_wrap,
96 mbedtls_md4_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +010097};
Hanno Beckerd03949e2019-07-26 14:38:44 +010098#endif /* MBEDTLS_MD4_C */
99
100/*
101 * MD-5
102 */
103
104#if defined(MBEDTLS_MD5_C)
Hanno Beckerd73aabd2019-09-04 15:14:51 +0100105static const mbedtls_md_info_t mbedtls_md5_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +0100106 MBEDTLS_MD_MD5,
107 "MD5",
108 16,
109 64,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100110 mbedtls_md5_starts_wrap,
111 mbedtls_md5_update_wrap,
112 mbedtls_md5_finish_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100113 mbedtls_md5_ret,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100114 mbedtls_md5_ctx_alloc,
115 mbedtls_md5_ctx_free,
116 mbedtls_md5_clone_wrap,
117 mbedtls_md5_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100118};
Hanno Beckerd03949e2019-07-26 14:38:44 +0100119#endif /* MBEDTLS_MD5_C */
120
121/*
122 * RIPEMD-160
123 */
124
125#if defined(MBEDTLS_RIPEMD160_C)
Hanno Beckerd73aabd2019-09-04 15:14:51 +0100126static const mbedtls_md_info_t mbedtls_ripemd160_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +0100127 MBEDTLS_MD_RIPEMD160,
128 "RIPEMD160",
129 20,
130 64,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100131 mbedtls_ripemd160_starts_wrap,
132 mbedtls_ripemd160_update_wrap,
133 mbedtls_ripemd160_finish_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100134 mbedtls_ripemd160_ret,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100135 mbedtls_ripemd160_ctx_alloc,
136 mbedtls_ripemd160_ctx_free,
137 mbedtls_ripemd160_clone_wrap,
138 mbedtls_ripemd160_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100139};
Hanno Beckerd03949e2019-07-26 14:38:44 +0100140#endif /* MBEDTLS_RIPEMD160_C */
141
142/*
143 * SHA-1
144 */
145
146#if defined(MBEDTLS_SHA1_C)
Hanno Beckerd73aabd2019-09-04 15:14:51 +0100147static const mbedtls_md_info_t mbedtls_sha1_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +0100148 MBEDTLS_MD_SHA1,
149 "SHA1",
150 20,
151 64,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100152 mbedtls_sha1_starts_wrap,
153 mbedtls_sha1_update_wrap,
154 mbedtls_sha1_finish_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100155 mbedtls_sha1_ret,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100156 mbedtls_sha1_ctx_alloc,
157 mbedtls_sha1_ctx_free,
158 mbedtls_sha1_clone_wrap,
159 mbedtls_sha1_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100160};
Hanno Beckerd03949e2019-07-26 14:38:44 +0100161#endif /* MBEDTLS_SHA1_C */
162
163/*
164 * SHA-224 and SHA-256
165 */
166
167#if defined(MBEDTLS_SHA256_C)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100168#if !defined(MBEDTLS_SHA256_NO_SHA224)
Hanno Beckerd73aabd2019-09-04 15:14:51 +0100169static const mbedtls_md_info_t mbedtls_sha224_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +0100170 MBEDTLS_MD_SHA224,
171 "SHA224",
172 28,
173 64,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100174 mbedtls_sha224_starts_wrap,
175 mbedtls_sha224_update_wrap,
176 mbedtls_sha224_finish_wrap,
177 mbedtls_sha224_wrap,
178 mbedtls_sha224_ctx_alloc,
179 mbedtls_sha224_ctx_free,
180 mbedtls_sha224_clone_wrap,
181 mbedtls_sha224_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100182};
183#endif /* !MBEDTLS_SHA256_NO_SHA224 */
Hanno Beckerd73aabd2019-09-04 15:14:51 +0100184static const mbedtls_md_info_t mbedtls_sha256_info =
Hanno Beckerd03949e2019-07-26 14:38:44 +0100185 MBEDTLS_MD_INFO( MBEDTLS_MD_INFO_SHA256 );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100186#endif /* MBEDTLS_SHA256_C */
187
188/*
189 * SHA-384 and SHA-512
190 */
191
192#if defined(MBEDTLS_SHA512_C)
Hanno Beckerd73aabd2019-09-04 15:14:51 +0100193static const mbedtls_md_info_t mbedtls_sha384_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +0100194 MBEDTLS_MD_SHA384,
195 "SHA384",
196 48,
197 128,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100198 mbedtls_sha384_starts_wrap,
199 mbedtls_sha384_update_wrap,
200 mbedtls_sha384_finish_wrap,
201 mbedtls_sha384_wrap,
202 mbedtls_sha384_ctx_alloc,
203 mbedtls_sha384_ctx_free,
204 mbedtls_sha384_clone_wrap,
205 mbedtls_sha384_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100206};
Hanno Beckerd73aabd2019-09-04 15:14:51 +0100207static const mbedtls_md_info_t mbedtls_sha512_info = {
Hanno Beckerd03949e2019-07-26 14:38:44 +0100208 MBEDTLS_MD_SHA512,
209 "SHA512",
210 64,
211 128,
Hanno Beckerc4e42102019-09-04 12:43:22 +0100212 mbedtls_sha512_starts_wrap,
213 mbedtls_sha384_update_wrap,
214 mbedtls_sha384_finish_wrap,
215 mbedtls_sha512_wrap,
216 mbedtls_sha384_ctx_alloc,
217 mbedtls_sha384_ctx_free,
218 mbedtls_sha384_clone_wrap,
219 mbedtls_sha384_process_wrap,
Hanno Beckerd03949e2019-07-26 14:38:44 +0100220};
Hanno Beckerd03949e2019-07-26 14:38:44 +0100221#endif /* MBEDTLS_SHA512_C */
222
223/*
Manuel Pégourié-Gonnard88db5da2015-06-15 14:34:59 +0200224 * Reminder: update profiles in x509_crt.c when adding a new hash!
225 */
Paul Bakker72f62662011-01-16 21:27:44 +0000226static const int supported_digests[] = {
227
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228#if defined(MBEDTLS_SHA512_C)
229 MBEDTLS_MD_SHA512,
230 MBEDTLS_MD_SHA384,
Paul Bakker72f62662011-01-16 21:27:44 +0000231#endif
232
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200233#if defined(MBEDTLS_SHA256_C)
234 MBEDTLS_MD_SHA256,
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200235#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236 MBEDTLS_MD_SHA224,
Paul Bakker72f62662011-01-16 21:27:44 +0000237#endif
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200238#endif /* MBEDTLS_SHA256_C */
Paul Bakker72f62662011-01-16 21:27:44 +0000239
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200240#if defined(MBEDTLS_SHA1_C)
241 MBEDTLS_MD_SHA1,
Paul Bakker72f62662011-01-16 21:27:44 +0000242#endif
243
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200244#if defined(MBEDTLS_RIPEMD160_C)
245 MBEDTLS_MD_RIPEMD160,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200246#endif
247
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200248#if defined(MBEDTLS_MD5_C)
249 MBEDTLS_MD_MD5,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200250#endif
251
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200252#if defined(MBEDTLS_MD4_C)
253 MBEDTLS_MD_MD4,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200254#endif
255
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200256#if defined(MBEDTLS_MD2_C)
257 MBEDTLS_MD_MD2,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200258#endif
259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200260 MBEDTLS_MD_NONE
Paul Bakker72f62662011-01-16 21:27:44 +0000261};
262
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200263const int *mbedtls_md_list( void )
Paul Bakker72f62662011-01-16 21:27:44 +0000264{
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200265 return( supported_digests );
Paul Bakker72f62662011-01-16 21:27:44 +0000266}
267
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100268mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
Paul Bakker17373852011-01-06 14:20:01 +0000269{
270 if( NULL == md_name )
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200271 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +0000272
273 /* Get the appropriate digest information */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274#if defined(MBEDTLS_MD2_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200275 if( !strcmp( "MD2", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );
Paul Bakker17373852011-01-06 14:20:01 +0000277#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200278#if defined(MBEDTLS_MD4_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200279 if( !strcmp( "MD4", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );
Paul Bakker17373852011-01-06 14:20:01 +0000281#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282#if defined(MBEDTLS_MD5_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200283 if( !strcmp( "MD5", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );
Paul Bakker17373852011-01-06 14:20:01 +0000285#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286#if defined(MBEDTLS_RIPEMD160_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200287 if( !strcmp( "RIPEMD160", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +0100289#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200290#if defined(MBEDTLS_SHA1_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200291 if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
Paul Bakker17373852011-01-06 14:20:01 +0000293#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200295#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200296 if( !strcmp( "SHA224", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200298#endif
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200299 if( !strcmp( "SHA256", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200301#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200302#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200303 if( !strcmp( "SHA384", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200305 if( !strcmp( "SHA512", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );
Paul Bakker17373852011-01-06 14:20:01 +0000307#endif
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200308 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +0000309}
310
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100311mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
Paul Bakker17373852011-01-06 14:20:01 +0000312{
313 switch( md_type )
314 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315#if defined(MBEDTLS_MD2_C)
316 case MBEDTLS_MD_MD2:
317 return( &mbedtls_md2_info );
Paul Bakker17373852011-01-06 14:20:01 +0000318#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319#if defined(MBEDTLS_MD4_C)
320 case MBEDTLS_MD_MD4:
321 return( &mbedtls_md4_info );
Paul Bakker17373852011-01-06 14:20:01 +0000322#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323#if defined(MBEDTLS_MD5_C)
324 case MBEDTLS_MD_MD5:
325 return( &mbedtls_md5_info );
Paul Bakker17373852011-01-06 14:20:01 +0000326#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327#if defined(MBEDTLS_RIPEMD160_C)
328 case MBEDTLS_MD_RIPEMD160:
329 return( &mbedtls_ripemd160_info );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +0100330#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331#if defined(MBEDTLS_SHA1_C)
332 case MBEDTLS_MD_SHA1:
333 return( &mbedtls_sha1_info );
Paul Bakker17373852011-01-06 14:20:01 +0000334#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200335#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200336#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 case MBEDTLS_MD_SHA224:
338 return( &mbedtls_sha224_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200339#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200340 case MBEDTLS_MD_SHA256:
341 return( &mbedtls_sha256_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200342#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343#if defined(MBEDTLS_SHA512_C)
344 case MBEDTLS_MD_SHA384:
345 return( &mbedtls_sha384_info );
346 case MBEDTLS_MD_SHA512:
347 return( &mbedtls_sha512_info );
Paul Bakker17373852011-01-06 14:20:01 +0000348#endif
349 default:
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200350 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +0000351 }
352}
353
Hanno Becker1292c352019-08-13 15:43:26 +0100354#else /* MBEDTLS_MD_SINGLE_HASH */
355
356const int *mbedtls_md_list( void )
357{
358 static int single_hash[2] =
359 { MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH ),
360 MBEDTLS_MD_INVALID_HANDLE };
361
362 return( single_hash );
363}
364
365mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
366{
367 static const char * const hash_name =
368 MBEDTLS_MD_INFO_NAME( MBEDTLS_MD_SINGLE_HASH );
369
370 if( md_name != NULL && strcmp( hash_name, md_name ) == 0 )
371 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
372
373 return( MBEDTLS_MD_INVALID_HANDLE );
374}
375
376mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
377{
378 static const mbedtls_md_type_t hash_type =
379 MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH );
380
381 if( hash_type == md_type )
382 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
383
384 return( MBEDTLS_MD_INVALID_HANDLE );
385}
386
387#endif /* MBEDTLS_MD_SINGLE_HASH */
388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389void mbedtls_md_init( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +0200390{
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +0200391 memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
Hanno Becker52e36bc2019-09-05 13:02:52 +0100392
393#if defined(MBEDTLS_MD_SINGLE_HASH)
394 mbedtls_md_info_init( mbedtls_md_get_handle( ctx ),
395 ctx->md_ctx );
396#endif
Paul Bakker84bbeb52014-07-01 14:53:22 +0200397}
398
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200399void mbedtls_md_free( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +0200400{
Hanno Beckerd3827c72019-09-03 12:56:37 +0100401 if( ctx == NULL || mbedtls_md_get_handle( ctx ) == MBEDTLS_MD_INVALID_HANDLE )
Paul Bakker84bbeb52014-07-01 14:53:22 +0200402 return;
403
Hanno Becker52e36bc2019-09-05 13:02:52 +0100404#if !defined(MBEDTLS_MD_SINGLE_HASH)
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100405 if( ctx->md_ctx != NULL )
Hanno Beckerd3827c72019-09-03 12:56:37 +0100406 {
Hanno Becker3a98eab2019-09-04 11:15:02 +0100407 mbedtls_md_info_ctx_free( mbedtls_md_get_handle( ctx ), ctx->md_ctx );
Hanno Beckerd3827c72019-09-03 12:56:37 +0100408 }
Paul Bakker84bbeb52014-07-01 14:53:22 +0200409
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100410 if( ctx->hmac_ctx != NULL )
411 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500412 mbedtls_platform_zeroize( ctx->hmac_ctx,
Hanno Beckerd3827c72019-09-03 12:56:37 +0100413 2 * mbedtls_md_info_block_size( mbedtls_md_get_handle( ctx ) ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414 mbedtls_free( ctx->hmac_ctx );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100415 }
Hanno Becker52e36bc2019-09-05 13:02:52 +0100416#endif /* MBEDTLS_MD_SINGLE_HASH */
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100417
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500418 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
Paul Bakker84bbeb52014-07-01 14:53:22 +0200419}
420
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200421int mbedtls_md_clone( mbedtls_md_context_t *dst,
422 const mbedtls_md_context_t *src )
423{
Hanno Beckerd3827c72019-09-03 12:56:37 +0100424 if( dst == NULL || mbedtls_md_get_handle( dst ) == MBEDTLS_MD_INVALID_HANDLE ||
425 src == NULL || mbedtls_md_get_handle( src ) == MBEDTLS_MD_INVALID_HANDLE ||
426 mbedtls_md_get_handle( dst ) != mbedtls_md_get_handle( src ) )
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200427 {
428 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
429 }
430
Hanno Becker3a98eab2019-09-04 11:15:02 +0100431 mbedtls_md_info_clone( mbedtls_md_get_handle( dst ),
432 dst->md_ctx, src->md_ctx );
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +0200433 return( 0 );
434}
435
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200436#if ! defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100437int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +0100438{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 return mbedtls_md_setup( ctx, md_info, 1 );
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +0100440}
441#endif
442
Hanno Becker64b06232019-09-05 13:02:32 +0100443#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100444int mbedtls_md_setup( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info, int hmac )
Paul Bakker17373852011-01-06 14:20:01 +0000445{
Hanno Becker64b06232019-09-05 13:02:32 +0100446 return( mbedtls_md_setup_internal( ctx, md_info, hmac ) );
Paul Bakker17373852011-01-06 14:20:01 +0000447}
448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449int mbedtls_md_starts( mbedtls_md_context_t *ctx )
Paul Bakker562535d2011-01-20 16:42:01 +0000450{
Hanno Becker527f7c92019-09-04 12:46:07 +0100451 return( mbedtls_md_starts_internal( ctx ) );
Paul Bakker562535d2011-01-20 16:42:01 +0000452}
453
Hanno Beckerfdef5ac2019-09-04 13:20:05 +0100454int mbedtls_md_update( mbedtls_md_context_t *ctx,
455 const unsigned char *input,
456 size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +0000457{
Hanno Beckerfdef5ac2019-09-04 13:20:05 +0100458 return( mbedtls_md_update_internal( ctx, input, ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +0000459}
460
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +0000462{
Hanno Becker993691d2019-09-04 13:24:44 +0100463 return( mbedtls_md_finish_internal( ctx, output ) );
Paul Bakker17373852011-01-06 14:20:01 +0000464}
465
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100466int mbedtls_md( mbedtls_md_handle_t md_info, const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000467 unsigned char *output )
468{
Hanno Becker993691d2019-09-04 13:24:44 +0100469 return( mbedtls_md_internal( md_info, input, ilen, output ) );
Paul Bakker17373852011-01-06 14:20:01 +0000470}
Hanno Becker993691d2019-09-04 13:24:44 +0100471#endif /* !MBEDTLS_MD_SINGLE_HASH */
Paul Bakker17373852011-01-06 14:20:01 +0000472
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200473#if defined(MBEDTLS_FS_IO)
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100474int mbedtls_md_file( mbedtls_md_handle_t md_info, const char *path, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +0000475{
Paul Bakker9c021ad2011-06-09 15:55:11 +0000476 int ret;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200477 FILE *f;
478 size_t n;
479 mbedtls_md_context_t ctx;
480 unsigned char buf[1024];
Paul Bakker9c021ad2011-06-09 15:55:11 +0000481
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100482 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +0000484
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200485 if( ( f = fopen( path, "rb" ) ) == NULL )
Manuel Pégourié-Gonnardbcc03082015-06-24 00:09:29 +0200486 return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
487
488 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200489
490 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
491 goto cleanup;
492
Hanno Becker3a98eab2019-09-04 11:15:02 +0100493 ret = mbedtls_md_info_starts( md_info, ctx.md_ctx );
Hanno Becker530387e2019-07-17 14:10:26 +0100494 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100495 goto cleanup;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200496
497 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Hanno Becker530387e2019-07-17 14:10:26 +0100498 {
Hanno Becker3a98eab2019-09-04 11:15:02 +0100499 ret = mbedtls_md_info_update( md_info, ctx.md_ctx,
500 buf, n );
Hanno Becker530387e2019-07-17 14:10:26 +0100501 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100502 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +0100503 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200504
505 if( ferror( f ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +0100506 {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200507 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Hanno Becker530387e2019-07-17 14:10:26 +0100508 }
Andres Amaya Garciaeb132b62017-06-23 16:30:31 +0100509 else
Hanno Becker530387e2019-07-17 14:10:26 +0100510 {
Hanno Becker3a98eab2019-09-04 11:15:02 +0100511 ret = mbedtls_md_info_finish( md_info, ctx.md_ctx,
512 output );
Hanno Becker530387e2019-07-17 14:10:26 +0100513 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200514
515cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500516 mbedtls_platform_zeroize( buf, sizeof( buf ) );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200517 fclose( f );
518 mbedtls_md_free( &ctx );
Paul Bakker9c021ad2011-06-09 15:55:11 +0000519
Paul Bakker8913f822012-01-14 18:07:41 +0000520 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +0000521}
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +0200522#endif /* MBEDTLS_FS_IO */
Paul Bakker17373852011-01-06 14:20:01 +0000523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
Paul Bakker17373852011-01-06 14:20:01 +0000525{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100526 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200527 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100528 unsigned char *ipad, *opad;
Arto Kinnunen5299a422019-11-25 16:19:25 +0200529 size_t i = 0;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100530
Hanno Beckerd3827c72019-09-03 12:56:37 +0100531 mbedtls_md_handle_t md_info;
532
Hanno Becker3252c4d2019-09-05 15:03:56 +0100533 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200534 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +0000535
Hanno Becker3252c4d2019-09-05 15:03:56 +0100536#if !defined(MBEDTLS_MD_SINGLE_HASH)
537 if( ctx->hmac_ctx == NULL )
538 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
539#endif /* !MBEDTLS_MD_SINGLE_HASH */
540
Hanno Beckerd3827c72019-09-03 12:56:37 +0100541 md_info = mbedtls_md_get_handle( ctx );
542 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
543 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Becker530387e2019-07-17 14:10:26 +0100544
Hanno Beckerd3827c72019-09-03 12:56:37 +0100545 if( keylen > (size_t) mbedtls_md_info_block_size( md_info ) )
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100546 {
Hanno Becker3a98eab2019-09-04 11:15:02 +0100547 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100548 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100549
Hanno Becker3a98eab2019-09-04 11:15:02 +0100550 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx,
551 key, keylen ) ) != 0 )
552 {
Hanno Becker530387e2019-07-17 14:10:26 +0100553 goto cleanup;
Hanno Becker3a98eab2019-09-04 11:15:02 +0100554 }
Hanno Becker530387e2019-07-17 14:10:26 +0100555
Hanno Becker3a98eab2019-09-04 11:15:02 +0100556 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, sum ) ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +0100557 goto cleanup;
558
Hanno Beckerd3827c72019-09-03 12:56:37 +0100559 keylen = mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100560 key = sum;
561 }
562
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100563 ipad = (unsigned char *) ctx->hmac_ctx;
Hanno Beckerd3827c72019-09-03 12:56:37 +0100564 opad = (unsigned char *) ctx->hmac_ctx +
565 mbedtls_md_info_block_size( md_info );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100566
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200567 mbedtls_platform_memset( ipad, 0x36, mbedtls_md_info_block_size( md_info ) );
568 mbedtls_platform_memset( opad, 0x5C, mbedtls_md_info_block_size( md_info ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100569
570 for( i = 0; i < keylen; i++ )
571 {
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100572 ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
573 opad[i] = (unsigned char)( opad[i] ^ key[i] );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100574 }
575
Hanno Becker3a98eab2019-09-04 11:15:02 +0100576 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100577 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +0100578
Arto Kinnunen5b366932019-11-20 16:13:13 +0200579 i++; // Use i as flow control
580
Hanno Becker3a98eab2019-09-04 11:15:02 +0100581 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, ipad,
Hanno Beckerd3827c72019-09-03 12:56:37 +0100582 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
583 {
Andres Amaya Garcia42e5e102017-07-20 16:27:03 +0100584 goto cleanup;
Hanno Beckerd3827c72019-09-03 12:56:37 +0100585 }
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100586
Arto Kinnunen5b366932019-11-20 16:13:13 +0200587 i++; // Use i as flow control now
588
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100589cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500590 mbedtls_platform_zeroize( sum, sizeof( sum ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100591
Arto Kinnunen5299a422019-11-25 16:19:25 +0200592 if ( ret != 0 )
593 return ret;
Arto Kinnunen5b366932019-11-20 16:13:13 +0200594
Arto Kinnunen5299a422019-11-25 16:19:25 +0200595 /* Check possible fault injection */
596 if ( ( i - 2 ) == keylen )
597 return ret; // success, return 0 from ret
598
599 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker17373852011-01-06 14:20:01 +0000600}
601
Hanno Beckerd3827c72019-09-03 12:56:37 +0100602int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx,
603 const unsigned char *input, size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +0000604{
Hanno Beckerd3827c72019-09-03 12:56:37 +0100605 mbedtls_md_handle_t md_info;
Paul Bakker17373852011-01-06 14:20:01 +0000606
Hanno Becker3252c4d2019-09-05 15:03:56 +0100607 if( ctx == NULL )
Hanno Beckerd3827c72019-09-03 12:56:37 +0100608 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
609
Hanno Becker3252c4d2019-09-05 15:03:56 +0100610#if !defined(MBEDTLS_MD_SINGLE_HASH)
611 if( ctx->hmac_ctx == NULL )
612 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
613#endif /* !MBEDTLS_MD_SINGLE_HASH */
614
Hanno Beckerd3827c72019-09-03 12:56:37 +0100615 md_info = mbedtls_md_get_handle( ctx );
616 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
617 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
618
Hanno Becker3a98eab2019-09-04 11:15:02 +0100619 return( mbedtls_md_info_update( md_info,
620 ctx->md_ctx, input,
621 ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +0000622}
623
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200624int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +0000625{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100626 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100628 unsigned char *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100629
Hanno Beckerd3827c72019-09-03 12:56:37 +0100630 mbedtls_md_handle_t md_info;
631
Hanno Becker3252c4d2019-09-05 15:03:56 +0100632 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200633 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +0000634
Hanno Becker3252c4d2019-09-05 15:03:56 +0100635#if !defined(MBEDTLS_MD_SINGLE_HASH)
636 if( ctx->hmac_ctx == NULL )
637 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
638#endif /* !MBEDTLS_MD_SINGLE_HASH */
639
Hanno Beckerd3827c72019-09-03 12:56:37 +0100640 md_info = mbedtls_md_get_handle( ctx );
641 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
642 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100643
Hanno Beckerd3827c72019-09-03 12:56:37 +0100644 opad = (unsigned char *) ctx->hmac_ctx +
645 mbedtls_md_info_block_size( md_info );
Hanno Becker530387e2019-07-17 14:10:26 +0100646
Hanno Becker3a98eab2019-09-04 11:15:02 +0100647 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, tmp ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100648 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +0100649
Hanno Becker3a98eab2019-09-04 11:15:02 +0100650 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100651 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +0100652
Hanno Becker3a98eab2019-09-04 11:15:02 +0100653 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, opad,
654 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
Hanno Beckerd3827c72019-09-03 12:56:37 +0100655 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100656 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +0100657 }
Hanno Becker530387e2019-07-17 14:10:26 +0100658
Hanno Becker3a98eab2019-09-04 11:15:02 +0100659 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, tmp,
Hanno Beckerd3827c72019-09-03 12:56:37 +0100660 mbedtls_md_info_size( md_info ) ) ) != 0 )
661 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100662 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +0100663 }
Hanno Becker530387e2019-07-17 14:10:26 +0100664
Hanno Becker3a98eab2019-09-04 11:15:02 +0100665 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, output ) ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +0100666 return( ret );
667
Arto Kinnunen5b366932019-11-20 16:13:13 +0200668 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +0000669}
670
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
Paul Bakker17373852011-01-06 14:20:01 +0000672{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100673 int ret;
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100674 unsigned char *ipad;
675
Hanno Beckerd3827c72019-09-03 12:56:37 +0100676 mbedtls_md_handle_t md_info;
677
Hanno Becker3252c4d2019-09-05 15:03:56 +0100678 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200679 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Beckerd3827c72019-09-03 12:56:37 +0100680
Hanno Becker3252c4d2019-09-05 15:03:56 +0100681#if !defined(MBEDTLS_MD_SINGLE_HASH)
682 if( ctx->hmac_ctx == NULL )
683 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
684#endif /* !MBEDTLS_MD_SINGLE_HASH */
685
Hanno Beckerd3827c72019-09-03 12:56:37 +0100686 md_info = mbedtls_md_get_handle( ctx );
687 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
688 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +0000689
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +0100690 ipad = (unsigned char *) ctx->hmac_ctx;
691
Hanno Becker3a98eab2019-09-04 11:15:02 +0100692 ret = mbedtls_md_info_starts( md_info, ctx->md_ctx );
Hanno Becker530387e2019-07-17 14:10:26 +0100693 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100694 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +0100695
Hanno Becker3a98eab2019-09-04 11:15:02 +0100696 ret = mbedtls_md_info_update( md_info,
697 ctx->md_ctx, ipad,
698 mbedtls_md_info_block_size( md_info ) );
Hanno Becker530387e2019-07-17 14:10:26 +0100699 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +0000700}
701
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100702int mbedtls_md_hmac( mbedtls_md_handle_t md_info,
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100703 const unsigned char *key, size_t keylen,
704 const unsigned char *input, size_t ilen,
705 unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +0000706{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200707 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100708 int ret;
709
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100710 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +0000712
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100714
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715 if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100716 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100717
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100718 if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
719 goto cleanup;
720 if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 )
721 goto cleanup;
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100722 if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 )
723 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +0100724
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100725cleanup:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726 mbedtls_md_free( &ctx );
Paul Bakker17373852011-01-06 14:20:01 +0000727
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +0100728 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +0000729}
730
Hanno Becker53ade9f2019-09-04 13:44:51 +0100731#if !defined(MBEDTLS_MD_SINGLE_HASH)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200732int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
Paul Bakker1bd3ae82013-03-13 10:26:44 +0100733{
Hanno Becker53ade9f2019-09-04 13:44:51 +0100734 return( mbedtls_md_process_internal( ctx, data ) );
Paul Bakker1bd3ae82013-03-13 10:26:44 +0100735}
Hanno Becker53ade9f2019-09-04 13:44:51 +0100736#endif /* !MBEDTLS_MD_SINGLE_HASH */
Paul Bakker1bd3ae82013-03-13 10:26:44 +0100737
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100738unsigned char mbedtls_md_get_size( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100739{
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100740 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100741 return( 0 );
742
Hanno Becker530387e2019-07-17 14:10:26 +0100743 return mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100744}
745
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100746mbedtls_md_type_t mbedtls_md_get_type( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100747{
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100748 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100750
Hanno Becker530387e2019-07-17 14:10:26 +0100751 return mbedtls_md_info_type( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100752}
753
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100754const char *mbedtls_md_get_name( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100755{
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100756 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100757 return( NULL );
758
Hanno Becker530387e2019-07-17 14:10:26 +0100759 return mbedtls_md_info_name( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100760}
761
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200762#endif /* MBEDTLS_MD_C */