xref: /optee_os/lib/libmbedtls/mbedtls/library/md.c (revision 11fa71b9ddb429088f325cfda430183003ccd1db)
1c6672fdcSEdison Ai // SPDX-License-Identifier: Apache-2.0
2817466cbSJens Wiklander /**
3817466cbSJens Wiklander  * \file mbedtls_md.c
4817466cbSJens Wiklander  *
5817466cbSJens Wiklander  * \brief Generic message digest wrapper for mbed TLS
6817466cbSJens Wiklander  *
7817466cbSJens Wiklander  * \author Adriaan de Jong <dejong@fox-it.com>
8817466cbSJens Wiklander  *
9817466cbSJens Wiklander  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
10817466cbSJens Wiklander  *
11817466cbSJens Wiklander  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
12817466cbSJens Wiklander  *  not use this file except in compliance with the License.
13817466cbSJens Wiklander  *  You may obtain a copy of the License at
14817466cbSJens Wiklander  *
15817466cbSJens Wiklander  *  http://www.apache.org/licenses/LICENSE-2.0
16817466cbSJens Wiklander  *
17817466cbSJens Wiklander  *  Unless required by applicable law or agreed to in writing, software
18817466cbSJens Wiklander  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19817466cbSJens Wiklander  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20817466cbSJens Wiklander  *  See the License for the specific language governing permissions and
21817466cbSJens Wiklander  *  limitations under the License.
22817466cbSJens Wiklander  *
23817466cbSJens Wiklander  *  This file is part of mbed TLS (https://tls.mbed.org)
24817466cbSJens Wiklander  */
25817466cbSJens Wiklander 
26817466cbSJens Wiklander #if !defined(MBEDTLS_CONFIG_FILE)
27817466cbSJens Wiklander #include "mbedtls/config.h"
28817466cbSJens Wiklander #else
29817466cbSJens Wiklander #include MBEDTLS_CONFIG_FILE
30817466cbSJens Wiklander #endif
31817466cbSJens Wiklander 
32817466cbSJens Wiklander #if defined(MBEDTLS_MD_C)
33817466cbSJens Wiklander 
34817466cbSJens Wiklander #include "mbedtls/md.h"
35817466cbSJens Wiklander #include "mbedtls/md_internal.h"
363d3b0591SJens Wiklander #include "mbedtls/platform_util.h"
37*11fa71b9SJerome Forissier #include "mbedtls/error.h"
38*11fa71b9SJerome Forissier 
39*11fa71b9SJerome Forissier #include "mbedtls/md2.h"
40*11fa71b9SJerome Forissier #include "mbedtls/md4.h"
41*11fa71b9SJerome Forissier #include "mbedtls/md5.h"
42*11fa71b9SJerome Forissier #include "mbedtls/ripemd160.h"
43*11fa71b9SJerome Forissier #include "mbedtls/sha1.h"
44*11fa71b9SJerome Forissier #include "mbedtls/sha256.h"
45*11fa71b9SJerome Forissier #include "mbedtls/sha512.h"
46817466cbSJens Wiklander 
47817466cbSJens Wiklander #if defined(MBEDTLS_PLATFORM_C)
48817466cbSJens Wiklander #include "mbedtls/platform.h"
49817466cbSJens Wiklander #else
50817466cbSJens Wiklander #include <stdlib.h>
51817466cbSJens Wiklander #define mbedtls_calloc    calloc
52817466cbSJens Wiklander #define mbedtls_free       free
53817466cbSJens Wiklander #endif
54817466cbSJens Wiklander 
55817466cbSJens Wiklander #include <string.h>
56817466cbSJens Wiklander 
57817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO)
58817466cbSJens Wiklander #include <stdio.h>
59817466cbSJens Wiklander #endif
60817466cbSJens Wiklander 
61*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
62*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_md2_info = {
63*11fa71b9SJerome Forissier     "MD2",
64*11fa71b9SJerome Forissier     MBEDTLS_MD_MD2,
65*11fa71b9SJerome Forissier     16,
66*11fa71b9SJerome Forissier     16,
67*11fa71b9SJerome Forissier };
68*11fa71b9SJerome Forissier #endif
69*11fa71b9SJerome Forissier 
70*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
71*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_md4_info = {
72*11fa71b9SJerome Forissier     "MD4",
73*11fa71b9SJerome Forissier     MBEDTLS_MD_MD4,
74*11fa71b9SJerome Forissier     16,
75*11fa71b9SJerome Forissier     64,
76*11fa71b9SJerome Forissier };
77*11fa71b9SJerome Forissier #endif
78*11fa71b9SJerome Forissier 
79*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
80*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_md5_info = {
81*11fa71b9SJerome Forissier     "MD5",
82*11fa71b9SJerome Forissier     MBEDTLS_MD_MD5,
83*11fa71b9SJerome Forissier     16,
84*11fa71b9SJerome Forissier     64,
85*11fa71b9SJerome Forissier };
86*11fa71b9SJerome Forissier #endif
87*11fa71b9SJerome Forissier 
88*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
89*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_ripemd160_info = {
90*11fa71b9SJerome Forissier     "RIPEMD160",
91*11fa71b9SJerome Forissier     MBEDTLS_MD_RIPEMD160,
92*11fa71b9SJerome Forissier     20,
93*11fa71b9SJerome Forissier     64,
94*11fa71b9SJerome Forissier };
95*11fa71b9SJerome Forissier #endif
96*11fa71b9SJerome Forissier 
97*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
98*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha1_info = {
99*11fa71b9SJerome Forissier     "SHA1",
100*11fa71b9SJerome Forissier     MBEDTLS_MD_SHA1,
101*11fa71b9SJerome Forissier     20,
102*11fa71b9SJerome Forissier     64,
103*11fa71b9SJerome Forissier };
104*11fa71b9SJerome Forissier #endif
105*11fa71b9SJerome Forissier 
106*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
107*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha224_info = {
108*11fa71b9SJerome Forissier     "SHA224",
109*11fa71b9SJerome Forissier     MBEDTLS_MD_SHA224,
110*11fa71b9SJerome Forissier     28,
111*11fa71b9SJerome Forissier     64,
112*11fa71b9SJerome Forissier };
113*11fa71b9SJerome Forissier 
114*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha256_info = {
115*11fa71b9SJerome Forissier     "SHA256",
116*11fa71b9SJerome Forissier     MBEDTLS_MD_SHA256,
117*11fa71b9SJerome Forissier     32,
118*11fa71b9SJerome Forissier     64,
119*11fa71b9SJerome Forissier };
120*11fa71b9SJerome Forissier #endif
121*11fa71b9SJerome Forissier 
122*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
123*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
124*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha384_info = {
125*11fa71b9SJerome Forissier     "SHA384",
126*11fa71b9SJerome Forissier     MBEDTLS_MD_SHA384,
127*11fa71b9SJerome Forissier     48,
128*11fa71b9SJerome Forissier     128,
129*11fa71b9SJerome Forissier };
130*11fa71b9SJerome Forissier #endif
131*11fa71b9SJerome Forissier 
132*11fa71b9SJerome Forissier const mbedtls_md_info_t mbedtls_sha512_info = {
133*11fa71b9SJerome Forissier     "SHA512",
134*11fa71b9SJerome Forissier     MBEDTLS_MD_SHA512,
135*11fa71b9SJerome Forissier     64,
136*11fa71b9SJerome Forissier     128,
137*11fa71b9SJerome Forissier };
138*11fa71b9SJerome Forissier #endif
139*11fa71b9SJerome Forissier 
140817466cbSJens Wiklander /*
141817466cbSJens Wiklander  * Reminder: update profiles in x509_crt.c when adding a new hash!
142817466cbSJens Wiklander  */
143817466cbSJens Wiklander static const int supported_digests[] = {
144817466cbSJens Wiklander 
145817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C)
146817466cbSJens Wiklander         MBEDTLS_MD_SHA512,
147*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
148817466cbSJens Wiklander         MBEDTLS_MD_SHA384,
149817466cbSJens Wiklander #endif
150*11fa71b9SJerome Forissier #endif
151817466cbSJens Wiklander 
152817466cbSJens Wiklander #if defined(MBEDTLS_SHA256_C)
153817466cbSJens Wiklander         MBEDTLS_MD_SHA256,
154817466cbSJens Wiklander         MBEDTLS_MD_SHA224,
155817466cbSJens Wiklander #endif
156817466cbSJens Wiklander 
157817466cbSJens Wiklander #if defined(MBEDTLS_SHA1_C)
158817466cbSJens Wiklander         MBEDTLS_MD_SHA1,
159817466cbSJens Wiklander #endif
160817466cbSJens Wiklander 
161817466cbSJens Wiklander #if defined(MBEDTLS_RIPEMD160_C)
162817466cbSJens Wiklander         MBEDTLS_MD_RIPEMD160,
163817466cbSJens Wiklander #endif
164817466cbSJens Wiklander 
165817466cbSJens Wiklander #if defined(MBEDTLS_MD5_C)
166817466cbSJens Wiklander         MBEDTLS_MD_MD5,
167817466cbSJens Wiklander #endif
168817466cbSJens Wiklander 
169817466cbSJens Wiklander #if defined(MBEDTLS_MD4_C)
170817466cbSJens Wiklander         MBEDTLS_MD_MD4,
171817466cbSJens Wiklander #endif
172817466cbSJens Wiklander 
173817466cbSJens Wiklander #if defined(MBEDTLS_MD2_C)
174817466cbSJens Wiklander         MBEDTLS_MD_MD2,
175817466cbSJens Wiklander #endif
176817466cbSJens Wiklander 
177817466cbSJens Wiklander         MBEDTLS_MD_NONE
178817466cbSJens Wiklander };
179817466cbSJens Wiklander 
180817466cbSJens Wiklander const int *mbedtls_md_list( void )
181817466cbSJens Wiklander {
182817466cbSJens Wiklander     return( supported_digests );
183817466cbSJens Wiklander }
184817466cbSJens Wiklander 
185817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name )
186817466cbSJens Wiklander {
187817466cbSJens Wiklander     if( NULL == md_name )
188817466cbSJens Wiklander         return( NULL );
189817466cbSJens Wiklander 
190817466cbSJens Wiklander     /* Get the appropriate digest information */
191817466cbSJens Wiklander #if defined(MBEDTLS_MD2_C)
192817466cbSJens Wiklander     if( !strcmp( "MD2", md_name ) )
193817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );
194817466cbSJens Wiklander #endif
195817466cbSJens Wiklander #if defined(MBEDTLS_MD4_C)
196817466cbSJens Wiklander     if( !strcmp( "MD4", md_name ) )
197817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );
198817466cbSJens Wiklander #endif
199817466cbSJens Wiklander #if defined(MBEDTLS_MD5_C)
200817466cbSJens Wiklander     if( !strcmp( "MD5", md_name ) )
201817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );
202817466cbSJens Wiklander #endif
203817466cbSJens Wiklander #if defined(MBEDTLS_RIPEMD160_C)
204817466cbSJens Wiklander     if( !strcmp( "RIPEMD160", md_name ) )
205817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );
206817466cbSJens Wiklander #endif
207817466cbSJens Wiklander #if defined(MBEDTLS_SHA1_C)
208817466cbSJens Wiklander     if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
209817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
210817466cbSJens Wiklander #endif
211817466cbSJens Wiklander #if defined(MBEDTLS_SHA256_C)
212817466cbSJens Wiklander     if( !strcmp( "SHA224", md_name ) )
213817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );
214817466cbSJens Wiklander     if( !strcmp( "SHA256", md_name ) )
215817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
216817466cbSJens Wiklander #endif
217817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C)
218*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
219817466cbSJens Wiklander     if( !strcmp( "SHA384", md_name ) )
220817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );
221*11fa71b9SJerome Forissier #endif
222817466cbSJens Wiklander     if( !strcmp( "SHA512", md_name ) )
223817466cbSJens Wiklander         return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );
224817466cbSJens Wiklander #endif
225817466cbSJens Wiklander     return( NULL );
226817466cbSJens Wiklander }
227817466cbSJens Wiklander 
228817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
229817466cbSJens Wiklander {
230817466cbSJens Wiklander     switch( md_type )
231817466cbSJens Wiklander     {
232817466cbSJens Wiklander #if defined(MBEDTLS_MD2_C)
233817466cbSJens Wiklander         case MBEDTLS_MD_MD2:
234817466cbSJens Wiklander             return( &mbedtls_md2_info );
235817466cbSJens Wiklander #endif
236817466cbSJens Wiklander #if defined(MBEDTLS_MD4_C)
237817466cbSJens Wiklander         case MBEDTLS_MD_MD4:
238817466cbSJens Wiklander             return( &mbedtls_md4_info );
239817466cbSJens Wiklander #endif
240817466cbSJens Wiklander #if defined(MBEDTLS_MD5_C)
241817466cbSJens Wiklander         case MBEDTLS_MD_MD5:
242817466cbSJens Wiklander             return( &mbedtls_md5_info );
243817466cbSJens Wiklander #endif
244817466cbSJens Wiklander #if defined(MBEDTLS_RIPEMD160_C)
245817466cbSJens Wiklander         case MBEDTLS_MD_RIPEMD160:
246817466cbSJens Wiklander             return( &mbedtls_ripemd160_info );
247817466cbSJens Wiklander #endif
248817466cbSJens Wiklander #if defined(MBEDTLS_SHA1_C)
249817466cbSJens Wiklander         case MBEDTLS_MD_SHA1:
250817466cbSJens Wiklander             return( &mbedtls_sha1_info );
251817466cbSJens Wiklander #endif
252817466cbSJens Wiklander #if defined(MBEDTLS_SHA256_C)
253817466cbSJens Wiklander         case MBEDTLS_MD_SHA224:
254817466cbSJens Wiklander             return( &mbedtls_sha224_info );
255817466cbSJens Wiklander         case MBEDTLS_MD_SHA256:
256817466cbSJens Wiklander             return( &mbedtls_sha256_info );
257817466cbSJens Wiklander #endif
258817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C)
259*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
260817466cbSJens Wiklander         case MBEDTLS_MD_SHA384:
261817466cbSJens Wiklander             return( &mbedtls_sha384_info );
262*11fa71b9SJerome Forissier #endif
263817466cbSJens Wiklander         case MBEDTLS_MD_SHA512:
264817466cbSJens Wiklander             return( &mbedtls_sha512_info );
265817466cbSJens Wiklander #endif
266817466cbSJens Wiklander         default:
267817466cbSJens Wiklander             return( NULL );
268817466cbSJens Wiklander     }
269817466cbSJens Wiklander }
270817466cbSJens Wiklander 
271817466cbSJens Wiklander void mbedtls_md_init( mbedtls_md_context_t *ctx )
272817466cbSJens Wiklander {
273817466cbSJens Wiklander     memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
274817466cbSJens Wiklander }
275817466cbSJens Wiklander 
276817466cbSJens Wiklander void mbedtls_md_free( mbedtls_md_context_t *ctx )
277817466cbSJens Wiklander {
278817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL )
279817466cbSJens Wiklander         return;
280817466cbSJens Wiklander 
281817466cbSJens Wiklander     if( ctx->md_ctx != NULL )
282*11fa71b9SJerome Forissier     {
283*11fa71b9SJerome Forissier         switch( ctx->md_info->type )
284*11fa71b9SJerome Forissier         {
285*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
286*11fa71b9SJerome Forissier             case MBEDTLS_MD_MD2:
287*11fa71b9SJerome Forissier                 mbedtls_md2_free( ctx->md_ctx );
288*11fa71b9SJerome Forissier                 break;
289*11fa71b9SJerome Forissier #endif
290*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
291*11fa71b9SJerome Forissier             case MBEDTLS_MD_MD4:
292*11fa71b9SJerome Forissier                 mbedtls_md4_free( ctx->md_ctx );
293*11fa71b9SJerome Forissier                 break;
294*11fa71b9SJerome Forissier #endif
295*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
296*11fa71b9SJerome Forissier             case MBEDTLS_MD_MD5:
297*11fa71b9SJerome Forissier                 mbedtls_md5_free( ctx->md_ctx );
298*11fa71b9SJerome Forissier                 break;
299*11fa71b9SJerome Forissier #endif
300*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
301*11fa71b9SJerome Forissier             case MBEDTLS_MD_RIPEMD160:
302*11fa71b9SJerome Forissier                 mbedtls_ripemd160_free( ctx->md_ctx );
303*11fa71b9SJerome Forissier                 break;
304*11fa71b9SJerome Forissier #endif
305*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
306*11fa71b9SJerome Forissier             case MBEDTLS_MD_SHA1:
307*11fa71b9SJerome Forissier                 mbedtls_sha1_free( ctx->md_ctx );
308*11fa71b9SJerome Forissier                 break;
309*11fa71b9SJerome Forissier #endif
310*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
311*11fa71b9SJerome Forissier             case MBEDTLS_MD_SHA224:
312*11fa71b9SJerome Forissier             case MBEDTLS_MD_SHA256:
313*11fa71b9SJerome Forissier                 mbedtls_sha256_free( ctx->md_ctx );
314*11fa71b9SJerome Forissier                 break;
315*11fa71b9SJerome Forissier #endif
316*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
317*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
318*11fa71b9SJerome Forissier             case MBEDTLS_MD_SHA384:
319*11fa71b9SJerome Forissier #endif
320*11fa71b9SJerome Forissier             case MBEDTLS_MD_SHA512:
321*11fa71b9SJerome Forissier                 mbedtls_sha512_free( ctx->md_ctx );
322*11fa71b9SJerome Forissier                 break;
323*11fa71b9SJerome Forissier #endif
324*11fa71b9SJerome Forissier             default:
325*11fa71b9SJerome Forissier                 /* Shouldn't happen */
326*11fa71b9SJerome Forissier                 break;
327*11fa71b9SJerome Forissier         }
328*11fa71b9SJerome Forissier         mbedtls_free( ctx->md_ctx );
329*11fa71b9SJerome Forissier     }
330817466cbSJens Wiklander 
331817466cbSJens Wiklander     if( ctx->hmac_ctx != NULL )
332817466cbSJens Wiklander     {
3333d3b0591SJens Wiklander         mbedtls_platform_zeroize( ctx->hmac_ctx,
3343d3b0591SJens Wiklander                                   2 * ctx->md_info->block_size );
335817466cbSJens Wiklander         mbedtls_free( ctx->hmac_ctx );
336817466cbSJens Wiklander     }
337817466cbSJens Wiklander 
3383d3b0591SJens Wiklander     mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
339817466cbSJens Wiklander }
340817466cbSJens Wiklander 
341817466cbSJens Wiklander int mbedtls_md_clone( mbedtls_md_context_t *dst,
342817466cbSJens Wiklander                       const mbedtls_md_context_t *src )
343817466cbSJens Wiklander {
344817466cbSJens Wiklander     if( dst == NULL || dst->md_info == NULL ||
345817466cbSJens Wiklander         src == NULL || src->md_info == NULL ||
346817466cbSJens Wiklander         dst->md_info != src->md_info )
347817466cbSJens Wiklander     {
348817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
349817466cbSJens Wiklander     }
350817466cbSJens Wiklander 
351*11fa71b9SJerome Forissier     switch( src->md_info->type )
352*11fa71b9SJerome Forissier     {
353*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
354*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD2:
355*11fa71b9SJerome Forissier             mbedtls_md2_clone( dst->md_ctx, src->md_ctx );
356*11fa71b9SJerome Forissier             break;
357*11fa71b9SJerome Forissier #endif
358*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
359*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD4:
360*11fa71b9SJerome Forissier             mbedtls_md4_clone( dst->md_ctx, src->md_ctx );
361*11fa71b9SJerome Forissier             break;
362*11fa71b9SJerome Forissier #endif
363*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
364*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD5:
365*11fa71b9SJerome Forissier             mbedtls_md5_clone( dst->md_ctx, src->md_ctx );
366*11fa71b9SJerome Forissier             break;
367*11fa71b9SJerome Forissier #endif
368*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
369*11fa71b9SJerome Forissier         case MBEDTLS_MD_RIPEMD160:
370*11fa71b9SJerome Forissier             mbedtls_ripemd160_clone( dst->md_ctx, src->md_ctx );
371*11fa71b9SJerome Forissier             break;
372*11fa71b9SJerome Forissier #endif
373*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
374*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA1:
375*11fa71b9SJerome Forissier             mbedtls_sha1_clone( dst->md_ctx, src->md_ctx );
376*11fa71b9SJerome Forissier             break;
377*11fa71b9SJerome Forissier #endif
378*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
379*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA224:
380*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA256:
381*11fa71b9SJerome Forissier             mbedtls_sha256_clone( dst->md_ctx, src->md_ctx );
382*11fa71b9SJerome Forissier             break;
383*11fa71b9SJerome Forissier #endif
384*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
385*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
386*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA384:
387*11fa71b9SJerome Forissier #endif
388*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA512:
389*11fa71b9SJerome Forissier             mbedtls_sha512_clone( dst->md_ctx, src->md_ctx );
390*11fa71b9SJerome Forissier             break;
391*11fa71b9SJerome Forissier #endif
392*11fa71b9SJerome Forissier         default:
393*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
394*11fa71b9SJerome Forissier     }
395817466cbSJens Wiklander 
39612484fc7SEdison Ai     if( dst->hmac_ctx != NULL && src->hmac_ctx != NULL )
39712484fc7SEdison Ai         memcpy( dst->hmac_ctx, src->hmac_ctx, 2 * src->md_info->block_size );
39812484fc7SEdison Ai 
399817466cbSJens Wiklander     return( 0 );
400817466cbSJens Wiklander }
401817466cbSJens Wiklander 
402817466cbSJens Wiklander #if ! defined(MBEDTLS_DEPRECATED_REMOVED)
403817466cbSJens Wiklander int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info )
404817466cbSJens Wiklander {
405817466cbSJens Wiklander     return mbedtls_md_setup( ctx, md_info, 1 );
406817466cbSJens Wiklander }
407817466cbSJens Wiklander #endif
408817466cbSJens Wiklander 
409*11fa71b9SJerome Forissier #define ALLOC( type )                                                   \
410*11fa71b9SJerome Forissier     do {                                                                \
411*11fa71b9SJerome Forissier         ctx->md_ctx = mbedtls_calloc( 1, sizeof( mbedtls_##type##_context ) ); \
412*11fa71b9SJerome Forissier         if( ctx->md_ctx == NULL )                                       \
413*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_ALLOC_FAILED );                      \
414*11fa71b9SJerome Forissier         mbedtls_##type##_init( ctx->md_ctx );                           \
415*11fa71b9SJerome Forissier     }                                                                   \
416*11fa71b9SJerome Forissier     while( 0 )
417*11fa71b9SJerome Forissier 
418817466cbSJens Wiklander int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac )
419817466cbSJens Wiklander {
420817466cbSJens Wiklander     if( md_info == NULL || ctx == NULL )
421817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
422817466cbSJens Wiklander 
423*11fa71b9SJerome Forissier     switch( md_info->type )
424*11fa71b9SJerome Forissier     {
425*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
426*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD2:
427*11fa71b9SJerome Forissier             ALLOC( md2 );
428*11fa71b9SJerome Forissier             break;
429*11fa71b9SJerome Forissier #endif
430*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
431*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD4:
432*11fa71b9SJerome Forissier             ALLOC( md4 );
433*11fa71b9SJerome Forissier             break;
434*11fa71b9SJerome Forissier #endif
435*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
436*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD5:
437*11fa71b9SJerome Forissier             ALLOC( md5 );
438*11fa71b9SJerome Forissier             break;
439*11fa71b9SJerome Forissier #endif
440*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
441*11fa71b9SJerome Forissier         case MBEDTLS_MD_RIPEMD160:
442*11fa71b9SJerome Forissier             ALLOC( ripemd160 );
443*11fa71b9SJerome Forissier             break;
444*11fa71b9SJerome Forissier #endif
445*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
446*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA1:
447*11fa71b9SJerome Forissier             ALLOC( sha1 );
448*11fa71b9SJerome Forissier             break;
449*11fa71b9SJerome Forissier #endif
450*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
451*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA224:
452*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA256:
453*11fa71b9SJerome Forissier             ALLOC( sha256 );
454*11fa71b9SJerome Forissier             break;
455*11fa71b9SJerome Forissier #endif
456*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
457*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
458*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA384:
459*11fa71b9SJerome Forissier #endif
460*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA512:
461*11fa71b9SJerome Forissier             ALLOC( sha512 );
462*11fa71b9SJerome Forissier             break;
463*11fa71b9SJerome Forissier #endif
464*11fa71b9SJerome Forissier         default:
465*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
466*11fa71b9SJerome Forissier     }
467817466cbSJens Wiklander 
468817466cbSJens Wiklander     if( hmac != 0 )
469817466cbSJens Wiklander     {
470817466cbSJens Wiklander         ctx->hmac_ctx = mbedtls_calloc( 2, md_info->block_size );
471817466cbSJens Wiklander         if( ctx->hmac_ctx == NULL )
472817466cbSJens Wiklander         {
473*11fa71b9SJerome Forissier             mbedtls_md_free( ctx );
474817466cbSJens Wiklander             return( MBEDTLS_ERR_MD_ALLOC_FAILED );
475817466cbSJens Wiklander         }
476817466cbSJens Wiklander     }
477817466cbSJens Wiklander 
478817466cbSJens Wiklander     ctx->md_info = md_info;
479817466cbSJens Wiklander 
480817466cbSJens Wiklander     return( 0 );
481817466cbSJens Wiklander }
482*11fa71b9SJerome Forissier #undef ALLOC
483817466cbSJens Wiklander 
484817466cbSJens Wiklander int mbedtls_md_starts( mbedtls_md_context_t *ctx )
485817466cbSJens Wiklander {
486817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL )
487817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
488817466cbSJens Wiklander 
489*11fa71b9SJerome Forissier     switch( ctx->md_info->type )
490*11fa71b9SJerome Forissier     {
491*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
492*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD2:
493*11fa71b9SJerome Forissier             return( mbedtls_md2_starts_ret( ctx->md_ctx ) );
494*11fa71b9SJerome Forissier #endif
495*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
496*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD4:
497*11fa71b9SJerome Forissier             return( mbedtls_md4_starts_ret( ctx->md_ctx ) );
498*11fa71b9SJerome Forissier #endif
499*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
500*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD5:
501*11fa71b9SJerome Forissier             return( mbedtls_md5_starts_ret( ctx->md_ctx ) );
502*11fa71b9SJerome Forissier #endif
503*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
504*11fa71b9SJerome Forissier         case MBEDTLS_MD_RIPEMD160:
505*11fa71b9SJerome Forissier             return( mbedtls_ripemd160_starts_ret( ctx->md_ctx ) );
506*11fa71b9SJerome Forissier #endif
507*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
508*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA1:
509*11fa71b9SJerome Forissier             return( mbedtls_sha1_starts_ret( ctx->md_ctx ) );
510*11fa71b9SJerome Forissier #endif
511*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
512*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA224:
513*11fa71b9SJerome Forissier             return( mbedtls_sha256_starts_ret( ctx->md_ctx, 1 ) );
514*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA256:
515*11fa71b9SJerome Forissier             return( mbedtls_sha256_starts_ret( ctx->md_ctx, 0 ) );
516*11fa71b9SJerome Forissier #endif
517*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
518*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
519*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA384:
520*11fa71b9SJerome Forissier             return( mbedtls_sha512_starts_ret( ctx->md_ctx, 1 ) );
521*11fa71b9SJerome Forissier #endif
522*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA512:
523*11fa71b9SJerome Forissier             return( mbedtls_sha512_starts_ret( ctx->md_ctx, 0 ) );
524*11fa71b9SJerome Forissier #endif
525*11fa71b9SJerome Forissier         default:
526*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
527*11fa71b9SJerome Forissier     }
528817466cbSJens Wiklander }
529817466cbSJens Wiklander 
530817466cbSJens Wiklander int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
531817466cbSJens Wiklander {
532817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL )
533817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
534817466cbSJens Wiklander 
535*11fa71b9SJerome Forissier     switch( ctx->md_info->type )
536*11fa71b9SJerome Forissier     {
537*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
538*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD2:
539*11fa71b9SJerome Forissier             return( mbedtls_md2_update_ret( ctx->md_ctx, input, ilen ) );
540*11fa71b9SJerome Forissier #endif
541*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
542*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD4:
543*11fa71b9SJerome Forissier             return( mbedtls_md4_update_ret( ctx->md_ctx, input, ilen ) );
544*11fa71b9SJerome Forissier #endif
545*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
546*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD5:
547*11fa71b9SJerome Forissier             return( mbedtls_md5_update_ret( ctx->md_ctx, input, ilen ) );
548*11fa71b9SJerome Forissier #endif
549*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
550*11fa71b9SJerome Forissier         case MBEDTLS_MD_RIPEMD160:
551*11fa71b9SJerome Forissier             return( mbedtls_ripemd160_update_ret( ctx->md_ctx, input, ilen ) );
552*11fa71b9SJerome Forissier #endif
553*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
554*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA1:
555*11fa71b9SJerome Forissier             return( mbedtls_sha1_update_ret( ctx->md_ctx, input, ilen ) );
556*11fa71b9SJerome Forissier #endif
557*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
558*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA224:
559*11fa71b9SJerome Forissier             return( mbedtls_sha256_update_ret( ctx->md_ctx, input, ilen ) );
560*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA256:
561*11fa71b9SJerome Forissier             return( mbedtls_sha256_update_ret( ctx->md_ctx, input, ilen ) );
562*11fa71b9SJerome Forissier #endif
563*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
564*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
565*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA384:
566*11fa71b9SJerome Forissier             return( mbedtls_sha512_update_ret( ctx->md_ctx, input, ilen ) );
567*11fa71b9SJerome Forissier #endif
568*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA512:
569*11fa71b9SJerome Forissier             return( mbedtls_sha512_update_ret( ctx->md_ctx, input, ilen ) );
570*11fa71b9SJerome Forissier #endif
571*11fa71b9SJerome Forissier         default:
572*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
573*11fa71b9SJerome Forissier     }
574817466cbSJens Wiklander }
575817466cbSJens Wiklander 
576817466cbSJens Wiklander int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
577817466cbSJens Wiklander {
578817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL )
579817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
580817466cbSJens Wiklander 
581*11fa71b9SJerome Forissier     switch( ctx->md_info->type )
582*11fa71b9SJerome Forissier     {
583*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
584*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD2:
585*11fa71b9SJerome Forissier             return( mbedtls_md2_finish_ret( ctx->md_ctx, output ) );
586*11fa71b9SJerome Forissier #endif
587*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
588*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD4:
589*11fa71b9SJerome Forissier             return( mbedtls_md4_finish_ret( ctx->md_ctx, output ) );
590*11fa71b9SJerome Forissier #endif
591*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
592*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD5:
593*11fa71b9SJerome Forissier             return( mbedtls_md5_finish_ret( ctx->md_ctx, output ) );
594*11fa71b9SJerome Forissier #endif
595*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
596*11fa71b9SJerome Forissier         case MBEDTLS_MD_RIPEMD160:
597*11fa71b9SJerome Forissier             return( mbedtls_ripemd160_finish_ret( ctx->md_ctx, output ) );
598*11fa71b9SJerome Forissier #endif
599*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
600*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA1:
601*11fa71b9SJerome Forissier             return( mbedtls_sha1_finish_ret( ctx->md_ctx, output ) );
602*11fa71b9SJerome Forissier #endif
603*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
604*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA224:
605*11fa71b9SJerome Forissier             return( mbedtls_sha256_finish_ret( ctx->md_ctx, output ) );
606*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA256:
607*11fa71b9SJerome Forissier             return( mbedtls_sha256_finish_ret( ctx->md_ctx, output ) );
608*11fa71b9SJerome Forissier #endif
609*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
610*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
611*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA384:
612*11fa71b9SJerome Forissier             return( mbedtls_sha512_finish_ret( ctx->md_ctx, output ) );
613*11fa71b9SJerome Forissier #endif
614*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA512:
615*11fa71b9SJerome Forissier             return( mbedtls_sha512_finish_ret( ctx->md_ctx, output ) );
616*11fa71b9SJerome Forissier #endif
617*11fa71b9SJerome Forissier         default:
618*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
619*11fa71b9SJerome Forissier     }
620817466cbSJens Wiklander }
621817466cbSJens Wiklander 
622817466cbSJens Wiklander int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
623817466cbSJens Wiklander             unsigned char *output )
624817466cbSJens Wiklander {
625817466cbSJens Wiklander     if( md_info == NULL )
626817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
627817466cbSJens Wiklander 
628*11fa71b9SJerome Forissier     switch( md_info->type )
629*11fa71b9SJerome Forissier     {
630*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
631*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD2:
632*11fa71b9SJerome Forissier             return( mbedtls_md2_ret( input, ilen, output ) );
633*11fa71b9SJerome Forissier #endif
634*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
635*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD4:
636*11fa71b9SJerome Forissier             return( mbedtls_md4_ret( input, ilen, output ) );
637*11fa71b9SJerome Forissier #endif
638*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
639*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD5:
640*11fa71b9SJerome Forissier             return( mbedtls_md5_ret( input, ilen, output ) );
641*11fa71b9SJerome Forissier #endif
642*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
643*11fa71b9SJerome Forissier         case MBEDTLS_MD_RIPEMD160:
644*11fa71b9SJerome Forissier             return( mbedtls_ripemd160_ret( input, ilen, output ) );
645*11fa71b9SJerome Forissier #endif
646*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
647*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA1:
648*11fa71b9SJerome Forissier             return( mbedtls_sha1_ret( input, ilen, output ) );
649*11fa71b9SJerome Forissier #endif
650*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
651*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA224:
652*11fa71b9SJerome Forissier             return( mbedtls_sha256_ret( input, ilen, output, 1 ) );
653*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA256:
654*11fa71b9SJerome Forissier             return( mbedtls_sha256_ret( input, ilen, output, 0 ) );
655*11fa71b9SJerome Forissier #endif
656*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
657*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
658*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA384:
659*11fa71b9SJerome Forissier             return( mbedtls_sha512_ret( input, ilen, output, 1 ) );
660*11fa71b9SJerome Forissier #endif
661*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA512:
662*11fa71b9SJerome Forissier             return( mbedtls_sha512_ret( input, ilen, output, 0 ) );
663*11fa71b9SJerome Forissier #endif
664*11fa71b9SJerome Forissier         default:
665*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
666*11fa71b9SJerome Forissier     }
667817466cbSJens Wiklander }
668817466cbSJens Wiklander 
669817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO)
670817466cbSJens Wiklander int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output )
671817466cbSJens Wiklander {
672*11fa71b9SJerome Forissier     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
673817466cbSJens Wiklander     FILE *f;
674817466cbSJens Wiklander     size_t n;
675817466cbSJens Wiklander     mbedtls_md_context_t ctx;
676817466cbSJens Wiklander     unsigned char buf[1024];
677817466cbSJens Wiklander 
678817466cbSJens Wiklander     if( md_info == NULL )
679817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
680817466cbSJens Wiklander 
681817466cbSJens Wiklander     if( ( f = fopen( path, "rb" ) ) == NULL )
682817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
683817466cbSJens Wiklander 
684817466cbSJens Wiklander     mbedtls_md_init( &ctx );
685817466cbSJens Wiklander 
686817466cbSJens Wiklander     if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
687817466cbSJens Wiklander         goto cleanup;
688817466cbSJens Wiklander 
689*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 )
6903d3b0591SJens Wiklander         goto cleanup;
691817466cbSJens Wiklander 
692817466cbSJens Wiklander     while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
693*11fa71b9SJerome Forissier         if( ( ret = mbedtls_md_update( &ctx, buf, n ) ) != 0 )
6943d3b0591SJens Wiklander             goto cleanup;
695817466cbSJens Wiklander 
696817466cbSJens Wiklander     if( ferror( f ) != 0 )
697817466cbSJens Wiklander         ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
6983d3b0591SJens Wiklander     else
699*11fa71b9SJerome Forissier         ret = mbedtls_md_finish( &ctx, output );
700817466cbSJens Wiklander 
701817466cbSJens Wiklander cleanup:
7023d3b0591SJens Wiklander     mbedtls_platform_zeroize( buf, sizeof( buf ) );
703817466cbSJens Wiklander     fclose( f );
704817466cbSJens Wiklander     mbedtls_md_free( &ctx );
705817466cbSJens Wiklander 
706817466cbSJens Wiklander     return( ret );
707817466cbSJens Wiklander }
708817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */
709817466cbSJens Wiklander 
710817466cbSJens Wiklander int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
711817466cbSJens Wiklander {
712*11fa71b9SJerome Forissier     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
713817466cbSJens Wiklander     unsigned char sum[MBEDTLS_MD_MAX_SIZE];
714817466cbSJens Wiklander     unsigned char *ipad, *opad;
715817466cbSJens Wiklander     size_t i;
716817466cbSJens Wiklander 
717817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
718817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
719817466cbSJens Wiklander 
720817466cbSJens Wiklander     if( keylen > (size_t) ctx->md_info->block_size )
721817466cbSJens Wiklander     {
722*11fa71b9SJerome Forissier         if( ( ret = mbedtls_md_starts( ctx ) ) != 0 )
7233d3b0591SJens Wiklander             goto cleanup;
724*11fa71b9SJerome Forissier         if( ( ret = mbedtls_md_update( ctx, key, keylen ) ) != 0 )
7253d3b0591SJens Wiklander             goto cleanup;
726*11fa71b9SJerome Forissier         if( ( ret = mbedtls_md_finish( ctx, sum ) ) != 0 )
7273d3b0591SJens Wiklander             goto cleanup;
728817466cbSJens Wiklander 
729817466cbSJens Wiklander         keylen = ctx->md_info->size;
730817466cbSJens Wiklander         key = sum;
731817466cbSJens Wiklander     }
732817466cbSJens Wiklander 
733817466cbSJens Wiklander     ipad = (unsigned char *) ctx->hmac_ctx;
734817466cbSJens Wiklander     opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
735817466cbSJens Wiklander 
736817466cbSJens Wiklander     memset( ipad, 0x36, ctx->md_info->block_size );
737817466cbSJens Wiklander     memset( opad, 0x5C, ctx->md_info->block_size );
738817466cbSJens Wiklander 
739817466cbSJens Wiklander     for( i = 0; i < keylen; i++ )
740817466cbSJens Wiklander     {
741817466cbSJens Wiklander         ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
742817466cbSJens Wiklander         opad[i] = (unsigned char)( opad[i] ^ key[i] );
743817466cbSJens Wiklander     }
744817466cbSJens Wiklander 
745*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_starts( ctx ) ) != 0 )
7463d3b0591SJens Wiklander         goto cleanup;
747*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_update( ctx, ipad,
7483d3b0591SJens Wiklander                                    ctx->md_info->block_size ) ) != 0 )
7493d3b0591SJens Wiklander         goto cleanup;
750817466cbSJens Wiklander 
7513d3b0591SJens Wiklander cleanup:
7523d3b0591SJens Wiklander     mbedtls_platform_zeroize( sum, sizeof( sum ) );
753817466cbSJens Wiklander 
7543d3b0591SJens Wiklander     return( ret );
755817466cbSJens Wiklander }
756817466cbSJens Wiklander 
757817466cbSJens Wiklander int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
758817466cbSJens Wiklander {
759817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
760817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
761817466cbSJens Wiklander 
762*11fa71b9SJerome Forissier     return( mbedtls_md_update( ctx, input, ilen ) );
763817466cbSJens Wiklander }
764817466cbSJens Wiklander 
765817466cbSJens Wiklander int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
766817466cbSJens Wiklander {
767*11fa71b9SJerome Forissier     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
768817466cbSJens Wiklander     unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
769817466cbSJens Wiklander     unsigned char *opad;
770817466cbSJens Wiklander 
771817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
772817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
773817466cbSJens Wiklander 
774817466cbSJens Wiklander     opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
775817466cbSJens Wiklander 
776*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_finish( ctx, tmp ) ) != 0 )
7773d3b0591SJens Wiklander         return( ret );
778*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_starts( ctx ) ) != 0 )
7793d3b0591SJens Wiklander         return( ret );
780*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_update( ctx, opad,
7813d3b0591SJens Wiklander                                    ctx->md_info->block_size ) ) != 0 )
7823d3b0591SJens Wiklander         return( ret );
783*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_update( ctx, tmp,
7843d3b0591SJens Wiklander                                    ctx->md_info->size ) ) != 0 )
7853d3b0591SJens Wiklander         return( ret );
786*11fa71b9SJerome Forissier     return( mbedtls_md_finish( ctx, output ) );
787817466cbSJens Wiklander }
788817466cbSJens Wiklander 
789817466cbSJens Wiklander int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
790817466cbSJens Wiklander {
791*11fa71b9SJerome Forissier     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
792817466cbSJens Wiklander     unsigned char *ipad;
793817466cbSJens Wiklander 
794817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
795817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
796817466cbSJens Wiklander 
797817466cbSJens Wiklander     ipad = (unsigned char *) ctx->hmac_ctx;
798817466cbSJens Wiklander 
799*11fa71b9SJerome Forissier     if( ( ret = mbedtls_md_starts( ctx ) ) != 0 )
8003d3b0591SJens Wiklander         return( ret );
801*11fa71b9SJerome Forissier     return( mbedtls_md_update( ctx, ipad, ctx->md_info->block_size ) );
802817466cbSJens Wiklander }
803817466cbSJens Wiklander 
8043d3b0591SJens Wiklander int mbedtls_md_hmac( const mbedtls_md_info_t *md_info,
8053d3b0591SJens Wiklander                      const unsigned char *key, size_t keylen,
806817466cbSJens Wiklander                      const unsigned char *input, size_t ilen,
807817466cbSJens Wiklander                      unsigned char *output )
808817466cbSJens Wiklander {
809817466cbSJens Wiklander     mbedtls_md_context_t ctx;
810*11fa71b9SJerome Forissier     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
811817466cbSJens Wiklander 
812817466cbSJens Wiklander     if( md_info == NULL )
813817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
814817466cbSJens Wiklander 
815817466cbSJens Wiklander     mbedtls_md_init( &ctx );
816817466cbSJens Wiklander 
817817466cbSJens Wiklander     if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
8183d3b0591SJens Wiklander         goto cleanup;
819817466cbSJens Wiklander 
8203d3b0591SJens Wiklander     if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
8213d3b0591SJens Wiklander         goto cleanup;
8223d3b0591SJens Wiklander     if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 )
8233d3b0591SJens Wiklander         goto cleanup;
8243d3b0591SJens Wiklander     if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 )
8253d3b0591SJens Wiklander         goto cleanup;
826817466cbSJens Wiklander 
8273d3b0591SJens Wiklander cleanup:
828817466cbSJens Wiklander     mbedtls_md_free( &ctx );
829817466cbSJens Wiklander 
8303d3b0591SJens Wiklander     return( ret );
831817466cbSJens Wiklander }
832817466cbSJens Wiklander 
833817466cbSJens Wiklander int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
834817466cbSJens Wiklander {
835817466cbSJens Wiklander     if( ctx == NULL || ctx->md_info == NULL )
836817466cbSJens Wiklander         return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
837817466cbSJens Wiklander 
838*11fa71b9SJerome Forissier     switch( ctx->md_info->type )
839*11fa71b9SJerome Forissier     {
840*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD2_C)
841*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD2:
842*11fa71b9SJerome Forissier             return( mbedtls_internal_md2_process( ctx->md_ctx ) );
843*11fa71b9SJerome Forissier #endif
844*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD4_C)
845*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD4:
846*11fa71b9SJerome Forissier             return( mbedtls_internal_md4_process( ctx->md_ctx, data ) );
847*11fa71b9SJerome Forissier #endif
848*11fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C)
849*11fa71b9SJerome Forissier         case MBEDTLS_MD_MD5:
850*11fa71b9SJerome Forissier             return( mbedtls_internal_md5_process( ctx->md_ctx, data ) );
851*11fa71b9SJerome Forissier #endif
852*11fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C)
853*11fa71b9SJerome Forissier         case MBEDTLS_MD_RIPEMD160:
854*11fa71b9SJerome Forissier             return( mbedtls_internal_ripemd160_process( ctx->md_ctx, data ) );
855*11fa71b9SJerome Forissier #endif
856*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C)
857*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA1:
858*11fa71b9SJerome Forissier             return( mbedtls_internal_sha1_process( ctx->md_ctx, data ) );
859*11fa71b9SJerome Forissier #endif
860*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C)
861*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA224:
862*11fa71b9SJerome Forissier             return( mbedtls_internal_sha256_process( ctx->md_ctx, data ) );
863*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA256:
864*11fa71b9SJerome Forissier             return( mbedtls_internal_sha256_process( ctx->md_ctx, data ) );
865*11fa71b9SJerome Forissier #endif
866*11fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C)
867*11fa71b9SJerome Forissier #if !defined(MBEDTLS_SHA512_NO_SHA384)
868*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA384:
869*11fa71b9SJerome Forissier             return( mbedtls_internal_sha512_process( ctx->md_ctx, data ) );
870*11fa71b9SJerome Forissier #endif
871*11fa71b9SJerome Forissier         case MBEDTLS_MD_SHA512:
872*11fa71b9SJerome Forissier             return( mbedtls_internal_sha512_process( ctx->md_ctx, data ) );
873*11fa71b9SJerome Forissier #endif
874*11fa71b9SJerome Forissier         default:
875*11fa71b9SJerome Forissier             return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
876*11fa71b9SJerome Forissier     }
877817466cbSJens Wiklander }
878817466cbSJens Wiklander 
879817466cbSJens Wiklander unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info )
880817466cbSJens Wiklander {
881817466cbSJens Wiklander     if( md_info == NULL )
882817466cbSJens Wiklander         return( 0 );
883817466cbSJens Wiklander 
884817466cbSJens Wiklander     return md_info->size;
885817466cbSJens Wiklander }
886817466cbSJens Wiklander 
887817466cbSJens Wiklander mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info )
888817466cbSJens Wiklander {
889817466cbSJens Wiklander     if( md_info == NULL )
890817466cbSJens Wiklander         return( MBEDTLS_MD_NONE );
891817466cbSJens Wiklander 
892817466cbSJens Wiklander     return md_info->type;
893817466cbSJens Wiklander }
894817466cbSJens Wiklander 
895817466cbSJens Wiklander const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info )
896817466cbSJens Wiklander {
897817466cbSJens Wiklander     if( md_info == NULL )
898817466cbSJens Wiklander         return( NULL );
899817466cbSJens Wiklander 
900817466cbSJens Wiklander     return md_info->name;
901817466cbSJens Wiklander }
902817466cbSJens Wiklander 
903817466cbSJens Wiklander #endif /* MBEDTLS_MD_C */
904