Coverage Report

Created: 2026-04-01 07:25

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