Coverage Report

Created: 2026-08-15 06:21

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