blob: 6fb5e4932668919af58c55483fea2db358364501 [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"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050035#include "mbedtls/platform_util.h"
Paul Bakker17373852011-01-06 14:20:01 +000036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020037#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010038#include "mbedtls/platform.h"
39#else
Paul Bakker17373852011-01-06 14:20:01 +000040#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020041#define mbedtls_calloc calloc
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020042#define mbedtls_free free
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010043#endif
44
Rich Evans00ab4702015-02-06 13:43:58 +000045#include <string.h>
Paul Bakker17373852011-01-06 14:20:01 +000046
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +020047#if defined(MBEDTLS_FS_IO)
48#include <stdio.h>
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000049#endif
50
Hanno Beckerd03949e2019-07-26 14:38:44 +010051#if defined(MBEDTLS_MD2_C)
52#include "mbedtls/md2.h"
53#endif
54
55#if defined(MBEDTLS_MD4_C)
56#include "mbedtls/md4.h"
57#endif
58
59#if defined(MBEDTLS_MD5_C)
60#include "mbedtls/md5.h"
61#endif
62
63#if defined(MBEDTLS_RIPEMD160_C)
64#include "mbedtls/ripemd160.h"
65#endif
66
67#if defined(MBEDTLS_SHA1_C)
68#include "mbedtls/sha1.h"
69#endif
70
71#if defined(MBEDTLS_SHA256_C)
72#include "mbedtls/sha256.h"
73#endif
74
75#if defined(MBEDTLS_SHA512_C)
76#include "mbedtls/sha512.h"
77#endif
78
79/*
80 * Message-digest information macro definition
81 */
82
83/* SHA-256 */
84#define MBEDTLS_MD_INFO_SHA256_TYPE MBEDTLS_MD_SHA256
85#define MBEDTLS_MD_INFO_SHA256_NAME "SHA256"
86#define MBEDTLS_MD_INFO_SHA256_SIZE 32
87#define MBEDTLS_MD_INFO_SHA256_BLOCKSIZE 64
88#define MBEDTLS_MD_INFO_SHA256_STARTS_FUNC sha256_starts_wrap
89#define MBEDTLS_MD_INFO_SHA256_UPDATE_FUNC sha224_update_wrap
90#define MBEDTLS_MD_INFO_SHA256_FINISH_FUNC sha224_finish_wrap
91#define MBEDTLS_MD_INFO_SHA256_DIGEST_FUNC sha256_wrap
92#define MBEDTLS_MD_INFO_SHA256_ALLOC_FUNC sha224_ctx_alloc
93#define MBEDTLS_MD_INFO_SHA256_FREE_FUNC sha224_ctx_free
94#define MBEDTLS_MD_INFO_SHA256_CLONE_FUNC sha224_clone_wrap
95#define MBEDTLS_MD_INFO_SHA256_PROCESS_FUNC sha224_process_wrap
96
97/*
98 * Helper macros to extract fields from ciphersuites.
99 */
100
101#define MBEDTLS_MD_INFO_TYPE_T( MD ) MD ## _TYPE
102#define MBEDTLS_MD_INFO_NAME_T( MD ) MD ## _NAME
103#define MBEDTLS_MD_INFO_SIZE_T( MD ) MD ## _SIZE
104#define MBEDTLS_MD_INFO_BLOCKSIZE_T( MD ) MD ## _BLOCKSIZE
105#define MBEDTLS_MD_INFO_STARTS_FUNC_T( MD ) MD ## _STARTS_FUNC
106#define MBEDTLS_MD_INFO_UPDATE_FUNC_T( MD ) MD ## _UPDATE_FUNC
107#define MBEDTLS_MD_INFO_FINISH_FUNC_T( MD ) MD ## _FINISH_FUNC
108#define MBEDTLS_MD_INFO_DIGEST_FUNC_T( MD ) MD ## _DIGEST_FUNC
109#define MBEDTLS_MD_INFO_ALLOC_FUNC_T( MD ) MD ## _ALLOC_FUNC
110#define MBEDTLS_MD_INFO_FREE_FUNC_T( MD ) MD ## _FREE_FUNC
111#define MBEDTLS_MD_INFO_CLONE_FUNC_T( MD ) MD ## _CLONE_FUNC
112#define MBEDTLS_MD_INFO_PROCESS_FUNC_T( MD ) MD ## _PROCESS_FUNC
113
114/* Wrapper around MBEDTLS_MD_INFO_XXX_T() which makes sure that
115 * the argument is macro-expanded before concatenated with the
116 * field name. This allows to call these macros as
Hanno Becker08cf43a2019-09-04 11:27:56 +0100117 * MBEDTLS_MD_INFO_XXX( MBEDTLS_MD_SINGLE_HASH ).
118 * where MBEDTLS_MD_SINGLE_HASH expands to MBEDTLS_MD_INFO_XXX. */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100119#define MBEDTLS_MD_INFO_TYPE( MD ) MBEDTLS_MD_INFO_TYPE_T( MD )
120#define MBEDTLS_MD_INFO_NAME( MD ) MBEDTLS_MD_INFO_NAME_T( MD )
121#define MBEDTLS_MD_INFO_SIZE( MD ) MBEDTLS_MD_INFO_SIZE_T( MD )
122#define MBEDTLS_MD_INFO_BLOCKSIZE( MD ) MBEDTLS_MD_INFO_BLOCKSIZE_T( MD )
123#define MBEDTLS_MD_INFO_STARTS_FUNC( MD ) MBEDTLS_MD_INFO_STARTS_FUNC_T( MD )
124#define MBEDTLS_MD_INFO_UPDATE_FUNC( MD ) MBEDTLS_MD_INFO_UPDATE_FUNC_T( MD )
125#define MBEDTLS_MD_INFO_FINISH_FUNC( MD ) MBEDTLS_MD_INFO_FINISH_FUNC_T( MD )
126#define MBEDTLS_MD_INFO_DIGEST_FUNC( MD ) MBEDTLS_MD_INFO_DIGEST_FUNC_T( MD )
127#define MBEDTLS_MD_INFO_ALLOC_FUNC( MD ) MBEDTLS_MD_INFO_ALLOC_FUNC_T( MD )
128#define MBEDTLS_MD_INFO_FREE_FUNC( MD ) MBEDTLS_MD_INFO_FREE_FUNC_T( MD )
129#define MBEDTLS_MD_INFO_CLONE_FUNC( MD ) MBEDTLS_MD_INFO_CLONE_FUNC_T( MD )
130#define MBEDTLS_MD_INFO_PROCESS_FUNC( MD ) MBEDTLS_MD_INFO_PROCESS_FUNC_T( MD )
131
132/**
133 * Message digest information.
134 * Allows message digest functions to be called in a generic way.
135 */
136
137typedef int mbedtls_md_starts_func_t( void *ctx );
138typedef int mbedtls_md_update_func_t( void *ctx,
139 const unsigned char *input,
140 size_t ilen );
141typedef int mbedtls_md_finish_func_t( void *ctx, unsigned char *output );
142typedef int mbedtls_md_digest_func_t( const unsigned char *input,
143 size_t ilen,
144 unsigned char *output );
145typedef void* mbedtls_md_ctx_alloc_func_t( void );
146typedef void mbedtls_md_ctx_free_func_t( void *ctx );
147typedef void mbedtls_md_clone_func_t( void *st, const void *src );
148typedef int mbedtls_md_process_func_t( void *ctx,
149 const unsigned char *input );
150
Hanno Becker1292c352019-08-13 15:43:26 +0100151#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100152struct mbedtls_md_info_t
153{
154 /** Digest identifier */
155 mbedtls_md_type_t type;
156
157 /** Name of the message digest */
158 const char * name;
159
160 /** Output length of the digest function in bytes */
161 int size;
162
163 /** Block length of the digest function in bytes */
164 int block_size;
165
166 /** Digest initialisation function */
167 mbedtls_md_starts_func_t *starts_func;
168
169 /** Digest update function */
170 mbedtls_md_update_func_t *update_func;
171
172 /** Digest finalisation function */
173 mbedtls_md_finish_func_t *finish_func;
174
175 /** Generic digest function */
176 mbedtls_md_digest_func_t *digest_func;
177
178 /** Allocate a new context */
179 mbedtls_md_ctx_alloc_func_t *ctx_alloc_func;
180
181 /** Free the given context */
182 mbedtls_md_ctx_free_func_t *ctx_free_func;
183
184 /** Clone state from a context */
185 mbedtls_md_clone_func_t *clone_func;
186
187 /** Internal use only */
188 mbedtls_md_process_func_t *process_func;
189};
190
191/**
192 * \brief This macro builds an instance of ::mbedtls_md_info_t
193 * from an \c MBEDTLS_MD_INFO_XXX identifier.
194 */
195#define MBEDTLS_MD_INFO( MD ) \
196 { MBEDTLS_MD_INFO_TYPE( MD ), \
197 MBEDTLS_MD_INFO_NAME( MD ), \
198 MBEDTLS_MD_INFO_SIZE( MD ), \
199 MBEDTLS_MD_INFO_BLOCKSIZE( MD ), \
200 MBEDTLS_MD_INFO_STARTS_FUNC( MD ), \
201 MBEDTLS_MD_INFO_UPDATE_FUNC( MD ), \
202 MBEDTLS_MD_INFO_FINISH_FUNC( MD ), \
203 MBEDTLS_MD_INFO_DIGEST_FUNC( MD ), \
204 MBEDTLS_MD_INFO_ALLOC_FUNC( MD ), \
205 MBEDTLS_MD_INFO_FREE_FUNC( MD ), \
206 MBEDTLS_MD_INFO_CLONE_FUNC( MD ), \
207 MBEDTLS_MD_INFO_PROCESS_FUNC( MD ) }
208
Hanno Becker1292c352019-08-13 15:43:26 +0100209#endif /* !MBEDTLS_MD_SINGLE_HASH */
210
Hanno Beckerd03949e2019-07-26 14:38:44 +0100211/*
212 *
213 * Definitions of MD information structures for various digests.
214 *
215 */
216
217/*
218 * MD-2
219 */
220
221#if defined(MBEDTLS_MD2_C)
222
223static int md2_starts_wrap( void *ctx )
224{
225 return( mbedtls_md2_starts_ret( (mbedtls_md2_context *) ctx ) );
226}
227
228static int md2_update_wrap( void *ctx, const unsigned char *input,
229 size_t ilen )
230{
231 return( mbedtls_md2_update_ret( (mbedtls_md2_context *) ctx, input, ilen ) );
232}
233
234static int md2_finish_wrap( void *ctx, unsigned char *output )
235{
236 return( mbedtls_md2_finish_ret( (mbedtls_md2_context *) ctx, output ) );
237}
238
239static void *md2_ctx_alloc( void )
240{
241 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md2_context ) );
242
243 if( ctx != NULL )
244 mbedtls_md2_init( (mbedtls_md2_context *) ctx );
245
246 return( ctx );
247}
248
249static void md2_ctx_free( void *ctx )
250{
251 mbedtls_md2_free( (mbedtls_md2_context *) ctx );
252 mbedtls_free( ctx );
253}
254
255static void md2_clone_wrap( void *dst, const void *src )
256{
257 mbedtls_md2_clone( (mbedtls_md2_context *) dst,
258 (const mbedtls_md2_context *) src );
259}
260
261static int md2_process_wrap( void *ctx, const unsigned char *data )
262{
263 ((void) data);
264
265 return( mbedtls_internal_md2_process( (mbedtls_md2_context *) ctx ) );
266}
267
Hanno Becker1292c352019-08-13 15:43:26 +0100268#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100269const mbedtls_md_info_t mbedtls_md2_info = {
270 MBEDTLS_MD_MD2,
271 "MD2",
272 16,
273 16,
274 md2_starts_wrap,
275 md2_update_wrap,
276 md2_finish_wrap,
277 mbedtls_md2_ret,
278 md2_ctx_alloc,
279 md2_ctx_free,
280 md2_clone_wrap,
281 md2_process_wrap,
282};
Hanno Becker1292c352019-08-13 15:43:26 +0100283#endif /* !MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100284
285#endif /* MBEDTLS_MD2_C */
286
287/*
288 * MD-4
289 */
290
291#if defined(MBEDTLS_MD4_C)
292
293static int md4_starts_wrap( void *ctx )
294{
295 return( mbedtls_md4_starts_ret( (mbedtls_md4_context *) ctx ) );
296}
297
298static int md4_update_wrap( void *ctx, const unsigned char *input,
299 size_t ilen )
300{
301 return( mbedtls_md4_update_ret( (mbedtls_md4_context *) ctx, input, ilen ) );
302}
303
304static int md4_finish_wrap( void *ctx, unsigned char *output )
305{
306 return( mbedtls_md4_finish_ret( (mbedtls_md4_context *) ctx, output ) );
307}
308
309static void *md4_ctx_alloc( void )
310{
311 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md4_context ) );
312
313 if( ctx != NULL )
314 mbedtls_md4_init( (mbedtls_md4_context *) ctx );
315
316 return( ctx );
317}
318
319static void md4_ctx_free( void *ctx )
320{
321 mbedtls_md4_free( (mbedtls_md4_context *) ctx );
322 mbedtls_free( ctx );
323}
324
325static void md4_clone_wrap( void *dst, const void *src )
326{
327 mbedtls_md4_clone( (mbedtls_md4_context *) dst,
328 (const mbedtls_md4_context *) src );
329}
330
331static int md4_process_wrap( void *ctx, const unsigned char *data )
332{
333 return( mbedtls_internal_md4_process( (mbedtls_md4_context *) ctx, data ) );
334}
335
Hanno Becker1292c352019-08-13 15:43:26 +0100336#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100337const mbedtls_md_info_t mbedtls_md4_info = {
338 MBEDTLS_MD_MD4,
339 "MD4",
340 16,
341 64,
342 md4_starts_wrap,
343 md4_update_wrap,
344 md4_finish_wrap,
345 mbedtls_md4_ret,
346 md4_ctx_alloc,
347 md4_ctx_free,
348 md4_clone_wrap,
349 md4_process_wrap,
350};
Hanno Becker1292c352019-08-13 15:43:26 +0100351#endif /* MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100352
353#endif /* MBEDTLS_MD4_C */
354
355/*
356 * MD-5
357 */
358
359#if defined(MBEDTLS_MD5_C)
360
361static int md5_starts_wrap( void *ctx )
362{
363 return( mbedtls_md5_starts_ret( (mbedtls_md5_context *) ctx ) );
364}
365
366static int md5_update_wrap( void *ctx, const unsigned char *input,
367 size_t ilen )
368{
369 return( mbedtls_md5_update_ret( (mbedtls_md5_context *) ctx, input, ilen ) );
370}
371
372static int md5_finish_wrap( void *ctx, unsigned char *output )
373{
374 return( mbedtls_md5_finish_ret( (mbedtls_md5_context *) ctx, output ) );
375}
376
377static void *md5_ctx_alloc( void )
378{
379 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md5_context ) );
380
381 if( ctx != NULL )
382 mbedtls_md5_init( (mbedtls_md5_context *) ctx );
383
384 return( ctx );
385}
386
387static void md5_ctx_free( void *ctx )
388{
389 mbedtls_md5_free( (mbedtls_md5_context *) ctx );
390 mbedtls_free( ctx );
391}
392
393static void md5_clone_wrap( void *dst, const void *src )
394{
395 mbedtls_md5_clone( (mbedtls_md5_context *) dst,
396 (const mbedtls_md5_context *) src );
397}
398
399static int md5_process_wrap( void *ctx, const unsigned char *data )
400{
401 return( mbedtls_internal_md5_process( (mbedtls_md5_context *) ctx, data ) );
402}
403
Hanno Becker1292c352019-08-13 15:43:26 +0100404#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100405const mbedtls_md_info_t mbedtls_md5_info = {
406 MBEDTLS_MD_MD5,
407 "MD5",
408 16,
409 64,
410 md5_starts_wrap,
411 md5_update_wrap,
412 md5_finish_wrap,
413 mbedtls_md5_ret,
414 md5_ctx_alloc,
415 md5_ctx_free,
416 md5_clone_wrap,
417 md5_process_wrap,
418};
Hanno Becker1292c352019-08-13 15:43:26 +0100419#endif /* MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100420
421#endif /* MBEDTLS_MD5_C */
422
423/*
424 * RIPEMD-160
425 */
426
427#if defined(MBEDTLS_RIPEMD160_C)
428
429static int ripemd160_starts_wrap( void *ctx )
430{
431 return( mbedtls_ripemd160_starts_ret( (mbedtls_ripemd160_context *) ctx ) );
432}
433
434static int ripemd160_update_wrap( void *ctx, const unsigned char *input,
435 size_t ilen )
436{
437 return( mbedtls_ripemd160_update_ret( (mbedtls_ripemd160_context *) ctx,
438 input, ilen ) );
439}
440
441static int ripemd160_finish_wrap( void *ctx, unsigned char *output )
442{
443 return( mbedtls_ripemd160_finish_ret( (mbedtls_ripemd160_context *) ctx,
444 output ) );
445}
446
447static void *ripemd160_ctx_alloc( void )
448{
449 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ripemd160_context ) );
450
451 if( ctx != NULL )
452 mbedtls_ripemd160_init( (mbedtls_ripemd160_context *) ctx );
453
454 return( ctx );
455}
456
457static void ripemd160_ctx_free( void *ctx )
458{
459 mbedtls_ripemd160_free( (mbedtls_ripemd160_context *) ctx );
460 mbedtls_free( ctx );
461}
462
463static void ripemd160_clone_wrap( void *dst, const void *src )
464{
465 mbedtls_ripemd160_clone( (mbedtls_ripemd160_context *) dst,
466 (const mbedtls_ripemd160_context *) src );
467}
468
469static int ripemd160_process_wrap( void *ctx, const unsigned char *data )
470{
471 return( mbedtls_internal_ripemd160_process(
472 (mbedtls_ripemd160_context *) ctx, data ) );
473}
474
Hanno Becker1292c352019-08-13 15:43:26 +0100475#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100476const mbedtls_md_info_t mbedtls_ripemd160_info = {
477 MBEDTLS_MD_RIPEMD160,
478 "RIPEMD160",
479 20,
480 64,
481 ripemd160_starts_wrap,
482 ripemd160_update_wrap,
483 ripemd160_finish_wrap,
484 mbedtls_ripemd160_ret,
485 ripemd160_ctx_alloc,
486 ripemd160_ctx_free,
487 ripemd160_clone_wrap,
488 ripemd160_process_wrap,
489};
Hanno Becker1292c352019-08-13 15:43:26 +0100490#endif /* !MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100491
492#endif /* MBEDTLS_RIPEMD160_C */
493
494/*
495 * SHA-1
496 */
497
498#if defined(MBEDTLS_SHA1_C)
499
500static int sha1_starts_wrap( void *ctx )
501{
502 return( mbedtls_sha1_starts_ret( (mbedtls_sha1_context *) ctx ) );
503}
504
505static int sha1_update_wrap( void *ctx, const unsigned char *input,
506 size_t ilen )
507{
508 return( mbedtls_sha1_update_ret( (mbedtls_sha1_context *) ctx,
509 input, ilen ) );
510}
511
512static int sha1_finish_wrap( void *ctx, unsigned char *output )
513{
514 return( mbedtls_sha1_finish_ret( (mbedtls_sha1_context *) ctx, output ) );
515}
516
517static void *sha1_ctx_alloc( void )
518{
519 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha1_context ) );
520
521 if( ctx != NULL )
522 mbedtls_sha1_init( (mbedtls_sha1_context *) ctx );
523
524 return( ctx );
525}
526
527static void sha1_clone_wrap( void *dst, const void *src )
528{
529 mbedtls_sha1_clone( (mbedtls_sha1_context *) dst,
530 (const mbedtls_sha1_context *) src );
531}
532
533static void sha1_ctx_free( void *ctx )
534{
535 mbedtls_sha1_free( (mbedtls_sha1_context *) ctx );
536 mbedtls_free( ctx );
537}
538
539static int sha1_process_wrap( void *ctx, const unsigned char *data )
540{
541 return( mbedtls_internal_sha1_process( (mbedtls_sha1_context *) ctx,
542 data ) );
543}
544
Hanno Becker1292c352019-08-13 15:43:26 +0100545#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100546const mbedtls_md_info_t mbedtls_sha1_info = {
547 MBEDTLS_MD_SHA1,
548 "SHA1",
549 20,
550 64,
551 sha1_starts_wrap,
552 sha1_update_wrap,
553 sha1_finish_wrap,
554 mbedtls_sha1_ret,
555 sha1_ctx_alloc,
556 sha1_ctx_free,
557 sha1_clone_wrap,
558 sha1_process_wrap,
559};
Hanno Becker1292c352019-08-13 15:43:26 +0100560#endif /* !MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100561
562#endif /* MBEDTLS_SHA1_C */
563
564/*
565 * SHA-224 and SHA-256
566 */
567
568#if defined(MBEDTLS_SHA256_C)
569
570#if !defined(MBEDTLS_SHA256_NO_SHA224)
571static int sha224_starts_wrap( void *ctx )
572{
573 return( mbedtls_sha256_starts_ret( (mbedtls_sha256_context *) ctx, 1 ) );
574}
575#endif /* !MBEDTLS_SHA256_NO_SHA224 */
576
577static int sha224_update_wrap( void *ctx, const unsigned char *input,
578 size_t ilen )
579{
580 return( mbedtls_sha256_update_ret( (mbedtls_sha256_context *) ctx,
581 input, ilen ) );
582}
583
584static int sha224_finish_wrap( void *ctx, unsigned char *output )
585{
586 return( mbedtls_sha256_finish_ret( (mbedtls_sha256_context *) ctx,
587 output ) );
588}
589
590#if !defined(MBEDTLS_SHA256_NO_SHA224)
591static int sha224_wrap( const unsigned char *input, size_t ilen,
592 unsigned char *output )
593{
594 return( mbedtls_sha256_ret( input, ilen, output, 1 ) );
595}
596#endif /* !MBEDTLS_SHA256_NO_SHA224 */
597
598static void *sha224_ctx_alloc( void )
599{
600 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha256_context ) );
601
602 if( ctx != NULL )
603 mbedtls_sha256_init( (mbedtls_sha256_context *) ctx );
604
605 return( ctx );
606}
607
608static void sha224_ctx_free( void *ctx )
609{
610 mbedtls_sha256_free( (mbedtls_sha256_context *) ctx );
611 mbedtls_free( ctx );
612}
613
614static void sha224_clone_wrap( void *dst, const void *src )
615{
616 mbedtls_sha256_clone( (mbedtls_sha256_context *) dst,
617 (const mbedtls_sha256_context *) src );
618}
619
620static int sha224_process_wrap( void *ctx, const unsigned char *data )
621{
622 return( mbedtls_internal_sha256_process( (mbedtls_sha256_context *) ctx,
623 data ) );
624}
625
Hanno Becker1292c352019-08-13 15:43:26 +0100626#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100627#if !defined(MBEDTLS_SHA256_NO_SHA224)
628const mbedtls_md_info_t mbedtls_sha224_info = {
629 MBEDTLS_MD_SHA224,
630 "SHA224",
631 28,
632 64,
633 sha224_starts_wrap,
634 sha224_update_wrap,
635 sha224_finish_wrap,
636 sha224_wrap,
637 sha224_ctx_alloc,
638 sha224_ctx_free,
639 sha224_clone_wrap,
640 sha224_process_wrap,
641};
642#endif /* !MBEDTLS_SHA256_NO_SHA224 */
Hanno Becker1292c352019-08-13 15:43:26 +0100643#endif /* !MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100644
645static int sha256_starts_wrap( void *ctx )
646{
647 return( mbedtls_sha256_starts_ret( (mbedtls_sha256_context *) ctx, 0 ) );
648}
649
650static int sha256_wrap( const unsigned char *input, size_t ilen,
651 unsigned char *output )
652{
653 return( mbedtls_sha256_ret( input, ilen, output, 0 ) );
654}
655
Hanno Becker1292c352019-08-13 15:43:26 +0100656#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100657const mbedtls_md_info_t mbedtls_sha256_info =
658 MBEDTLS_MD_INFO( MBEDTLS_MD_INFO_SHA256 );
Hanno Becker1292c352019-08-13 15:43:26 +0100659#endif /* !MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100660
661#endif /* MBEDTLS_SHA256_C */
662
663/*
664 * SHA-384 and SHA-512
665 */
666
667#if defined(MBEDTLS_SHA512_C)
668
669static int sha384_starts_wrap( void *ctx )
670{
671 return( mbedtls_sha512_starts_ret( (mbedtls_sha512_context *) ctx, 1 ) );
672}
673
674static int sha384_update_wrap( void *ctx, const unsigned char *input,
675 size_t ilen )
676{
677 return( mbedtls_sha512_update_ret( (mbedtls_sha512_context *) ctx,
678 input, ilen ) );
679}
680
681static int sha384_finish_wrap( void *ctx, unsigned char *output )
682{
683 return( mbedtls_sha512_finish_ret( (mbedtls_sha512_context *) ctx,
684 output ) );
685}
686
687static int sha384_wrap( const unsigned char *input, size_t ilen,
688 unsigned char *output )
689{
690 return( mbedtls_sha512_ret( input, ilen, output, 1 ) );
691}
692
693static void *sha384_ctx_alloc( void )
694{
695 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha512_context ) );
696
697 if( ctx != NULL )
698 mbedtls_sha512_init( (mbedtls_sha512_context *) ctx );
699
700 return( ctx );
701}
702
703static void sha384_ctx_free( void *ctx )
704{
705 mbedtls_sha512_free( (mbedtls_sha512_context *) ctx );
706 mbedtls_free( ctx );
707}
708
709static void sha384_clone_wrap( void *dst, const void *src )
710{
711 mbedtls_sha512_clone( (mbedtls_sha512_context *) dst,
712 (const mbedtls_sha512_context *) src );
713}
714
715static int sha384_process_wrap( void *ctx, const unsigned char *data )
716{
717 return( mbedtls_internal_sha512_process( (mbedtls_sha512_context *) ctx,
718 data ) );
719}
720
Hanno Becker1292c352019-08-13 15:43:26 +0100721#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100722const mbedtls_md_info_t mbedtls_sha384_info = {
723 MBEDTLS_MD_SHA384,
724 "SHA384",
725 48,
726 128,
727 sha384_starts_wrap,
728 sha384_update_wrap,
729 sha384_finish_wrap,
730 sha384_wrap,
731 sha384_ctx_alloc,
732 sha384_ctx_free,
733 sha384_clone_wrap,
734 sha384_process_wrap,
735};
Hanno Becker1292c352019-08-13 15:43:26 +0100736#endif /* MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100737
738static int sha512_starts_wrap( void *ctx )
739{
740 return( mbedtls_sha512_starts_ret( (mbedtls_sha512_context *) ctx, 0 ) );
741}
742
743static int sha512_wrap( const unsigned char *input, size_t ilen,
744 unsigned char *output )
745{
746 return( mbedtls_sha512_ret( input, ilen, output, 0 ) );
747}
748
Hanno Becker1292c352019-08-13 15:43:26 +0100749#if !defined(MBEDTLS_MD_SINGLE_HASH)
Hanno Beckerd03949e2019-07-26 14:38:44 +0100750const mbedtls_md_info_t mbedtls_sha512_info = {
751 MBEDTLS_MD_SHA512,
752 "SHA512",
753 64,
754 128,
755 sha512_starts_wrap,
756 sha384_update_wrap,
757 sha384_finish_wrap,
758 sha512_wrap,
759 sha384_ctx_alloc,
760 sha384_ctx_free,
761 sha384_clone_wrap,
762 sha384_process_wrap,
763};
Hanno Becker1292c352019-08-13 15:43:26 +0100764#endif /* MBEDTLS_MD_SINGLE_HASH */
Hanno Beckerd03949e2019-07-26 14:38:44 +0100765
766#endif /* MBEDTLS_SHA512_C */
767
768/*
769 * Getter functions for MD info structure.
770 */
771
Hanno Becker1292c352019-08-13 15:43:26 +0100772#if !defined(MBEDTLS_MD_SINGLE_HASH)
773
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100774MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_type_t mbedtls_md_info_type(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100775 mbedtls_md_handle_t info )
776{
777 return( info->type );
778}
779
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100780MBEDTLS_ALWAYS_INLINE static inline const char * mbedtls_md_info_name(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100781 mbedtls_md_handle_t info )
782{
783 return( info->name );
784}
785
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100786MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_size(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100787 mbedtls_md_handle_t info )
788{
789 return( info->size );
790}
791
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100792MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_block_size(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100793 mbedtls_md_handle_t info )
794{
795 return( info->block_size );
796}
797
Hanno Becker3a98eab2019-09-04 11:15:02 +0100798MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_starts( mbedtls_md_handle_t info,
799 void *ctx )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100800{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100801 return( info->starts_func( ctx ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100802}
803
Hanno Becker3a98eab2019-09-04 11:15:02 +0100804MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_update( mbedtls_md_handle_t info,
805 void *ctx,
806 const unsigned char *input,
807 size_t ilen )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100808{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100809 return( info->update_func( ctx, input, ilen ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100810}
811
Hanno Becker3a98eab2019-09-04 11:15:02 +0100812MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_finish( mbedtls_md_handle_t info,
813 void *ctx,
814 unsigned char *output )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100815{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100816 return( info->finish_func( ctx, output ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100817}
818
Hanno Becker3a98eab2019-09-04 11:15:02 +0100819MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_digest( mbedtls_md_handle_t info,
820 const unsigned char *input,
821 size_t ilen,
822 unsigned char *output )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100823{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100824 return( info->digest_func( input, ilen, output ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100825}
826
Hanno Becker3a98eab2019-09-04 11:15:02 +0100827MBEDTLS_ALWAYS_INLINE static inline void* mbedtls_md_info_ctx_alloc( mbedtls_md_handle_t info )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100828{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100829 return( info->ctx_alloc_func() );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100830}
831
Hanno Becker3a98eab2019-09-04 11:15:02 +0100832MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_ctx_free( mbedtls_md_handle_t info,
833 void *ctx )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100834{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100835 info->ctx_free_func( ctx );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100836}
837
Hanno Becker3a98eab2019-09-04 11:15:02 +0100838MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_clone( mbedtls_md_handle_t info,
839 void *dst,
840 const void *src )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100841{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100842 info->clone_func( dst, src );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100843}
844
Hanno Becker3a98eab2019-09-04 11:15:02 +0100845MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_process( mbedtls_md_handle_t info,
846 void *ctx,
847 const unsigned char *input )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100848{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100849 return( info->process_func( ctx, input ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100850}
Hanno Becker0e7fc312019-07-17 11:23:12 +0100851
Hanno Becker1292c352019-08-13 15:43:26 +0100852#else /* !MBEDTLS_MD_SINGLE_HASH */
853
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100854MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_type_t mbedtls_md_info_type(
Hanno Becker1292c352019-08-13 15:43:26 +0100855 mbedtls_md_handle_t info )
856{
857 ((void) info);
858 return( MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH ) );
859}
860
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100861MBEDTLS_ALWAYS_INLINE static inline const char * mbedtls_md_info_name(
Hanno Becker1292c352019-08-13 15:43:26 +0100862 mbedtls_md_handle_t info )
863{
864 ((void) info);
865 return( MBEDTLS_MD_INFO_NAME( MBEDTLS_MD_SINGLE_HASH ) );
866}
867
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100868MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_size(
Hanno Becker1292c352019-08-13 15:43:26 +0100869 mbedtls_md_handle_t info )
870{
871 ((void) info);
872 return( MBEDTLS_MD_INFO_SIZE( MBEDTLS_MD_SINGLE_HASH ) );
873}
874
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100875MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_block_size(
Hanno Becker1292c352019-08-13 15:43:26 +0100876 mbedtls_md_handle_t info )
877{
878 ((void) info);
879 return( MBEDTLS_MD_INFO_BLOCKSIZE( MBEDTLS_MD_SINGLE_HASH ) );
880}
881
Hanno Becker3a98eab2019-09-04 11:15:02 +0100882MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_starts( mbedtls_md_handle_t info,
883 void *ctx )
Hanno Becker1292c352019-08-13 15:43:26 +0100884{
885 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100886 return( MBEDTLS_MD_INFO_STARTS_FUNC( MBEDTLS_MD_SINGLE_HASH )( ctx ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100887}
888
Hanno Becker3a98eab2019-09-04 11:15:02 +0100889MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_update( mbedtls_md_handle_t info,
890 void *ctx,
891 const unsigned char *input,
892 size_t ilen )
Hanno Becker1292c352019-08-13 15:43:26 +0100893{
894 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100895 return( MBEDTLS_MD_INFO_UPDATE_FUNC( MBEDTLS_MD_SINGLE_HASH )
896 ( ctx, input, ilen ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100897}
898
Hanno Becker3a98eab2019-09-04 11:15:02 +0100899MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_finish( mbedtls_md_handle_t info,
900 void *ctx,
901 unsigned char *output )
Hanno Becker1292c352019-08-13 15:43:26 +0100902{
903 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100904 return( MBEDTLS_MD_INFO_FINISH_FUNC( MBEDTLS_MD_SINGLE_HASH )
905 ( ctx, output ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100906}
907
Hanno Becker3a98eab2019-09-04 11:15:02 +0100908MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_digest( mbedtls_md_handle_t info,
909 const unsigned char *input,
910 size_t ilen,
911 unsigned char *output )
Hanno Becker1292c352019-08-13 15:43:26 +0100912{
913 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100914 return( MBEDTLS_MD_INFO_DIGEST_FUNC( MBEDTLS_MD_SINGLE_HASH )
915 ( input, ilen, output ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100916}
917
Hanno Becker3a98eab2019-09-04 11:15:02 +0100918MBEDTLS_ALWAYS_INLINE static inline void* mbedtls_md_info_ctx_alloc( mbedtls_md_handle_t info )
Hanno Becker1292c352019-08-13 15:43:26 +0100919{
920 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100921 return( MBEDTLS_MD_INFO_ALLOC_FUNC( MBEDTLS_MD_SINGLE_HASH )() );
Hanno Becker1292c352019-08-13 15:43:26 +0100922}
923
Hanno Becker3a98eab2019-09-04 11:15:02 +0100924MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_ctx_free( mbedtls_md_handle_t info,
925 void *ctx )
Hanno Becker1292c352019-08-13 15:43:26 +0100926{
927 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100928 MBEDTLS_MD_INFO_FREE_FUNC( MBEDTLS_MD_SINGLE_HASH )( ctx );
Hanno Becker1292c352019-08-13 15:43:26 +0100929}
930
Hanno Becker3a98eab2019-09-04 11:15:02 +0100931MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_clone( mbedtls_md_handle_t info,
932 void *dst,
933 const void *src )
Hanno Becker1292c352019-08-13 15:43:26 +0100934{
935 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100936 MBEDTLS_MD_INFO_CLONE_FUNC( MBEDTLS_MD_SINGLE_HASH )( dst, src );
Hanno Becker1292c352019-08-13 15:43:26 +0100937}
938
Hanno Becker3a98eab2019-09-04 11:15:02 +0100939MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_process( mbedtls_md_handle_t info,
940 void *ctx,
941 const unsigned char *input )
Hanno Becker1292c352019-08-13 15:43:26 +0100942{
943 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100944 return( MBEDTLS_MD_INFO_PROCESS_FUNC( MBEDTLS_MD_SINGLE_HASH )
945 ( ctx, input ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100946}
947
948#endif /* MBEDTLS_MD_SINGLE_HASH */
949
950#if !defined(MBEDTLS_MD_SINGLE_HASH)
951
Manuel Pégourié-Gonnard88db5da2015-06-15 14:34:59 +0200952/*
953 * Reminder: update profiles in x509_crt.c when adding a new hash!
954 */
Paul Bakker72f62662011-01-16 21:27:44 +0000955static const int supported_digests[] = {
956
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957#if defined(MBEDTLS_SHA512_C)
958 MBEDTLS_MD_SHA512,
959 MBEDTLS_MD_SHA384,
Paul Bakker72f62662011-01-16 21:27:44 +0000960#endif
961
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200962#if defined(MBEDTLS_SHA256_C)
963 MBEDTLS_MD_SHA256,
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200964#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200965 MBEDTLS_MD_SHA224,
Paul Bakker72f62662011-01-16 21:27:44 +0000966#endif
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200967#endif /* MBEDTLS_SHA256_C */
Paul Bakker72f62662011-01-16 21:27:44 +0000968
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200969#if defined(MBEDTLS_SHA1_C)
970 MBEDTLS_MD_SHA1,
Paul Bakker72f62662011-01-16 21:27:44 +0000971#endif
972
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973#if defined(MBEDTLS_RIPEMD160_C)
974 MBEDTLS_MD_RIPEMD160,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200975#endif
976
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200977#if defined(MBEDTLS_MD5_C)
978 MBEDTLS_MD_MD5,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200979#endif
980
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200981#if defined(MBEDTLS_MD4_C)
982 MBEDTLS_MD_MD4,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200983#endif
984
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985#if defined(MBEDTLS_MD2_C)
986 MBEDTLS_MD_MD2,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200987#endif
988
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989 MBEDTLS_MD_NONE
Paul Bakker72f62662011-01-16 21:27:44 +0000990};
991
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992const int *mbedtls_md_list( void )
Paul Bakker72f62662011-01-16 21:27:44 +0000993{
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200994 return( supported_digests );
Paul Bakker72f62662011-01-16 21:27:44 +0000995}
996
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100997mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
Paul Bakker17373852011-01-06 14:20:01 +0000998{
999 if( NULL == md_name )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001000 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001001
1002 /* Get the appropriate digest information */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001003#if defined(MBEDTLS_MD2_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001004 if( !strcmp( "MD2", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001005 return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );
Paul Bakker17373852011-01-06 14:20:01 +00001006#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001007#if defined(MBEDTLS_MD4_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001008 if( !strcmp( "MD4", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009 return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );
Paul Bakker17373852011-01-06 14:20:01 +00001010#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001011#if defined(MBEDTLS_MD5_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001012 if( !strcmp( "MD5", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001013 return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );
Paul Bakker17373852011-01-06 14:20:01 +00001014#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001015#if defined(MBEDTLS_RIPEMD160_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001016 if( !strcmp( "RIPEMD160", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001017 return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +01001018#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001019#if defined(MBEDTLS_SHA1_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001020 if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
Paul Bakker17373852011-01-06 14:20:01 +00001022#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001023#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001024#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001025 if( !strcmp( "SHA224", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001026 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001027#endif
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001028 if( !strcmp( "SHA256", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001030#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001031#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001032 if( !strcmp( "SHA384", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001033 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001034 if( !strcmp( "SHA512", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );
Paul Bakker17373852011-01-06 14:20:01 +00001036#endif
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001037 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001038}
1039
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001040mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
Paul Bakker17373852011-01-06 14:20:01 +00001041{
1042 switch( md_type )
1043 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001044#if defined(MBEDTLS_MD2_C)
1045 case MBEDTLS_MD_MD2:
1046 return( &mbedtls_md2_info );
Paul Bakker17373852011-01-06 14:20:01 +00001047#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048#if defined(MBEDTLS_MD4_C)
1049 case MBEDTLS_MD_MD4:
1050 return( &mbedtls_md4_info );
Paul Bakker17373852011-01-06 14:20:01 +00001051#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001052#if defined(MBEDTLS_MD5_C)
1053 case MBEDTLS_MD_MD5:
1054 return( &mbedtls_md5_info );
Paul Bakker17373852011-01-06 14:20:01 +00001055#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056#if defined(MBEDTLS_RIPEMD160_C)
1057 case MBEDTLS_MD_RIPEMD160:
1058 return( &mbedtls_ripemd160_info );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +01001059#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060#if defined(MBEDTLS_SHA1_C)
1061 case MBEDTLS_MD_SHA1:
1062 return( &mbedtls_sha1_info );
Paul Bakker17373852011-01-06 14:20:01 +00001063#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001064#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001065#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066 case MBEDTLS_MD_SHA224:
1067 return( &mbedtls_sha224_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001068#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069 case MBEDTLS_MD_SHA256:
1070 return( &mbedtls_sha256_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001071#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001072#if defined(MBEDTLS_SHA512_C)
1073 case MBEDTLS_MD_SHA384:
1074 return( &mbedtls_sha384_info );
1075 case MBEDTLS_MD_SHA512:
1076 return( &mbedtls_sha512_info );
Paul Bakker17373852011-01-06 14:20:01 +00001077#endif
1078 default:
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001079 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001080 }
1081}
1082
Hanno Becker1292c352019-08-13 15:43:26 +01001083#else /* MBEDTLS_MD_SINGLE_HASH */
1084
1085const int *mbedtls_md_list( void )
1086{
1087 static int single_hash[2] =
1088 { MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH ),
1089 MBEDTLS_MD_INVALID_HANDLE };
1090
1091 return( single_hash );
1092}
1093
1094mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
1095{
1096 static const char * const hash_name =
1097 MBEDTLS_MD_INFO_NAME( MBEDTLS_MD_SINGLE_HASH );
1098
1099 if( md_name != NULL && strcmp( hash_name, md_name ) == 0 )
1100 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
1101
1102 return( MBEDTLS_MD_INVALID_HANDLE );
1103}
1104
1105mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
1106{
1107 static const mbedtls_md_type_t hash_type =
1108 MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH );
1109
1110 if( hash_type == md_type )
1111 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
1112
1113 return( MBEDTLS_MD_INVALID_HANDLE );
1114}
1115
1116#endif /* MBEDTLS_MD_SINGLE_HASH */
1117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001118void mbedtls_md_init( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001119{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001120 memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02001121}
1122
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001123void mbedtls_md_free( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001124{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001125 if( ctx == NULL || mbedtls_md_get_handle( ctx ) == MBEDTLS_MD_INVALID_HANDLE )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001126 return;
1127
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001128 if( ctx->md_ctx != NULL )
Hanno Beckerd3827c72019-09-03 12:56:37 +01001129 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001130 mbedtls_md_info_ctx_free( mbedtls_md_get_handle( ctx ), ctx->md_ctx );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001131 }
Paul Bakker84bbeb52014-07-01 14:53:22 +02001132
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001133 if( ctx->hmac_ctx != NULL )
1134 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001135 mbedtls_platform_zeroize( ctx->hmac_ctx,
Hanno Beckerd3827c72019-09-03 12:56:37 +01001136 2 * mbedtls_md_info_block_size( mbedtls_md_get_handle( ctx ) ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137 mbedtls_free( ctx->hmac_ctx );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001138 }
1139
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001140 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02001141}
1142
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001143int mbedtls_md_clone( mbedtls_md_context_t *dst,
1144 const mbedtls_md_context_t *src )
1145{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001146 if( dst == NULL || mbedtls_md_get_handle( dst ) == MBEDTLS_MD_INVALID_HANDLE ||
1147 src == NULL || mbedtls_md_get_handle( src ) == MBEDTLS_MD_INVALID_HANDLE ||
1148 mbedtls_md_get_handle( dst ) != mbedtls_md_get_handle( src ) )
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001149 {
1150 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1151 }
1152
Hanno Becker3a98eab2019-09-04 11:15:02 +01001153 mbedtls_md_info_clone( mbedtls_md_get_handle( dst ),
1154 dst->md_ctx, src->md_ctx );
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001155 return( 0 );
1156}
1157
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001158#if ! defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001159int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +01001160{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001161 return mbedtls_md_setup( ctx, md_info, 1 );
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +01001162}
1163#endif
1164
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001165int mbedtls_md_setup( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info, int hmac )
Paul Bakker17373852011-01-06 14:20:01 +00001166{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001167 if( md_info == MBEDTLS_MD_INVALID_HANDLE || ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001168 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001169
Hanno Becker3a98eab2019-09-04 11:15:02 +01001170 ctx->md_ctx = mbedtls_md_info_ctx_alloc( md_info );
Hanno Becker530387e2019-07-17 14:10:26 +01001171 if( ctx->md_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001172 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
Paul Bakker17373852011-01-06 14:20:01 +00001173
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001174 if( hmac != 0 )
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001175 {
Hanno Beckerd3827c72019-09-03 12:56:37 +01001176 ctx->hmac_ctx = mbedtls_calloc( 2,
1177 mbedtls_md_info_block_size( md_info ) );
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001178 if( ctx->hmac_ctx == NULL )
1179 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001180 mbedtls_md_info_ctx_free( md_info, ctx->md_ctx );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001181 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001182 }
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001183 }
1184
Hanno Beckerccb2b622019-09-03 13:19:14 +01001185#if !defined(MBEDTLS_MD_SINGLE_HASH)
Paul Bakker17373852011-01-06 14:20:01 +00001186 ctx->md_info = md_info;
Hanno Beckerccb2b622019-09-03 13:19:14 +01001187#endif
Paul Bakker17373852011-01-06 14:20:01 +00001188
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001189 return( 0 );
Paul Bakker17373852011-01-06 14:20:01 +00001190}
1191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001192int mbedtls_md_starts( mbedtls_md_context_t *ctx )
Paul Bakker562535d2011-01-20 16:42:01 +00001193{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001194 mbedtls_md_handle_t md_info;
1195 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001196 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker562535d2011-01-20 16:42:01 +00001197
Hanno Beckerd3827c72019-09-03 12:56:37 +01001198 md_info = mbedtls_md_get_handle( ctx );
1199 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1200 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1201
Hanno Becker3a98eab2019-09-04 11:15:02 +01001202 return( mbedtls_md_info_starts( md_info, ctx->md_ctx ) );
Paul Bakker562535d2011-01-20 16:42:01 +00001203}
1204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001205int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +00001206{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001207 mbedtls_md_handle_t md_info;
1208 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001209 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001210
Hanno Beckerd3827c72019-09-03 12:56:37 +01001211 md_info = mbedtls_md_get_handle( ctx );
1212 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1213 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1214
Hanno Becker3a98eab2019-09-04 11:15:02 +01001215 return( mbedtls_md_info_update( md_info, ctx->md_ctx,
1216 input, ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +00001217}
1218
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001219int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001220{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001221 mbedtls_md_handle_t md_info;
1222 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001223 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001224
Hanno Beckerd3827c72019-09-03 12:56:37 +01001225 md_info = mbedtls_md_get_handle( ctx );
1226 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1227 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1228
Hanno Becker3a98eab2019-09-04 11:15:02 +01001229 return( mbedtls_md_info_finish( md_info, ctx->md_ctx,
1230 output ) );
Paul Bakker17373852011-01-06 14:20:01 +00001231}
1232
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001233int mbedtls_md( mbedtls_md_handle_t md_info, const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +00001234 unsigned char *output )
1235{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001236 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001237 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001238
Hanno Becker3a98eab2019-09-04 11:15:02 +01001239 return( mbedtls_md_info_digest( md_info, input,
1240 ilen, output) );
Paul Bakker17373852011-01-06 14:20:01 +00001241}
1242
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001243#if defined(MBEDTLS_FS_IO)
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001244int mbedtls_md_file( mbedtls_md_handle_t md_info, const char *path, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001245{
Paul Bakker9c021ad2011-06-09 15:55:11 +00001246 int ret;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001247 FILE *f;
1248 size_t n;
1249 mbedtls_md_context_t ctx;
1250 unsigned char buf[1024];
Paul Bakker9c021ad2011-06-09 15:55:11 +00001251
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001252 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001254
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001255 if( ( f = fopen( path, "rb" ) ) == NULL )
Manuel Pégourié-Gonnardbcc03082015-06-24 00:09:29 +02001256 return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
1257
1258 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001259
1260 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
1261 goto cleanup;
1262
Hanno Becker3a98eab2019-09-04 11:15:02 +01001263 ret = mbedtls_md_info_starts( md_info, ctx.md_ctx );
Hanno Becker530387e2019-07-17 14:10:26 +01001264 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001265 goto cleanup;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001266
1267 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001268 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001269 ret = mbedtls_md_info_update( md_info, ctx.md_ctx,
1270 buf, n );
Hanno Becker530387e2019-07-17 14:10:26 +01001271 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001272 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +01001273 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001274
1275 if( ferror( f ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001276 {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001277 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Hanno Becker530387e2019-07-17 14:10:26 +01001278 }
Andres Amaya Garciaeb132b62017-06-23 16:30:31 +01001279 else
Hanno Becker530387e2019-07-17 14:10:26 +01001280 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001281 ret = mbedtls_md_info_finish( md_info, ctx.md_ctx,
1282 output );
Hanno Becker530387e2019-07-17 14:10:26 +01001283 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001284
1285cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001286 mbedtls_platform_zeroize( buf, sizeof( buf ) );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001287 fclose( f );
1288 mbedtls_md_free( &ctx );
Paul Bakker9c021ad2011-06-09 15:55:11 +00001289
Paul Bakker8913f822012-01-14 18:07:41 +00001290 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001291}
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001292#endif /* MBEDTLS_FS_IO */
Paul Bakker17373852011-01-06 14:20:01 +00001293
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001294int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
Paul Bakker17373852011-01-06 14:20:01 +00001295{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001296 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001297 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001298 unsigned char *ipad, *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001299 size_t i;
1300
Hanno Beckerd3827c72019-09-03 12:56:37 +01001301 mbedtls_md_handle_t md_info;
1302
1303 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001304 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001305
Hanno Beckerd3827c72019-09-03 12:56:37 +01001306 md_info = mbedtls_md_get_handle( ctx );
1307 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1308 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Becker530387e2019-07-17 14:10:26 +01001309
Hanno Beckerd3827c72019-09-03 12:56:37 +01001310 if( keylen > (size_t) mbedtls_md_info_block_size( md_info ) )
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001311 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001312 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001313 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001314
Hanno Becker3a98eab2019-09-04 11:15:02 +01001315 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx,
1316 key, keylen ) ) != 0 )
1317 {
Hanno Becker530387e2019-07-17 14:10:26 +01001318 goto cleanup;
Hanno Becker3a98eab2019-09-04 11:15:02 +01001319 }
Hanno Becker530387e2019-07-17 14:10:26 +01001320
Hanno Becker3a98eab2019-09-04 11:15:02 +01001321 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, sum ) ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001322 goto cleanup;
1323
Hanno Beckerd3827c72019-09-03 12:56:37 +01001324 keylen = mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001325 key = sum;
1326 }
1327
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001328 ipad = (unsigned char *) ctx->hmac_ctx;
Hanno Beckerd3827c72019-09-03 12:56:37 +01001329 opad = (unsigned char *) ctx->hmac_ctx +
1330 mbedtls_md_info_block_size( md_info );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001331
Hanno Beckerd3827c72019-09-03 12:56:37 +01001332 memset( ipad, 0x36, mbedtls_md_info_block_size( md_info ) );
1333 memset( opad, 0x5C, mbedtls_md_info_block_size( md_info ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001334
1335 for( i = 0; i < keylen; i++ )
1336 {
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001337 ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
1338 opad[i] = (unsigned char)( opad[i] ^ key[i] );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001339 }
1340
Hanno Becker3a98eab2019-09-04 11:15:02 +01001341 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001342 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +01001343
Hanno Becker3a98eab2019-09-04 11:15:02 +01001344 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, ipad,
Hanno Beckerd3827c72019-09-03 12:56:37 +01001345 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
1346 {
Andres Amaya Garcia42e5e102017-07-20 16:27:03 +01001347 goto cleanup;
Hanno Beckerd3827c72019-09-03 12:56:37 +01001348 }
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001349
1350cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001351 mbedtls_platform_zeroize( sum, sizeof( sum ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001352
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001353 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001354}
1355
Hanno Beckerd3827c72019-09-03 12:56:37 +01001356int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx,
1357 const unsigned char *input, size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +00001358{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001359 mbedtls_md_handle_t md_info;
Paul Bakker17373852011-01-06 14:20:01 +00001360
Hanno Beckerd3827c72019-09-03 12:56:37 +01001361 if( ctx == NULL || ctx->hmac_ctx == NULL )
1362 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1363
1364 md_info = mbedtls_md_get_handle( ctx );
1365 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1366 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1367
Hanno Becker3a98eab2019-09-04 11:15:02 +01001368 return( mbedtls_md_info_update( md_info,
1369 ctx->md_ctx, input,
1370 ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +00001371}
1372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001373int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001374{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001375 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001376 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001377 unsigned char *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001378
Hanno Beckerd3827c72019-09-03 12:56:37 +01001379 mbedtls_md_handle_t md_info;
1380
1381 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001382 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001383
Hanno Beckerd3827c72019-09-03 12:56:37 +01001384 md_info = mbedtls_md_get_handle( ctx );
1385 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1386 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001387
Hanno Beckerd3827c72019-09-03 12:56:37 +01001388 opad = (unsigned char *) ctx->hmac_ctx +
1389 mbedtls_md_info_block_size( md_info );
Hanno Becker530387e2019-07-17 14:10:26 +01001390
Hanno Becker3a98eab2019-09-04 11:15:02 +01001391 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, tmp ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001392 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001393
Hanno Becker3a98eab2019-09-04 11:15:02 +01001394 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001395 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001396
Hanno Becker3a98eab2019-09-04 11:15:02 +01001397 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, opad,
1398 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
Hanno Beckerd3827c72019-09-03 12:56:37 +01001399 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001400 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001401 }
Hanno Becker530387e2019-07-17 14:10:26 +01001402
Hanno Becker3a98eab2019-09-04 11:15:02 +01001403 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, tmp,
Hanno Beckerd3827c72019-09-03 12:56:37 +01001404 mbedtls_md_info_size( md_info ) ) ) != 0 )
1405 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001406 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001407 }
Hanno Becker530387e2019-07-17 14:10:26 +01001408
Hanno Becker3a98eab2019-09-04 11:15:02 +01001409 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, output ) ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001410 return( ret );
1411
1412 return( 0 );
Paul Bakker17373852011-01-06 14:20:01 +00001413}
1414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001415int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
Paul Bakker17373852011-01-06 14:20:01 +00001416{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001417 int ret;
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001418 unsigned char *ipad;
1419
Hanno Beckerd3827c72019-09-03 12:56:37 +01001420 mbedtls_md_handle_t md_info;
1421
1422 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001423 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001424
1425 md_info = mbedtls_md_get_handle( ctx );
1426 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1427 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001428
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001429 ipad = (unsigned char *) ctx->hmac_ctx;
1430
Hanno Becker3a98eab2019-09-04 11:15:02 +01001431 ret = mbedtls_md_info_starts( md_info, ctx->md_ctx );
Hanno Becker530387e2019-07-17 14:10:26 +01001432 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001433 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001434
Hanno Becker3a98eab2019-09-04 11:15:02 +01001435 ret = mbedtls_md_info_update( md_info,
1436 ctx->md_ctx, ipad,
1437 mbedtls_md_info_block_size( md_info ) );
Hanno Becker530387e2019-07-17 14:10:26 +01001438 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001439}
1440
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001441int mbedtls_md_hmac( mbedtls_md_handle_t md_info,
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001442 const unsigned char *key, size_t keylen,
1443 const unsigned char *input, size_t ilen,
1444 unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001445{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001446 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001447 int ret;
1448
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001449 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001450 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001452 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454 if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001455 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001456
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001457 if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
1458 goto cleanup;
1459 if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 )
1460 goto cleanup;
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +01001461 if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 )
1462 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001463
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001464cleanup:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001465 mbedtls_md_free( &ctx );
Paul Bakker17373852011-01-06 14:20:01 +00001466
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001467 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001468}
1469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001470int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001471{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001472 mbedtls_md_handle_t md_info;
1473 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001474 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001475
Hanno Beckerd3827c72019-09-03 12:56:37 +01001476 md_info = mbedtls_md_get_handle( ctx );
1477 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1478 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1479
Hanno Becker3a98eab2019-09-04 11:15:02 +01001480 return( mbedtls_md_info_process( md_info, ctx->md_ctx, data ) );
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001481}
1482
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001483unsigned char mbedtls_md_get_size( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001484{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001485 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001486 return( 0 );
1487
Hanno Becker530387e2019-07-17 14:10:26 +01001488 return mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001489}
1490
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001491mbedtls_md_type_t mbedtls_md_get_type( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001492{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001493 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001495
Hanno Becker530387e2019-07-17 14:10:26 +01001496 return mbedtls_md_info_type( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001497}
1498
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001499const char *mbedtls_md_get_name( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001500{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001501 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001502 return( NULL );
1503
Hanno Becker530387e2019-07-17 14:10:26 +01001504 return mbedtls_md_info_name( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001505}
1506
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001507#endif /* MBEDTLS_MD_C */