v2 / thirdparty / mbedtls / library / md.c
1108 lines · 984 sloc · 29.42 KB · 1274cdc3447be8e83616e8512872455e8720c2fd
Raw
1/**
2 * \file md.c
3 *
4 * \brief Generic message digest wrapper for Mbed TLS
5 *
6 * \author Adriaan de Jong <[email protected]>
7 *
8 * Copyright The Mbed TLS Contributors
9 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
10 */
11
12#include "common.h"
13
14/*
15 * Availability of functions in this module is controlled by two
16 * feature macros:
17 * - MBEDTLS_MD_C enables the whole module;
18 * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
19 * most hash metadata (everything except string names); is it
20 * automatically set whenever MBEDTLS_MD_C is defined.
21 *
22 * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
23 *
24 * In the future we may want to change the contract of some functions
25 * (behaviour with NULL arguments) depending on whether MD_C is defined or
26 * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
27 *
28 * For these reasons, we're keeping MD_LIGHT internal for now.
29 */
30#if defined(MBEDTLS_MD_LIGHT)
31
32#include "mbedtls/md.h"
33#include "md_wrap.h"
34#include "mbedtls/platform_util.h"
35#include "mbedtls/error.h"
36
37#include "mbedtls/md5.h"
38#include "mbedtls/ripemd160.h"
39#include "mbedtls/sha1.h"
40#include "mbedtls/sha256.h"
41#include "mbedtls/sha512.h"
42#include "mbedtls/sha3.h"
43
44#if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
45#include <psa/crypto.h>
46#include "md_psa.h"
47#include "psa_util_internal.h"
48#endif
49
50#if defined(MBEDTLS_MD_SOME_PSA)
51#include "psa_crypto_core.h"
52#endif
53
54#include "mbedtls/platform.h"
55
56#include <string.h>
57
58#if defined(MBEDTLS_FS_IO)
59#include <stdio.h>
60#endif
61
62/* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
63#if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
64#error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
65#endif
66
67#if defined(MBEDTLS_MD_C)
68#define MD_INFO(type, out_size, block_size) type, out_size, block_size,
69#else
70#define MD_INFO(type, out_size, block_size) type, out_size,
71#endif
72
73#if defined(MBEDTLS_MD_CAN_MD5)
74static const mbedtls_md_info_t mbedtls_md5_info = {
75 MD_INFO(MBEDTLS_MD_MD5, 16, 64)
76};
77#endif
78
79#if defined(MBEDTLS_MD_CAN_RIPEMD160)
80static const mbedtls_md_info_t mbedtls_ripemd160_info = {
81 MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64)
82};
83#endif
84
85#if defined(MBEDTLS_MD_CAN_SHA1)
86static const mbedtls_md_info_t mbedtls_sha1_info = {
87 MD_INFO(MBEDTLS_MD_SHA1, 20, 64)
88};
89#endif
90
91#if defined(MBEDTLS_MD_CAN_SHA224)
92static const mbedtls_md_info_t mbedtls_sha224_info = {
93 MD_INFO(MBEDTLS_MD_SHA224, 28, 64)
94};
95#endif
96
97#if defined(MBEDTLS_MD_CAN_SHA256)
98static const mbedtls_md_info_t mbedtls_sha256_info = {
99 MD_INFO(MBEDTLS_MD_SHA256, 32, 64)
100};
101#endif
102
103#if defined(MBEDTLS_MD_CAN_SHA384)
104static const mbedtls_md_info_t mbedtls_sha384_info = {
105 MD_INFO(MBEDTLS_MD_SHA384, 48, 128)
106};
107#endif
108
109#if defined(MBEDTLS_MD_CAN_SHA512)
110static const mbedtls_md_info_t mbedtls_sha512_info = {
111 MD_INFO(MBEDTLS_MD_SHA512, 64, 128)
112};
113#endif
114
115#if defined(MBEDTLS_MD_CAN_SHA3_224)
116static const mbedtls_md_info_t mbedtls_sha3_224_info = {
117 MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144)
118};
119#endif
120
121#if defined(MBEDTLS_MD_CAN_SHA3_256)
122static const mbedtls_md_info_t mbedtls_sha3_256_info = {
123 MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136)
124};
125#endif
126
127#if defined(MBEDTLS_MD_CAN_SHA3_384)
128static const mbedtls_md_info_t mbedtls_sha3_384_info = {
129 MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104)
130};
131#endif
132
133#if defined(MBEDTLS_MD_CAN_SHA3_512)
134static const mbedtls_md_info_t mbedtls_sha3_512_info = {
135 MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72)
136};
137#endif
138
139const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
140{
141 switch (md_type) {
142#if defined(MBEDTLS_MD_CAN_MD5)
143 case MBEDTLS_MD_MD5:
144 return &mbedtls_md5_info;
145#endif
146#if defined(MBEDTLS_MD_CAN_RIPEMD160)
147 case MBEDTLS_MD_RIPEMD160:
148 return &mbedtls_ripemd160_info;
149#endif
150#if defined(MBEDTLS_MD_CAN_SHA1)
151 case MBEDTLS_MD_SHA1:
152 return &mbedtls_sha1_info;
153#endif
154#if defined(MBEDTLS_MD_CAN_SHA224)
155 case MBEDTLS_MD_SHA224:
156 return &mbedtls_sha224_info;
157#endif
158#if defined(MBEDTLS_MD_CAN_SHA256)
159 case MBEDTLS_MD_SHA256:
160 return &mbedtls_sha256_info;
161#endif
162#if defined(MBEDTLS_MD_CAN_SHA384)
163 case MBEDTLS_MD_SHA384:
164 return &mbedtls_sha384_info;
165#endif
166#if defined(MBEDTLS_MD_CAN_SHA512)
167 case MBEDTLS_MD_SHA512:
168 return &mbedtls_sha512_info;
169#endif
170#if defined(MBEDTLS_MD_CAN_SHA3_224)
171 case MBEDTLS_MD_SHA3_224:
172 return &mbedtls_sha3_224_info;
173#endif
174#if defined(MBEDTLS_MD_CAN_SHA3_256)
175 case MBEDTLS_MD_SHA3_256:
176 return &mbedtls_sha3_256_info;
177#endif
178#if defined(MBEDTLS_MD_CAN_SHA3_384)
179 case MBEDTLS_MD_SHA3_384:
180 return &mbedtls_sha3_384_info;
181#endif
182#if defined(MBEDTLS_MD_CAN_SHA3_512)
183 case MBEDTLS_MD_SHA3_512:
184 return &mbedtls_sha3_512_info;
185#endif
186 default:
187 return NULL;
188 }
189}
190
191#if defined(MBEDTLS_MD_SOME_PSA)
192static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
193{
194 switch (info->type) {
195#if defined(MBEDTLS_MD_MD5_VIA_PSA)
196 case MBEDTLS_MD_MD5:
197 return PSA_ALG_MD5;
198#endif
199#if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
200 case MBEDTLS_MD_RIPEMD160:
201 return PSA_ALG_RIPEMD160;
202#endif
203#if defined(MBEDTLS_MD_SHA1_VIA_PSA)
204 case MBEDTLS_MD_SHA1:
205 return PSA_ALG_SHA_1;
206#endif
207#if defined(MBEDTLS_MD_SHA224_VIA_PSA)
208 case MBEDTLS_MD_SHA224:
209 return PSA_ALG_SHA_224;
210#endif
211#if defined(MBEDTLS_MD_SHA256_VIA_PSA)
212 case MBEDTLS_MD_SHA256:
213 return PSA_ALG_SHA_256;
214#endif
215#if defined(MBEDTLS_MD_SHA384_VIA_PSA)
216 case MBEDTLS_MD_SHA384:
217 return PSA_ALG_SHA_384;
218#endif
219#if defined(MBEDTLS_MD_SHA512_VIA_PSA)
220 case MBEDTLS_MD_SHA512:
221 return PSA_ALG_SHA_512;
222#endif
223#if defined(MBEDTLS_MD_SHA3_224_VIA_PSA)
224 case MBEDTLS_MD_SHA3_224:
225 return PSA_ALG_SHA3_224;
226#endif
227#if defined(MBEDTLS_MD_SHA3_256_VIA_PSA)
228 case MBEDTLS_MD_SHA3_256:
229 return PSA_ALG_SHA3_256;
230#endif
231#if defined(MBEDTLS_MD_SHA3_384_VIA_PSA)
232 case MBEDTLS_MD_SHA3_384:
233 return PSA_ALG_SHA3_384;
234#endif
235#if defined(MBEDTLS_MD_SHA3_512_VIA_PSA)
236 case MBEDTLS_MD_SHA3_512:
237 return PSA_ALG_SHA3_512;
238#endif
239 default:
240 return PSA_ALG_NONE;
241 }
242}
243
244static int md_can_use_psa(const mbedtls_md_info_t *info)
245{
246 psa_algorithm_t alg = psa_alg_of_md(info);
247 if (alg == PSA_ALG_NONE) {
248 return 0;
249 }
250
251 return psa_can_do_hash(alg);
252}
253#endif /* MBEDTLS_MD_SOME_PSA */
254
255void mbedtls_md_init(mbedtls_md_context_t *ctx)
256{
257 /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
258 memset(ctx, 0, sizeof(mbedtls_md_context_t));
259}
260
261void mbedtls_md_free(mbedtls_md_context_t *ctx)
262{
263 if (ctx == NULL || ctx->md_info == NULL) {
264 return;
265 }
266
267 if (ctx->md_ctx != NULL) {
268#if defined(MBEDTLS_MD_SOME_PSA)
269 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
270 psa_hash_abort(ctx->md_ctx);
271 } else
272#endif
273 switch (ctx->md_info->type) {
274#if defined(MBEDTLS_MD5_C)
275 case MBEDTLS_MD_MD5:
276 mbedtls_md5_free(ctx->md_ctx);
277 break;
278#endif
279#if defined(MBEDTLS_RIPEMD160_C)
280 case MBEDTLS_MD_RIPEMD160:
281 mbedtls_ripemd160_free(ctx->md_ctx);
282 break;
283#endif
284#if defined(MBEDTLS_SHA1_C)
285 case MBEDTLS_MD_SHA1:
286 mbedtls_sha1_free(ctx->md_ctx);
287 break;
288#endif
289#if defined(MBEDTLS_SHA224_C)
290 case MBEDTLS_MD_SHA224:
291 mbedtls_sha256_free(ctx->md_ctx);
292 break;
293#endif
294#if defined(MBEDTLS_SHA256_C)
295 case MBEDTLS_MD_SHA256:
296 mbedtls_sha256_free(ctx->md_ctx);
297 break;
298#endif
299#if defined(MBEDTLS_SHA384_C)
300 case MBEDTLS_MD_SHA384:
301 mbedtls_sha512_free(ctx->md_ctx);
302 break;
303#endif
304#if defined(MBEDTLS_SHA512_C)
305 case MBEDTLS_MD_SHA512:
306 mbedtls_sha512_free(ctx->md_ctx);
307 break;
308#endif
309#if defined(MBEDTLS_SHA3_C)
310 case MBEDTLS_MD_SHA3_224:
311 case MBEDTLS_MD_SHA3_256:
312 case MBEDTLS_MD_SHA3_384:
313 case MBEDTLS_MD_SHA3_512:
314 mbedtls_sha3_free(ctx->md_ctx);
315 break;
316#endif
317 default:
318 /* Shouldn't happen */
319 break;
320 }
321 mbedtls_free(ctx->md_ctx);
322 }
323
324#if defined(MBEDTLS_MD_C)
325 if (ctx->hmac_ctx != NULL) {
326 mbedtls_zeroize_and_free(ctx->hmac_ctx,
327 2 * ctx->md_info->block_size);
328 }
329#endif
330
331 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
332}
333
334int mbedtls_md_clone(mbedtls_md_context_t *dst,
335 const mbedtls_md_context_t *src)
336{
337 if (dst == NULL || dst->md_info == NULL ||
338 src == NULL || src->md_info == NULL ||
339 dst->md_info != src->md_info) {
340 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
341 }
342
343#if defined(MBEDTLS_MD_SOME_PSA)
344 if (src->engine != dst->engine) {
345 /* This can happen with src set to legacy because PSA wasn't ready
346 * yet, and dst to PSA because it became ready in the meantime.
347 * We currently don't support that case (we'd need to re-allocate
348 * md_ctx to the size of the appropriate MD context). */
349 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
350 }
351
352 if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
353 psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
354 return mbedtls_md_error_from_psa(status);
355 }
356#endif
357
358 switch (src->md_info->type) {
359#if defined(MBEDTLS_MD5_C)
360 case MBEDTLS_MD_MD5:
361 mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
362 break;
363#endif
364#if defined(MBEDTLS_RIPEMD160_C)
365 case MBEDTLS_MD_RIPEMD160:
366 mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
367 break;
368#endif
369#if defined(MBEDTLS_SHA1_C)
370 case MBEDTLS_MD_SHA1:
371 mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
372 break;
373#endif
374#if defined(MBEDTLS_SHA224_C)
375 case MBEDTLS_MD_SHA224:
376 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
377 break;
378#endif
379#if defined(MBEDTLS_SHA256_C)
380 case MBEDTLS_MD_SHA256:
381 mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
382 break;
383#endif
384#if defined(MBEDTLS_SHA384_C)
385 case MBEDTLS_MD_SHA384:
386 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
387 break;
388#endif
389#if defined(MBEDTLS_SHA512_C)
390 case MBEDTLS_MD_SHA512:
391 mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
392 break;
393#endif
394#if defined(MBEDTLS_SHA3_C)
395 case MBEDTLS_MD_SHA3_224:
396 case MBEDTLS_MD_SHA3_256:
397 case MBEDTLS_MD_SHA3_384:
398 case MBEDTLS_MD_SHA3_512:
399 mbedtls_sha3_clone(dst->md_ctx, src->md_ctx);
400 break;
401#endif
402 default:
403 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
404 }
405
406 return 0;
407}
408
409#define ALLOC(type) \
410 do { \
411 ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
412 if (ctx->md_ctx == NULL) \
413 return MBEDTLS_ERR_MD_ALLOC_FAILED; \
414 mbedtls_##type##_init(ctx->md_ctx); \
415 } \
416 while (0)
417
418int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
419{
420#if defined(MBEDTLS_MD_C)
421 if (ctx == NULL) {
422 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
423 }
424#endif
425 if (md_info == NULL) {
426 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
427 }
428
429 ctx->md_info = md_info;
430 ctx->md_ctx = NULL;
431#if defined(MBEDTLS_MD_C)
432 ctx->hmac_ctx = NULL;
433#else
434 if (hmac != 0) {
435 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
436 }
437#endif
438
439#if defined(MBEDTLS_MD_SOME_PSA)
440 if (md_can_use_psa(ctx->md_info)) {
441 ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
442 if (ctx->md_ctx == NULL) {
443 return MBEDTLS_ERR_MD_ALLOC_FAILED;
444 }
445 ctx->engine = MBEDTLS_MD_ENGINE_PSA;
446 } else
447#endif
448 switch (md_info->type) {
449#if defined(MBEDTLS_MD5_C)
450 case MBEDTLS_MD_MD5:
451 ALLOC(md5);
452 break;
453#endif
454#if defined(MBEDTLS_RIPEMD160_C)
455 case MBEDTLS_MD_RIPEMD160:
456 ALLOC(ripemd160);
457 break;
458#endif
459#if defined(MBEDTLS_SHA1_C)
460 case MBEDTLS_MD_SHA1:
461 ALLOC(sha1);
462 break;
463#endif
464#if defined(MBEDTLS_SHA224_C)
465 case MBEDTLS_MD_SHA224:
466 ALLOC(sha256);
467 break;
468#endif
469#if defined(MBEDTLS_SHA256_C)
470 case MBEDTLS_MD_SHA256:
471 ALLOC(sha256);
472 break;
473#endif
474#if defined(MBEDTLS_SHA384_C)
475 case MBEDTLS_MD_SHA384:
476 ALLOC(sha512);
477 break;
478#endif
479#if defined(MBEDTLS_SHA512_C)
480 case MBEDTLS_MD_SHA512:
481 ALLOC(sha512);
482 break;
483#endif
484#if defined(MBEDTLS_SHA3_C)
485 case MBEDTLS_MD_SHA3_224:
486 case MBEDTLS_MD_SHA3_256:
487 case MBEDTLS_MD_SHA3_384:
488 case MBEDTLS_MD_SHA3_512:
489 ALLOC(sha3);
490 break;
491#endif
492 default:
493 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
494 }
495
496#if defined(MBEDTLS_MD_C)
497 if (hmac != 0) {
498 ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
499 if (ctx->hmac_ctx == NULL) {
500 mbedtls_md_free(ctx);
501 return MBEDTLS_ERR_MD_ALLOC_FAILED;
502 }
503 }
504#endif
505
506 return 0;
507}
508#undef ALLOC
509
510int mbedtls_md_starts(mbedtls_md_context_t *ctx)
511{
512#if defined(MBEDTLS_MD_C)
513 if (ctx == NULL || ctx->md_info == NULL) {
514 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
515 }
516#endif
517
518#if defined(MBEDTLS_MD_SOME_PSA)
519 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
520 psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
521 psa_hash_abort(ctx->md_ctx);
522 psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
523 return mbedtls_md_error_from_psa(status);
524 }
525#endif
526
527 switch (ctx->md_info->type) {
528#if defined(MBEDTLS_MD5_C)
529 case MBEDTLS_MD_MD5:
530 return mbedtls_md5_starts(ctx->md_ctx);
531#endif
532#if defined(MBEDTLS_RIPEMD160_C)
533 case MBEDTLS_MD_RIPEMD160:
534 return mbedtls_ripemd160_starts(ctx->md_ctx);
535#endif
536#if defined(MBEDTLS_SHA1_C)
537 case MBEDTLS_MD_SHA1:
538 return mbedtls_sha1_starts(ctx->md_ctx);
539#endif
540#if defined(MBEDTLS_SHA224_C)
541 case MBEDTLS_MD_SHA224:
542 return mbedtls_sha256_starts(ctx->md_ctx, 1);
543#endif
544#if defined(MBEDTLS_SHA256_C)
545 case MBEDTLS_MD_SHA256:
546 return mbedtls_sha256_starts(ctx->md_ctx, 0);
547#endif
548#if defined(MBEDTLS_SHA384_C)
549 case MBEDTLS_MD_SHA384:
550 return mbedtls_sha512_starts(ctx->md_ctx, 1);
551#endif
552#if defined(MBEDTLS_SHA512_C)
553 case MBEDTLS_MD_SHA512:
554 return mbedtls_sha512_starts(ctx->md_ctx, 0);
555#endif
556#if defined(MBEDTLS_SHA3_C)
557 case MBEDTLS_MD_SHA3_224:
558 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
559 case MBEDTLS_MD_SHA3_256:
560 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
561 case MBEDTLS_MD_SHA3_384:
562 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
563 case MBEDTLS_MD_SHA3_512:
564 return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
565#endif
566 default:
567 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
568 }
569}
570
571int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
572{
573#if defined(MBEDTLS_MD_C)
574 if (ctx == NULL || ctx->md_info == NULL) {
575 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
576 }
577#endif
578
579#if defined(MBEDTLS_MD_SOME_PSA)
580 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
581 psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
582 return mbedtls_md_error_from_psa(status);
583 }
584#endif
585
586 switch (ctx->md_info->type) {
587#if defined(MBEDTLS_MD5_C)
588 case MBEDTLS_MD_MD5:
589 return mbedtls_md5_update(ctx->md_ctx, input, ilen);
590#endif
591#if defined(MBEDTLS_RIPEMD160_C)
592 case MBEDTLS_MD_RIPEMD160:
593 return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
594#endif
595#if defined(MBEDTLS_SHA1_C)
596 case MBEDTLS_MD_SHA1:
597 return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
598#endif
599#if defined(MBEDTLS_SHA224_C)
600 case MBEDTLS_MD_SHA224:
601 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
602#endif
603#if defined(MBEDTLS_SHA256_C)
604 case MBEDTLS_MD_SHA256:
605 return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
606#endif
607#if defined(MBEDTLS_SHA384_C)
608 case MBEDTLS_MD_SHA384:
609 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
610#endif
611#if defined(MBEDTLS_SHA512_C)
612 case MBEDTLS_MD_SHA512:
613 return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
614#endif
615#if defined(MBEDTLS_SHA3_C)
616 case MBEDTLS_MD_SHA3_224:
617 case MBEDTLS_MD_SHA3_256:
618 case MBEDTLS_MD_SHA3_384:
619 case MBEDTLS_MD_SHA3_512:
620 return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
621#endif
622 default:
623 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
624 }
625}
626
627int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
628{
629#if defined(MBEDTLS_MD_C)
630 if (ctx == NULL || ctx->md_info == NULL) {
631 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
632 }
633#endif
634
635#if defined(MBEDTLS_MD_SOME_PSA)
636 if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
637 size_t size = ctx->md_info->size;
638 psa_status_t status = psa_hash_finish(ctx->md_ctx,
639 output, size, &size);
640 return mbedtls_md_error_from_psa(status);
641 }
642#endif
643
644 switch (ctx->md_info->type) {
645#if defined(MBEDTLS_MD5_C)
646 case MBEDTLS_MD_MD5:
647 return mbedtls_md5_finish(ctx->md_ctx, output);
648#endif
649#if defined(MBEDTLS_RIPEMD160_C)
650 case MBEDTLS_MD_RIPEMD160:
651 return mbedtls_ripemd160_finish(ctx->md_ctx, output);
652#endif
653#if defined(MBEDTLS_SHA1_C)
654 case MBEDTLS_MD_SHA1:
655 return mbedtls_sha1_finish(ctx->md_ctx, output);
656#endif
657#if defined(MBEDTLS_SHA224_C)
658 case MBEDTLS_MD_SHA224:
659 return mbedtls_sha256_finish(ctx->md_ctx, output);
660#endif
661#if defined(MBEDTLS_SHA256_C)
662 case MBEDTLS_MD_SHA256:
663 return mbedtls_sha256_finish(ctx->md_ctx, output);
664#endif
665#if defined(MBEDTLS_SHA384_C)
666 case MBEDTLS_MD_SHA384:
667 return mbedtls_sha512_finish(ctx->md_ctx, output);
668#endif
669#if defined(MBEDTLS_SHA512_C)
670 case MBEDTLS_MD_SHA512:
671 return mbedtls_sha512_finish(ctx->md_ctx, output);
672#endif
673#if defined(MBEDTLS_SHA3_C)
674 case MBEDTLS_MD_SHA3_224:
675 case MBEDTLS_MD_SHA3_256:
676 case MBEDTLS_MD_SHA3_384:
677 case MBEDTLS_MD_SHA3_512:
678 return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
679#endif
680 default:
681 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
682 }
683}
684
685int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
686 unsigned char *output)
687{
688 if (md_info == NULL) {
689 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
690 }
691
692#if defined(MBEDTLS_MD_SOME_PSA)
693 if (md_can_use_psa(md_info)) {
694 size_t size = md_info->size;
695 psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
696 input, ilen,
697 output, size, &size);
698 return mbedtls_md_error_from_psa(status);
699 }
700#endif
701
702 switch (md_info->type) {
703#if defined(MBEDTLS_MD5_C)
704 case MBEDTLS_MD_MD5:
705 return mbedtls_md5(input, ilen, output);
706#endif
707#if defined(MBEDTLS_RIPEMD160_C)
708 case MBEDTLS_MD_RIPEMD160:
709 return mbedtls_ripemd160(input, ilen, output);
710#endif
711#if defined(MBEDTLS_SHA1_C)
712 case MBEDTLS_MD_SHA1:
713 return mbedtls_sha1(input, ilen, output);
714#endif
715#if defined(MBEDTLS_SHA224_C)
716 case MBEDTLS_MD_SHA224:
717 return mbedtls_sha256(input, ilen, output, 1);
718#endif
719#if defined(MBEDTLS_SHA256_C)
720 case MBEDTLS_MD_SHA256:
721 return mbedtls_sha256(input, ilen, output, 0);
722#endif
723#if defined(MBEDTLS_SHA384_C)
724 case MBEDTLS_MD_SHA384:
725 return mbedtls_sha512(input, ilen, output, 1);
726#endif
727#if defined(MBEDTLS_SHA512_C)
728 case MBEDTLS_MD_SHA512:
729 return mbedtls_sha512(input, ilen, output, 0);
730#endif
731#if defined(MBEDTLS_SHA3_C)
732 case MBEDTLS_MD_SHA3_224:
733 return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
734 case MBEDTLS_MD_SHA3_256:
735 return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
736 case MBEDTLS_MD_SHA3_384:
737 return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
738 case MBEDTLS_MD_SHA3_512:
739 return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
740#endif
741 default:
742 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
743 }
744}
745
746unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
747{
748 if (md_info == NULL) {
749 return 0;
750 }
751
752 return md_info->size;
753}
754
755mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
756{
757 if (md_info == NULL) {
758 return MBEDTLS_MD_NONE;
759 }
760
761 return md_info->type;
762}
763
764#if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
765int mbedtls_md_error_from_psa(psa_status_t status)
766{
767 return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
768 psa_generic_status_to_mbedtls);
769}
770#endif /* MBEDTLS_PSA_CRYPTO_CLIENT */
771
772
773/************************************************************************
774 * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
775 * functions below are only available when MBEDTLS_MD_C is set. *
776 ************************************************************************/
777#if defined(MBEDTLS_MD_C)
778
779/*
780 * Reminder: update profiles in x509_crt.c when adding a new hash!
781 */
782static const int supported_digests[] = {
783
784#if defined(MBEDTLS_MD_CAN_SHA512)
785 MBEDTLS_MD_SHA512,
786#endif
787
788#if defined(MBEDTLS_MD_CAN_SHA384)
789 MBEDTLS_MD_SHA384,
790#endif
791
792#if defined(MBEDTLS_MD_CAN_SHA256)
793 MBEDTLS_MD_SHA256,
794#endif
795#if defined(MBEDTLS_MD_CAN_SHA224)
796 MBEDTLS_MD_SHA224,
797#endif
798
799#if defined(MBEDTLS_MD_CAN_SHA1)
800 MBEDTLS_MD_SHA1,
801#endif
802
803#if defined(MBEDTLS_MD_CAN_RIPEMD160)
804 MBEDTLS_MD_RIPEMD160,
805#endif
806
807#if defined(MBEDTLS_MD_CAN_MD5)
808 MBEDTLS_MD_MD5,
809#endif
810
811#if defined(MBEDTLS_MD_CAN_SHA3_224)
812 MBEDTLS_MD_SHA3_224,
813#endif
814
815#if defined(MBEDTLS_MD_CAN_SHA3_256)
816 MBEDTLS_MD_SHA3_256,
817#endif
818
819#if defined(MBEDTLS_MD_CAN_SHA3_384)
820 MBEDTLS_MD_SHA3_384,
821#endif
822
823#if defined(MBEDTLS_MD_CAN_SHA3_512)
824 MBEDTLS_MD_SHA3_512,
825#endif
826
827 MBEDTLS_MD_NONE
828};
829
830const int *mbedtls_md_list(void)
831{
832 return supported_digests;
833}
834
835typedef struct {
836 const char *md_name;
837 mbedtls_md_type_t md_type;
838} md_name_entry;
839
840static const md_name_entry md_names[] = {
841#if defined(MBEDTLS_MD_CAN_MD5)
842 { "MD5", MBEDTLS_MD_MD5 },
843#endif
844#if defined(MBEDTLS_MD_CAN_RIPEMD160)
845 { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
846#endif
847#if defined(MBEDTLS_MD_CAN_SHA1)
848 { "SHA1", MBEDTLS_MD_SHA1 },
849 { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
850#endif
851#if defined(MBEDTLS_MD_CAN_SHA224)
852 { "SHA224", MBEDTLS_MD_SHA224 },
853#endif
854#if defined(MBEDTLS_MD_CAN_SHA256)
855 { "SHA256", MBEDTLS_MD_SHA256 },
856#endif
857#if defined(MBEDTLS_MD_CAN_SHA384)
858 { "SHA384", MBEDTLS_MD_SHA384 },
859#endif
860#if defined(MBEDTLS_MD_CAN_SHA512)
861 { "SHA512", MBEDTLS_MD_SHA512 },
862#endif
863#if defined(MBEDTLS_MD_CAN_SHA3_224)
864 { "SHA3-224", MBEDTLS_MD_SHA3_224 },
865#endif
866#if defined(MBEDTLS_MD_CAN_SHA3_256)
867 { "SHA3-256", MBEDTLS_MD_SHA3_256 },
868#endif
869#if defined(MBEDTLS_MD_CAN_SHA3_384)
870 { "SHA3-384", MBEDTLS_MD_SHA3_384 },
871#endif
872#if defined(MBEDTLS_MD_CAN_SHA3_512)
873 { "SHA3-512", MBEDTLS_MD_SHA3_512 },
874#endif
875 { NULL, MBEDTLS_MD_NONE },
876};
877
878const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
879{
880 if (NULL == md_name) {
881 return NULL;
882 }
883
884 const md_name_entry *entry = md_names;
885 while (entry->md_name != NULL &&
886 strcmp(entry->md_name, md_name) != 0) {
887 ++entry;
888 }
889
890 return mbedtls_md_info_from_type(entry->md_type);
891}
892
893const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
894{
895 if (md_info == NULL) {
896 return NULL;
897 }
898
899 const md_name_entry *entry = md_names;
900 while (entry->md_type != MBEDTLS_MD_NONE &&
901 entry->md_type != md_info->type) {
902 ++entry;
903 }
904
905 return entry->md_name;
906}
907
908const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
909 const mbedtls_md_context_t *ctx)
910{
911 if (ctx == NULL) {
912 return NULL;
913 }
914
915 return ctx->MBEDTLS_PRIVATE(md_info);
916}
917
918#if defined(MBEDTLS_FS_IO)
919int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
920{
921 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
922 FILE *f;
923 size_t n;
924 mbedtls_md_context_t ctx;
925 unsigned char buf[1024];
926
927 if (md_info == NULL) {
928 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
929 }
930
931 if ((f = fopen(path, "rb")) == NULL) {
932 return MBEDTLS_ERR_MD_FILE_IO_ERROR;
933 }
934
935 /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
936 mbedtls_setbuf(f, NULL);
937
938 mbedtls_md_init(&ctx);
939
940 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
941 goto cleanup;
942 }
943
944 if ((ret = mbedtls_md_starts(&ctx)) != 0) {
945 goto cleanup;
946 }
947
948 while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
949 if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
950 goto cleanup;
951 }
952 }
953
954 if (ferror(f) != 0) {
955 ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
956 } else {
957 ret = mbedtls_md_finish(&ctx, output);
958 }
959
960cleanup:
961 mbedtls_platform_zeroize(buf, sizeof(buf));
962 fclose(f);
963 mbedtls_md_free(&ctx);
964
965 return ret;
966}
967#endif /* MBEDTLS_FS_IO */
968
969int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
970{
971 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
972 unsigned char sum[MBEDTLS_MD_MAX_SIZE];
973 unsigned char *ipad, *opad;
974
975 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
976 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
977 }
978
979 if (keylen > (size_t) ctx->md_info->block_size) {
980 if ((ret = mbedtls_md_starts(ctx)) != 0) {
981 goto cleanup;
982 }
983 if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
984 goto cleanup;
985 }
986 if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
987 goto cleanup;
988 }
989
990 keylen = ctx->md_info->size;
991 key = sum;
992 }
993
994 ipad = (unsigned char *) ctx->hmac_ctx;
995 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
996
997 memset(ipad, 0x36, ctx->md_info->block_size);
998 memset(opad, 0x5C, ctx->md_info->block_size);
999
1000 mbedtls_xor(ipad, ipad, key, keylen);
1001 mbedtls_xor(opad, opad, key, keylen);
1002
1003 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1004 goto cleanup;
1005 }
1006 if ((ret = mbedtls_md_update(ctx, ipad,
1007 ctx->md_info->block_size)) != 0) {
1008 goto cleanup;
1009 }
1010
1011cleanup:
1012 mbedtls_platform_zeroize(sum, sizeof(sum));
1013
1014 return ret;
1015}
1016
1017int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
1018{
1019 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1020 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1021 }
1022
1023 return mbedtls_md_update(ctx, input, ilen);
1024}
1025
1026int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
1027{
1028 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1029 unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
1030 unsigned char *opad;
1031
1032 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1033 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1034 }
1035
1036 opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
1037
1038 if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
1039 return ret;
1040 }
1041 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1042 return ret;
1043 }
1044 if ((ret = mbedtls_md_update(ctx, opad,
1045 ctx->md_info->block_size)) != 0) {
1046 return ret;
1047 }
1048 if ((ret = mbedtls_md_update(ctx, tmp,
1049 ctx->md_info->size)) != 0) {
1050 return ret;
1051 }
1052 return mbedtls_md_finish(ctx, output);
1053}
1054
1055int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
1056{
1057 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1058 unsigned char *ipad;
1059
1060 if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1061 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1062 }
1063
1064 ipad = (unsigned char *) ctx->hmac_ctx;
1065
1066 if ((ret = mbedtls_md_starts(ctx)) != 0) {
1067 return ret;
1068 }
1069 return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
1070}
1071
1072int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1073 const unsigned char *key, size_t keylen,
1074 const unsigned char *input, size_t ilen,
1075 unsigned char *output)
1076{
1077 mbedtls_md_context_t ctx;
1078 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1079
1080 if (md_info == NULL) {
1081 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1082 }
1083
1084 mbedtls_md_init(&ctx);
1085
1086 if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
1087 goto cleanup;
1088 }
1089
1090 if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
1091 goto cleanup;
1092 }
1093 if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
1094 goto cleanup;
1095 }
1096 if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
1097 goto cleanup;
1098 }
1099
1100cleanup:
1101 mbedtls_md_free(&ctx);
1102
1103 return ret;
1104}
1105
1106#endif /* MBEDTLS_MD_C */
1107
1108#endif /* MBEDTLS_MD_LIGHT */
1109