blob: ab66744e6a97badf060f94ee3055ee5dd7b7e84f [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
117 * MBEDTLS_MD_INFO_XXX( MBEDTLS_SSL_CONF_SINGLE_HASH ).
118 * where MBEDTLS_SSL_CONF_SINGLE_HASH expands to MBEDTLS_MD_INFO_XXX. */
119#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 Beckerbdaf0ea2019-08-14 11:33:43 +0100798MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_starts_func_t *mbedtls_md_info_starts_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100799 mbedtls_md_handle_t info )
800{
801 return( info->starts_func );
802}
803
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100804MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_update_func_t *mbedtls_md_info_update_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100805 mbedtls_md_handle_t info )
806{
807 return( info->update_func );
808}
809
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100810MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_finish_func_t *mbedtls_md_info_finish_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100811 mbedtls_md_handle_t info )
812{
813 return( info->finish_func );
814}
815
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100816MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_digest_func_t *mbedtls_md_info_digest_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100817 mbedtls_md_handle_t info )
818{
819 return( info->digest_func );
820}
821
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100822MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_ctx_alloc_func_t *mbedtls_md_info_ctx_alloc_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100823 mbedtls_md_handle_t info )
824{
825 return( info->ctx_alloc_func );
826}
827
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100828MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_ctx_free_func_t *mbedtls_md_info_ctx_free_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100829 mbedtls_md_handle_t info )
830{
831 return( info->ctx_free_func );
832}
833
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100834MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_clone_func_t *mbedtls_md_info_clone_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100835 mbedtls_md_handle_t info )
836{
837 return( info->clone_func );
838}
839
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100840MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_process_func_t *mbedtls_md_info_process_func(
Hanno Beckerd03949e2019-07-26 14:38:44 +0100841 mbedtls_md_handle_t info )
842{
843 return( info->process_func );
844}
Hanno Becker0e7fc312019-07-17 11:23:12 +0100845
Hanno Becker1292c352019-08-13 15:43:26 +0100846#else /* !MBEDTLS_MD_SINGLE_HASH */
847
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100848MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_type_t mbedtls_md_info_type(
Hanno Becker1292c352019-08-13 15:43:26 +0100849 mbedtls_md_handle_t info )
850{
851 ((void) info);
852 return( MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH ) );
853}
854
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100855MBEDTLS_ALWAYS_INLINE static inline const char * mbedtls_md_info_name(
Hanno Becker1292c352019-08-13 15:43:26 +0100856 mbedtls_md_handle_t info )
857{
858 ((void) info);
859 return( MBEDTLS_MD_INFO_NAME( MBEDTLS_MD_SINGLE_HASH ) );
860}
861
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100862MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_size(
Hanno Becker1292c352019-08-13 15:43:26 +0100863 mbedtls_md_handle_t info )
864{
865 ((void) info);
866 return( MBEDTLS_MD_INFO_SIZE( MBEDTLS_MD_SINGLE_HASH ) );
867}
868
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100869MBEDTLS_ALWAYS_INLINE static inline int mbedtls_md_info_block_size(
Hanno Becker1292c352019-08-13 15:43:26 +0100870 mbedtls_md_handle_t info )
871{
872 ((void) info);
873 return( MBEDTLS_MD_INFO_BLOCKSIZE( MBEDTLS_MD_SINGLE_HASH ) );
874}
875
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100876MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_starts_func_t *mbedtls_md_info_starts_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100877 mbedtls_md_handle_t info )
878{
879 ((void) info);
880 return( MBEDTLS_MD_INFO_STARTS_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
881}
882
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100883MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_update_func_t *mbedtls_md_info_update_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100884 mbedtls_md_handle_t info )
885{
886 ((void) info);
887 return( MBEDTLS_MD_INFO_UPDATE_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
888}
889
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100890MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_finish_func_t *mbedtls_md_info_finish_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100891 mbedtls_md_handle_t info )
892{
893 ((void) info);
894 return( MBEDTLS_MD_INFO_FINISH_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
895}
896
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100897MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_digest_func_t *mbedtls_md_info_digest_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100898 mbedtls_md_handle_t info )
899{
900 ((void) info);
901 return( MBEDTLS_MD_INFO_DIGEST_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
902}
903
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100904MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_ctx_alloc_func_t *mbedtls_md_info_ctx_alloc_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100905 mbedtls_md_handle_t info )
906{
907 ((void) info);
908 return( MBEDTLS_MD_INFO_ALLOC_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
909}
910
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100911MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_ctx_free_func_t *mbedtls_md_info_ctx_free_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100912 mbedtls_md_handle_t info )
913{
914 ((void) info);
915 return( MBEDTLS_MD_INFO_FREE_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
916}
917
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100918MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_clone_func_t *mbedtls_md_info_clone_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100919 mbedtls_md_handle_t info )
920{
921 ((void) info);
922 return( MBEDTLS_MD_INFO_CLONE_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
923}
924
Hanno Beckerbdaf0ea2019-08-14 11:33:43 +0100925MBEDTLS_ALWAYS_INLINE static inline mbedtls_md_process_func_t *mbedtls_md_info_process_func(
Hanno Becker1292c352019-08-13 15:43:26 +0100926 mbedtls_md_handle_t info )
927{
928 ((void) info);
929 return( MBEDTLS_MD_INFO_PROCESS_FUNC( MBEDTLS_MD_SINGLE_HASH ) );
930}
931
932#endif /* MBEDTLS_MD_SINGLE_HASH */
933
934#if !defined(MBEDTLS_MD_SINGLE_HASH)
935
Manuel Pégourié-Gonnard88db5da2015-06-15 14:34:59 +0200936/*
937 * Reminder: update profiles in x509_crt.c when adding a new hash!
938 */
Paul Bakker72f62662011-01-16 21:27:44 +0000939static const int supported_digests[] = {
940
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941#if defined(MBEDTLS_SHA512_C)
942 MBEDTLS_MD_SHA512,
943 MBEDTLS_MD_SHA384,
Paul Bakker72f62662011-01-16 21:27:44 +0000944#endif
945
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200946#if defined(MBEDTLS_SHA256_C)
947 MBEDTLS_MD_SHA256,
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200948#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200949 MBEDTLS_MD_SHA224,
Paul Bakker72f62662011-01-16 21:27:44 +0000950#endif
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +0200951#endif /* MBEDTLS_SHA256_C */
Paul Bakker72f62662011-01-16 21:27:44 +0000952
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953#if defined(MBEDTLS_SHA1_C)
954 MBEDTLS_MD_SHA1,
Paul Bakker72f62662011-01-16 21:27:44 +0000955#endif
956
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957#if defined(MBEDTLS_RIPEMD160_C)
958 MBEDTLS_MD_RIPEMD160,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200959#endif
960
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200961#if defined(MBEDTLS_MD5_C)
962 MBEDTLS_MD_MD5,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200963#endif
964
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200965#if defined(MBEDTLS_MD4_C)
966 MBEDTLS_MD_MD4,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200967#endif
968
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200969#if defined(MBEDTLS_MD2_C)
970 MBEDTLS_MD_MD2,
Manuel Pégourié-Gonnardbd772542014-07-07 14:02:33 +0200971#endif
972
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973 MBEDTLS_MD_NONE
Paul Bakker72f62662011-01-16 21:27:44 +0000974};
975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976const int *mbedtls_md_list( void )
Paul Bakker72f62662011-01-16 21:27:44 +0000977{
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200978 return( supported_digests );
Paul Bakker72f62662011-01-16 21:27:44 +0000979}
980
Hanno Beckera5cedbc2019-07-17 11:21:02 +0100981mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
Paul Bakker17373852011-01-06 14:20:01 +0000982{
983 if( NULL == md_name )
Paul Bakkerd8bb8262014-06-17 14:06:49 +0200984 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +0000985
986 /* Get the appropriate digest information */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200987#if defined(MBEDTLS_MD2_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200988 if( !strcmp( "MD2", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989 return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );
Paul Bakker17373852011-01-06 14:20:01 +0000990#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200991#if defined(MBEDTLS_MD4_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200992 if( !strcmp( "MD4", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );
Paul Bakker17373852011-01-06 14:20:01 +0000994#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200995#if defined(MBEDTLS_MD5_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +0200996 if( !strcmp( "MD5", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200997 return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );
Paul Bakker17373852011-01-06 14:20:01 +0000998#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200999#if defined(MBEDTLS_RIPEMD160_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001000 if( !strcmp( "RIPEMD160", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001 return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +01001002#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001003#if defined(MBEDTLS_SHA1_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001004 if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001005 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
Paul Bakker17373852011-01-06 14:20:01 +00001006#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001007#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001008#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001009 if( !strcmp( "SHA224", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001010 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001011#endif
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001012 if( !strcmp( "SHA256", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001013 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001014#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001015#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001016 if( !strcmp( "SHA384", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001017 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );
Manuel Pégourié-Gonnardcb46fd82015-05-28 17:06:07 +02001018 if( !strcmp( "SHA512", md_name ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001019 return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );
Paul Bakker17373852011-01-06 14:20:01 +00001020#endif
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001021 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001022}
1023
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001024mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
Paul Bakker17373852011-01-06 14:20:01 +00001025{
1026 switch( md_type )
1027 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_MD2_C)
1029 case MBEDTLS_MD_MD2:
1030 return( &mbedtls_md2_info );
Paul Bakker17373852011-01-06 14:20:01 +00001031#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032#if defined(MBEDTLS_MD4_C)
1033 case MBEDTLS_MD_MD4:
1034 return( &mbedtls_md4_info );
Paul Bakker17373852011-01-06 14:20:01 +00001035#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001036#if defined(MBEDTLS_MD5_C)
1037 case MBEDTLS_MD_MD5:
1038 return( &mbedtls_md5_info );
Paul Bakker17373852011-01-06 14:20:01 +00001039#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001040#if defined(MBEDTLS_RIPEMD160_C)
1041 case MBEDTLS_MD_RIPEMD160:
1042 return( &mbedtls_ripemd160_info );
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +01001043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001044#if defined(MBEDTLS_SHA1_C)
1045 case MBEDTLS_MD_SHA1:
1046 return( &mbedtls_sha1_info );
Paul Bakker17373852011-01-06 14:20:01 +00001047#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001049#if !defined(MBEDTLS_SHA256_NO_SHA224)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001050 case MBEDTLS_MD_SHA224:
1051 return( &mbedtls_sha224_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001052#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001053 case MBEDTLS_MD_SHA256:
1054 return( &mbedtls_sha256_info );
Manuel Pégourié-Gonnard394c5fb2019-07-16 15:57:36 +02001055#endif /* MBEDTLS_SHA256_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056#if defined(MBEDTLS_SHA512_C)
1057 case MBEDTLS_MD_SHA384:
1058 return( &mbedtls_sha384_info );
1059 case MBEDTLS_MD_SHA512:
1060 return( &mbedtls_sha512_info );
Paul Bakker17373852011-01-06 14:20:01 +00001061#endif
1062 default:
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001063 return( NULL );
Paul Bakker17373852011-01-06 14:20:01 +00001064 }
1065}
1066
Hanno Becker1292c352019-08-13 15:43:26 +01001067#else /* MBEDTLS_MD_SINGLE_HASH */
1068
1069const int *mbedtls_md_list( void )
1070{
1071 static int single_hash[2] =
1072 { MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH ),
1073 MBEDTLS_MD_INVALID_HANDLE };
1074
1075 return( single_hash );
1076}
1077
1078mbedtls_md_handle_t mbedtls_md_info_from_string( const char *md_name )
1079{
1080 static const char * const hash_name =
1081 MBEDTLS_MD_INFO_NAME( MBEDTLS_MD_SINGLE_HASH );
1082
1083 if( md_name != NULL && strcmp( hash_name, md_name ) == 0 )
1084 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
1085
1086 return( MBEDTLS_MD_INVALID_HANDLE );
1087}
1088
1089mbedtls_md_handle_t mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
1090{
1091 static const mbedtls_md_type_t hash_type =
1092 MBEDTLS_MD_INFO_TYPE( MBEDTLS_MD_SINGLE_HASH );
1093
1094 if( hash_type == md_type )
1095 return( MBEDTLS_MD_UNIQUE_VALID_HANDLE );
1096
1097 return( MBEDTLS_MD_INVALID_HANDLE );
1098}
1099
1100#endif /* MBEDTLS_MD_SINGLE_HASH */
1101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102void mbedtls_md_init( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001103{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104 memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02001105}
1106
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107void mbedtls_md_free( mbedtls_md_context_t *ctx )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001108{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001109 if( ctx == NULL || mbedtls_md_get_handle( ctx ) == MBEDTLS_MD_INVALID_HANDLE )
Paul Bakker84bbeb52014-07-01 14:53:22 +02001110 return;
1111
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001112 if( ctx->md_ctx != NULL )
Hanno Beckerd3827c72019-09-03 12:56:37 +01001113 {
1114 mbedtls_md_info_ctx_free_func(
1115 mbedtls_md_get_handle( ctx ) )( ctx->md_ctx );
1116 }
Paul Bakker84bbeb52014-07-01 14:53:22 +02001117
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001118 if( ctx->hmac_ctx != NULL )
1119 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001120 mbedtls_platform_zeroize( ctx->hmac_ctx,
Hanno Beckerd3827c72019-09-03 12:56:37 +01001121 2 * mbedtls_md_info_block_size( mbedtls_md_get_handle( ctx ) ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001122 mbedtls_free( ctx->hmac_ctx );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001123 }
1124
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001125 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02001126}
1127
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001128int mbedtls_md_clone( mbedtls_md_context_t *dst,
1129 const mbedtls_md_context_t *src )
1130{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001131 if( dst == NULL || mbedtls_md_get_handle( dst ) == MBEDTLS_MD_INVALID_HANDLE ||
1132 src == NULL || mbedtls_md_get_handle( src ) == MBEDTLS_MD_INVALID_HANDLE ||
1133 mbedtls_md_get_handle( dst ) != mbedtls_md_get_handle( src ) )
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001134 {
1135 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1136 }
1137
Hanno Beckerd3827c72019-09-03 12:56:37 +01001138 mbedtls_md_info_clone_func( mbedtls_md_get_handle( dst ) )
1139 ( dst->md_ctx, src->md_ctx );
Manuel Pégourié-Gonnard052a6c92015-07-06 16:06:02 +02001140 return( 0 );
1141}
1142
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001143#if ! defined(MBEDTLS_DEPRECATED_REMOVED)
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001144int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +01001145{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001146 return mbedtls_md_setup( ctx, md_info, 1 );
Manuel Pégourié-Gonnard147fa092015-03-25 16:43:14 +01001147}
1148#endif
1149
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001150int mbedtls_md_setup( mbedtls_md_context_t *ctx, mbedtls_md_handle_t md_info, int hmac )
Paul Bakker17373852011-01-06 14:20:01 +00001151{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001152 if( md_info == MBEDTLS_MD_INVALID_HANDLE || ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001153 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001154
Hanno Becker530387e2019-07-17 14:10:26 +01001155 ctx->md_ctx = mbedtls_md_info_ctx_alloc_func( md_info )();
1156 if( ctx->md_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001157 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
Paul Bakker17373852011-01-06 14:20:01 +00001158
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001159 if( hmac != 0 )
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001160 {
Hanno Beckerd3827c72019-09-03 12:56:37 +01001161 ctx->hmac_ctx = mbedtls_calloc( 2,
1162 mbedtls_md_info_block_size( md_info ) );
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001163 if( ctx->hmac_ctx == NULL )
1164 {
Hanno Becker530387e2019-07-17 14:10:26 +01001165 mbedtls_md_info_ctx_free_func( md_info )( ctx->md_ctx );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001166 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +01001167 }
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001168 }
1169
Hanno Beckerccb2b622019-09-03 13:19:14 +01001170#if !defined(MBEDTLS_MD_SINGLE_HASH)
Paul Bakker17373852011-01-06 14:20:01 +00001171 ctx->md_info = md_info;
Hanno Beckerccb2b622019-09-03 13:19:14 +01001172#endif
Paul Bakker17373852011-01-06 14:20:01 +00001173
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001174 return( 0 );
Paul Bakker17373852011-01-06 14:20:01 +00001175}
1176
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001177int mbedtls_md_starts( mbedtls_md_context_t *ctx )
Paul Bakker562535d2011-01-20 16:42:01 +00001178{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001179 mbedtls_md_handle_t md_info;
1180 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001181 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker562535d2011-01-20 16:42:01 +00001182
Hanno Beckerd3827c72019-09-03 12:56:37 +01001183 md_info = mbedtls_md_get_handle( ctx );
1184 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1185 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1186
1187 return( mbedtls_md_info_starts_func( md_info )( ctx->md_ctx ) );
Paul Bakker562535d2011-01-20 16:42:01 +00001188}
1189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001190int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +00001191{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001192 mbedtls_md_handle_t md_info;
1193 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001194 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001195
Hanno Beckerd3827c72019-09-03 12:56:37 +01001196 md_info = mbedtls_md_get_handle( ctx );
1197 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1198 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1199
1200 return( mbedtls_md_info_update_func( md_info )( ctx->md_ctx,
1201 input, ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +00001202}
1203
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001204int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001205{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001206 mbedtls_md_handle_t md_info;
1207 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001208 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001209
Hanno Beckerd3827c72019-09-03 12:56:37 +01001210 md_info = mbedtls_md_get_handle( ctx );
1211 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1212 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1213
1214 return( mbedtls_md_info_finish_func( md_info )( ctx->md_ctx,
1215 output ) );
Paul Bakker17373852011-01-06 14:20:01 +00001216}
1217
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001218int mbedtls_md( mbedtls_md_handle_t md_info, const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +00001219 unsigned char *output )
1220{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001221 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001223
Hanno Becker530387e2019-07-17 14:10:26 +01001224 return( mbedtls_md_info_digest_func( md_info )(
1225 input, ilen, output) );
Paul Bakker17373852011-01-06 14:20:01 +00001226}
1227
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001228#if defined(MBEDTLS_FS_IO)
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001229int mbedtls_md_file( mbedtls_md_handle_t md_info, const char *path, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001230{
Paul Bakker9c021ad2011-06-09 15:55:11 +00001231 int ret;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001232 FILE *f;
1233 size_t n;
1234 mbedtls_md_context_t ctx;
1235 unsigned char buf[1024];
Paul Bakker9c021ad2011-06-09 15:55:11 +00001236
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001237 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001238 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001239
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001240 if( ( f = fopen( path, "rb" ) ) == NULL )
Manuel Pégourié-Gonnardbcc03082015-06-24 00:09:29 +02001241 return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
1242
1243 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001244
1245 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
1246 goto cleanup;
1247
Hanno Becker530387e2019-07-17 14:10:26 +01001248 ret = mbedtls_md_info_starts_func( md_info )( ctx.md_ctx );
1249 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001250 goto cleanup;
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001251
1252 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001253 {
1254 ret = mbedtls_md_info_update_func( md_info )( ctx.md_ctx,
1255 buf, n );
1256 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001257 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +01001258 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001259
1260 if( ferror( f ) != 0 )
Hanno Becker530387e2019-07-17 14:10:26 +01001261 {
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001262 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
Hanno Becker530387e2019-07-17 14:10:26 +01001263 }
Andres Amaya Garciaeb132b62017-06-23 16:30:31 +01001264 else
Hanno Becker530387e2019-07-17 14:10:26 +01001265 {
1266 ret = mbedtls_md_info_finish_func( md_info )( ctx.md_ctx,
1267 output );
1268 }
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001269
1270cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001271 mbedtls_platform_zeroize( buf, sizeof( buf ) );
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001272 fclose( f );
1273 mbedtls_md_free( &ctx );
Paul Bakker9c021ad2011-06-09 15:55:11 +00001274
Paul Bakker8913f822012-01-14 18:07:41 +00001275 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001276}
Manuel Pégourié-Gonnardbfffa902015-05-28 14:44:00 +02001277#endif /* MBEDTLS_FS_IO */
Paul Bakker17373852011-01-06 14:20:01 +00001278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001279int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
Paul Bakker17373852011-01-06 14:20:01 +00001280{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001281 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001282 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001283 unsigned char *ipad, *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001284 size_t i;
1285
Hanno Becker530387e2019-07-17 14:10:26 +01001286 mbedtls_md_starts_func_t *starts;
1287 mbedtls_md_update_func_t *update;
1288 mbedtls_md_finish_func_t *finish;
1289
Hanno Beckerd3827c72019-09-03 12:56:37 +01001290 mbedtls_md_handle_t md_info;
1291
1292 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001293 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001294
Hanno Beckerd3827c72019-09-03 12:56:37 +01001295 md_info = mbedtls_md_get_handle( ctx );
1296 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1297 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Becker530387e2019-07-17 14:10:26 +01001298
Hanno Beckerd3827c72019-09-03 12:56:37 +01001299 starts = mbedtls_md_info_starts_func( md_info );
1300 update = mbedtls_md_info_update_func( md_info );
1301 finish = mbedtls_md_info_finish_func( md_info );
1302
1303 if( keylen > (size_t) mbedtls_md_info_block_size( md_info ) )
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001304 {
Hanno Becker530387e2019-07-17 14:10:26 +01001305 if( ( ret = starts( ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001306 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001307
Hanno Becker530387e2019-07-17 14:10:26 +01001308 if( ( ret = update( ctx->md_ctx, key, keylen ) ) )
1309 goto cleanup;
1310
1311 if( ( ret = finish( ctx->md_ctx, sum ) ) != 0 )
1312 goto cleanup;
1313
Hanno Beckerd3827c72019-09-03 12:56:37 +01001314 keylen = mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001315 key = sum;
1316 }
1317
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001318 ipad = (unsigned char *) ctx->hmac_ctx;
Hanno Beckerd3827c72019-09-03 12:56:37 +01001319 opad = (unsigned char *) ctx->hmac_ctx +
1320 mbedtls_md_info_block_size( md_info );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001321
Hanno Beckerd3827c72019-09-03 12:56:37 +01001322 memset( ipad, 0x36, mbedtls_md_info_block_size( md_info ) );
1323 memset( opad, 0x5C, mbedtls_md_info_block_size( md_info ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001324
1325 for( i = 0; i < keylen; i++ )
1326 {
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001327 ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
1328 opad[i] = (unsigned char)( opad[i] ^ key[i] );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001329 }
1330
Hanno Becker530387e2019-07-17 14:10:26 +01001331 if( ( ret = starts( ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001332 goto cleanup;
Hanno Becker530387e2019-07-17 14:10:26 +01001333
Hanno Beckerd3827c72019-09-03 12:56:37 +01001334 if( ( ret = update( ctx->md_ctx, ipad,
1335 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
1336 {
Andres Amaya Garcia42e5e102017-07-20 16:27:03 +01001337 goto cleanup;
Hanno Beckerd3827c72019-09-03 12:56:37 +01001338 }
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001339
1340cleanup:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001341 mbedtls_platform_zeroize( sum, sizeof( sum ) );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001342
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001343 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001344}
1345
Hanno Beckerd3827c72019-09-03 12:56:37 +01001346int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx,
1347 const unsigned char *input, size_t ilen )
Paul Bakker17373852011-01-06 14:20:01 +00001348{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001349 mbedtls_md_handle_t md_info;
Paul Bakker17373852011-01-06 14:20:01 +00001350
Hanno Beckerd3827c72019-09-03 12:56:37 +01001351 if( ctx == NULL || ctx->hmac_ctx == NULL )
1352 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1353
1354 md_info = mbedtls_md_get_handle( ctx );
1355 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1356 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1357
1358 return( mbedtls_md_info_update_func( md_info )(
Hanno Becker530387e2019-07-17 14:10:26 +01001359 ctx->md_ctx, input, ilen ) );
Paul Bakker17373852011-01-06 14:20:01 +00001360}
1361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001362int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001363{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001364 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001365 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001366 unsigned char *opad;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001367
Hanno Becker530387e2019-07-17 14:10:26 +01001368 mbedtls_md_starts_func_t *starts;
1369 mbedtls_md_update_func_t *update;
1370 mbedtls_md_finish_func_t *finish;
1371
Hanno Beckerd3827c72019-09-03 12:56:37 +01001372 mbedtls_md_handle_t md_info;
1373
1374 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001375 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001376
Hanno Beckerd3827c72019-09-03 12:56:37 +01001377 md_info = mbedtls_md_get_handle( ctx );
1378 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1379 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001380
Hanno Beckerd3827c72019-09-03 12:56:37 +01001381 starts = mbedtls_md_info_starts_func( md_info );
1382 update = mbedtls_md_info_update_func( md_info );
1383 finish = mbedtls_md_info_finish_func( md_info );
1384
1385 opad = (unsigned char *) ctx->hmac_ctx +
1386 mbedtls_md_info_block_size( md_info );
Hanno Becker530387e2019-07-17 14:10:26 +01001387
1388 if( ( ret = finish( ctx->md_ctx, tmp ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001389 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001390
1391 if( ( ret = starts( ctx->md_ctx ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001392 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001393
Hanno Beckerd3827c72019-09-03 12:56:37 +01001394 if( ( ret = update( ctx->md_ctx, opad,
1395 mbedtls_md_info_block_size( md_info ) ) ) != 0 )
1396 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001397 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001398 }
Hanno Becker530387e2019-07-17 14:10:26 +01001399
Hanno Beckerd3827c72019-09-03 12:56:37 +01001400 if( ( ret = update( ctx->md_ctx, tmp,
1401 mbedtls_md_info_size( md_info ) ) ) != 0 )
1402 {
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001403 return( ret );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001404 }
Hanno Becker530387e2019-07-17 14:10:26 +01001405
1406 if( ( ret = finish( ctx->md_ctx, output ) ) != 0 )
1407 return( ret );
1408
1409 return( 0 );
Paul Bakker17373852011-01-06 14:20:01 +00001410}
1411
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001412int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
Paul Bakker17373852011-01-06 14:20:01 +00001413{
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001414 int ret;
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001415 unsigned char *ipad;
1416
Hanno Beckerd3827c72019-09-03 12:56:37 +01001417 mbedtls_md_handle_t md_info;
1418
1419 if( ctx == NULL || ctx->hmac_ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001420 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Hanno Beckerd3827c72019-09-03 12:56:37 +01001421
1422 md_info = mbedtls_md_get_handle( ctx );
1423 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1424 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001425
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +01001426 ipad = (unsigned char *) ctx->hmac_ctx;
1427
Hanno Beckerd3827c72019-09-03 12:56:37 +01001428 ret = mbedtls_md_info_starts_func( md_info )( ctx->md_ctx );
Hanno Becker530387e2019-07-17 14:10:26 +01001429 if( ret != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001430 return( ret );
Hanno Becker530387e2019-07-17 14:10:26 +01001431
Hanno Beckerd3827c72019-09-03 12:56:37 +01001432 ret = mbedtls_md_info_update_func( md_info )(
1433 ctx->md_ctx, ipad,
1434 mbedtls_md_info_block_size( md_info ) );
Hanno Becker530387e2019-07-17 14:10:26 +01001435 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001436}
1437
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001438int mbedtls_md_hmac( mbedtls_md_handle_t md_info,
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001439 const unsigned char *key, size_t keylen,
1440 const unsigned char *input, size_t ilen,
1441 unsigned char *output )
Paul Bakker17373852011-01-06 14:20:01 +00001442{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001443 mbedtls_md_context_t ctx;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001444 int ret;
1445
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001446 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001447 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker17373852011-01-06 14:20:01 +00001448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001449 mbedtls_md_init( &ctx );
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001450
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001451 if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001452 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001453
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001454 if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 )
1455 goto cleanup;
1456 if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 )
1457 goto cleanup;
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +01001458 if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 )
1459 goto cleanup;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +01001460
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001461cleanup:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001462 mbedtls_md_free( &ctx );
Paul Bakker17373852011-01-06 14:20:01 +00001463
Andres Amaya Garcia0dd4fa02017-06-28 14:16:07 +01001464 return( ret );
Paul Bakker17373852011-01-06 14:20:01 +00001465}
1466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001467int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001468{
Hanno Beckerd3827c72019-09-03 12:56:37 +01001469 mbedtls_md_handle_t md_info;
1470 if( ctx == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001471 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001472
Hanno Beckerd3827c72019-09-03 12:56:37 +01001473 md_info = mbedtls_md_get_handle( ctx );
1474 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
1475 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
1476
1477 return( mbedtls_md_info_process_func( md_info )(
Hanno Becker530387e2019-07-17 14:10:26 +01001478 ctx->md_ctx, data ) );
Paul Bakker1bd3ae82013-03-13 10:26:44 +01001479}
1480
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001481unsigned char mbedtls_md_get_size( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001482{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001483 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001484 return( 0 );
1485
Hanno Becker530387e2019-07-17 14:10:26 +01001486 return mbedtls_md_info_size( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001487}
1488
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001489mbedtls_md_type_t mbedtls_md_get_type( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001490{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001491 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001492 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001493
Hanno Becker530387e2019-07-17 14:10:26 +01001494 return mbedtls_md_info_type( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001495}
1496
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001497const char *mbedtls_md_get_name( mbedtls_md_handle_t md_info )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001498{
Hanno Beckera5cedbc2019-07-17 11:21:02 +01001499 if( md_info == MBEDTLS_MD_INVALID_HANDLE )
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001500 return( NULL );
1501
Hanno Becker530387e2019-07-17 14:10:26 +01001502 return mbedtls_md_info_name( md_info );
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01001503}
1504
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001505#endif /* MBEDTLS_MD_C */