Coverage Report

Created: 2026-11-12 06:59

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