Coverage Report

Created: 2026-09-04 06:30

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