Coverage Report

Created: 2026-05-21 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl/wolfcrypt/src/hash.c
Line
Count
Source
1
/* hash.c
2
 *
3
 * Copyright (C) 2006-2026 wolfSSL Inc.
4
 *
5
 * This file is part of wolfSSL.
6
 *
7
 * wolfSSL is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
23
24
#ifndef NO_ASN
25
#include <wolfssl/wolfcrypt/asn.h>
26
#endif
27
28
#include <wolfssl/wolfcrypt/hash.h>
29
#include <wolfssl/wolfcrypt/hmac.h>
30
#include <wolfssl/wolfcrypt/cryptocb.h>
31
32
#ifdef NO_INLINE
33
    #include <wolfssl/wolfcrypt/misc.h>
34
#else
35
    #define WOLFSSL_MISC_INCLUDED
36
    #include <wolfcrypt/src/misc.c>
37
#endif
38
39
40
#if !defined(NO_PWDBASED) || !defined(NO_ASN)
41
/* function converts int hash type to enum */
42
enum wc_HashType wc_HashTypeConvert(int hashType)
43
0
{
44
    /* Default to hash type none as error */
45
0
    enum wc_HashType eHashType = WC_HASH_TYPE_NONE;
46
#if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
47
    /* original FIPSv1  and CAVP selftest require a mapping for unique hash
48
       type to wc_HashType */
49
    switch (hashType) {
50
    #ifndef NO_MD5
51
        case WC_MD5:
52
            eHashType = WC_HASH_TYPE_MD5;
53
            break;
54
    #endif /* !NO_MD5 */
55
    #ifndef NO_SHA
56
        case WC_SHA:
57
            eHashType = WC_HASH_TYPE_SHA;
58
            break;
59
    #endif /* !NO_SHA */
60
61
    #ifdef WOLFSSL_SHA224
62
        case WC_SHA224:
63
            eHashType = WC_HASH_TYPE_SHA224;
64
            break;
65
    #endif /* WOLFSSL_SHA224 */
66
67
    #ifndef NO_SHA256
68
        case WC_SHA256:
69
            eHashType = WC_HASH_TYPE_SHA256;
70
            break;
71
    #endif /* !NO_SHA256 */
72
73
    #ifdef WOLFSSL_SHA384
74
        case WC_SHA384:
75
            eHashType = WC_HASH_TYPE_SHA384;
76
            break;
77
    #endif /* WOLFSSL_SHA384 */
78
    #ifdef WOLFSSL_SHA512
79
        case WC_SHA512:
80
            eHashType = WC_HASH_TYPE_SHA512;
81
            break;
82
    #if !defined(WOLFSSL_NOSHA512_224)
83
        case WC_SHA512_224:
84
            eHashType = WC_HASH_TYPE_SHA512_224;
85
            break;
86
    #endif
87
    #if !defined(WOLFSSL_NOSHA512_256)
88
        case WC_SHA512_256:
89
            eHashType = WC_HASH_TYPE_SHA512_256;
90
            break;
91
    #endif
92
    #endif /* WOLFSSL_SHA512 */
93
    #ifdef WOLFSSL_SHA3
94
        case WC_SHA3_224:
95
            eHashType = WC_HASH_TYPE_SHA3_224;
96
            break;
97
        case WC_SHA3_256:
98
            eHashType = WC_HASH_TYPE_SHA3_256;
99
            break;
100
        case WC_SHA3_384:
101
            eHashType = WC_HASH_TYPE_SHA3_384;
102
            break;
103
        case WC_SHA3_512:
104
            eHashType = WC_HASH_TYPE_SHA3_512;
105
            break;
106
    #endif /* WOLFSSL_SHA3 */
107
    #ifdef WOLFSSL_SM3
108
        case WC_SM3:
109
            eHashType = WC_HASH_TYPE_SM3;
110
            break;
111
    #endif
112
        default:
113
            eHashType = WC_HASH_TYPE_NONE;
114
            break;
115
    }
116
#else
117
    /* current master uses same unique types as wc_HashType */
118
0
    if (hashType > 0 && hashType <= WC_HASH_TYPE_MAX) {
119
0
        eHashType = (enum wc_HashType)hashType;
120
0
    }
121
0
#endif
122
0
    return eHashType;
123
0
}
124
#endif /* !NO_PWDBASED || !NO_ASN */
125
126
#if !defined(NO_ASN) || !defined(NO_DH) || defined(HAVE_ECC)
127
128
int wc_HashGetOID(enum wc_HashType hash_type)
129
0
{
130
0
    int oid;
131
0
    switch(hash_type)
132
0
    {
133
0
        case WC_HASH_TYPE_MD2:
134
        #ifdef WOLFSSL_MD2
135
            oid = MD2h;
136
        #else
137
0
            oid = HASH_TYPE_E;
138
0
        #endif
139
0
            break;
140
0
        case WC_HASH_TYPE_MD5_SHA:
141
        #if !defined(NO_MD5) && !defined(NO_SHA)
142
            oid = MD5h;
143
        #else
144
0
            oid = HASH_TYPE_E;
145
0
        #endif
146
0
            break;
147
0
        case WC_HASH_TYPE_MD5:
148
        #ifndef NO_MD5
149
            oid = MD5h;
150
        #else
151
0
            oid = HASH_TYPE_E;
152
0
        #endif
153
0
            break;
154
0
        case WC_HASH_TYPE_SHA:
155
0
        #ifndef NO_SHA
156
0
            oid = SHAh;
157
        #else
158
            oid = HASH_TYPE_E;
159
        #endif
160
0
            break;
161
0
        case WC_HASH_TYPE_SHA224:
162
0
        #ifdef WOLFSSL_SHA224
163
0
            oid = SHA224h;
164
        #else
165
            oid = HASH_TYPE_E;
166
        #endif
167
0
            break;
168
0
        case WC_HASH_TYPE_SHA256:
169
0
        #ifndef NO_SHA256
170
0
            oid = SHA256h;
171
        #else
172
            oid = HASH_TYPE_E;
173
        #endif
174
0
            break;
175
0
        case WC_HASH_TYPE_SHA384:
176
0
        #ifdef WOLFSSL_SHA384
177
0
            oid = SHA384h;
178
        #else
179
            oid = HASH_TYPE_E;
180
        #endif
181
0
            break;
182
0
        case WC_HASH_TYPE_SHA512:
183
0
        #ifdef WOLFSSL_SHA512
184
0
            oid = SHA512h;
185
        #else
186
            oid = HASH_TYPE_E;
187
        #endif
188
0
            break;
189
0
        case WC_HASH_TYPE_SHA512_224:
190
0
        #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
191
0
            oid = SHA512_224h;
192
        #else
193
            oid = HASH_TYPE_E;
194
        #endif
195
0
            break;
196
0
        case WC_HASH_TYPE_SHA512_256:
197
0
        #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
198
0
            oid = SHA512_256h;
199
        #else
200
            oid = HASH_TYPE_E;
201
        #endif
202
0
            break;
203
0
        case WC_HASH_TYPE_SHA3_224:
204
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
205
0
            oid = SHA3_224h;
206
        #else
207
            oid = HASH_TYPE_E;
208
        #endif
209
0
            break;
210
0
        case WC_HASH_TYPE_SHA3_256:
211
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
212
0
            oid = SHA3_256h;
213
        #else
214
            oid = HASH_TYPE_E;
215
        #endif
216
0
            break;
217
0
        case WC_HASH_TYPE_SHA3_384:
218
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
219
0
            oid = SHA3_384h;
220
        #else
221
            oid = HASH_TYPE_E;
222
        #endif
223
0
            break;
224
0
        case WC_HASH_TYPE_SHA3_512:
225
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
226
0
            oid = SHA3_512h;
227
        #else
228
            oid = HASH_TYPE_E;
229
        #endif
230
0
            break;
231
0
        case WC_HASH_TYPE_SHAKE128:
232
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
233
0
            oid = SHAKE128h;
234
        #else
235
            oid = HASH_TYPE_E;
236
        #endif
237
0
            break;
238
0
        case WC_HASH_TYPE_SHAKE256:
239
0
        #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
240
0
            oid = SHAKE256h;
241
        #else
242
            oid = HASH_TYPE_E;
243
        #endif
244
0
            break;
245
0
        case WC_HASH_TYPE_SM3:
246
        #ifdef WOLFSSL_SM3
247
            oid = SM3h;
248
        #else
249
0
            oid = HASH_TYPE_E;
250
0
        #endif
251
0
            break;
252
253
        /* Not Supported */
254
0
        case WC_HASH_TYPE_MD4:
255
0
            oid = HASH_TYPE_E;
256
0
            break;
257
0
        case WC_HASH_TYPE_BLAKE2B:
258
0
            oid = HASH_TYPE_E;
259
0
            break;
260
0
        case WC_HASH_TYPE_BLAKE2S:
261
0
            oid = HASH_TYPE_E;
262
0
            break;
263
264
0
        case WC_HASH_TYPE_NONE:
265
0
            oid = BAD_FUNC_ARG;
266
0
            break;
267
0
        default:
268
0
            oid = BAD_FUNC_ARG;
269
0
            break;
270
0
    }
271
0
    return oid;
272
0
}
273
274
enum wc_HashType wc_OidGetHash(int oid)
275
0
{
276
0
    enum wc_HashType hash_type;
277
0
    switch (oid)
278
0
    {
279
0
        case MD2h:
280
        #ifdef WOLFSSL_MD2
281
            hash_type = WC_HASH_TYPE_MD2;
282
        #else
283
0
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
284
0
        #endif
285
0
            break;
286
0
        case MD5h:
287
        #ifndef NO_MD5
288
            hash_type = WC_HASH_TYPE_MD5;
289
        #else
290
0
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
291
0
        #endif
292
0
            break;
293
0
        case SHAh:
294
0
        #ifndef NO_SHA
295
0
            hash_type = WC_HASH_TYPE_SHA;
296
        #else
297
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
298
        #endif
299
0
            break;
300
0
        case SHA224h:
301
0
        #ifdef WOLFSSL_SHA224
302
0
            hash_type = WC_HASH_TYPE_SHA224;
303
        #else
304
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
305
        #endif
306
0
            break;
307
0
        case SHA256h:
308
0
        #ifndef NO_SHA256
309
0
            hash_type = WC_HASH_TYPE_SHA256;
310
        #else
311
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
312
        #endif
313
0
            break;
314
0
        case SHA384h:
315
0
        #ifdef WOLFSSL_SHA384
316
0
            hash_type = WC_HASH_TYPE_SHA384;
317
        #else
318
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
319
        #endif
320
0
            break;
321
0
        case SHA512h:
322
0
        #ifdef WOLFSSL_SHA512
323
0
            hash_type = WC_HASH_TYPE_SHA512;
324
        #else
325
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
326
        #endif
327
0
            break;
328
0
        case SHA3_224h:
329
0
        #ifdef WOLFSSL_SHA3
330
0
            hash_type = WC_HASH_TYPE_SHA3_224;
331
        #else
332
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
333
        #endif
334
0
            break;
335
0
        case SHA3_256h:
336
0
        #ifdef WOLFSSL_SHA3
337
0
            hash_type = WC_HASH_TYPE_SHA3_256;
338
        #else
339
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
340
        #endif
341
0
            break;
342
0
        case SHA3_384h:
343
0
        #ifdef WOLFSSL_SHA3
344
0
            hash_type = WC_HASH_TYPE_SHA3_384;
345
        #else
346
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
347
        #endif
348
0
            break;
349
0
        case SHA3_512h:
350
0
        #ifdef WOLFSSL_SHA3
351
0
            hash_type = WC_HASH_TYPE_SHA3_512;
352
        #else
353
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
354
        #endif
355
0
            break;
356
0
        case SM3h:
357
        #ifdef WOLFSSL_SM3
358
            hash_type = WC_HASH_TYPE_SM3;
359
        #else
360
0
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
361
0
        #endif
362
0
            break;
363
0
        default:
364
0
            hash_type = WC_ERR_TRACE(WC_HASH_TYPE_NONE);
365
0
            break;
366
0
    }
367
0
    return hash_type;
368
0
}
369
#endif /* !NO_ASN || !NO_DH || HAVE_ECC */
370
371
#ifndef NO_HASH_WRAPPER
372
373
/* Get Hash digest size */
374
int wc_HashGetDigestSize(enum wc_HashType hash_type)
375
0
{
376
0
    int dig_size;
377
0
    switch(hash_type)
378
0
    {
379
0
        case WC_HASH_TYPE_MD2:
380
        #ifdef WOLFSSL_MD2
381
            dig_size = WC_MD2_DIGEST_SIZE;
382
        #else
383
0
            dig_size = HASH_TYPE_E;
384
0
        #endif
385
0
            break;
386
0
        case WC_HASH_TYPE_MD4:
387
        #ifndef NO_MD4
388
            dig_size = WC_MD4_DIGEST_SIZE;
389
        #else
390
0
            dig_size = HASH_TYPE_E;
391
0
        #endif
392
0
            break;
393
0
        case WC_HASH_TYPE_MD5:
394
        #ifndef NO_MD5
395
            dig_size = WC_MD5_DIGEST_SIZE;
396
        #else
397
0
            dig_size = HASH_TYPE_E;
398
0
        #endif
399
0
            break;
400
0
        case WC_HASH_TYPE_SHA:
401
0
        #ifndef NO_SHA
402
0
            dig_size = WC_SHA_DIGEST_SIZE;
403
        #else
404
            dig_size = HASH_TYPE_E;
405
        #endif
406
0
            break;
407
0
        case WC_HASH_TYPE_SHA224:
408
0
        #ifdef WOLFSSL_SHA224
409
0
            dig_size = WC_SHA224_DIGEST_SIZE;
410
        #else
411
            dig_size = HASH_TYPE_E;
412
        #endif
413
0
            break;
414
0
        case WC_HASH_TYPE_SHA256:
415
0
        #ifndef NO_SHA256
416
0
            dig_size = WC_SHA256_DIGEST_SIZE;
417
        #else
418
            dig_size = HASH_TYPE_E;
419
        #endif
420
0
            break;
421
0
        case WC_HASH_TYPE_SHA384:
422
0
        #ifdef WOLFSSL_SHA384
423
0
            dig_size = WC_SHA384_DIGEST_SIZE;
424
        #else
425
            dig_size = HASH_TYPE_E;
426
        #endif
427
0
            break;
428
0
        case WC_HASH_TYPE_SHA512:
429
0
        #ifdef WOLFSSL_SHA512
430
0
            dig_size = WC_SHA512_DIGEST_SIZE;
431
        #else
432
            dig_size = HASH_TYPE_E;
433
        #endif
434
0
            break;
435
0
        case WC_HASH_TYPE_SHA512_224:
436
0
        #if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
437
0
            !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
438
0
            !defined(WOLFSSL_NOSHA512_224)
439
0
            dig_size = WC_SHA512_224_DIGEST_SIZE;
440
        #else
441
            dig_size = HASH_TYPE_E;
442
        #endif
443
0
            break;
444
0
        case WC_HASH_TYPE_SHA512_256:
445
0
        #if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
446
0
            !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
447
0
            !defined(WOLFSSL_NOSHA512_256)
448
0
            dig_size = WC_SHA512_256_DIGEST_SIZE;
449
        #else
450
            dig_size = HASH_TYPE_E;
451
        #endif
452
0
            break;
453
0
        case WC_HASH_TYPE_MD5_SHA: /* Old TLS Specific */
454
        #if !defined(NO_MD5) && !defined(NO_SHA)
455
            dig_size = (int)WC_MD5_DIGEST_SIZE + (int)WC_SHA_DIGEST_SIZE;
456
        #else
457
0
            dig_size = HASH_TYPE_E;
458
0
        #endif
459
0
            break;
460
461
0
        case WC_HASH_TYPE_SHA3_224:
462
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
463
0
            dig_size = WC_SHA3_224_DIGEST_SIZE;
464
        #else
465
            dig_size = HASH_TYPE_E;
466
        #endif
467
0
            break;
468
0
        case WC_HASH_TYPE_SHA3_256:
469
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
470
0
            dig_size = WC_SHA3_256_DIGEST_SIZE;
471
        #else
472
            dig_size = HASH_TYPE_E;
473
        #endif
474
0
            break;
475
0
        case WC_HASH_TYPE_SHA3_384:
476
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
477
0
            dig_size = WC_SHA3_384_DIGEST_SIZE;
478
        #else
479
            dig_size = HASH_TYPE_E;
480
        #endif
481
0
            break;
482
0
        case WC_HASH_TYPE_SHA3_512:
483
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
484
0
            dig_size = WC_SHA3_512_DIGEST_SIZE;
485
        #else
486
            dig_size = HASH_TYPE_E;
487
        #endif
488
0
            break;
489
0
        case WC_HASH_TYPE_BLAKE2B:
490
        #if defined(HAVE_BLAKE2B)
491
            dig_size = BLAKE2B_OUTBYTES;
492
        #else
493
0
            dig_size = HASH_TYPE_E;
494
0
        #endif
495
0
            break;
496
0
        case WC_HASH_TYPE_BLAKE2S:
497
        #if defined(HAVE_BLAKE2S)
498
            dig_size = BLAKE2S_OUTBYTES;
499
        #else
500
0
            dig_size = HASH_TYPE_E;
501
0
        #endif
502
0
            break;
503
504
0
        case WC_HASH_TYPE_SM3:
505
        #ifdef WOLFSSL_SM3
506
            dig_size = WC_SM3_DIGEST_SIZE;
507
        #else
508
0
            dig_size = HASH_TYPE_E;
509
0
        #endif
510
0
            break;
511
512
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
513
        /* SHAKE is an XOF; default output here is 2x the security level
514
         * (256 bits for SHAKE128, 512 bits for SHAKE256). The SHA3 digest
515
         * macros are reused only for their bit-length value. */
516
0
        case WC_HASH_TYPE_SHAKE128:
517
0
            dig_size = WC_SHA3_256_DIGEST_SIZE;
518
0
            break;
519
    #else
520
        case WC_HASH_TYPE_SHAKE128:
521
            dig_size = HASH_TYPE_E;
522
            break;
523
    #endif
524
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
525
0
        case WC_HASH_TYPE_SHAKE256:
526
0
            dig_size = WC_SHA3_512_DIGEST_SIZE;
527
0
            break;
528
    #else
529
        case WC_HASH_TYPE_SHAKE256:
530
            dig_size = HASH_TYPE_E;
531
            break;
532
    #endif
533
534
        /* Not Supported */
535
0
        case WC_HASH_TYPE_NONE:
536
0
            dig_size = BAD_FUNC_ARG;
537
0
            break;
538
0
        default:
539
0
            dig_size = BAD_FUNC_ARG;
540
0
            break;
541
0
    }
542
0
    return dig_size;
543
0
}
544
545
546
/* Get Hash block size */
547
int wc_HashGetBlockSize(enum wc_HashType hash_type)
548
0
{
549
0
    int block_size;
550
0
    switch (hash_type)
551
0
    {
552
0
        case WC_HASH_TYPE_MD2:
553
        #ifdef WOLFSSL_MD2
554
            block_size = WC_MD2_BLOCK_SIZE;
555
        #else
556
0
            block_size = HASH_TYPE_E;
557
0
        #endif
558
0
            break;
559
0
        case WC_HASH_TYPE_MD4:
560
        #ifndef NO_MD4
561
            block_size = WC_MD4_BLOCK_SIZE;
562
        #else
563
0
            block_size = HASH_TYPE_E;
564
0
        #endif
565
0
            break;
566
0
        case WC_HASH_TYPE_MD5:
567
        #ifndef NO_MD5
568
            block_size = WC_MD5_BLOCK_SIZE;
569
        #else
570
0
            block_size = HASH_TYPE_E;
571
0
        #endif
572
0
            break;
573
0
        case WC_HASH_TYPE_SHA:
574
0
        #ifndef NO_SHA
575
0
            block_size = WC_SHA_BLOCK_SIZE;
576
        #else
577
            block_size = HASH_TYPE_E;
578
        #endif
579
0
            break;
580
0
        case WC_HASH_TYPE_SHA224:
581
0
        #ifdef WOLFSSL_SHA224
582
0
            block_size = WC_SHA224_BLOCK_SIZE;
583
        #else
584
            block_size = HASH_TYPE_E;
585
        #endif
586
0
            break;
587
0
        case WC_HASH_TYPE_SHA256:
588
0
        #ifndef NO_SHA256
589
0
            block_size = WC_SHA256_BLOCK_SIZE;
590
        #else
591
            block_size = HASH_TYPE_E;
592
        #endif
593
0
            break;
594
0
        case WC_HASH_TYPE_SHA384:
595
0
        #ifdef WOLFSSL_SHA384
596
0
            block_size = WC_SHA384_BLOCK_SIZE;
597
        #else
598
            block_size = HASH_TYPE_E;
599
        #endif
600
0
            break;
601
0
        case WC_HASH_TYPE_SHA512:
602
0
        #ifdef WOLFSSL_SHA512
603
0
            block_size = WC_SHA512_BLOCK_SIZE;
604
        #else
605
            block_size = HASH_TYPE_E;
606
        #endif
607
0
            break;
608
0
        case WC_HASH_TYPE_SHA512_224:
609
0
        #if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
610
0
            !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
611
0
            !defined(WOLFSSL_NOSHA512_224)
612
0
            block_size = WC_SHA512_224_BLOCK_SIZE;
613
        #else
614
            block_size = HASH_TYPE_E;
615
        #endif
616
0
            break;
617
0
        case WC_HASH_TYPE_SHA512_256:
618
0
        #if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
619
0
            !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
620
0
            !defined(WOLFSSL_NOSHA512_256)
621
0
            block_size = WC_SHA512_256_BLOCK_SIZE;
622
        #else
623
            block_size = HASH_TYPE_E;
624
        #endif
625
0
            break;
626
0
        case WC_HASH_TYPE_MD5_SHA: /* Old TLS Specific */
627
        #if !defined(NO_MD5) && !defined(NO_SHA)
628
            block_size = (int)WC_MD5_BLOCK_SIZE + (int)WC_SHA_BLOCK_SIZE;
629
        #else
630
0
            block_size = HASH_TYPE_E;
631
0
        #endif
632
0
            break;
633
634
0
        case WC_HASH_TYPE_SHA3_224:
635
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
636
0
            block_size = WC_SHA3_224_BLOCK_SIZE;
637
        #else
638
            block_size = HASH_TYPE_E;
639
        #endif
640
0
            break;
641
0
        case WC_HASH_TYPE_SHA3_256:
642
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
643
0
            block_size = WC_SHA3_256_BLOCK_SIZE;
644
        #else
645
            block_size = HASH_TYPE_E;
646
        #endif
647
0
            break;
648
0
        case WC_HASH_TYPE_SHA3_384:
649
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
650
0
            block_size = WC_SHA3_384_BLOCK_SIZE;
651
        #else
652
            block_size = HASH_TYPE_E;
653
        #endif
654
0
            break;
655
0
        case WC_HASH_TYPE_SHA3_512:
656
0
        #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
657
0
            block_size = WC_SHA3_512_BLOCK_SIZE;
658
        #else
659
            block_size = HASH_TYPE_E;
660
        #endif
661
0
            break;
662
0
        case WC_HASH_TYPE_BLAKE2B:
663
        #if defined(HAVE_BLAKE2B)
664
            block_size = BLAKE2B_BLOCKBYTES;
665
        #else
666
0
            block_size = HASH_TYPE_E;
667
0
        #endif
668
0
            break;
669
0
        case WC_HASH_TYPE_BLAKE2S:
670
        #if defined(HAVE_BLAKE2S)
671
            block_size = BLAKE2S_BLOCKBYTES;
672
        #else
673
0
            block_size = HASH_TYPE_E;
674
0
        #endif
675
0
            break;
676
677
0
        case WC_HASH_TYPE_SM3:
678
        #ifdef WOLFSSL_SM3
679
            block_size = WC_SM3_BLOCK_SIZE;
680
        #else
681
0
            block_size = HASH_TYPE_E;
682
0
        #endif
683
0
            break;
684
685
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
686
        /* WC_SHA3_*_BLOCK_SIZE names the Keccak rate by capacity, not a
687
         * specific SHA-3 hash. SHAKE128 uses the 1344-bit rate (168 B);
688
         * SHAKE256 uses the 1088-bit rate (136 B), shared with SHA3-256.
689
         * Per FIPS 202. */
690
0
        case WC_HASH_TYPE_SHAKE128:
691
0
            block_size = WC_SHA3_128_BLOCK_SIZE;
692
0
            break;
693
    #else
694
        case WC_HASH_TYPE_SHAKE128:
695
            block_size = HASH_TYPE_E;
696
            break;
697
    #endif
698
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
699
0
        case WC_HASH_TYPE_SHAKE256:
700
0
            block_size = WC_SHA3_256_BLOCK_SIZE;
701
0
            break;
702
    #else
703
        case WC_HASH_TYPE_SHAKE256:
704
            block_size = HASH_TYPE_E;
705
            break;
706
    #endif
707
708
        /* Not Supported */
709
0
        case WC_HASH_TYPE_NONE:
710
0
            block_size = BAD_FUNC_ARG;
711
0
            break;
712
0
        default:
713
0
            block_size = BAD_FUNC_ARG;
714
0
            break;
715
0
    }
716
0
    return block_size;
717
0
}
718
719
/* Generic Hashing Wrapper */
720
int wc_Hash_ex(enum wc_HashType hash_type, const byte* data,
721
    word32 data_len, byte* hash, word32 hash_len, void* heap, int devId)
722
0
{
723
0
    int ret;
724
0
    int dig_size;
725
726
    /* Validate hash buffer size */
727
0
    dig_size = wc_HashGetDigestSize(hash_type);
728
0
    if (dig_size < 0) {
729
0
        return dig_size;
730
0
    }
731
732
0
    if (hash_len < (word32)dig_size) {
733
0
        return BUFFER_E;
734
0
    }
735
736
    /* Suppress possible unused arg if all hashing is disabled */
737
0
    (void)data;
738
0
    (void)data_len;
739
0
    (void)hash;
740
0
    (void)hash_len;
741
742
0
    switch(hash_type)
743
0
    {
744
0
        case WC_HASH_TYPE_MD5:
745
#ifndef NO_MD5
746
            ret = wc_Md5Hash_ex(data, data_len, hash, heap, devId);
747
#else
748
0
            ret = HASH_TYPE_E;
749
0
#endif
750
0
            break;
751
0
        case WC_HASH_TYPE_SHA:
752
0
#ifndef NO_SHA
753
0
            ret = wc_ShaHash_ex(data, data_len, hash, heap, devId);
754
#else
755
            ret = HASH_TYPE_E;
756
#endif
757
0
            break;
758
0
        case WC_HASH_TYPE_SHA224:
759
0
#ifdef WOLFSSL_SHA224
760
0
            ret = wc_Sha224Hash_ex(data, data_len, hash, heap, devId);
761
#else
762
            ret = HASH_TYPE_E;
763
#endif
764
0
            break;
765
0
        case WC_HASH_TYPE_SHA256:
766
0
#ifndef NO_SHA256
767
0
            ret = wc_Sha256Hash_ex(data, data_len, hash, heap, devId);
768
#else
769
            ret = HASH_TYPE_E;
770
#endif
771
0
            break;
772
0
        case WC_HASH_TYPE_SHA384:
773
0
#ifdef WOLFSSL_SHA384
774
0
            ret = wc_Sha384Hash_ex(data, data_len, hash, heap, devId);
775
#else
776
            ret = HASH_TYPE_E;
777
#endif
778
0
            break;
779
0
        case WC_HASH_TYPE_SHA512:
780
0
#ifdef WOLFSSL_SHA512
781
0
            ret = wc_Sha512Hash_ex(data, data_len, hash, heap, devId);
782
#else
783
            ret = HASH_TYPE_E;
784
#endif
785
0
            break;
786
0
        case WC_HASH_TYPE_SHA512_224:
787
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
788
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
789
0
    !defined(WOLFSSL_NOSHA512_224)
790
0
            ret = wc_Sha512_224Hash_ex(data, data_len, hash, heap, devId);
791
#else
792
            ret = HASH_TYPE_E;
793
#endif
794
0
            break;
795
0
        case WC_HASH_TYPE_SHA512_256:
796
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
797
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
798
0
    !defined(WOLFSSL_NOSHA512_256)
799
0
            ret = wc_Sha512_256Hash_ex(data, data_len, hash, heap, devId);
800
#else
801
            ret = HASH_TYPE_E;
802
#endif
803
0
            break;
804
0
        case WC_HASH_TYPE_MD5_SHA:
805
#if !defined(NO_MD5) && !defined(NO_SHA)
806
            ret = wc_Md5Hash_ex(data, data_len, hash, heap, devId);
807
            if (ret == 0) {
808
                ret = wc_ShaHash_ex(data, data_len, &hash[WC_MD5_DIGEST_SIZE],
809
                    heap, devId);
810
            }
811
#else
812
0
            ret = HASH_TYPE_E;
813
0
#endif
814
0
            break;
815
816
0
        case WC_HASH_TYPE_SHA3_224:
817
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
818
0
            ret = wc_Sha3_224Hash_ex(data, data_len, hash, heap, devId);
819
#else
820
            ret = HASH_TYPE_E;
821
#endif
822
0
            break;
823
0
        case WC_HASH_TYPE_SHA3_256:
824
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
825
0
            ret = wc_Sha3_256Hash_ex(data, data_len, hash, heap, devId);
826
#else
827
            ret = HASH_TYPE_E;
828
#endif
829
0
            break;
830
0
        case WC_HASH_TYPE_SHA3_384:
831
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
832
0
            ret = wc_Sha3_384Hash_ex(data, data_len, hash, heap, devId);
833
#else
834
            ret = HASH_TYPE_E;
835
#endif
836
0
            break;
837
0
        case WC_HASH_TYPE_SHA3_512:
838
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
839
0
            ret = wc_Sha3_512Hash_ex(data, data_len, hash, heap, devId);
840
#else
841
            ret = HASH_TYPE_E;
842
#endif
843
0
            break;
844
845
0
        case WC_HASH_TYPE_SM3:
846
#ifdef WOLFSSL_SM3
847
            ret = wc_Sm3Hash_ex(data, data_len, hash, heap, devId);
848
#else
849
0
            ret = HASH_TYPE_E;
850
0
#endif
851
0
            break;
852
853
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
854
0
        case WC_HASH_TYPE_SHAKE128:
855
0
        {
856
0
            WC_DECLARE_VAR(shake, wc_Shake, 1, heap);
857
0
            WC_ALLOC_VAR_EX(shake, wc_Shake, 1, heap, DYNAMIC_TYPE_TMP_BUFFER,
858
0
                ret = MEMORY_E);
859
0
            if (WC_VAR_OK(shake)) {
860
0
                ret = wc_InitShake128(shake, heap, devId);
861
0
                if (ret == 0) {
862
0
                    ret = wc_Shake128_Update(shake, data, data_len);
863
0
                    if (ret == 0)
864
0
                        ret = wc_Shake128_Final(shake, hash,
865
0
                            WC_SHA3_256_DIGEST_SIZE);
866
0
                    wc_Shake128_Free(shake);
867
0
                }
868
0
            }
869
0
            WC_FREE_VAR_EX(shake, heap, DYNAMIC_TYPE_TMP_BUFFER);
870
0
            break;
871
0
        }
872
    #else
873
        case WC_HASH_TYPE_SHAKE128:
874
            ret = HASH_TYPE_E;
875
            break;
876
    #endif
877
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
878
0
        case WC_HASH_TYPE_SHAKE256:
879
0
        {
880
0
            WC_DECLARE_VAR(shake, wc_Shake, 1, heap);
881
0
            WC_ALLOC_VAR_EX(shake, wc_Shake, 1, heap, DYNAMIC_TYPE_TMP_BUFFER,
882
0
                ret = MEMORY_E);
883
0
            if (WC_VAR_OK(shake)) {
884
0
                ret = wc_InitShake256(shake, heap, devId);
885
0
                if (ret == 0) {
886
0
                    ret = wc_Shake256_Update(shake, data, data_len);
887
0
                    if (ret == 0)
888
0
                        ret = wc_Shake256_Final(shake, hash,
889
0
                            WC_SHA3_512_DIGEST_SIZE);
890
0
                    wc_Shake256_Free(shake);
891
0
                }
892
0
            }
893
0
            WC_FREE_VAR_EX(shake, heap, DYNAMIC_TYPE_TMP_BUFFER);
894
0
            break;
895
0
        }
896
    #else
897
        case WC_HASH_TYPE_SHAKE256:
898
            ret = HASH_TYPE_E;
899
            break;
900
    #endif
901
902
        /* Not Supported */
903
0
        case WC_HASH_TYPE_MD2:
904
0
        case WC_HASH_TYPE_MD4:
905
0
        case WC_HASH_TYPE_BLAKE2B:
906
0
        case WC_HASH_TYPE_BLAKE2S:
907
0
            ret = HASH_TYPE_E;
908
0
            break;
909
0
        case WC_HASH_TYPE_NONE:
910
0
            ret = BAD_FUNC_ARG;
911
0
            break;
912
0
        default:
913
0
            ret = BAD_FUNC_ARG;
914
0
            break;
915
0
    }
916
0
    return ret;
917
0
}
918
int wc_Hash(enum wc_HashType hash_type, const byte* data,
919
    word32 data_len, byte* hash, word32 hash_len)
920
0
{
921
0
    return wc_Hash_ex(hash_type, data, data_len, hash, hash_len,
922
0
        NULL, INVALID_DEVID);
923
0
}
924
925
#ifndef WC_NO_CONSTRUCTORS
926
wc_HashAlg* wc_HashNew(enum wc_HashType type, void* heap, int devId,
927
                       int *result_code)
928
0
{
929
0
    int ret;
930
0
    wc_HashAlg* hash = (wc_HashAlg*)XMALLOC(sizeof(wc_HashAlg), heap,
931
0
                        DYNAMIC_TYPE_HASHES);
932
0
    if (hash == NULL) {
933
0
        ret = MEMORY_E;
934
0
    }
935
0
    else {
936
0
        ret = wc_HashInit_ex(hash, type, heap, devId);
937
0
        if (ret != 0) {
938
0
            XFREE(hash, heap, DYNAMIC_TYPE_HASHES);
939
0
            hash = NULL;
940
0
        }
941
0
    }
942
943
0
    if (result_code != NULL)
944
0
        *result_code = ret;
945
946
0
    return hash;
947
0
}
948
949
0
int wc_HashDelete(wc_HashAlg *hash, wc_HashAlg **hash_p) {
950
0
    int ret;
951
0
    void* heap;
952
0
    if (hash == NULL)
953
0
        return BAD_FUNC_ARG;
954
0
    heap = hash->heap;
955
0
    ret = wc_HashFree(hash, hash->type);
956
0
    if (ret < 0)
957
0
        return ret;
958
0
    XFREE(hash, heap, DYNAMIC_TYPE_HASHES);
959
0
    if (hash_p != NULL)
960
0
        *hash_p = NULL;
961
0
    return 0;
962
0
}
963
#endif /* !WC_NO_CONSTRUCTORS */
964
965
int wc_HashInit_ex(wc_HashAlg* hash, enum wc_HashType type, void* heap,
966
    int devId)
967
0
{
968
0
    int ret;
969
970
0
    if (hash == NULL)
971
0
        return BAD_FUNC_ARG;
972
973
0
    hash->type = type;
974
975
#ifdef WC_NO_CONSTRUCTORS
976
    (void)heap;
977
#else
978
0
    hash->heap = heap;
979
0
#endif
980
981
0
    switch (type) {
982
0
        case WC_HASH_TYPE_MD5:
983
#ifndef NO_MD5
984
            ret = wc_InitMd5_ex(&hash->alg.md5, heap, devId);
985
#else
986
0
            ret = HASH_TYPE_E;
987
0
#endif
988
0
            break;
989
0
        case WC_HASH_TYPE_SHA:
990
0
#ifndef NO_SHA
991
0
            ret = wc_InitSha_ex(&hash->alg.sha, heap, devId);
992
#else
993
            ret = HASH_TYPE_E;
994
#endif
995
0
            break;
996
0
        case WC_HASH_TYPE_SHA224:
997
0
#ifdef WOLFSSL_SHA224
998
0
            ret = wc_InitSha224_ex(&hash->alg.sha224, heap, devId);
999
#else
1000
            ret = HASH_TYPE_E;
1001
#endif
1002
0
            break;
1003
0
        case WC_HASH_TYPE_SHA256:
1004
0
#ifndef NO_SHA256
1005
0
            ret = wc_InitSha256_ex(&hash->alg.sha256, heap, devId);
1006
#else
1007
            ret = HASH_TYPE_E;
1008
#endif
1009
0
            break;
1010
0
        case WC_HASH_TYPE_SHA384:
1011
0
#ifdef WOLFSSL_SHA384
1012
0
            ret = wc_InitSha384_ex(&hash->alg.sha384, heap, devId);
1013
#else
1014
            ret = HASH_TYPE_E;
1015
#endif
1016
0
            break;
1017
0
        case WC_HASH_TYPE_SHA512:
1018
0
#ifdef WOLFSSL_SHA512
1019
0
            ret = wc_InitSha512_ex(&hash->alg.sha512, heap, devId);
1020
#else
1021
            ret = HASH_TYPE_E;
1022
#endif
1023
0
            break;
1024
0
        case WC_HASH_TYPE_SHA512_224:
1025
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1026
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1027
0
    !defined(WOLFSSL_NOSHA512_224)
1028
0
            ret = wc_InitSha512_224_ex(&hash->alg.sha512, heap, devId);
1029
#else
1030
            ret = HASH_TYPE_E;
1031
#endif
1032
0
            break;
1033
0
        case WC_HASH_TYPE_SHA512_256:
1034
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1035
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1036
0
    !defined(WOLFSSL_NOSHA512_256)
1037
0
            ret = wc_InitSha512_256_ex(&hash->alg.sha512, heap, devId);
1038
#else
1039
            ret = HASH_TYPE_E;
1040
#endif
1041
0
            break;
1042
0
        case WC_HASH_TYPE_SHA3_224:
1043
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
1044
0
            ret = wc_InitSha3_224(&hash->alg.sha3, heap, devId);
1045
#else
1046
            ret = HASH_TYPE_E;
1047
#endif
1048
0
            break;
1049
0
        case WC_HASH_TYPE_SHA3_256:
1050
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
1051
0
            ret = wc_InitSha3_256(&hash->alg.sha3, heap, devId);
1052
#else
1053
            ret = HASH_TYPE_E;
1054
#endif
1055
0
            break;
1056
0
        case WC_HASH_TYPE_SHA3_384:
1057
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
1058
0
            ret = wc_InitSha3_384(&hash->alg.sha3, heap, devId);
1059
#else
1060
            ret = HASH_TYPE_E;
1061
#endif
1062
0
            break;
1063
0
        case WC_HASH_TYPE_SHA3_512:
1064
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
1065
0
            ret = wc_InitSha3_512(&hash->alg.sha3, heap, devId);
1066
#else
1067
            ret = HASH_TYPE_E;
1068
#endif
1069
0
            break;
1070
1071
0
        case WC_HASH_TYPE_SM3:
1072
#ifdef WOLFSSL_SM3
1073
            ret = wc_InitSm3(&hash->alg.sm3, heap, devId);
1074
#else
1075
0
            ret = HASH_TYPE_E;
1076
0
#endif
1077
0
            break;
1078
1079
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
1080
0
        case WC_HASH_TYPE_SHAKE128:
1081
0
            ret = wc_InitShake128(&hash->alg.sha3, heap, devId);
1082
0
            break;
1083
    #else
1084
        case WC_HASH_TYPE_SHAKE128:
1085
            ret = HASH_TYPE_E;
1086
            break;
1087
    #endif
1088
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
1089
0
        case WC_HASH_TYPE_SHAKE256:
1090
0
            ret = wc_InitShake256(&hash->alg.sha3, heap, devId);
1091
0
            break;
1092
    #else
1093
        case WC_HASH_TYPE_SHAKE256:
1094
            ret = HASH_TYPE_E;
1095
            break;
1096
    #endif
1097
1098
        /* not supported */
1099
0
        case WC_HASH_TYPE_MD5_SHA:
1100
0
        case WC_HASH_TYPE_MD2:
1101
0
        case WC_HASH_TYPE_MD4:
1102
0
        case WC_HASH_TYPE_BLAKE2B:
1103
0
        case WC_HASH_TYPE_BLAKE2S:
1104
0
            ret = HASH_TYPE_E;
1105
0
            break;
1106
0
        case WC_HASH_TYPE_NONE:
1107
0
            ret = BAD_FUNC_ARG;
1108
0
            break;
1109
0
        default:
1110
0
            ret = BAD_FUNC_ARG;
1111
0
    };
1112
1113
0
    (void)devId;
1114
1115
0
    return ret;
1116
0
}
1117
1118
int wc_HashInit(wc_HashAlg* hash, enum wc_HashType type)
1119
0
{
1120
0
    return wc_HashInit_ex(hash, type, NULL, INVALID_DEVID);
1121
0
}
1122
1123
int wc_HashUpdate(wc_HashAlg* hash, enum wc_HashType type, const byte* data,
1124
                  word32 dataSz)
1125
0
{
1126
0
    int ret;
1127
1128
0
    if (hash == NULL || (data == NULL && dataSz > 0))
1129
0
        return BAD_FUNC_ARG;
1130
1131
#ifdef DEBUG_WOLFSSL
1132
    if (hash->type != type) {
1133
        WOLFSSL_MSG("Hash update type mismatch!");
1134
        return BAD_FUNC_ARG;
1135
    }
1136
#endif
1137
1138
0
    switch (type) {
1139
0
        case WC_HASH_TYPE_MD5:
1140
#ifndef NO_MD5
1141
            ret = wc_Md5Update(&hash->alg.md5, data, dataSz);
1142
#else
1143
0
            ret = HASH_TYPE_E;
1144
0
#endif
1145
0
            break;
1146
0
        case WC_HASH_TYPE_SHA:
1147
0
#ifndef NO_SHA
1148
0
            ret = wc_ShaUpdate(&hash->alg.sha, data, dataSz);
1149
#else
1150
            ret = HASH_TYPE_E;
1151
#endif
1152
0
            break;
1153
0
        case WC_HASH_TYPE_SHA224:
1154
0
#ifdef WOLFSSL_SHA224
1155
0
            ret = wc_Sha224Update(&hash->alg.sha224, data, dataSz);
1156
#else
1157
            ret = HASH_TYPE_E;
1158
#endif
1159
0
            break;
1160
0
        case WC_HASH_TYPE_SHA256:
1161
0
#ifndef NO_SHA256
1162
0
            ret = wc_Sha256Update(&hash->alg.sha256, data, dataSz);
1163
#else
1164
            ret = HASH_TYPE_E;
1165
#endif
1166
0
            break;
1167
0
        case WC_HASH_TYPE_SHA384:
1168
0
#ifdef WOLFSSL_SHA384
1169
0
            ret = wc_Sha384Update(&hash->alg.sha384, data, dataSz);
1170
#else
1171
            ret = HASH_TYPE_E;
1172
#endif
1173
0
            break;
1174
0
        case WC_HASH_TYPE_SHA512:
1175
0
#ifdef WOLFSSL_SHA512
1176
0
            ret = wc_Sha512Update(&hash->alg.sha512, data, dataSz);
1177
#else
1178
            ret = HASH_TYPE_E;
1179
#endif
1180
0
            break;
1181
0
        case WC_HASH_TYPE_SHA512_224:
1182
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1183
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1184
0
    !defined(WOLFSSL_NOSHA512_224)
1185
0
            ret = wc_Sha512_224Update(&hash->alg.sha512, data, dataSz);
1186
#else
1187
            ret = HASH_TYPE_E;
1188
#endif
1189
0
            break;
1190
0
        case WC_HASH_TYPE_SHA512_256:
1191
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1192
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1193
0
    !defined(WOLFSSL_NOSHA512_256)
1194
0
            ret = wc_Sha512_256Update(&hash->alg.sha512, data, dataSz);
1195
#else
1196
            ret = HASH_TYPE_E;
1197
#endif
1198
0
            break;
1199
0
        case WC_HASH_TYPE_SHA3_224:
1200
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
1201
0
            ret = wc_Sha3_224_Update(&hash->alg.sha3, data, dataSz);
1202
#else
1203
            ret = HASH_TYPE_E;
1204
#endif
1205
0
            break;
1206
0
        case WC_HASH_TYPE_SHA3_256:
1207
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
1208
0
            ret = wc_Sha3_256_Update(&hash->alg.sha3, data, dataSz);
1209
#else
1210
            ret = HASH_TYPE_E;
1211
#endif
1212
0
            break;
1213
0
        case WC_HASH_TYPE_SHA3_384:
1214
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
1215
0
            ret = wc_Sha3_384_Update(&hash->alg.sha3, data, dataSz);
1216
#else
1217
            ret = HASH_TYPE_E;
1218
#endif
1219
0
            break;
1220
0
        case WC_HASH_TYPE_SHA3_512:
1221
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
1222
0
            ret = wc_Sha3_512_Update(&hash->alg.sha3, data, dataSz);
1223
#else
1224
            ret = HASH_TYPE_E;
1225
#endif
1226
0
            break;
1227
1228
0
        case WC_HASH_TYPE_SM3:
1229
#ifdef WOLFSSL_SM3
1230
            ret = wc_Sm3Update(&hash->alg.sm3, data, dataSz);
1231
#else
1232
0
            ret = HASH_TYPE_E;
1233
0
#endif
1234
0
            break;
1235
1236
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
1237
0
        case WC_HASH_TYPE_SHAKE128:
1238
0
            ret = wc_Shake128_Update(&hash->alg.sha3, data, dataSz);
1239
0
            break;
1240
    #else
1241
        case WC_HASH_TYPE_SHAKE128:
1242
            ret = HASH_TYPE_E;
1243
            break;
1244
    #endif
1245
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
1246
0
        case WC_HASH_TYPE_SHAKE256:
1247
0
            ret = wc_Shake256_Update(&hash->alg.sha3, data, dataSz);
1248
0
            break;
1249
    #else
1250
        case WC_HASH_TYPE_SHAKE256:
1251
            ret = HASH_TYPE_E;
1252
            break;
1253
    #endif
1254
1255
        /* not supported */
1256
0
        case WC_HASH_TYPE_MD5_SHA:
1257
0
        case WC_HASH_TYPE_MD2:
1258
0
        case WC_HASH_TYPE_MD4:
1259
0
        case WC_HASH_TYPE_BLAKE2B:
1260
0
        case WC_HASH_TYPE_BLAKE2S:
1261
0
            ret = HASH_TYPE_E;
1262
0
            break;
1263
0
        case WC_HASH_TYPE_NONE:
1264
0
            ret = BAD_FUNC_ARG;
1265
0
            break;
1266
0
        default:
1267
0
            ret = BAD_FUNC_ARG;
1268
0
    };
1269
1270
0
    return ret;
1271
0
}
1272
1273
int wc_HashFinal(wc_HashAlg* hash, enum wc_HashType type, byte* out)
1274
0
{
1275
0
    int ret;
1276
1277
0
    if (hash == NULL || out == NULL)
1278
0
        return BAD_FUNC_ARG;
1279
1280
#ifdef DEBUG_WOLFSSL
1281
    if (hash->type != type) {
1282
        WOLFSSL_MSG("Hash final type mismatch!");
1283
        return BAD_FUNC_ARG;
1284
    }
1285
#endif
1286
1287
0
    switch (type) {
1288
0
        case WC_HASH_TYPE_MD5:
1289
#ifndef NO_MD5
1290
            ret = wc_Md5Final(&hash->alg.md5, out);
1291
#else
1292
0
            ret = HASH_TYPE_E;
1293
0
#endif
1294
0
            break;
1295
0
        case WC_HASH_TYPE_SHA:
1296
0
#ifndef NO_SHA
1297
0
            ret = wc_ShaFinal(&hash->alg.sha, out);
1298
#else
1299
            ret = HASH_TYPE_E;
1300
#endif
1301
0
            break;
1302
0
        case WC_HASH_TYPE_SHA224:
1303
0
#ifdef WOLFSSL_SHA224
1304
0
            ret = wc_Sha224Final(&hash->alg.sha224, out);
1305
#else
1306
            ret = HASH_TYPE_E;
1307
#endif
1308
0
            break;
1309
0
        case WC_HASH_TYPE_SHA256:
1310
0
#ifndef NO_SHA256
1311
0
            ret = wc_Sha256Final(&hash->alg.sha256, out);
1312
#else
1313
            ret = HASH_TYPE_E;
1314
#endif
1315
0
            break;
1316
0
        case WC_HASH_TYPE_SHA384:
1317
0
#ifdef WOLFSSL_SHA384
1318
0
            ret = wc_Sha384Final(&hash->alg.sha384, out);
1319
#else
1320
            ret = HASH_TYPE_E;
1321
#endif
1322
0
            break;
1323
0
        case WC_HASH_TYPE_SHA512:
1324
0
#ifdef WOLFSSL_SHA512
1325
0
            ret = wc_Sha512Final(&hash->alg.sha512, out);
1326
#else
1327
            ret = HASH_TYPE_E;
1328
#endif
1329
0
            break;
1330
0
        case WC_HASH_TYPE_SHA512_224:
1331
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1332
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1333
0
    !defined(WOLFSSL_NOSHA512_224)
1334
0
            ret = wc_Sha512_224Final(&hash->alg.sha512, out);
1335
#else
1336
            ret = HASH_TYPE_E;
1337
#endif
1338
0
            break;
1339
0
        case WC_HASH_TYPE_SHA512_256:
1340
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1341
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1342
0
    !defined(WOLFSSL_NOSHA512_256)
1343
0
            ret = wc_Sha512_256Final(&hash->alg.sha512, out);
1344
#else
1345
            ret = HASH_TYPE_E;
1346
#endif
1347
0
            break;
1348
0
        case WC_HASH_TYPE_SHA3_224:
1349
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
1350
0
            ret = wc_Sha3_224_Final(&hash->alg.sha3, out);
1351
#else
1352
            ret = HASH_TYPE_E;
1353
#endif
1354
0
            break;
1355
0
        case WC_HASH_TYPE_SHA3_256:
1356
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
1357
0
            ret = wc_Sha3_256_Final(&hash->alg.sha3, out);
1358
#else
1359
            ret = HASH_TYPE_E;
1360
#endif
1361
0
            break;
1362
0
        case WC_HASH_TYPE_SHA3_384:
1363
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
1364
0
            ret = wc_Sha3_384_Final(&hash->alg.sha3, out);
1365
#else
1366
            ret = HASH_TYPE_E;
1367
#endif
1368
0
            break;
1369
0
        case WC_HASH_TYPE_SHA3_512:
1370
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
1371
0
            ret = wc_Sha3_512_Final(&hash->alg.sha3, out);
1372
#else
1373
            ret = HASH_TYPE_E;
1374
#endif
1375
0
            break;
1376
1377
0
        case WC_HASH_TYPE_SM3:
1378
#ifdef WOLFSSL_SM3
1379
            ret = wc_Sm3Final(&hash->alg.sm3, out);
1380
#else
1381
0
            ret = HASH_TYPE_E;
1382
0
#endif
1383
0
            break;
1384
1385
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
1386
0
        case WC_HASH_TYPE_SHAKE128:
1387
0
            ret = wc_Shake128_Final(&hash->alg.sha3, out,
1388
0
                WC_SHA3_256_DIGEST_SIZE);
1389
0
            break;
1390
    #else
1391
        case WC_HASH_TYPE_SHAKE128:
1392
            ret = HASH_TYPE_E;
1393
            break;
1394
    #endif
1395
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
1396
0
        case WC_HASH_TYPE_SHAKE256:
1397
0
            ret = wc_Shake256_Final(&hash->alg.sha3, out,
1398
0
                WC_SHA3_512_DIGEST_SIZE);
1399
0
            break;
1400
    #else
1401
        case WC_HASH_TYPE_SHAKE256:
1402
            ret = HASH_TYPE_E;
1403
            break;
1404
    #endif
1405
1406
        /* not supported */
1407
0
        case WC_HASH_TYPE_MD5_SHA:
1408
0
        case WC_HASH_TYPE_MD2:
1409
0
        case WC_HASH_TYPE_MD4:
1410
0
        case WC_HASH_TYPE_BLAKE2B:
1411
0
        case WC_HASH_TYPE_BLAKE2S:
1412
0
            ret = HASH_TYPE_E;
1413
0
            break;
1414
0
        case WC_HASH_TYPE_NONE:
1415
0
            ret = BAD_FUNC_ARG;
1416
0
            break;
1417
0
        default:
1418
0
            ret = BAD_FUNC_ARG;
1419
0
    };
1420
1421
0
    return ret;
1422
0
}
1423
1424
int wc_HashFree(wc_HashAlg* hash, enum wc_HashType type)
1425
0
{
1426
0
    int ret;
1427
1428
0
    if (hash == NULL)
1429
0
        return BAD_FUNC_ARG;
1430
1431
#ifdef DEBUG_WOLFSSL
1432
    if (hash->type != type) {
1433
        WOLFSSL_MSG("Hash free type mismatch!");
1434
        return BAD_FUNC_ARG;
1435
    }
1436
#endif
1437
1438
0
    switch (type) {
1439
0
        case WC_HASH_TYPE_MD5:
1440
#ifndef NO_MD5
1441
            wc_Md5Free(&hash->alg.md5);
1442
            ret = 0;
1443
#else
1444
0
            ret = HASH_TYPE_E;
1445
0
#endif
1446
0
            break;
1447
0
        case WC_HASH_TYPE_SHA:
1448
0
#ifndef NO_SHA
1449
0
            wc_ShaFree(&hash->alg.sha);
1450
0
            ret = 0;
1451
#else
1452
            ret = HASH_TYPE_E;
1453
#endif
1454
0
            break;
1455
0
        case WC_HASH_TYPE_SHA224:
1456
0
#ifdef WOLFSSL_SHA224
1457
0
            wc_Sha224Free(&hash->alg.sha224);
1458
0
            ret = 0;
1459
#else
1460
            ret = HASH_TYPE_E;
1461
#endif
1462
0
            break;
1463
0
        case WC_HASH_TYPE_SHA256:
1464
0
#ifndef NO_SHA256
1465
0
            wc_Sha256Free(&hash->alg.sha256);
1466
0
            ret = 0;
1467
#else
1468
            ret = HASH_TYPE_E;
1469
#endif
1470
0
            break;
1471
0
        case WC_HASH_TYPE_SHA384:
1472
0
#ifdef WOLFSSL_SHA384
1473
0
            wc_Sha384Free(&hash->alg.sha384);
1474
0
            ret = 0;
1475
#else
1476
            ret = HASH_TYPE_E;
1477
#endif
1478
0
            break;
1479
0
        case WC_HASH_TYPE_SHA512:
1480
0
#ifdef WOLFSSL_SHA512
1481
0
            wc_Sha512Free(&hash->alg.sha512);
1482
0
            ret = 0;
1483
#else
1484
            ret = HASH_TYPE_E;
1485
#endif
1486
0
            break;
1487
0
        case WC_HASH_TYPE_SHA512_224:
1488
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1489
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1490
0
    !defined(WOLFSSL_NOSHA512_224)
1491
0
            wc_Sha512_224Free(&hash->alg.sha512);
1492
0
            ret = 0;
1493
#else
1494
            ret = HASH_TYPE_E;
1495
#endif
1496
0
            break;
1497
0
        case WC_HASH_TYPE_SHA512_256:
1498
0
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && \
1499
0
    !defined(HAVE_SELFTEST) && defined(WOLFSSL_SHA512) && \
1500
0
    !defined(WOLFSSL_NOSHA512_256)
1501
0
            wc_Sha512_256Free(&hash->alg.sha512);
1502
0
            ret = 0;
1503
#else
1504
            ret = HASH_TYPE_E;
1505
#endif
1506
0
            break;
1507
0
        case WC_HASH_TYPE_SHA3_224:
1508
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
1509
0
            wc_Sha3_224_Free(&hash->alg.sha3);
1510
0
            ret = 0;
1511
#else
1512
            ret = HASH_TYPE_E;
1513
#endif
1514
0
            break;
1515
0
        case WC_HASH_TYPE_SHA3_256:
1516
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
1517
0
            wc_Sha3_256_Free(&hash->alg.sha3);
1518
0
            ret = 0;
1519
#else
1520
            ret = HASH_TYPE_E;
1521
#endif
1522
0
            break;
1523
0
        case WC_HASH_TYPE_SHA3_384:
1524
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
1525
0
            wc_Sha3_384_Free(&hash->alg.sha3);
1526
0
            ret = 0;
1527
#else
1528
            ret = HASH_TYPE_E;
1529
#endif
1530
0
            break;
1531
0
        case WC_HASH_TYPE_SHA3_512:
1532
0
#if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
1533
0
            wc_Sha3_512_Free(&hash->alg.sha3);
1534
0
            ret = 0;
1535
#else
1536
            ret = HASH_TYPE_E;
1537
#endif
1538
0
            break;
1539
1540
0
        case WC_HASH_TYPE_SM3:
1541
#ifdef WOLFSSL_SM3
1542
            wc_Sm3Free(&hash->alg.sm3);
1543
            ret = 0;
1544
#else
1545
0
            ret = HASH_TYPE_E;
1546
0
#endif
1547
0
            break;
1548
1549
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
1550
0
        case WC_HASH_TYPE_SHAKE128:
1551
0
            wc_Shake128_Free(&hash->alg.sha3);
1552
0
            ret = 0;
1553
0
            break;
1554
    #else
1555
        case WC_HASH_TYPE_SHAKE128:
1556
            ret = HASH_TYPE_E;
1557
            break;
1558
    #endif
1559
0
    #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
1560
0
        case WC_HASH_TYPE_SHAKE256:
1561
0
            wc_Shake256_Free(&hash->alg.sha3);
1562
0
            ret = 0;
1563
0
            break;
1564
    #else
1565
        case WC_HASH_TYPE_SHAKE256:
1566
            ret = HASH_TYPE_E;
1567
            break;
1568
    #endif
1569
1570
        /* not supported */
1571
0
        case WC_HASH_TYPE_MD5_SHA:
1572
0
        case WC_HASH_TYPE_MD2:
1573
0
        case WC_HASH_TYPE_MD4:
1574
0
        case WC_HASH_TYPE_BLAKE2B:
1575
0
        case WC_HASH_TYPE_BLAKE2S:
1576
0
            ret = HASH_TYPE_E;
1577
0
            break;
1578
0
        case WC_HASH_TYPE_NONE:
1579
0
            ret = BAD_FUNC_ARG;
1580
0
            break;
1581
0
        default:
1582
0
            ret = BAD_FUNC_ARG;
1583
0
    };
1584
1585
0
    return ret;
1586
0
}
1587
1588
#ifdef WOLFSSL_HASH_FLAGS
1589
int wc_HashSetFlags(wc_HashAlg* hash, enum wc_HashType type, word32 flags)
1590
{
1591
    int ret;
1592
1593
    if (hash == NULL)
1594
        return BAD_FUNC_ARG;
1595
1596
    switch (type) {
1597
        case WC_HASH_TYPE_MD5:
1598
#ifndef NO_MD5
1599
            ret = wc_Md5SetFlags(&hash->alg.md5, flags);
1600
#else
1601
            ret = HASH_TYPE_E;
1602
#endif
1603
            break;
1604
        case WC_HASH_TYPE_SHA:
1605
#ifndef NO_SHA
1606
            ret = wc_ShaSetFlags(&hash->alg.sha, flags);
1607
#else
1608
            ret = HASH_TYPE_E;
1609
#endif
1610
            break;
1611
        case WC_HASH_TYPE_SHA224:
1612
#ifdef WOLFSSL_SHA224
1613
            ret = wc_Sha224SetFlags(&hash->alg.sha224, flags);
1614
#else
1615
            ret = HASH_TYPE_E;
1616
#endif
1617
            break;
1618
        case WC_HASH_TYPE_SHA256:
1619
#ifndef NO_SHA256
1620
            ret = wc_Sha256SetFlags(&hash->alg.sha256, flags);
1621
#else
1622
            ret = HASH_TYPE_E;
1623
#endif
1624
            break;
1625
        case WC_HASH_TYPE_SHA384:
1626
#ifdef WOLFSSL_SHA384
1627
            ret = wc_Sha384SetFlags(&hash->alg.sha384, flags);
1628
#else
1629
            ret = HASH_TYPE_E;
1630
#endif
1631
            break;
1632
        case WC_HASH_TYPE_SHA512:
1633
#ifdef WOLFSSL_SHA512
1634
            ret = wc_Sha512SetFlags(&hash->alg.sha512, flags);
1635
#else
1636
            ret = HASH_TYPE_E;
1637
#endif
1638
            break;
1639
1640
        case WC_HASH_TYPE_SHA512_224:
1641
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
1642
            ret = wc_Sha512SetFlags(&hash->alg.sha512, flags);
1643
#else
1644
            ret = HASH_TYPE_E;
1645
#endif
1646
            break;
1647
1648
        case WC_HASH_TYPE_SHA512_256:
1649
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
1650
            ret = wc_Sha512SetFlags(&hash->alg.sha512, flags);
1651
#else
1652
            ret = HASH_TYPE_E;
1653
#endif
1654
            break;
1655
1656
        case WC_HASH_TYPE_SHA3_224:
1657
        case WC_HASH_TYPE_SHA3_256:
1658
        case WC_HASH_TYPE_SHA3_384:
1659
        case WC_HASH_TYPE_SHA3_512:
1660
#ifdef WOLFSSL_SHA3
1661
            ret = wc_Sha3_SetFlags(&hash->alg.sha3, flags);
1662
#else
1663
            ret = HASH_TYPE_E;
1664
#endif
1665
            break;
1666
1667
        case WC_HASH_TYPE_SHAKE128:
1668
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
1669
            ret = wc_Sha3_SetFlags(&hash->alg.sha3, flags);
1670
#else
1671
            ret = HASH_TYPE_E;
1672
#endif
1673
            break;
1674
1675
        case WC_HASH_TYPE_SHAKE256:
1676
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
1677
            ret = wc_Sha3_SetFlags(&hash->alg.sha3, flags);
1678
#else
1679
            ret = HASH_TYPE_E;
1680
#endif
1681
            break;
1682
1683
        case WC_HASH_TYPE_SM3:
1684
#ifdef WOLFSSL_SM3
1685
            ret = wc_Sm3SetFlags(&hash->alg.sm3, flags);
1686
#else
1687
            ret = HASH_TYPE_E;
1688
#endif
1689
            break;
1690
1691
        /* not supported */
1692
        case WC_HASH_TYPE_MD5_SHA:
1693
        case WC_HASH_TYPE_MD2:
1694
        case WC_HASH_TYPE_MD4:
1695
        case WC_HASH_TYPE_BLAKE2B:
1696
        case WC_HASH_TYPE_BLAKE2S:
1697
            ret = HASH_TYPE_E;
1698
            break;
1699
        case WC_HASH_TYPE_NONE:
1700
        default:
1701
            ret = BAD_FUNC_ARG;
1702
    };
1703
1704
    return ret;
1705
}
1706
int wc_HashGetFlags(wc_HashAlg* hash, enum wc_HashType type, word32* flags)
1707
{
1708
    int ret;
1709
1710
    if (hash == NULL)
1711
        return BAD_FUNC_ARG;
1712
1713
    switch (type) {
1714
        case WC_HASH_TYPE_MD5:
1715
#ifndef NO_MD5
1716
            ret = wc_Md5GetFlags(&hash->alg.md5, flags);
1717
#else
1718
            ret = HASH_TYPE_E;
1719
#endif
1720
            break;
1721
        case WC_HASH_TYPE_SHA:
1722
#ifndef NO_SHA
1723
            ret = wc_ShaGetFlags(&hash->alg.sha, flags);
1724
#else
1725
            ret = HASH_TYPE_E;
1726
#endif
1727
            break;
1728
        case WC_HASH_TYPE_SHA224:
1729
#ifdef WOLFSSL_SHA224
1730
            ret = wc_Sha224GetFlags(&hash->alg.sha224, flags);
1731
#else
1732
            ret = HASH_TYPE_E;
1733
#endif
1734
            break;
1735
        case WC_HASH_TYPE_SHA256:
1736
#ifndef NO_SHA256
1737
            ret = wc_Sha256GetFlags(&hash->alg.sha256, flags);
1738
#else
1739
            ret = HASH_TYPE_E;
1740
#endif
1741
            break;
1742
        case WC_HASH_TYPE_SHA384:
1743
#ifdef WOLFSSL_SHA384
1744
            ret = wc_Sha384GetFlags(&hash->alg.sha384, flags);
1745
#else
1746
            ret = HASH_TYPE_E;
1747
#endif
1748
            break;
1749
        case WC_HASH_TYPE_SHA512:
1750
#ifdef WOLFSSL_SHA512
1751
            ret = wc_Sha512GetFlags(&hash->alg.sha512, flags);
1752
#else
1753
            ret = HASH_TYPE_E;
1754
#endif
1755
            break;
1756
        case WC_HASH_TYPE_SHA512_224:
1757
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
1758
            ret = wc_Sha512GetFlags(&hash->alg.sha512, flags);
1759
#else
1760
            ret = HASH_TYPE_E;
1761
#endif
1762
            break;
1763
        case WC_HASH_TYPE_SHA512_256:
1764
#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
1765
            ret = wc_Sha512GetFlags(&hash->alg.sha512, flags);
1766
#else
1767
            ret = HASH_TYPE_E;
1768
#endif
1769
            break;
1770
1771
        case WC_HASH_TYPE_SHA3_224:
1772
        case WC_HASH_TYPE_SHA3_256:
1773
        case WC_HASH_TYPE_SHA3_384:
1774
        case WC_HASH_TYPE_SHA3_512:
1775
#ifdef WOLFSSL_SHA3
1776
            ret = wc_Sha3_GetFlags(&hash->alg.sha3, flags);
1777
#else
1778
            ret = HASH_TYPE_E;
1779
#endif
1780
            break;
1781
1782
        case WC_HASH_TYPE_SHAKE128:
1783
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
1784
            ret = wc_Sha3_GetFlags(&hash->alg.sha3, flags);
1785
#else
1786
            ret = HASH_TYPE_E;
1787
#endif
1788
            break;
1789
1790
        case WC_HASH_TYPE_SHAKE256:
1791
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
1792
            ret = wc_Sha3_GetFlags(&hash->alg.sha3, flags);
1793
#else
1794
            ret = HASH_TYPE_E;
1795
#endif
1796
            break;
1797
1798
        case WC_HASH_TYPE_SM3:
1799
#ifdef WOLFSSL_SM3
1800
            ret = wc_Sm3GetFlags(&hash->alg.sm3, flags);
1801
#else
1802
            ret = HASH_TYPE_E;
1803
#endif
1804
            break;
1805
1806
        /* not supported */
1807
        case WC_HASH_TYPE_MD5_SHA:
1808
        case WC_HASH_TYPE_MD2:
1809
        case WC_HASH_TYPE_MD4:
1810
        case WC_HASH_TYPE_BLAKE2B:
1811
        case WC_HASH_TYPE_BLAKE2S:
1812
            ret = HASH_TYPE_E;
1813
            break;
1814
        case WC_HASH_TYPE_NONE:
1815
            ret = BAD_FUNC_ARG;
1816
            break;
1817
        default:
1818
            ret = BAD_FUNC_ARG;
1819
    };
1820
1821
    return ret;
1822
}
1823
#endif /* WOLFSSL_HASH_FLAGS */
1824
1825
1826
#if !defined(WOLFSSL_TI_HASH)
1827
1828
#if !defined(NO_MD5)
1829
    int wc_Md5Hash_ex(const byte* data, word32 len, byte* hash,
1830
        void* heap, int devId)
1831
    {
1832
        int ret;
1833
        WC_DECLARE_VAR(md5, wc_Md5, 1, 0);
1834
1835
        WC_ALLOC_VAR_EX(md5, wc_Md5, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
1836
            return MEMORY_E);
1837
1838
        if ((ret = wc_InitMd5_ex(md5, heap, devId)) != 0) {
1839
            WOLFSSL_MSG("InitMd5 failed");
1840
        }
1841
        else {
1842
            if ((ret = wc_Md5Update(md5, data, len)) != 0) {
1843
                WOLFSSL_MSG("Md5Update failed");
1844
            }
1845
            else if ((ret = wc_Md5Final(md5, hash)) != 0) {
1846
                WOLFSSL_MSG("Md5Final failed");
1847
            }
1848
            wc_Md5Free(md5);
1849
        }
1850
1851
        WC_FREE_VAR_EX(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1852
1853
        return ret;
1854
    }
1855
    int wc_Md5Hash(const byte* data, word32 len, byte* hash)
1856
    {
1857
        int devId = INVALID_DEVID;
1858
    #ifdef WOLF_CRYPTO_CB
1859
        /* find devId if its not an empty hash */
1860
        if (data != NULL && len > 0) {
1861
            devId = wc_CryptoCb_DefaultDevID();
1862
        }
1863
    #endif
1864
        return wc_Md5Hash_ex(data, len, hash, NULL, devId);
1865
    }
1866
#endif /* !NO_MD5 */
1867
1868
#if !defined(NO_SHA)
1869
    int wc_ShaHash_ex(const byte* data, word32 len, byte* hash,
1870
        void* heap, int devId)
1871
0
    {
1872
0
        int ret = 0;
1873
0
        WC_DECLARE_VAR(sha, wc_Sha, 1, 0);
1874
1875
0
        WC_ALLOC_VAR_EX(sha, wc_Sha, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
1876
0
            return MEMORY_E);
1877
1878
0
        if ((ret = wc_InitSha_ex(sha, heap, devId)) != 0) {
1879
0
            WOLFSSL_MSG("InitSha failed");
1880
0
        }
1881
0
        else {
1882
0
            if ((ret = wc_ShaUpdate(sha, data, len)) != 0) {
1883
0
                WOLFSSL_MSG("ShaUpdate failed");
1884
0
            }
1885
0
            else if ((ret = wc_ShaFinal(sha, hash)) != 0) {
1886
0
                WOLFSSL_MSG("ShaFinal failed");
1887
0
            }
1888
0
            wc_ShaFree(sha);
1889
0
        }
1890
1891
0
        WC_FREE_VAR_EX(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1892
1893
0
        return ret;
1894
0
    }
1895
    int wc_ShaHash(const byte* data, word32 len, byte* hash)
1896
0
    {
1897
0
        int devId = INVALID_DEVID;
1898
    #ifdef WOLF_CRYPTO_CB
1899
        /* find devId if its not an empty hash */
1900
        if (data != NULL && len > 0) {
1901
            devId = wc_CryptoCb_DefaultDevID();
1902
        }
1903
    #endif
1904
0
        return wc_ShaHash_ex(data, len, hash, NULL, devId);
1905
0
    }
1906
#endif /* !NO_SHA */
1907
1908
#if defined(WOLFSSL_SHA224)
1909
    int wc_Sha224Hash_ex(const byte* data, word32 len, byte* hash,
1910
        void* heap, int devId)
1911
0
    {
1912
0
        int ret = 0;
1913
0
        WC_DECLARE_VAR(sha224, wc_Sha224, 1, 0);
1914
1915
0
        WC_ALLOC_VAR_EX(sha224, wc_Sha224, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
1916
0
            return MEMORY_E);
1917
1918
0
        if ((ret = wc_InitSha224_ex(sha224, heap, devId)) != 0) {
1919
0
            WOLFSSL_MSG("InitSha224 failed");
1920
0
        }
1921
0
        else {
1922
0
            if ((ret = wc_Sha224Update(sha224, data, len)) != 0) {
1923
0
                WOLFSSL_MSG("Sha224Update failed");
1924
0
            }
1925
0
            else if ((ret = wc_Sha224Final(sha224, hash)) != 0) {
1926
0
                WOLFSSL_MSG("Sha224Final failed");
1927
0
            }
1928
0
            wc_Sha224Free(sha224);
1929
0
        }
1930
1931
0
        WC_FREE_VAR_EX(sha224, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1932
1933
0
        return ret;
1934
0
    }
1935
    int wc_Sha224Hash(const byte* data, word32 len, byte* hash)
1936
0
    {
1937
0
        int devId = INVALID_DEVID;
1938
    #ifdef WOLF_CRYPTO_CB
1939
        /* find devId if its not an empty hash */
1940
        if (data != NULL && len > 0) {
1941
            devId = wc_CryptoCb_DefaultDevID();
1942
        }
1943
    #endif
1944
0
        return wc_Sha224Hash_ex(data, len, hash, NULL, devId);
1945
0
    }
1946
#endif /* WOLFSSL_SHA224 */
1947
1948
#if !defined(NO_SHA256)
1949
    int wc_Sha256Hash_ex(const byte* data, word32 len, byte* hash,
1950
        void* heap, int devId)
1951
0
    {
1952
0
        int ret = 0;
1953
    #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
1954
        wc_Sha256* sha256;
1955
    #else
1956
0
        wc_Sha256 sha256[1];
1957
0
    #endif
1958
1959
    #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
1960
        sha256 = (wc_Sha256*)XMALLOC(sizeof(wc_Sha256), NULL,
1961
            DYNAMIC_TYPE_TMP_BUFFER);
1962
        if (sha256 == NULL)
1963
            return MEMORY_E;
1964
    #endif
1965
1966
0
        if ((ret = wc_InitSha256_ex(sha256, heap, devId)) != 0) {
1967
0
            WOLFSSL_MSG("InitSha256 failed");
1968
0
        }
1969
0
        else {
1970
0
            if ((ret = wc_Sha256Update(sha256, data, len)) != 0) {
1971
0
                WOLFSSL_MSG("Sha256Update failed");
1972
0
            }
1973
0
            else if ((ret = wc_Sha256Final(sha256, hash)) != 0) {
1974
0
                WOLFSSL_MSG("Sha256Final failed");
1975
0
            }
1976
0
            wc_Sha256Free(sha256);
1977
0
        }
1978
1979
1980
    #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
1981
        XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1982
    #endif
1983
1984
0
        return ret;
1985
0
    }
1986
    int wc_Sha256Hash(const byte* data, word32 len, byte* hash)
1987
0
    {
1988
0
        int devId = INVALID_DEVID;
1989
    #ifdef WOLF_CRYPTO_CB
1990
        /* find devId if its not an empty hash */
1991
        if (data != NULL && len > 0) {
1992
            devId = wc_CryptoCb_DefaultDevID();
1993
        }
1994
    #endif
1995
0
        return wc_Sha256Hash_ex(data, len, hash, NULL, devId);
1996
0
    }
1997
#endif /* !NO_SHA256 */
1998
1999
#endif /* !defined(WOLFSSL_TI_HASH) */
2000
2001
2002
#if defined(WOLFSSL_SHA512)
2003
    int wc_Sha512Hash_ex(const byte* data, word32 len, byte* hash,
2004
        void* heap, int devId)
2005
0
    {
2006
0
        int ret = 0;
2007
0
        WC_DECLARE_VAR(sha512, wc_Sha512, 1, 0);
2008
2009
0
        WC_ALLOC_VAR_EX(sha512, wc_Sha512, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2010
0
            return MEMORY_E);
2011
2012
0
        if ((ret = wc_InitSha512_ex(sha512, heap, devId)) != 0) {
2013
0
            WOLFSSL_MSG("InitSha512 failed");
2014
0
        }
2015
0
        else {
2016
0
            if ((ret = wc_Sha512Update(sha512, data, len)) != 0) {
2017
0
                WOLFSSL_MSG("Sha512Update failed");
2018
0
            }
2019
0
            else if ((ret = wc_Sha512Final(sha512, hash)) != 0) {
2020
0
                WOLFSSL_MSG("Sha512Final failed");
2021
0
            }
2022
0
            wc_Sha512Free(sha512);
2023
0
        }
2024
2025
0
        WC_FREE_VAR_EX(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2026
2027
0
        return ret;
2028
0
    }
2029
    int wc_Sha512Hash(const byte* data, word32 len, byte* hash)
2030
0
    {
2031
0
        int devId = INVALID_DEVID;
2032
    #ifdef WOLF_CRYPTO_CB
2033
        /* find devId if its not an empty hash */
2034
        if (data != NULL && len > 0) {
2035
            devId = wc_CryptoCb_DefaultDevID();
2036
        }
2037
    #endif
2038
0
        return wc_Sha512Hash_ex(data, len, hash, NULL, devId);
2039
0
    }
2040
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && !defined(HAVE_SELFTEST)
2041
#ifndef WOLFSSL_NOSHA512_224
2042
    int wc_Sha512_224Hash_ex(const byte* data, word32 len, byte* hash,
2043
        void* heap, int devId)
2044
0
    {
2045
0
        int ret = 0;
2046
0
        WC_DECLARE_VAR(sha512, wc_Sha512, 1, 0);
2047
2048
0
        WC_ALLOC_VAR_EX(sha512, wc_Sha512, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2049
0
            return MEMORY_E);
2050
2051
0
        if ((ret = wc_InitSha512_224_ex(sha512, heap, devId)) != 0) {
2052
0
            WOLFSSL_MSG("wc_InitSha512_224 failed");
2053
0
        }
2054
0
        else {
2055
0
            if ((ret = wc_Sha512_224Update(sha512, data, len)) != 0) {
2056
0
                WOLFSSL_MSG("wc_Sha512_224_Update failed");
2057
0
            }
2058
0
            else if ((ret = wc_Sha512_224Final(sha512, hash)) != 0) {
2059
0
                WOLFSSL_MSG("wc_Sha512_224_Final failed");
2060
0
            }
2061
0
            wc_Sha512_224Free(sha512);
2062
0
        }
2063
2064
0
        WC_FREE_VAR_EX(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2065
2066
0
        return ret;
2067
0
    }
2068
    int wc_Sha512_224Hash(const byte* data, word32 len, byte* hash)
2069
0
    {
2070
0
        int devId = INVALID_DEVID;
2071
    #ifdef WOLF_CRYPTO_CB
2072
        /* find devId if its not an empty hash */
2073
        if (data != NULL && len > 0) {
2074
            devId = wc_CryptoCb_DefaultDevID();
2075
        }
2076
    #endif
2077
0
        return wc_Sha512_224Hash_ex(data, len, hash, NULL, devId);
2078
0
    }
2079
#endif /* !WOLFSSL_NOSHA512_224 */
2080
#endif /* (!HAVE_FIPS || FIPS v7+) && !HAVE_SELFTEST */
2081
2082
#if (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)) && !defined(HAVE_SELFTEST)
2083
#ifndef WOLFSSL_NOSHA512_256
2084
    int wc_Sha512_256Hash_ex(const byte* data, word32 len, byte* hash,
2085
        void* heap, int devId)
2086
0
    {
2087
0
        int ret = 0;
2088
0
        WC_DECLARE_VAR(sha512, wc_Sha512, 1, 0);
2089
2090
0
        WC_ALLOC_VAR_EX(sha512, wc_Sha512, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2091
0
            return MEMORY_E);
2092
2093
0
        if ((ret = wc_InitSha512_256_ex(sha512, heap, devId)) != 0) {
2094
0
            WOLFSSL_MSG("wc_InitSha512_256 failed");
2095
0
        }
2096
0
        else {
2097
0
            if ((ret = wc_Sha512_256Update(sha512, data, len)) != 0) {
2098
0
                WOLFSSL_MSG("wc_Sha512_256_Update failed");
2099
0
            }
2100
0
            else if ((ret = wc_Sha512_256Final(sha512, hash)) != 0) {
2101
0
                WOLFSSL_MSG("wc_Sha512_256_Final failed");
2102
0
            }
2103
0
            wc_Sha512_256Free(sha512);
2104
0
        }
2105
2106
0
        WC_FREE_VAR_EX(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2107
2108
0
        return ret;
2109
0
    }
2110
    int wc_Sha512_256Hash(const byte* data, word32 len, byte* hash)
2111
0
    {
2112
0
        int devId = INVALID_DEVID;
2113
    #ifdef WOLF_CRYPTO_CB
2114
        /* find devId if its not an empty hash */
2115
        if (data != NULL && len > 0) {
2116
            devId = wc_CryptoCb_DefaultDevID();
2117
        }
2118
    #endif
2119
0
        return wc_Sha512_256Hash_ex(data, len, hash, NULL, devId);
2120
0
    }
2121
#endif /* !WOLFSSL_NOSHA512_256 */
2122
#endif /* (!HAVE_FIPS || FIPS v7+) && !HAVE_SELFTEST */
2123
2124
#endif /* WOLFSSL_SHA512 */
2125
2126
#if defined(WOLFSSL_SHA384)
2127
    int wc_Sha384Hash_ex(const byte* data, word32 len, byte* hash,
2128
        void* heap, int devId)
2129
0
    {
2130
0
        int ret = 0;
2131
0
        WC_DECLARE_VAR(sha384, wc_Sha384, 1, 0);
2132
2133
0
        WC_ALLOC_VAR_EX(sha384, wc_Sha384, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2134
0
            return MEMORY_E);
2135
2136
0
        if ((ret = wc_InitSha384_ex(sha384, heap, devId)) != 0) {
2137
0
            WOLFSSL_MSG("InitSha384 failed");
2138
0
        }
2139
0
        else {
2140
0
            if ((ret = wc_Sha384Update(sha384, data, len)) != 0) {
2141
0
                WOLFSSL_MSG("Sha384Update failed");
2142
0
            }
2143
0
            else if ((ret = wc_Sha384Final(sha384, hash)) != 0) {
2144
0
                WOLFSSL_MSG("Sha384Final failed");
2145
0
            }
2146
0
            wc_Sha384Free(sha384);
2147
0
        }
2148
2149
0
        WC_FREE_VAR_EX(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2150
2151
0
        return ret;
2152
0
    }
2153
    int wc_Sha384Hash(const byte* data, word32 len, byte* hash)
2154
0
    {
2155
0
        int devId = INVALID_DEVID;
2156
    #ifdef WOLF_CRYPTO_CB
2157
        /* find devId if its not an empty hash */
2158
        if (data != NULL && len > 0) {
2159
            devId = wc_CryptoCb_DefaultDevID();
2160
        }
2161
    #endif
2162
0
        return wc_Sha384Hash_ex(data, len, hash, NULL, devId);
2163
0
    }
2164
#endif /* WOLFSSL_SHA384 */
2165
2166
#if defined(WOLFSSL_SHA3)
2167
#if !defined(WOLFSSL_NOSHA3_224)
2168
    int wc_Sha3_224Hash_ex(const byte* data, word32 len, byte* hash,
2169
        void* heap, int devId)
2170
0
    {
2171
0
        int ret = 0;
2172
0
        WC_DECLARE_VAR(sha3, wc_Sha3, 1, 0);
2173
2174
0
        WC_ALLOC_VAR_EX(sha3, wc_Sha3, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2175
0
            return MEMORY_E);
2176
2177
0
        if ((ret = wc_InitSha3_224(sha3, heap, devId)) != 0) {
2178
0
            WOLFSSL_MSG("InitSha3_224 failed");
2179
0
        }
2180
0
        else {
2181
0
            if ((ret = wc_Sha3_224_Update(sha3, data, len)) != 0) {
2182
0
                WOLFSSL_MSG("Sha3_224_Update failed");
2183
0
            }
2184
0
            else if ((ret = wc_Sha3_224_Final(sha3, hash)) != 0) {
2185
0
                WOLFSSL_MSG("Sha3_224_Final failed");
2186
0
            }
2187
0
            wc_Sha3_224_Free(sha3);
2188
0
        }
2189
2190
0
        WC_FREE_VAR_EX(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2191
2192
0
        return ret;
2193
0
    }
2194
    int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash)
2195
0
    {
2196
0
        int devId = INVALID_DEVID;
2197
    #ifdef WOLF_CRYPTO_CB
2198
        /* find devId if its not an empty hash */
2199
        if (data != NULL && len > 0) {
2200
            devId = wc_CryptoCb_DefaultDevID();
2201
        }
2202
    #endif
2203
0
        return wc_Sha3_224Hash_ex(data, len, hash, NULL, devId);
2204
0
    }
2205
#endif /* !WOLFSSL_NOSHA3_224 */
2206
2207
#if !defined(WOLFSSL_NOSHA3_256)
2208
    int wc_Sha3_256Hash_ex(const byte* data, word32 len, byte* hash,
2209
        void* heap, int devId)
2210
0
    {
2211
0
        int ret = 0;
2212
0
        WC_DECLARE_VAR(sha3, wc_Sha3, 1, 0);
2213
2214
0
        WC_ALLOC_VAR_EX(sha3, wc_Sha3, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2215
0
            return MEMORY_E);
2216
2217
0
        if ((ret = wc_InitSha3_256(sha3, heap, devId)) != 0) {
2218
0
            WOLFSSL_MSG("InitSha3_256 failed");
2219
0
        }
2220
0
        else {
2221
0
            if ((ret = wc_Sha3_256_Update(sha3, data, len)) != 0) {
2222
0
                WOLFSSL_MSG("Sha3_256_Update failed");
2223
0
            }
2224
0
            else if ((ret = wc_Sha3_256_Final(sha3, hash)) != 0) {
2225
0
                WOLFSSL_MSG("Sha3_256_Final failed");
2226
0
            }
2227
0
            wc_Sha3_256_Free(sha3);
2228
0
        }
2229
2230
0
        WC_FREE_VAR_EX(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2231
2232
0
        return ret;
2233
0
    }
2234
    int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash)
2235
0
    {
2236
0
        int devId = INVALID_DEVID;
2237
    #ifdef WOLF_CRYPTO_CB
2238
        /* find devId if its not an empty hash */
2239
        if (data != NULL && len > 0) {
2240
            devId = wc_CryptoCb_DefaultDevID();
2241
        }
2242
    #endif
2243
0
        return wc_Sha3_256Hash_ex(data, len, hash, NULL, devId);
2244
0
    }
2245
#endif /* !WOLFSSL_NOSHA3_256 */
2246
2247
#if !defined(WOLFSSL_NOSHA3_384)
2248
    int wc_Sha3_384Hash_ex(const byte* data, word32 len, byte* hash,
2249
        void* heap, int devId)
2250
0
    {
2251
0
        int ret = 0;
2252
0
        WC_DECLARE_VAR(sha3, wc_Sha3, 1, 0);
2253
2254
0
        WC_ALLOC_VAR_EX(sha3, wc_Sha3, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2255
0
            return MEMORY_E);
2256
2257
0
        if ((ret = wc_InitSha3_384(sha3, heap, devId)) != 0) {
2258
0
            WOLFSSL_MSG("InitSha3_384 failed");
2259
0
        }
2260
0
        else {
2261
0
            if ((ret = wc_Sha3_384_Update(sha3, data, len)) != 0) {
2262
0
                WOLFSSL_MSG("Sha3_384_Update failed");
2263
0
            }
2264
0
            else if ((ret = wc_Sha3_384_Final(sha3, hash)) != 0) {
2265
0
                WOLFSSL_MSG("Sha3_384_Final failed");
2266
0
            }
2267
0
            wc_Sha3_384_Free(sha3);
2268
0
        }
2269
2270
0
        WC_FREE_VAR_EX(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2271
2272
0
        return ret;
2273
0
    }
2274
    int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash)
2275
0
    {
2276
0
        int devId = INVALID_DEVID;
2277
    #ifdef WOLF_CRYPTO_CB
2278
        /* find devId if its not an empty hash */
2279
        if (data != NULL && len > 0) {
2280
            devId = wc_CryptoCb_DefaultDevID();
2281
        }
2282
    #endif
2283
0
        return wc_Sha3_384Hash_ex(data, len, hash, NULL, devId);
2284
0
    }
2285
#endif /* !WOLFSSL_NOSHA3_384 */
2286
2287
#if !defined(WOLFSSL_NOSHA3_512)
2288
    int wc_Sha3_512Hash_ex(const byte* data, word32 len, byte* hash,
2289
        void* heap, int devId)
2290
0
    {
2291
0
        int ret = 0;
2292
0
        WC_DECLARE_VAR(sha3, wc_Sha3, 1, 0);
2293
2294
0
        WC_ALLOC_VAR_EX(sha3, wc_Sha3, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2295
0
            return MEMORY_E);
2296
2297
0
        if ((ret = wc_InitSha3_512(sha3, heap, devId)) != 0) {
2298
0
            WOLFSSL_MSG("InitSha3_512 failed");
2299
0
        }
2300
0
        else {
2301
0
            if ((ret = wc_Sha3_512_Update(sha3, data, len)) != 0) {
2302
0
                WOLFSSL_MSG("Sha3_512_Update failed");
2303
0
            }
2304
0
            else if ((ret = wc_Sha3_512_Final(sha3, hash)) != 0) {
2305
0
                WOLFSSL_MSG("Sha3_512_Final failed");
2306
0
            }
2307
0
            wc_Sha3_512_Free(sha3);
2308
0
        }
2309
2310
0
        WC_FREE_VAR_EX(sha3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2311
2312
0
        return ret;
2313
0
    }
2314
    int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash)
2315
0
    {
2316
0
        int devId = INVALID_DEVID;
2317
    #ifdef WOLF_CRYPTO_CB
2318
        /* find devId if its not an empty hash */
2319
        if (data != NULL && len > 0) {
2320
            devId = wc_CryptoCb_DefaultDevID();
2321
        }
2322
    #endif
2323
0
        return wc_Sha3_512Hash_ex(data, len, hash, NULL, devId);
2324
0
    }
2325
#endif /* !WOLFSSL_NOSHA3_512 */
2326
2327
#ifdef WOLFSSL_SHAKE128
2328
    int wc_Shake128Hash_ex(const byte* data, word32 len, byte* hash,
2329
                        word32 hashLen, void* heap, int devId)
2330
0
    {
2331
0
        int ret = 0;
2332
0
        WC_DECLARE_VAR(shake, wc_Shake, 1, 0);
2333
2334
0
        WC_ALLOC_VAR_EX(shake, wc_Shake, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2335
0
            return MEMORY_E);
2336
2337
0
        if ((ret = wc_InitShake128(shake, heap, devId)) != 0) {
2338
0
            WOLFSSL_MSG("InitShake128 failed");
2339
0
        }
2340
0
        else {
2341
0
            if ((ret = wc_Shake128_Update(shake, data, len)) != 0) {
2342
0
                WOLFSSL_MSG("Shake128_Update failed");
2343
0
            }
2344
0
            else if ((ret = wc_Shake128_Final(shake, hash, hashLen)) != 0) {
2345
0
                WOLFSSL_MSG("Shake128_Final failed");
2346
0
            }
2347
0
            wc_Shake128_Free(shake);
2348
0
        }
2349
2350
0
        WC_FREE_VAR_EX(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2351
2352
0
        return ret;
2353
0
    }
2354
    int wc_Shake128Hash(const byte* data, word32 len, byte* hash,
2355
                        word32 hashLen)
2356
0
    {
2357
0
        int devId = INVALID_DEVID;
2358
    #ifdef WOLF_CRYPTO_CB
2359
        /* find devId if its not an empty hash */
2360
        if (data != NULL && len > 0) {
2361
            devId = wc_CryptoCb_DefaultDevID();
2362
        }
2363
    #endif
2364
0
        return wc_Shake128Hash_ex(data, len, hash, hashLen,
2365
0
            NULL, devId);
2366
0
    }
2367
#endif /* WOLFSSL_SHAKE_128 */
2368
2369
#ifdef WOLFSSL_SHAKE256
2370
    int wc_Shake256Hash_ex(const byte* data, word32 len, byte* hash,
2371
                        word32 hashLen, void* heap, int devId)
2372
0
    {
2373
0
        int ret = 0;
2374
0
        WC_DECLARE_VAR(shake, wc_Shake, 1, 0);
2375
2376
0
        WC_ALLOC_VAR_EX(shake, wc_Shake, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2377
0
            return MEMORY_E);
2378
2379
0
        if ((ret = wc_InitShake256(shake, heap, devId)) != 0) {
2380
0
            WOLFSSL_MSG("InitShake256 failed");
2381
0
        }
2382
0
        else {
2383
0
            if ((ret = wc_Shake256_Update(shake, data, len)) != 0) {
2384
0
                WOLFSSL_MSG("Shake256_Update failed");
2385
0
            }
2386
0
            else if ((ret = wc_Shake256_Final(shake, hash, hashLen)) != 0) {
2387
0
                WOLFSSL_MSG("Shake256_Final failed");
2388
0
            }
2389
0
            wc_Shake256_Free(shake);
2390
0
        }
2391
2392
0
        WC_FREE_VAR_EX(shake, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2393
2394
0
        return ret;
2395
0
    }
2396
    int wc_Shake256Hash(const byte* data, word32 len, byte* hash,
2397
                        word32 hashLen)
2398
0
    {
2399
0
        int devId = INVALID_DEVID;
2400
    #ifdef WOLF_CRYPTO_CB
2401
        /* find devId if its not an empty hash */
2402
        if (data != NULL && len > 0) {
2403
            devId = wc_CryptoCb_DefaultDevID();
2404
        }
2405
    #endif
2406
0
        return wc_Shake256Hash_ex(data, len, hash, hashLen,
2407
            NULL, devId);
2408
0
    }
2409
#endif /* WOLFSSL_SHAKE_256 */
2410
#endif /* WOLFSSL_SHA3 */
2411
2412
#ifdef WOLFSSL_SM3
2413
    int wc_Sm3Hash_ex(const byte* data, word32 len, byte* hash,
2414
        void* heap, int devId)
2415
    {
2416
        int ret = 0;
2417
        WC_DECLARE_VAR(sm3, wc_Sm3, 1, 0);
2418
2419
        WC_ALLOC_VAR_EX(sm3, wc_Sm3, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2420
            return MEMORY_E);
2421
2422
        if ((ret = wc_InitSm3(sm3, heap, devId)) != 0) {
2423
            WOLFSSL_MSG("InitSm3 failed");
2424
        }
2425
        else {
2426
            if ((ret = wc_Sm3Update(sm3, data, len)) != 0) {
2427
                WOLFSSL_MSG("Sm3Update failed");
2428
            }
2429
            else if ((ret = wc_Sm3Final(sm3, hash)) != 0) {
2430
                WOLFSSL_MSG("Sm3Final failed");
2431
            }
2432
            wc_Sm3Free(sm3);
2433
        }
2434
2435
        WC_FREE_VAR_EX(sm3, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2436
2437
        return ret;
2438
    }
2439
    int wc_Sm3Hash(const byte* data, word32 len, byte* hash)
2440
    {
2441
        int devId = INVALID_DEVID;
2442
    #ifdef WOLF_CRYPTO_CB
2443
        /* find devId if its not an empty hash */
2444
        if (data != NULL && len > 0) {
2445
            devId = wc_CryptoCb_DefaultDevID();
2446
        }
2447
    #endif
2448
        return wc_Sm3Hash_ex(data, len, hash, NULL, devId);
2449
    }
2450
#endif /* !WOLFSSL_NOSHA3_224 */
2451
2452
#endif /* !NO_HASH_WRAPPER */
2453
2454
#ifdef WOLFSSL_HASH_KEEP
2455
int _wc_Hash_Grow(byte** msg, word32* used, word32* len, const byte* in,
2456
                        int inSz, void* heap)
2457
{
2458
    word32 usedSz = 0;
2459
2460
    if (inSz < 0 || !WC_SAFE_SUM_WORD32(*used, (word32)inSz, usedSz))
2461
        return BAD_FUNC_ARG;
2462
2463
    /* Allow zero-length input as a no-op. Some callers may pass zero-length
2464
     * data during hash operations and this should not be treated as an error. */
2465
    if (inSz == 0)
2466
        return 0;
2467
2468
    if (*len < usedSz) {
2469
        if (*msg == NULL) {
2470
            *msg = (byte*)XMALLOC(usedSz, heap, DYNAMIC_TYPE_TMP_BUFFER);
2471
        }
2472
        else {
2473
            byte* pt = (byte*)XREALLOC(*msg, usedSz, heap,
2474
                    DYNAMIC_TYPE_TMP_BUFFER);
2475
            if (pt == NULL) {
2476
                return MEMORY_E;
2477
            }
2478
            *msg = pt;
2479
        }
2480
        if (*msg == NULL) {
2481
            return MEMORY_E;
2482
        }
2483
        *len = usedSz;
2484
    }
2485
    XMEMCPY(*msg + *used, in, inSz);
2486
    *used += inSz;
2487
    return 0;
2488
}
2489
#endif /* WOLFSSL_HASH_KEEP */
2490