1
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
44
45
46
47
53
54
55
56
62
63
64
65
71
72
73
74
80
81
82
83
96
97
98
99
114
115
116
119
120
121
122
126
127
128
129
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
160
161
162
163
166
167
168
169
173
174
178
179
183
184
188
189
193
194
201
202
211
212
213
214
215
216
217
218
222
226
230
234
238
242
243
244
250
251
253
254
255
256
260
261
262
263
266
267
268
269
270
275
280
285
290
295
299
300
301
307
308
311
312
313
314
315
320
321
322
323
324
325
326
327
332
333
334
335
340
345
350
355
360
364
365
366
372
373
375
376
377
378
379
380
381
386
387
395
396
397
398
401
402
403
404
405
406
407
408
413
418
423
428
433
437
438
439
445
446
448
449
450
457
458
459
460
461
462
463
464
467
468
469
470
474
478
482
486
490
494
495
496
502
503
505
506
507
508
509
510
513
514
515
516
520
524
528
532
536
539
540
541
546
547
549
550
551
552
553
554
557
558
559
560
564
568
572
576
580
583
584
585
590
591
593
594
595
596
597
598
599
602
603
604
605
609
613
617
621
625
629
630
631
637
638
640
641
642
643
644
645
646
647
648
649
650
651
652
655
656
659
660
661
662
665
666
669
670
675
676
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
701
702
703
706
709
712
713
714
715
716
717
718
719
720
721
722
723
727
728
731
735
736
737
738
739
740
741
742
750
751
752
753
754
755
756
757
760
761
762
763
766
769
773
777
778
779
780
781
782
783
784
785
788
789
790
791
794
795
796
797
798
799
800
801
802
803
804
805
808
809
810
811
814
815
818
821
824
825
826
827
828
829
830
831
832
833
836
837
838
839
843
847
851
855
859
862
863
864
869
870
872
873
874
875
883
884
892
893
901
902
/* ... */
#include "common.h"
#if defined(MBEDTLS_MD_C)
#include "mbedtls/md.h"
#include "mbedtls/md_internal.h"
#include "mbedtls/platform_util.h"
#include "mbedtls/error.h"
#include "mbedtls/md2.h"
#include "mbedtls/md4.h"
#include "mbedtls/md5.h"
#include "mbedtls/ripemd160.h"
#include "mbedtls/sha1.h"
#include "mbedtls/sha256.h"
#include "mbedtls/sha512.h"
#include "mbedtls/platform.h"
#include <string.h>
13 includes
#if defined(MBEDTLS_FS_IO)
#include <stdio.h>
#endif
#if defined(MBEDTLS_MD2_C)
const mbedtls_md_info_t mbedtls_md2_info = {
"MD2",
MBEDTLS_MD_MD2,
16,
16,
...};/* ... */
#endif
#if defined(MBEDTLS_MD4_C)
const mbedtls_md_info_t mbedtls_md4_info = {
"MD4",
MBEDTLS_MD_MD4,
16,
64,
...};/* ... */
#endif
#if defined(MBEDTLS_MD5_C)
const mbedtls_md_info_t mbedtls_md5_info = {
"MD5",
MBEDTLS_MD_MD5,
16,
64,
...};/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)
const mbedtls_md_info_t mbedtls_ripemd160_info = {
"RIPEMD160",
MBEDTLS_MD_RIPEMD160,
20,
64,
...};/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)
const mbedtls_md_info_t mbedtls_sha1_info = {
"SHA1",
MBEDTLS_MD_SHA1,
20,
64,
...};/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)
const mbedtls_md_info_t mbedtls_sha224_info = {
"SHA224",
MBEDTLS_MD_SHA224,
28,
64,
...};
const mbedtls_md_info_t mbedtls_sha256_info = {
"SHA256",
MBEDTLS_MD_SHA256,
32,
64,
...};/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
const mbedtls_md_info_t mbedtls_sha384_info = {
"SHA384",
MBEDTLS_MD_SHA384,
48,
128,
...};/* ... */
#endif
const mbedtls_md_info_t mbedtls_sha512_info = {
"SHA512",
MBEDTLS_MD_SHA512,
64,
128,
...};/* ... */
#endif
/* ... */
static const int supported_digests[] = {
#if defined(MBEDTLS_SHA512_C)
MBEDTLS_MD_SHA512,
#if !defined(MBEDTLS_SHA512_NO_SHA384)
MBEDTLS_MD_SHA384,
#endif/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)
MBEDTLS_MD_SHA256,
MBEDTLS_MD_SHA224,/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)
MBEDTLS_MD_SHA1,
#endif
#if defined(MBEDTLS_RIPEMD160_C)
MBEDTLS_MD_RIPEMD160,
#endif
#if defined(MBEDTLS_MD5_C)
MBEDTLS_MD_MD5,
#endif
#if defined(MBEDTLS_MD4_C)
MBEDTLS_MD_MD4,
#endif
#if defined(MBEDTLS_MD2_C)
MBEDTLS_MD_MD2,
#endif
MBEDTLS_MD_NONE
...};
const int *mbedtls_md_list(void)
{
return supported_digests;
}{ ... }
const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
{
if (NULL == md_name) {
return NULL;
}if (NULL == md_name) { ... }
#if defined(MBEDTLS_MD2_C)
if (!strcmp("MD2", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_MD2);
}if (!strcmp("MD2", md_name)) { ... }
/* ... */#endif
#if defined(MBEDTLS_MD4_C)
if (!strcmp("MD4", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_MD4);
}if (!strcmp("MD4", md_name)) { ... }
/* ... */#endif
#if defined(MBEDTLS_MD5_C)
if (!strcmp("MD5", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_MD5);
}if (!strcmp("MD5", md_name)) { ... }
/* ... */#endif
#if defined(MBEDTLS_RIPEMD160_C)
if (!strcmp("RIPEMD160", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_RIPEMD160);
}if (!strcmp("RIPEMD160", md_name)) { ... }
/* ... */#endif
#if defined(MBEDTLS_SHA1_C)
if (!strcmp("SHA1", md_name) || !strcmp("SHA", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
}if (!strcmp("SHA1", md_name) || !strcmp("SHA", md_name)) { ... }
/* ... */#endif
#if defined(MBEDTLS_SHA256_C)
if (!strcmp("SHA224", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_SHA224);
}if (!strcmp("SHA224", md_name)) { ... }
if (!strcmp("SHA256", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
}if (!strcmp("SHA256", md_name)) { ... }
/* ... */#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
if (!strcmp("SHA384", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_SHA384);
}if (!strcmp("SHA384", md_name)) { ... }
/* ... */#endif
if (!strcmp("SHA512", md_name)) {
return mbedtls_md_info_from_type(MBEDTLS_MD_SHA512);
}if (!strcmp("SHA512", md_name)) { ... }
/* ... */#endif
return NULL;
}{ ... }
const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
{
switch (md_type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
return &mbedtls_md2_info;/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
return &mbedtls_md4_info;/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
return &mbedtls_md5_info;/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
return &mbedtls_ripemd160_info;/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
return &mbedtls_sha1_info;/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
return &mbedtls_sha224_info;case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
return &mbedtls_sha256_info;/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
return &mbedtls_sha384_info;/* ... */
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
return &mbedtls_sha512_info;/* ... */
#endif
default:
return NULL;default
}switch (md_type) { ... }
}{ ... }
void mbedtls_md_init(mbedtls_md_context_t *ctx)
{
memset(ctx, 0, sizeof(mbedtls_md_context_t));
}{ ... }
void mbedtls_md_free(mbedtls_md_context_t *ctx)
{
if (ctx == NULL || ctx->md_info == NULL) {
return;
}if (ctx == NULL || ctx->md_info == NULL) { ... }
if (ctx->md_ctx != NULL) {
switch (ctx->md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
mbedtls_md2_free(ctx->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
mbedtls_md4_free(ctx->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
mbedtls_md5_free(ctx->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
mbedtls_ripemd160_free(ctx->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
mbedtls_sha1_free(ctx->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
mbedtls_sha256_free(ctx->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
mbedtls_sha512_free(ctx->md_ctx);
break;/* ... */
#endif
default:
break;default
}switch (ctx->md_info->type) { ... }
mbedtls_free(ctx->md_ctx);
}if (ctx->md_ctx != NULL) { ... }
if (ctx->hmac_ctx != NULL) {
mbedtls_platform_zeroize(ctx->hmac_ctx,
2 * ctx->md_info->block_size);
mbedtls_free(ctx->hmac_ctx);
}if (ctx->hmac_ctx != NULL) { ... }
mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
}{ ... }
int mbedtls_md_clone(mbedtls_md_context_t *dst,
const mbedtls_md_context_t *src)
{
if (dst == NULL || dst->md_info == NULL ||
src == NULL || src->md_info == NULL ||
dst->md_info != src->md_info) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (dst == NULL || dst->md_info == NULL || src == NULL || src->md_info == NULL || dst->md_info != src->md_info) { ... }
switch (src->md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
mbedtls_md2_clone(dst->md_ctx, src->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
mbedtls_md4_clone(dst->md_ctx, src->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
break;/* ... */
#endif
default:
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;default
}switch (src->md_info->type) { ... }
return 0;
}{ ... }
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
int mbedtls_md_init_ctx(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info)
{
return mbedtls_md_setup(ctx, md_info, 1);
}{ ... }
/* ... */#endif
#define ALLOC(type) \
do { \
ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
if (ctx->md_ctx == NULL) \
return MBEDTLS_ERR_MD_ALLOC_FAILED; \
mbedtls_##type##_init(ctx->md_ctx); \
...} \
while (0)...
int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
{
if (md_info == NULL || ctx == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (md_info == NULL || ctx == NULL) { ... }
ctx->md_info = md_info;
ctx->md_ctx = NULL;
ctx->hmac_ctx = NULL;
switch (md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
ALLOC(md2);
break;/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
ALLOC(md4);
break;/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
ALLOC(md5);
break;/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
ALLOC(ripemd160);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
ALLOC(sha1);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
ALLOC(sha256);
break;/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
ALLOC(sha512);
break;/* ... */
#endif
default:
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;default
}switch (md_info->type) { ... }
if (hmac != 0) {
ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
if (ctx->hmac_ctx == NULL) {
mbedtls_md_free(ctx);
return MBEDTLS_ERR_MD_ALLOC_FAILED;
}if (ctx->hmac_ctx == NULL) { ... }
}if (hmac != 0) { ... }
return 0;
}{ ... }
#undef ALLOC
int mbedtls_md_starts(mbedtls_md_context_t *ctx)
{
if (ctx == NULL || ctx->md_info == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL) { ... }
switch (ctx->md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
return mbedtls_md2_starts_ret(ctx->md_ctx);/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
return mbedtls_md4_starts_ret(ctx->md_ctx);/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
return mbedtls_md5_starts_ret(ctx->md_ctx);/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
return mbedtls_ripemd160_starts_ret(ctx->md_ctx);/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
return mbedtls_sha1_starts_ret(ctx->md_ctx);/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
return mbedtls_sha256_starts_ret(ctx->md_ctx, 1);case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
return mbedtls_sha256_starts_ret(ctx->md_ctx, 0);/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
return mbedtls_sha512_starts_ret(ctx->md_ctx, 1);/* ... */
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
return mbedtls_sha512_starts_ret(ctx->md_ctx, 0);/* ... */
#endif
default:
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;default
}switch (ctx->md_info->type) { ... }
}{ ... }
int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
{
if (ctx == NULL || ctx->md_info == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL) { ... }
switch (ctx->md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
return mbedtls_md2_update_ret(ctx->md_ctx, input, ilen);/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
return mbedtls_md4_update_ret(ctx->md_ctx, input, ilen);/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
return mbedtls_md5_update_ret(ctx->md_ctx, input, ilen);/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
return mbedtls_ripemd160_update_ret(ctx->md_ctx, input, ilen);/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
return mbedtls_sha1_update_ret(ctx->md_ctx, input, ilen);/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
return mbedtls_sha256_update_ret(ctx->md_ctx, input, ilen);/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
return mbedtls_sha512_update_ret(ctx->md_ctx, input, ilen);/* ... */
#endif
default:
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;default
}switch (ctx->md_info->type) { ... }
}{ ... }
int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
{
if (ctx == NULL || ctx->md_info == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL) { ... }
switch (ctx->md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
return mbedtls_md2_finish_ret(ctx->md_ctx, output);/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
return mbedtls_md4_finish_ret(ctx->md_ctx, output);/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
return mbedtls_md5_finish_ret(ctx->md_ctx, output);/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
return mbedtls_ripemd160_finish_ret(ctx->md_ctx, output);/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
return mbedtls_sha1_finish_ret(ctx->md_ctx, output);/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
return mbedtls_sha256_finish_ret(ctx->md_ctx, output);/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
return mbedtls_sha512_finish_ret(ctx->md_ctx, output);/* ... */
#endif
default:
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;default
}switch (ctx->md_info->type) { ... }
}{ ... }
int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
unsigned char *output)
{
if (md_info == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (md_info == NULL) { ... }
switch (md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
return mbedtls_md2_ret(input, ilen, output);/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
return mbedtls_md4_ret(input, ilen, output);/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
return mbedtls_md5_ret(input, ilen, output);/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
return mbedtls_ripemd160_ret(input, ilen, output);/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
return mbedtls_sha1_ret(input, ilen, output);/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
return mbedtls_sha256_ret(input, ilen, output, 1);case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
return mbedtls_sha256_ret(input, ilen, output, 0);/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
return mbedtls_sha512_ret(input, ilen, output, 1);/* ... */
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
return mbedtls_sha512_ret(input, ilen, output, 0);/* ... */
#endif
default:
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;default
}switch (md_info->type) { ... }
}{ ... }
#if defined(MBEDTLS_FS_IO)
int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
{
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
FILE *f;
size_t n;
mbedtls_md_context_t ctx;
unsigned char buf[1024];
if (md_info == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (md_info == NULL) { ... }
if ((f = fopen(path, "rb")) == NULL) {
return MBEDTLS_ERR_MD_FILE_IO_ERROR;
}if ((f = fopen(path, "rb")) == NULL) { ... }
mbedtls_md_init(&ctx);
if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) { ... }
if ((ret = mbedtls_md_starts(&ctx)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_starts(&ctx)) != 0) { ... }
while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) { ... }
}while ((n = fread(buf, 1, sizeof(buf), f)) > 0) { ... }
if (ferror(f) != 0) {
ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
}if (ferror(f) != 0) { ... } else {
ret = mbedtls_md_finish(&ctx, output);
}else { ... }
cleanup:
mbedtls_platform_zeroize(buf, sizeof(buf));
fclose(f);
mbedtls_md_free(&ctx);
return ret;
}mbedtls_md_file (const mbedtls_md_info_t *md_info, const char *path, unsigned char *output) { ... }
/* ... */#endif
int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
{
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
unsigned char sum[MBEDTLS_MD_MAX_SIZE];
unsigned char *ipad, *opad;
size_t i;
if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { ... }
if (keylen > (size_t) ctx->md_info->block_size) {
if ((ret = mbedtls_md_starts(ctx)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_starts(ctx)) != 0) { ... }
if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) { ... }
if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_finish(ctx, sum)) != 0) { ... }
keylen = ctx->md_info->size;
key = sum;
}if (keylen > (size_t) ctx->md_info->block_size) { ... }
ipad = (unsigned char *) ctx->hmac_ctx;
opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
memset(ipad, 0x36, ctx->md_info->block_size);
memset(opad, 0x5C, ctx->md_info->block_size);
for (i = 0; i < keylen; i++) {
ipad[i] = (unsigned char) (ipad[i] ^ key[i]);
opad[i] = (unsigned char) (opad[i] ^ key[i]);
}for (i = 0; i < keylen; i++) { ... }
if ((ret = mbedtls_md_starts(ctx)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_starts(ctx)) != 0) { ... }
if ((ret = mbedtls_md_update(ctx, ipad,
ctx->md_info->block_size)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_update(ctx, ipad, ctx->md_info->block_size)) != 0) { ... }
cleanup:
mbedtls_platform_zeroize(sum, sizeof(sum));
return ret;
}{ ... }
int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
{
if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { ... }
return mbedtls_md_update(ctx, input, ilen);
}{ ... }
int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
{
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
unsigned char *opad;
if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { ... }
opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
return ret;
}if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) { ... }
if ((ret = mbedtls_md_starts(ctx)) != 0) {
return ret;
}if ((ret = mbedtls_md_starts(ctx)) != 0) { ... }
if ((ret = mbedtls_md_update(ctx, opad,
ctx->md_info->block_size)) != 0) {
return ret;
}if ((ret = mbedtls_md_update(ctx, opad, ctx->md_info->block_size)) != 0) { ... }
if ((ret = mbedtls_md_update(ctx, tmp,
ctx->md_info->size)) != 0) {
return ret;
}if ((ret = mbedtls_md_update(ctx, tmp, ctx->md_info->size)) != 0) { ... }
return mbedtls_md_finish(ctx, output);
}{ ... }
int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
{
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
unsigned char *ipad;
if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { ... }
ipad = (unsigned char *) ctx->hmac_ctx;
if ((ret = mbedtls_md_starts(ctx)) != 0) {
return ret;
}if ((ret = mbedtls_md_starts(ctx)) != 0) { ... }
return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
}{ ... }
int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
const unsigned char *key, size_t keylen,
const unsigned char *input, size_t ilen,
unsigned char *output)
{
mbedtls_md_context_t ctx;
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
if (md_info == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (md_info == NULL) { ... }
mbedtls_md_init(&ctx);
if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) { ... }
if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) { ... }
if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) { ... }
if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
goto cleanup;
}if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) { ... }
cleanup:
mbedtls_md_free(&ctx);
return ret;
}{ ... }
int mbedtls_md_process(mbedtls_md_context_t *ctx, const unsigned char *data)
{
if (ctx == NULL || ctx->md_info == NULL) {
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->md_info == NULL) { ... }
switch (ctx->md_info->type) {
#if defined(MBEDTLS_MD2_C)
case MBEDTLS_MD_MD2:
return mbedtls_internal_md2_process(ctx->md_ctx);/* ... */
#endif
#if defined(MBEDTLS_MD4_C)case MBEDTLS_MD_MD2:
case MBEDTLS_MD_MD4:
return mbedtls_internal_md4_process(ctx->md_ctx, data);/* ... */
#endif
#if defined(MBEDTLS_MD5_C)case MBEDTLS_MD_MD4:
case MBEDTLS_MD_MD5:
return mbedtls_internal_md5_process(ctx->md_ctx, data);/* ... */
#endif
#if defined(MBEDTLS_RIPEMD160_C)case MBEDTLS_MD_MD5:
case MBEDTLS_MD_RIPEMD160:
return mbedtls_internal_ripemd160_process(ctx->md_ctx, data);/* ... */
#endif
#if defined(MBEDTLS_SHA1_C)case MBEDTLS_MD_RIPEMD160:
case MBEDTLS_MD_SHA1:
return mbedtls_internal_sha1_process(ctx->md_ctx, data);/* ... */
#endif
#if defined(MBEDTLS_SHA256_C)case MBEDTLS_MD_SHA1:
case MBEDTLS_MD_SHA224:
case MBEDTLS_MD_SHA256:
return mbedtls_internal_sha256_process(ctx->md_ctx, data);/* ... */
#endif
#if defined(MBEDTLS_SHA512_C)
#if !defined(MBEDTLS_SHA512_NO_SHA384)
case MBEDTLS_MD_SHA384:
#endifcase MBEDTLS_MD_SHA384:
case MBEDTLS_MD_SHA512:
return mbedtls_internal_sha512_process(ctx->md_ctx, data);/* ... */
#endif
default:
return MBEDTLS_ERR_MD_BAD_INPUT_DATA;default
}switch (ctx->md_info->type) { ... }
}{ ... }
unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
{
if (md_info == NULL) {
return 0;
}if (md_info == NULL) { ... }
return md_info->size;
}{ ... }
mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
{
if (md_info == NULL) {
return MBEDTLS_MD_NONE;
}if (md_info == NULL) { ... }
return md_info->type;
}{ ... }
const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
{
if (md_info == NULL) {
return NULL;
}if (md_info == NULL) { ... }
return md_info->name;
}{ ... }
/* ... */#endif