blob: 8d8f3371addf7a1530f28f86da1187dee8f8053e [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 Becker3f7d2702019-09-04 11:52:46 +0100798MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_starts(
799 mbedtls_md_handle_t info,
800 void *ctx )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100801{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100802 return( info->starts_func( ctx ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100803}
804
Hanno Becker3f7d2702019-09-04 11:52:46 +0100805MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_update(
806 mbedtls_md_handle_t info,
807 void *ctx,
808 const unsigned char *input,
809 size_t ilen )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100810{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100811 return( info->update_func( ctx, input, ilen ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100812}
813
Hanno Becker3f7d2702019-09-04 11:52:46 +0100814MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_finish(
815 mbedtls_md_handle_t info,
816 void *ctx,
817 unsigned char *output )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100818{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100819 return( info->finish_func( ctx, output ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100820}
821
Hanno Becker3f7d2702019-09-04 11:52:46 +0100822MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_digest(
823 mbedtls_md_handle_t info,
824 const unsigned char *input,
825 size_t ilen,
826 unsigned char *output )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100827{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100828 return( info->digest_func( input, ilen, output ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100829}
830
Hanno Becker3f7d2702019-09-04 11:52:46 +0100831MBEDTLS_ALWAYS_INLINE static inline void* mbedtls_md_info_ctx_alloc(
832 mbedtls_md_handle_t info )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100833{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100834 return( info->ctx_alloc_func() );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100835}
836
Hanno Becker3f7d2702019-09-04 11:52:46 +0100837MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_ctx_free(
838 mbedtls_md_handle_t info,
839 void *ctx )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100840{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100841 info->ctx_free_func( ctx );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100842}
843
Hanno Becker3f7d2702019-09-04 11:52:46 +0100844MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_clone(
845 mbedtls_md_handle_t info,
846 void *dst,
847 const void *src )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100848{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100849 info->clone_func( dst, src );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100850}
851
Hanno Becker3f7d2702019-09-04 11:52:46 +0100852MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_process(
853 mbedtls_md_handle_t info,
854 void *ctx,
855 const unsigned char *input )
Hanno Beckerd03949e2019-07-26 14:38:44 +0100856{
Hanno Becker3a98eab2019-09-04 11:15:02 +0100857 return( info->process_func( ctx, input ) );
Hanno Beckerd03949e2019-07-26 14:38:44 +0100858}
Hanno Becker0e7fc312019-07-17 11:23:12 +0100859
Hanno Becker1292c352019-08-13 15:43:26 +0100860#else /* !MBEDTLS_MD_SINGLE_HASH */
861
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100862MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_type_t mbedtls_md_info_type(
Hanno Becker1292c352019-08-13 15:43:26 +0100863 mbedtls_md_handle_t info )
864{
865 ((void) info);
866 return( MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH ) );
867}
868
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100869MBEDTLS_ALWAYS_INLINE static inline const char * mbedtls_md_info_name(
Hanno Becker1292c352019-08-13 15:43:26 +0100870 mbedtls_md_handle_t info )
871{
872 ((void) info);
873 return( MBEDTLS_MD_INFO_NAME( MBEDTLS_MD_SINGLE_HASH ) );
874}
875
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100876MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_size(
Hanno Becker1292c352019-08-13 15:43:26 +0100877 mbedtls_md_handle_t info )
878{
879 ((void) info);
880 return( MBEDTLS_MD_INFO_SIZE( MBEDTLS_MD_SINGLE_HASH ) );
881}
882
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100883MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_block_size(
Hanno Becker1292c352019-08-13 15:43:26 +0100884 mbedtls_md_handle_t info )
885{
886 ((void) info);
887 return( MBEDTLS_MD_INFO_BLOCKSIZE( MBEDTLS_MD_SINGLE_HASH ) );
888}
889
Hanno Becker3f7d2702019-09-04 11:52:46 +0100890MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_starts(
891 mbedtls_md_handle_t info,
892 void *ctx )
Hanno Becker1292c352019-08-13 15:43:26 +0100893{
894 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100895 return( MBEDTLS_MD_INFO_STARTS_FUNC( MBEDTLS_MD_SINGLE_HASH )( ctx ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100896}
897
Hanno Becker3f7d2702019-09-04 11:52:46 +0100898MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_update(
899 mbedtls_md_handle_t info,
900 void *ctx,
901 const unsigned char *input,
902 size_t ilen )
Hanno Becker1292c352019-08-13 15:43:26 +0100903{
904 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100905 return( MBEDTLS_MD_INFO_UPDATE_FUNC( MBEDTLS_MD_SINGLE_HASH )
906 ( ctx, input, ilen ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100907}
908
Hanno Becker3f7d2702019-09-04 11:52:46 +0100909MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_finish(
910 mbedtls_md_handle_t info,
911 void *ctx,
912 unsigned char *output )
Hanno Becker1292c352019-08-13 15:43:26 +0100913{
914 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100915 return( MBEDTLS_MD_INFO_FINISH_FUNC( MBEDTLS_MD_SINGLE_HASH )
916 ( ctx, output ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100917}
918
Hanno Becker3f7d2702019-09-04 11:52:46 +0100919MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_digest(
920 mbedtls_md_handle_t info,
921 const unsigned char *input,
922 size_t ilen,
923 unsigned char *output )
Hanno Becker1292c352019-08-13 15:43:26 +0100924{
925 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100926 return( MBEDTLS_MD_INFO_DIGEST_FUNC( MBEDTLS_MD_SINGLE_HASH )
927 ( input, ilen, output ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100928}
929
Hanno Becker3f7d2702019-09-04 11:52:46 +0100930MBEDTLS_ALWAYS_INLINE static inline void* mbedtls_md_info_ctx_alloc(
931 mbedtls_md_handle_t info )
Hanno Becker1292c352019-08-13 15:43:26 +0100932{
933 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100934 return( MBEDTLS_MD_INFO_ALLOC_FUNC( MBEDTLS_MD_SINGLE_HASH )() );
Hanno Becker1292c352019-08-13 15:43:26 +0100935}
936
Hanno Becker3f7d2702019-09-04 11:52:46 +0100937MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_ctx_free(
938 mbedtls_md_handle_t info,
939 void *ctx )
Hanno Becker1292c352019-08-13 15:43:26 +0100940{
941 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100942 MBEDTLS_MD_INFO_FREE_FUNC( MBEDTLS_MD_SINGLE_HASH )( ctx );
Hanno Becker1292c352019-08-13 15:43:26 +0100943}
944
Hanno Becker3f7d2702019-09-04 11:52:46 +0100945MBEDTLS_ALWAYS_INLINE static inline void mbedtls_md_info_clone(
946 mbedtls_md_handle_t info,
947 void *dst,
948 const void *src )
Hanno Becker1292c352019-08-13 15:43:26 +0100949{
950 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100951 MBEDTLS_MD_INFO_CLONE_FUNC( MBEDTLS_MD_SINGLE_HASH )( dst, src );
Hanno Becker1292c352019-08-13 15:43:26 +0100952}
953
Hanno Becker3f7d2702019-09-04 11:52:46 +0100954MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_process(
955 mbedtls_md_handle_t info,
956 void *ctx,
957 const unsigned char *input )
Hanno Becker1292c352019-08-13 15:43:26 +0100958{
959 ((void) info);
Hanno Becker3a98eab2019-09-04 11:15:02 +0100960 return( MBEDTLS_MD_INFO_PROCESS_FUNC( MBEDTLS_MD_SINGLE_HASH )
961 ( ctx, input ) );
Hanno Becker1292c352019-08-13 15:43:26 +0100962}
963
964#endif /* MBEDTLS_MD_SINGLE_HASH */
965
966#if !defined(MBEDTLS_MD_SINGLE_HASH)
967
Manuel Pégourié-Gonnard88db5da2015-06-15 14:34:59 +0200968/*
969 * Reminder: update profiles in x509_crt.c when adding a new hash!
970 */
Paul Bakker72f62662011-01-16 21:27:44 +0000971static const int supported_digests[] = {
972
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973#if defined(MBEDTLS_SHA512_C)
974 MBEDTLS_MD_SHA512,
975 MBEDTLS_MD_SHA384,
Paul Bakker72f62662011-01-16 21:27:44 +0000976#endif
977
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978#if defined(MBEDTLS_SHA256_C)
979 MBEDTLS_MD_SHA256,
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200980#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200981 MBEDTLS_MD_SHA224,
Paul Bakker72f62662011-01-16 21:27:44 +0000982#endif
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200983#endif /* MBEDTLS_SHA256_C */
Paul Bakker72f62662011-01-16 21:27:44 +0000984
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985#if defined(MBEDTLS_SHA1_C)
986 MBEDTLS_MD_SHA1,
Paul Bakker72f62662011-01-16 21:27:44 +0000987#endif
988
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989#if defined(MBEDTLS_RIPEMD160_C)
990 MBEDTLS_MD_RIPEMD160,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200991#endif
992
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993#if defined(MBEDTLS_MD5_C)
994 MBEDTLS_MD_MD5,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200995#endif
996
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200997#if defined(MBEDTLS_MD4_C)
998 MBEDTLS_MD_MD4,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200999#endif
1000
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001#if defined(MBEDTLS_MD2_C)
1002 MBEDTLS_MD_MD2,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +02001003#endif
1004
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001005 MBEDTLS_MD_NONE
Paul Bakker72f62662011-01-16 21:27:44 +00001006};
1007
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001008const int *mbedtls_md_list( void )
Paul Bakker72f62662011-01-16 21:27:44 +00001009{
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001010 return( supported_digests );
Paul Bakker72f62662011-01-16 21:27:44 +00001011}
1012
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001013mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
Paul Bakker17373852011-01-06 14:20:01 +00001014{
1015 if( NULL == md_name )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001016 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001017
1018 /* Get the appropriate digest information */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001019#if defined(MBEDTLS_MD2_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001020 if( !strcmp( "MD2", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021 return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );
Paul Bakker17373852011-01-06 14:20:01 +00001022#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001023#if defined(MBEDTLS_MD4_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001024 if( !strcmp( "MD4", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001025 return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );
Paul Bakker17373852011-01-06 14:20:01 +00001026#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027#if defined(MBEDTLS_MD5_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001028 if( !strcmp( "MD5", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029 return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );
Paul Bakker17373852011-01-06 14:20:01 +00001030#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001031#if defined(MBEDTLS_RIPEMD160_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001032 if( !strcmp( "RIPEMD160", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001033 return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +01001034#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035#if defined(MBEDTLS_SHA1_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001036 if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
Paul Bakker17373852011-01-06 14:20:01 +00001038#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001039#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001040#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001041 if( !strcmp( "SHA224", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001043#endif
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001044 if( !strcmp( "SHA256", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001045 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001046#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001048 if( !strcmp( "SHA384", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001049 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001050 if( !strcmp( "SHA512", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001051 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );
Paul Bakker17373852011-01-06 14:20:01 +00001052#endif
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001053 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001054}
1055
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001056mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
Paul Bakker17373852011-01-06 14:20:01 +00001057{
1058 switch( md_type )
1059 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060#if defined(MBEDTLS_MD2_C)
1061 case MBEDTLS_MD_MD2:
1062 return( &mbedtls_md2_info );
Paul Bakker17373852011-01-06 14:20:01 +00001063#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001064#if defined(MBEDTLS_MD4_C)
1065 case MBEDTLS_MD_MD4:
1066 return( &mbedtls_md4_info );
Paul Bakker17373852011-01-06 14:20:01 +00001067#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001068#if defined(MBEDTLS_MD5_C)
1069 case MBEDTLS_MD_MD5:
1070 return( &mbedtls_md5_info );
Paul Bakker17373852011-01-06 14:20:01 +00001071#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001072#if defined(MBEDTLS_RIPEMD160_C)
1073 case MBEDTLS_MD_RIPEMD160:
1074 return( &mbedtls_ripemd160_info );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +01001075#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076#if defined(MBEDTLS_SHA1_C)
1077 case MBEDTLS_MD_SHA1:
1078 return( &mbedtls_sha1_info );
Paul Bakker17373852011-01-06 14:20:01 +00001079#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001080#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001081#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001082 case MBEDTLS_MD_SHA224:
1083 return( &mbedtls_sha224_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001084#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001085 case MBEDTLS_MD_SHA256:
1086 return( &mbedtls_sha256_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001087#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088#if defined(MBEDTLS_SHA512_C)
1089 case MBEDTLS_MD_SHA384:
1090 return( &mbedtls_sha384_info );
1091 case MBEDTLS_MD_SHA512:
1092 return( &mbedtls_sha512_info );
Paul Bakker17373852011-01-06 14:20:01 +00001093#endif
1094 default:
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001095 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001096 }
1097}
1098
Hanno Becker1292c352019-08-13 15:43:26 +01001099#else /* MBEDTLS_MD_SINGLE_HASH */
1100
1101const int *mbedtls_md_list( void )
1102{
1103 static int single_hash[2] =
1104 { MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH ),
1105 MBEDTLS_MD_INVALID_HANDLE };
1106
1107 return( single_hash );
1108}
1109
1110mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
1111{
1112 static const char * const hash_name =
1113 MBEDTLS_MD_INFO_NAME( MBEDTLS_MD_SINGLE_HASH );
1114
1115 if( md_name != NULL && strcmp( hash_name, md_name ) == 0 )
1116 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
1117
1118 return( MBEDTLS_MD_INVALID_HANDLE );
1119}
1120
1121mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
1122{
1123 static const mbedtls_md_type_t hash_type =
1124 MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH );
1125
1126 if( hash_type == md_type )
1127 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
1128
1129 return( MBEDTLS_MD_INVALID_HANDLE );
1130}
1131
1132#endif /* MBEDTLS_MD_SINGLE_HASH */
1133
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001134void mbedtls_md_init( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001135{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001136 memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02001137}
1138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139void mbedtls_md_free( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001140{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001141 if( ctx == NULL || mbedtls_md_get_handle( ctx ) == MBEDTLS_MD_INVALID_HANDLE )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001142 return;
1143
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001144 if( ctx->md_ctx != NULL )
Hanno Beckerd3827c72019-09-03 12:56:37 +01001145 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001146 mbedtls_md_info_ctx_free( mbedtls_md_get_handle( ctx ), ctx->md_ctx );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001147 }
Paul Bakker84bbeb52014-07-01 14:53:22 +02001148
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001149 if( ctx->hmac_ctx != NULL )
1150 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001151 mbedtls_platform_zeroize( ctx->hmac_ctx,
Hanno Beckerd3827c72019-09-03 12:56:37 +01001152 2 * mbedtls_md_info_block_size( mbedtls_md_get_handle( ctx ) ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001153 mbedtls_free( ctx->hmac_ctx );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001154 }
1155
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001156 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02001157}
1158
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001159int mbedtls_md_clone( mbedtls_md_context_t *dst,
1160 const mbedtls_md_context_t *src )
1161{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001162 if( dst == NULL || mbedtls_md_get_handle( dst ) == MBEDTLS_MD_INVALID_HANDLE ||
1163 src == NULL || mbedtls_md_get_handle( src ) == MBEDTLS_MD_INVALID_HANDLE ||
1164 mbedtls_md_get_handle( dst ) != mbedtls_md_get_handle( src ) )
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001165 {
1166 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1167 }
1168
Hanno Becker3a98eab2019-09-04 11:15:02 +01001169 mbedtls_md_info_clone( mbedtls_md_get_handle( dst ),
1170 dst->md_ctx, src->md_ctx );
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001171 return( 0 );
1172}
1173
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001174#if ! defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001175int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +01001176{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001177 return mbedtls_md_setup( ctx, md_info, 1 );
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +01001178}
1179#endif
1180
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001181int mbedtls_md_setup( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info, int hmac )
Paul Bakker17373852011-01-06 14:20:01 +00001182{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001183 if( md_info == MBEDTLS_MD_INVALID_HANDLE || ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001184 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001185
Hanno Becker3a98eab2019-09-04 11:15:02 +01001186 ctx->md_ctx = mbedtls_md_info_ctx_alloc( md_info );
Hanno Becker530387e2019-07-17 14:10:26 +01001187 if( ctx->md_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
Paul Bakker17373852011-01-06 14:20:01 +00001189
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001190 if( hmac != 0 )
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001191 {
Hanno Beckerd3827c72019-09-03 12:56:37 +01001192 ctx->hmac_ctx = mbedtls_calloc( 2,
1193 mbedtls_md_info_block_size( md_info ) );
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001194 if( ctx->hmac_ctx == NULL )
1195 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001196 mbedtls_md_info_ctx_free( md_info, ctx->md_ctx );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001197 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001198 }
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001199 }
1200
Hanno Beckerccb2b622019-09-03 13:19:14 +01001201#if !defined(MBEDTLS_MD_SINGLE_HASH)
Paul Bakker17373852011-01-06 14:20:01 +00001202 ctx->md_info = md_info;
Hanno Beckerccb2b622019-09-03 13:19:14 +01001203#endif
Paul Bakker17373852011-01-06 14:20:01 +00001204
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001205 return( 0 );
Paul Bakker17373852011-01-06 14:20:01 +00001206}
1207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001208int mbedtls_md_starts( mbedtls_md_context_t *ctx )
Paul Bakker562535d2011-01-20 16:42:01 +00001209{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001210 mbedtls_md_handle_t md_info;
1211 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001212 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker562535d2011-01-20 16:42:01 +00001213
Hanno Beckerd3827c72019-09-03 12:56:37 +01001214 md_info = mbedtls_md_get_handle( ctx );
1215 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1216 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1217
Hanno Becker3a98eab2019-09-04 11:15:02 +01001218 return( mbedtls_md_info_starts( md_info, ctx->md_ctx ) );
Paul Bakker562535d2011-01-20 16:42:01 +00001219}
1220
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001221int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +00001222{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001223 mbedtls_md_handle_t md_info;
1224 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001225 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001226
Hanno Beckerd3827c72019-09-03 12:56:37 +01001227 md_info = mbedtls_md_get_handle( ctx );
1228 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1229 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1230
Hanno Becker3a98eab2019-09-04 11:15:02 +01001231 return( mbedtls_md_info_update( md_info, ctx->md_ctx,
1232 input, ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +00001233}
1234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001235int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001236{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001237 mbedtls_md_handle_t md_info;
1238 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001239 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001240
Hanno Beckerd3827c72019-09-03 12:56:37 +01001241 md_info = mbedtls_md_get_handle( ctx );
1242 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1243 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1244
Hanno Becker3a98eab2019-09-04 11:15:02 +01001245 return( mbedtls_md_info_finish( md_info, ctx->md_ctx,
1246 output ) );
Paul Bakker17373852011-01-06 14:20:01 +00001247}
1248
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001249int mbedtls_md( mbedtls_md_handle_t md_info, const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +00001250 unsigned char *output )
1251{
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
Hanno Becker3a98eab2019-09-04 11:15:02 +01001255 return( mbedtls_md_info_digest( md_info, input,
1256 ilen, output) );
Paul Bakker17373852011-01-06 14:20:01 +00001257}
1258
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001259#if defined(MBEDTLS_FS_IO)
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001260int mbedtls_md_file( mbedtls_md_handle_t md_info, const char *path, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001261{
Paul Bakker9c021ad2011-06-09 15:55:11 +00001262 int ret;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001263 FILE *f;
1264 size_t n;
1265 mbedtls_md_context_t ctx;
1266 unsigned char buf[1024];
Paul Bakker9c021ad2011-06-09 15:55:11 +00001267
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001268 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001269 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001270
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001271 if( ( f = fopen( path, "rb" ) ) == NULL )
Manuel Pégourié-Gonnardbcc03082015-06-24 00:09:29 +02001272 return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
1273
1274 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001275
1276 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
1277 goto cleanup;
1278
Hanno Becker3a98eab2019-09-04 11:15:02 +01001279 ret = mbedtls_md_info_starts( md_info, ctx.md_ctx );
Hanno Becker530387e2019-07-17 14:10:26 +01001280 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001281 goto cleanup;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001282
1283 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001284 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001285 ret = mbedtls_md_info_update( md_info, ctx.md_ctx,
1286 buf, n );
Hanno Becker530387e2019-07-17 14:10:26 +01001287 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001288 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +01001289 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001290
1291 if( ferror( f ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001292 {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001293 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Hanno Becker530387e2019-07-17 14:10:26 +01001294 }
Andres Amaya Garciaeb132b62017-06-23 16:30:31 +01001295 else
Hanno Becker530387e2019-07-17 14:10:26 +01001296 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001297 ret = mbedtls_md_info_finish( md_info, ctx.md_ctx,
1298 output );
Hanno Becker530387e2019-07-17 14:10:26 +01001299 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001300
1301cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001302 mbedtls_platform_zeroize( buf, sizeof( buf ) );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001303 fclose( f );
1304 mbedtls_md_free( &ctx );
Paul Bakker9c021ad2011-06-09 15:55:11 +00001305
Paul Bakker8913f822012-01-14 18:07:41 +00001306 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001307}
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001308#endif /* MBEDTLS_FS_IO */
Paul Bakker17373852011-01-06 14:20:01 +00001309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001310int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
Paul Bakker17373852011-01-06 14:20:01 +00001311{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001312 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001313 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001314 unsigned char *ipad, *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001315 size_t i;
1316
Hanno Beckerd3827c72019-09-03 12:56:37 +01001317 mbedtls_md_handle_t md_info;
1318
1319 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001320 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001321
Hanno Beckerd3827c72019-09-03 12:56:37 +01001322 md_info = mbedtls_md_get_handle( ctx );
1323 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1324 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Becker530387e2019-07-17 14:10:26 +01001325
Hanno Beckerd3827c72019-09-03 12:56:37 +01001326 if( keylen > (size_t) mbedtls_md_info_block_size( md_info ) )
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001327 {
Hanno Becker3a98eab2019-09-04 11:15:02 +01001328 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001329 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001330
Hanno Becker3a98eab2019-09-04 11:15:02 +01001331 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx,
1332 key, keylen ) ) != 0 )
1333 {
Hanno Becker530387e2019-07-17 14:10:26 +01001334 goto cleanup;
Hanno Becker3a98eab2019-09-04 11:15:02 +01001335 }
Hanno Becker530387e2019-07-17 14:10:26 +01001336
Hanno Becker3a98eab2019-09-04 11:15:02 +01001337 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, sum ) ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001338 goto cleanup;
1339
Hanno Beckerd3827c72019-09-03 12:56:37 +01001340 keylen = mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001341 key = sum;
1342 }
1343
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001344 ipad = (unsigned char *) ctx->hmac_ctx;
Hanno Beckerd3827c72019-09-03 12:56:37 +01001345 opad = (unsigned char *) ctx->hmac_ctx +
1346 mbedtls_md_info_block_size( md_info );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001347
Hanno Beckerd3827c72019-09-03 12:56:37 +01001348 memset( ipad, 0x36, mbedtls_md_info_block_size( md_info ) );
1349 memset( opad, 0x5C, mbedtls_md_info_block_size( md_info ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001350
1351 for( i = 0; i < keylen; i++ )
1352 {
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001353 ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
1354 opad[i] = (unsigned char)( opad[i] ^ key[i] );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001355 }
1356
Hanno Becker3a98eab2019-09-04 11:15:02 +01001357 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001358 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +01001359
Hanno Becker3a98eab2019-09-04 11:15:02 +01001360 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, ipad,
Hanno Beckerd3827c72019-09-03 12:56:37 +01001361 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
1362 {
Andres Amaya Garcia42e5e102017-07-20 16:27:03 +01001363 goto cleanup;
Hanno Beckerd3827c72019-09-03 12:56:37 +01001364 }
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001365
1366cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001367 mbedtls_platform_zeroize( sum, sizeof( sum ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001368
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001369 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001370}
1371
Hanno Beckerd3827c72019-09-03 12:56:37 +01001372int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx,
1373 const unsigned char *input, size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +00001374{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001375 mbedtls_md_handle_t md_info;
Paul Bakker17373852011-01-06 14:20:01 +00001376
Hanno Beckerd3827c72019-09-03 12:56:37 +01001377 if( ctx == NULL || ctx->hmac_ctx == NULL )
1378 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1379
1380 md_info = mbedtls_md_get_handle( ctx );
1381 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1382 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1383
Hanno Becker3a98eab2019-09-04 11:15:02 +01001384 return( mbedtls_md_info_update( md_info,
1385 ctx->md_ctx, input,
1386 ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +00001387}
1388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001389int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001390{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001391 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001392 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001393 unsigned char *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001394
Hanno Beckerd3827c72019-09-03 12:56:37 +01001395 mbedtls_md_handle_t md_info;
1396
1397 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001398 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001399
Hanno Beckerd3827c72019-09-03 12:56:37 +01001400 md_info = mbedtls_md_get_handle( ctx );
1401 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1402 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001403
Hanno Beckerd3827c72019-09-03 12:56:37 +01001404 opad = (unsigned char *) ctx->hmac_ctx +
1405 mbedtls_md_info_block_size( md_info );
Hanno Becker530387e2019-07-17 14:10:26 +01001406
Hanno Becker3a98eab2019-09-04 11:15:02 +01001407 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, tmp ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001408 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001409
Hanno Becker3a98eab2019-09-04 11:15:02 +01001410 if( ( ret = mbedtls_md_info_starts( md_info, ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001411 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001412
Hanno Becker3a98eab2019-09-04 11:15:02 +01001413 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, opad,
1414 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
Hanno Beckerd3827c72019-09-03 12:56:37 +01001415 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001416 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001417 }
Hanno Becker530387e2019-07-17 14:10:26 +01001418
Hanno Becker3a98eab2019-09-04 11:15:02 +01001419 if( ( ret = mbedtls_md_info_update( md_info, ctx->md_ctx, tmp,
Hanno Beckerd3827c72019-09-03 12:56:37 +01001420 mbedtls_md_info_size( md_info ) ) ) != 0 )
1421 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001422 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001423 }
Hanno Becker530387e2019-07-17 14:10:26 +01001424
Hanno Becker3a98eab2019-09-04 11:15:02 +01001425 if( ( ret = mbedtls_md_info_finish( md_info, ctx->md_ctx, output ) ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001426 return( ret );
1427
1428 return( 0 );
Paul Bakker17373852011-01-06 14:20:01 +00001429}
1430
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001431int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
Paul Bakker17373852011-01-06 14:20:01 +00001432{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001433 int ret;
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001434 unsigned char *ipad;
1435
Hanno Beckerd3827c72019-09-03 12:56:37 +01001436 mbedtls_md_handle_t md_info;
1437
1438 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001439 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001440
1441 md_info = mbedtls_md_get_handle( ctx );
1442 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1443 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001444
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001445 ipad = (unsigned char *) ctx->hmac_ctx;
1446
Hanno Becker3a98eab2019-09-04 11:15:02 +01001447 ret = mbedtls_md_info_starts( md_info, ctx->md_ctx );
Hanno Becker530387e2019-07-17 14:10:26 +01001448 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001449 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001450
Hanno Becker3a98eab2019-09-04 11:15:02 +01001451 ret = mbedtls_md_info_update( md_info,
1452 ctx->md_ctx, ipad,
1453 mbedtls_md_info_block_size( md_info ) );
Hanno Becker530387e2019-07-17 14:10:26 +01001454 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001455}
1456
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001457int mbedtls_md_hmac( mbedtls_md_handle_t md_info,
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001458 const unsigned char *key, size_t keylen,
1459 const unsigned char *input, size_t ilen,
1460 unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001461{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001462 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001463 int ret;
1464
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001465 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001470 if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001471 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001472
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001473 if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
1474 goto cleanup;
1475 if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 )
1476 goto cleanup;
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +01001477 if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 )
1478 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001479
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001480cleanup:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001481 mbedtls_md_free( &ctx );
Paul Bakker17373852011-01-06 14:20:01 +00001482
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001483 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001484}
1485
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001486int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001487{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001488 mbedtls_md_handle_t md_info;
1489 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001490 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001491
Hanno Beckerd3827c72019-09-03 12:56:37 +01001492 md_info = mbedtls_md_get_handle( ctx );
1493 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1494 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1495
Hanno Becker3a98eab2019-09-04 11:15:02 +01001496 return( mbedtls_md_info_process( md_info, ctx->md_ctx, data ) );
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001497}
1498
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001499unsigned char mbedtls_md_get_size( 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( 0 );
1503
Hanno Becker530387e2019-07-17 14:10:26 +01001504 return mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001505}
1506
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001507mbedtls_md_type_t mbedtls_md_get_type( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001508{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001509 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001510 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001511
Hanno Becker530387e2019-07-17 14:10:26 +01001512 return mbedtls_md_info_type( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001513}
1514
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001515const char *mbedtls_md_get_name( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001516{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001517 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001518 return( NULL );
1519
Hanno Becker530387e2019-07-17 14:10:26 +01001520 return mbedtls_md_info_name( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001521}
1522
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001523#endif /* MBEDTLS_MD_C */