Coverage Report

Created: 2026-04-01 07:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-sp-math/wolfcrypt/src/sha256.c
Line
Count
Source
1
/* sha256.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
/* For more info on the algorithm, see https://tools.ietf.org/html/rfc6234
23
 *
24
 * For more information on NIST FIPS PUB 180-4, see
25
 * https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
26
 */
27
28
/*
29
30
DESCRIPTION
31
This library provides the interface to SHA-256 secure hash algorithms.
32
SHA-256 performs processing on message blocks to produce a final hash digest
33
output. It can be used to hash a message, M, having a length of L bits,
34
where 0 <= L < 2^64.
35
36
Note that in some cases, hardware acceleration may be enabled, depending
37
on the specific device platform.
38
39
*/
40
41
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
42
43
/*
44
 * SHA256 Build Options:
45
 * USE_SLOW_SHA256:            Reduces code size by not partially unrolling
46
                                (~2KB smaller and ~25% slower) (default OFF)
47
 * WOLFSSL_SHA256_BY_SPEC:     Uses the Ch/Maj based on SHA256 specification
48
                                (default ON)
49
 * WOLFSSL_SHA256_ALT_CH_MAJ:  Alternate Ch/Maj that is easier for compilers to
50
                                optimize and recognize as SHA256 (default OFF)
51
 * SHA256_MANY_REGISTERS:      A SHA256 version that keeps all data in registers
52
                                and partial unrolled (default OFF)
53
 */
54
55
/* Default SHA256 to use Ch/Maj based on specification */
56
#if !defined(WOLFSSL_SHA256_BY_SPEC) && !defined(WOLFSSL_SHA256_ALT_CH_MAJ)
57
    #define WOLFSSL_SHA256_BY_SPEC
58
#endif
59
60
61
#if !defined(NO_SHA256) && !defined(WOLFSSL_RISCV_ASM)
62
63
#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)
64
    /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */
65
    #define FIPS_NO_WRAPPERS
66
67
    #ifdef USE_WINDOWS_API
68
        #pragma code_seg(".fipsA$l")
69
        #pragma const_seg(".fipsB$l")
70
    #endif
71
#endif
72
73
#include <wolfssl/wolfcrypt/sha256.h>
74
#include <wolfssl/wolfcrypt/cpuid.h>
75
#include <wolfssl/wolfcrypt/hash.h>
76
77
#ifdef WOLF_CRYPTO_CB
78
    #include <wolfssl/wolfcrypt/cryptocb.h>
79
#endif
80
81
#ifdef WOLFSSL_IMXRT1170_CAAM
82
    #include <wolfssl/wolfcrypt/port/caam/wolfcaam_fsl_nxp.h>
83
#endif
84
85
86
/* determine if we are using Espressif SHA hardware acceleration */
87
#undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW
88
#if defined(WOLFSSL_ESP32_CRYPT) && \
89
    !defined(NO_WOLFSSL_ESP32_CRYPT_HASH)
90
    /* define a single keyword for simplicity & readability
91
     *
92
     * by default the HW acceleration is on for ESP32-WROOM32
93
     * but individual components can be turned off.
94
     */
95
    #define WOLFSSL_USE_ESP32_CRYPT_HASH_HW
96
#else
97
    #undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW
98
#endif
99
100
#ifdef WOLFSSL_ESPIDF
101
    /* Define the ESP_LOGx(TAG,  WOLFSSL_ESPIDF_BLANKLINE_MESSAGE value for output messages here.
102
    **
103
    ** Beware of possible conflict in test.c (that one now named TEST_TAG)
104
    */
105
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
106
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
107
        static const char* TAG = "wc_sha256";
108
    #endif
109
#endif
110
111
#if defined(WOLFSSL_TI_HASH)
112
    /* #include <wolfcrypt/src/port/ti/ti-hash.c> included by wc_port.c */
113
#elif defined(WOLFSSL_CRYPTOCELL)
114
    /* wc_port.c includes wolfcrypt/src/port/arm/cryptoCellHash.c */
115
116
117
#elif defined(MAX3266X_SHA)
118
    /* Already brought in by sha256.h */
119
    /* #include <wolfssl/wolfcrypt/port/maxim/max3266x.h> */
120
#else
121
122
#ifdef NO_INLINE
123
    #include <wolfssl/wolfcrypt/misc.h>
124
#else
125
    #define WOLFSSL_MISC_INCLUDED
126
    #include <wolfcrypt/src/misc.c>
127
#endif
128
129
#ifdef WOLFSSL_DEVCRYPTO_HASH
130
    #include <wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h>
131
#endif
132
#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
133
    #include <wolfssl/wolfcrypt/port/nxp/se050_port.h>
134
#endif
135
136
#if FIPS_VERSION3_GE(6,0,0)
137
    const unsigned int wolfCrypt_FIPS_sha256_ro_sanity[2] =
138
                                                     { 0x1a2b3c4d, 0x00000014 };
139
    int wolfCrypt_FIPS_SHA256_sanity(void)
140
    {
141
        return 0;
142
    }
143
#endif
144
145
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP)
146
    #if defined(__GNUC__) && ((__GNUC__ < 4) || \
147
                              (__GNUC__ == 4 && __GNUC_MINOR__ <= 8))
148
        #undef  NO_AVX2_SUPPORT
149
        #define NO_AVX2_SUPPORT
150
    #endif
151
    #if defined(__clang__) && ((__clang_major__ < 3) || \
152
                               (__clang_major__ == 3 && __clang_minor__ <= 5))
153
        #define NO_AVX2_SUPPORT
154
    #elif defined(__clang__) && defined(NO_AVX2_SUPPORT)
155
        #undef NO_AVX2_SUPPORT
156
    #endif
157
158
    #define HAVE_INTEL_AVX1
159
    #ifndef NO_AVX2_SUPPORT
160
        #define HAVE_INTEL_AVX2
161
    #endif
162
#else
163
    #undef HAVE_INTEL_AVX1
164
    #undef HAVE_INTEL_AVX2
165
#endif /* WOLFSSL_X86_64_BUILD && USE_INTEL_SPEEDUP */
166
167
#if defined(HAVE_INTEL_AVX2)
168
    #define HAVE_INTEL_RORX
169
#endif
170
171
#if defined(LITTLE_ENDIAN_ORDER)
172
    #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \
173
          defined(CONFIG_IDF_TARGET_ESP8684) || \
174
          defined(CONFIG_IDF_TARGET_ESP32C3) || \
175
          defined(CONFIG_IDF_TARGET_ESP32C6)    \
176
        ) && \
177
        defined(WOLFSSL_ESP32_CRYPT) &&         \
178
        !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \
179
        !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
180
        /* For Espressif RISC-V Targets, we *may* need to reverse bytes
181
         * depending on if HW is active or not. */
182
        #define SHA256_REV_BYTES(ctx) \
183
            (esp_sha_need_byte_reversal(ctx))
184
    #elif defined(FREESCALE_MMCAU_SHA)
185
        #define SHA256_REV_BYTES(ctx)       1 /* reverse needed on final */
186
    #endif
187
#endif
188
#ifndef SHA256_REV_BYTES
189
    #if defined(LITTLE_ENDIAN_ORDER)
190
12.1M
        #define SHA256_REV_BYTES(ctx)       1
191
    #else
192
        #define SHA256_REV_BYTES(ctx)       0
193
    #endif
194
#endif
195
#if defined(LITTLE_ENDIAN_ORDER) && \
196
        defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
197
        (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
198
    #ifdef WC_C_DYNAMIC_FALLBACK
199
        #define SHA256_UPDATE_REV_BYTES(ctx) (sha256->sha_method == SHA256_C)
200
    #else
201
        #define SHA256_UPDATE_REV_BYTES(ctx) \
202
            (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags) && \
203
             !IS_INTEL_SHA(intel_flags))
204
    #endif
205
#elif defined(FREESCALE_MMCAU_SHA)
206
    #define SHA256_UPDATE_REV_BYTES(ctx)    0 /* reverse not needed on update */
207
#elif defined(WOLFSSL_PPC32_ASM)
208
    #define SHA256_UPDATE_REV_BYTES(ctx)    0
209
#elif defined(WOLFSSL_ARMASM)
210
    #define SHA256_UPDATE_REV_BYTES(ctx)    0
211
#else
212
7.60M
    #define SHA256_UPDATE_REV_BYTES(ctx)    SHA256_REV_BYTES(ctx)
213
#endif
214
215
216
#if !defined(WOLFSSL_PIC32MZ_HASH) && !defined(STM32_HASH_SHA2) && \
217
    (!defined(WOLFSSL_IMX6_CAAM) || defined(NO_IMX6_CAAM_HASH) || \
218
     defined(WOLFSSL_QNX_CAAM)) && \
219
    !defined(WOLFSSL_AFALG_HASH) && !defined(WOLFSSL_DEVCRYPTO_HASH) && \
220
    (!defined(WOLFSSL_ESP32_CRYPT) || defined(NO_WOLFSSL_ESP32_CRYPT_HASH)) && \
221
    ((!defined(WOLFSSL_RENESAS_TSIP_TLS) && \
222
      !defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) || \
223
     defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) && \
224
    !defined(PSOC6_HASH_SHA2) && !defined(WOLFSSL_IMXRT_DCP) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
225
    !defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_SE050_HASH) && \
226
    ((!defined(WOLFSSL_RENESAS_SCEPROTECT) && \
227
      !defined(WOLFSSL_RENESAS_RSIP)) \
228
      || defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)) && \
229
    (!defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH)) && \
230
    !defined(WOLFSSL_RENESAS_RX64_HASH)
231
232
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
233
    (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
234
#ifdef WC_C_DYNAMIC_FALLBACK
235
    #define SHA256_SETTRANSFORM_ARGS int *sha_method
236
#else
237
    #define SHA256_SETTRANSFORM_ARGS void
238
#endif
239
static void Sha256_SetTransform(SHA256_SETTRANSFORM_ARGS);
240
#endif
241
242
static int InitSha256(wc_Sha256* sha256)
243
10.0M
{
244
10.0M
    XMEMSET(sha256->digest, 0, sizeof(sha256->digest));
245
10.0M
    sha256->digest[0] = 0x6A09E667L;
246
10.0M
    sha256->digest[1] = 0xBB67AE85L;
247
10.0M
    sha256->digest[2] = 0x3C6EF372L;
248
10.0M
    sha256->digest[3] = 0xA54FF53AL;
249
10.0M
    sha256->digest[4] = 0x510E527FL;
250
10.0M
    sha256->digest[5] = 0x9B05688CL;
251
10.0M
    sha256->digest[6] = 0x1F83D9ABL;
252
10.0M
    sha256->digest[7] = 0x5BE0CD19L;
253
254
10.0M
    sha256->buffLen = 0;
255
10.0M
    sha256->loLen   = 0;
256
10.0M
    sha256->hiLen   = 0;
257
10.0M
#ifdef WOLFSSL_HASH_FLAGS
258
10.0M
    sha256->flags = 0;
259
10.0M
#endif
260
#ifdef WOLFSSL_HASH_KEEP
261
    sha256->msg  = NULL;
262
    sha256->len  = 0;
263
    sha256->used = 0;
264
#endif
265
266
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
267
    (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
268
    /* choose best Transform function under this runtime environment */
269
#ifdef WC_C_DYNAMIC_FALLBACK
270
    sha256->sha_method = 0;
271
    Sha256_SetTransform(&sha256->sha_method);
272
#else
273
    Sha256_SetTransform();
274
#endif
275
#endif
276
277
#ifdef WOLFSSL_MAXQ10XX_CRYPTO
278
    XMEMSET(&sha256->maxq_ctx, 0, sizeof(sha256->maxq_ctx));
279
#endif
280
281
#ifdef HAVE_ARIA
282
    sha256->hSession = NULL;
283
#endif
284
285
10.0M
    return 0;
286
10.0M
}
287
#endif
288
289
290
/* Hardware Acceleration */
291
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
292
                          (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
293
294
    /* in case intel instructions aren't available, plus we need the K[] global */
295
    #define NEED_SOFT_SHA256
296
297
    /*****
298
    Intel AVX1/AVX2 Macro Control Structure
299
300
    #define HAVE_INTEL_AVX1
301
    #define HAVE_INTEL_AVX2
302
303
    #define HAVE_INTEL_RORX
304
305
306
    int InitSha256(wc_Sha256* sha256) {
307
         Save/Recover XMM, YMM
308
         ...
309
    }
310
311
    #if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2)
312
      Transform_Sha256(); Function prototype
313
    #else
314
      Transform_Sha256() {   }
315
      int Sha256Final() {
316
         Save/Recover XMM, YMM
317
         ...
318
      }
319
    #endif
320
321
    #if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2)
322
        #if defined(HAVE_INTEL_RORX
323
             #define RND with rorx instruction
324
        #else
325
            #define RND
326
        #endif
327
    #endif
328
329
    #if defined(HAVE_INTEL_AVX1)
330
331
       #define XMM Instructions/inline asm
332
333
       int Transform_Sha256() {
334
           Stitched Message Sched/Round
335
        }
336
337
    #elif defined(HAVE_INTEL_AVX2)
338
339
      #define YMM Instructions/inline asm
340
341
      int Transform_Sha256() {
342
          More granular Stitched Message Sched/Round
343
      }
344
345
    #endif
346
347
    */
348
349
    /* Each platform needs to query info type 1 from cpuid to see if aesni is
350
     * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts
351
     */
352
353
    /* #if defined(HAVE_INTEL_AVX1/2) at the tail of sha256 */
354
    static int Transform_Sha256(wc_Sha256* sha256, const byte* data);
355
356
#ifdef __cplusplus
357
    extern "C" {
358
#endif
359
360
        extern int Transform_Sha256_SSE2_Sha(wc_Sha256 *sha256,
361
                                             const byte* data);
362
        extern int Transform_Sha256_SSE2_Sha_Len(wc_Sha256* sha256,
363
                                                 const byte* data, word32 len);
364
    #if defined(HAVE_INTEL_AVX1)
365
        extern int Transform_Sha256_AVX1_Sha(wc_Sha256 *sha256,
366
                                             const byte* data);
367
        extern int Transform_Sha256_AVX1_Sha_Len(wc_Sha256* sha256,
368
                                                 const byte* data, word32 len);
369
        extern int Transform_Sha256_AVX1(wc_Sha256 *sha256, const byte* data);
370
        extern int Transform_Sha256_AVX1_Len(wc_Sha256* sha256,
371
                                             const byte* data, word32 len);
372
    #endif
373
    #if defined(HAVE_INTEL_AVX2)
374
        extern int Transform_Sha256_AVX2(wc_Sha256 *sha256, const byte* data);
375
        extern int Transform_Sha256_AVX2_Len(wc_Sha256* sha256,
376
                                             const byte* data, word32 len);
377
        #ifdef HAVE_INTEL_RORX
378
        extern int Transform_Sha256_AVX1_RORX(wc_Sha256 *sha256, const byte* data);
379
        extern int Transform_Sha256_AVX1_RORX_Len(wc_Sha256* sha256,
380
                                                  const byte* data, word32 len);
381
        extern int Transform_Sha256_AVX2_RORX(wc_Sha256 *sha256, const byte* data);
382
        extern int Transform_Sha256_AVX2_RORX_Len(wc_Sha256* sha256,
383
                                                  const byte* data, word32 len);
384
        #endif /* HAVE_INTEL_RORX */
385
    #endif /* HAVE_INTEL_AVX2 */
386
387
#ifdef __cplusplus
388
    }  /* extern "C" */
389
#endif
390
391
    static cpuid_flags_t intel_flags = WC_CPUID_INITIALIZER;
392
393
#if defined(WC_C_DYNAMIC_FALLBACK) && !defined(WC_NO_INTERNAL_FUNCTION_POINTERS)
394
    #define WC_NO_INTERNAL_FUNCTION_POINTERS
395
#endif
396
397
#ifdef WC_NO_INTERNAL_FUNCTION_POINTERS
398
399
    enum sha_methods { SHA256_UNSET = 0, SHA256_AVX1_SHA, SHA256_AVX2,
400
                       SHA256_AVX1_RORX, SHA256_AVX1_NOSHA, SHA256_AVX2_RORX,
401
                       SHA256_SSE2, SHA256_C };
402
403
#ifndef WC_C_DYNAMIC_FALLBACK
404
    /* note that all write access to this static variable must be idempotent,
405
     * as arranged by Sha256_SetTransform(), else it will be susceptible to
406
     * data races.
407
     */
408
    static enum sha_methods sha_method = SHA256_UNSET;
409
#endif
410
411
    static void Sha256_SetTransform(SHA256_SETTRANSFORM_ARGS)
412
    {
413
    #ifdef WC_C_DYNAMIC_FALLBACK
414
        #define SHA_METHOD (*sha_method)
415
    #else
416
        #define SHA_METHOD sha_method
417
    #endif
418
        if (SHA_METHOD != SHA256_UNSET)
419
            return;
420
421
    #ifdef WC_C_DYNAMIC_FALLBACK
422
        if (! CAN_SAVE_VECTOR_REGISTERS()) {
423
            SHA_METHOD = SHA256_C;
424
            return;
425
        }
426
    #endif
427
428
        cpuid_get_flags_ex(&intel_flags);
429
430
        if (IS_INTEL_SHA(intel_flags)) {
431
        #ifdef HAVE_INTEL_AVX1
432
            if (IS_INTEL_AVX1(intel_flags)) {
433
                SHA_METHOD = SHA256_AVX1_SHA;
434
            }
435
            else
436
        #endif
437
            {
438
                SHA_METHOD = SHA256_SSE2;
439
            }
440
        }
441
        else
442
    #ifdef HAVE_INTEL_AVX2
443
        if (IS_INTEL_AVX2(intel_flags)) {
444
        #ifdef HAVE_INTEL_RORX
445
            if (IS_INTEL_BMI2(intel_flags)) {
446
                SHA_METHOD = SHA256_AVX2_RORX;
447
            }
448
            else
449
        #endif
450
            {
451
                SHA_METHOD = SHA256_AVX2;
452
            }
453
        }
454
        else
455
    #endif
456
    #ifdef HAVE_INTEL_AVX1
457
        if (IS_INTEL_AVX1(intel_flags)) {
458
        #ifdef HAVE_INTEL_RORX
459
            if (IS_INTEL_BMI2(intel_flags)) {
460
                SHA_METHOD = SHA256_AVX1_RORX;
461
            }
462
            else
463
        #endif
464
            {
465
                SHA_METHOD = SHA256_AVX1_NOSHA;
466
            }
467
        }
468
        else
469
    #endif
470
        {
471
            SHA_METHOD = SHA256_C;
472
        }
473
    #undef SHA_METHOD
474
    }
475
476
    static WC_INLINE int inline_XTRANSFORM(wc_Sha256* S, const byte* D) {
477
    #ifdef WC_C_DYNAMIC_FALLBACK
478
        #define SHA_METHOD (S->sha_method)
479
    #else
480
        #define SHA_METHOD sha_method
481
    #endif
482
        int ret;
483
484
        if (SHA_METHOD == SHA256_C)
485
            return Transform_Sha256(S, D);
486
        SAVE_VECTOR_REGISTERS(return _svr_ret;);
487
        switch (SHA_METHOD) {
488
        case SHA256_AVX2:
489
            ret = Transform_Sha256_AVX2(S, D);
490
            break;
491
        case SHA256_AVX2_RORX:
492
            ret = Transform_Sha256_AVX2_RORX(S, D);
493
            break;
494
        case SHA256_AVX1_SHA:
495
            ret = Transform_Sha256_AVX1_Sha(S, D);
496
            break;
497
        case SHA256_AVX1_NOSHA:
498
            ret = Transform_Sha256_AVX1(S, D);
499
            break;
500
        case SHA256_AVX1_RORX:
501
            ret = Transform_Sha256_AVX1_RORX(S, D);
502
            break;
503
        case SHA256_SSE2:
504
            ret = Transform_Sha256_SSE2_Sha(S, D);
505
            break;
506
        case SHA256_C:
507
        case SHA256_UNSET:
508
        default:
509
            ret = Transform_Sha256(S, D);
510
            break;
511
        }
512
        RESTORE_VECTOR_REGISTERS();
513
        return ret;
514
    #undef SHA_METHOD
515
    }
516
#define XTRANSFORM(...) inline_XTRANSFORM(__VA_ARGS__)
517
518
    static WC_INLINE int inline_XTRANSFORM_LEN(wc_Sha256* S, const byte* D, word32 L) {
519
    #ifdef WC_C_DYNAMIC_FALLBACK
520
        #define SHA_METHOD (S->sha_method)
521
    #else
522
        #define SHA_METHOD sha_method
523
    #endif
524
        int ret;
525
        SAVE_VECTOR_REGISTERS(return _svr_ret;);
526
        switch (SHA_METHOD) {
527
        case SHA256_AVX2:
528
            ret = Transform_Sha256_AVX2_Len(S, D, L);
529
            break;
530
        case SHA256_AVX2_RORX:
531
            ret = Transform_Sha256_AVX2_RORX_Len(S, D, L);
532
            break;
533
        case SHA256_AVX1_SHA:
534
            ret = Transform_Sha256_AVX1_Sha_Len(S, D, L);
535
            break;
536
        case SHA256_AVX1_NOSHA:
537
            ret = Transform_Sha256_AVX1_Len(S, D, L);
538
            break;
539
        case SHA256_AVX1_RORX:
540
            ret = Transform_Sha256_AVX1_RORX_Len(S, D, L);
541
            break;
542
        case SHA256_SSE2:
543
            ret = Transform_Sha256_SSE2_Sha_Len(S, D, L);
544
            break;
545
        case SHA256_C:
546
        case SHA256_UNSET:
547
        default:
548
            ret = 0;
549
            break;
550
        }
551
        RESTORE_VECTOR_REGISTERS();
552
        return ret;
553
    #undef SHA_METHOD
554
    }
555
#define XTRANSFORM_LEN(...) inline_XTRANSFORM_LEN(__VA_ARGS__)
556
557
#else /* !WC_NO_INTERNAL_FUNCTION_POINTERS */
558
559
    static int (*Transform_Sha256_p)(wc_Sha256* sha256, const byte* data);
560
                                                       /* = _Transform_Sha256 */
561
    static int (*Transform_Sha256_Len_p)(wc_Sha256* sha256, const byte* data,
562
                                         word32 len);
563
                                                                    /* = NULL */
564
    static int transform_check = 0;
565
    static int Transform_Sha256_is_vectorized = 0;
566
567
    static WC_INLINE int inline_XTRANSFORM(wc_Sha256* S, const byte* D) {
568
        int ret;
569
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
570
        if (Transform_Sha256_is_vectorized)
571
            SAVE_VECTOR_REGISTERS(return _svr_ret;);
572
    #endif
573
        ret = (*Transform_Sha256_p)(S, D);
574
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
575
        if (Transform_Sha256_is_vectorized)
576
            RESTORE_VECTOR_REGISTERS();
577
    #endif
578
        return ret;
579
    }
580
#define XTRANSFORM(...) inline_XTRANSFORM(__VA_ARGS__)
581
582
    static WC_INLINE int inline_XTRANSFORM_LEN(wc_Sha256* S, const byte* D, word32 L) {
583
        int ret;
584
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
585
        if (Transform_Sha256_is_vectorized)
586
            SAVE_VECTOR_REGISTERS(return _svr_ret;);
587
    #endif
588
        ret = (*Transform_Sha256_Len_p)(S, D, L);
589
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
590
        if (Transform_Sha256_is_vectorized)
591
            RESTORE_VECTOR_REGISTERS();
592
    #endif
593
        return ret;
594
    }
595
#define XTRANSFORM_LEN(...) inline_XTRANSFORM_LEN(__VA_ARGS__)
596
597
    static void Sha256_SetTransform(void)
598
    {
599
600
        if (transform_check)
601
            return;
602
603
        cpuid_get_flags_ex(&intel_flags);
604
605
        if (IS_INTEL_SHA(intel_flags)) {
606
        #ifdef HAVE_INTEL_AVX1
607
            if (IS_INTEL_AVX1(intel_flags)) {
608
                Transform_Sha256_p = Transform_Sha256_AVX1_Sha;
609
                Transform_Sha256_Len_p = Transform_Sha256_AVX1_Sha_Len;
610
                Transform_Sha256_is_vectorized = 1;
611
            }
612
            else
613
        #endif
614
            {
615
                Transform_Sha256_p = Transform_Sha256_SSE2_Sha;
616
                Transform_Sha256_Len_p = Transform_Sha256_SSE2_Sha_Len;
617
                Transform_Sha256_is_vectorized = 1;
618
            }
619
        }
620
        else
621
    #ifdef HAVE_INTEL_AVX2
622
        if (IS_INTEL_AVX2(intel_flags)) {
623
        #ifdef HAVE_INTEL_RORX
624
            if (IS_INTEL_BMI2(intel_flags)) {
625
                Transform_Sha256_p = Transform_Sha256_AVX2_RORX;
626
                Transform_Sha256_Len_p = Transform_Sha256_AVX2_RORX_Len;
627
                Transform_Sha256_is_vectorized = 1;
628
            }
629
            else
630
        #endif
631
            {
632
                Transform_Sha256_p = Transform_Sha256_AVX2;
633
                Transform_Sha256_Len_p = Transform_Sha256_AVX2_Len;
634
                Transform_Sha256_is_vectorized = 1;
635
            }
636
        }
637
        else
638
    #endif
639
    #ifdef HAVE_INTEL_AVX1
640
        if (IS_INTEL_AVX1(intel_flags)) {
641
        #ifdef HAVE_INTEL_RORX
642
            if (IS_INTEL_BMI2(intel_flags)) {
643
                Transform_Sha256_p = Transform_Sha256_AVX1_RORX;
644
                Transform_Sha256_Len_p = Transform_Sha256_AVX1_RORX_Len;
645
                Transform_Sha256_is_vectorized = 1;
646
            }
647
            else
648
        #endif
649
            {
650
                Transform_Sha256_p = Transform_Sha256_AVX1;
651
                Transform_Sha256_Len_p = Transform_Sha256_AVX1_Len;
652
                Transform_Sha256_is_vectorized = 1;
653
            }
654
        }
655
        else
656
    #endif
657
        {
658
            Transform_Sha256_p = Transform_Sha256;
659
            Transform_Sha256_Len_p = NULL;
660
            Transform_Sha256_is_vectorized = 0;
661
        }
662
663
        transform_check = 1;
664
    }
665
666
#endif /* !WC_NO_INTERNAL_FUNCTION_POINTERS */
667
668
#if !defined(WOLFSSL_KCAPI_HASH)
669
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
670
    {
671
        int ret = 0;
672
        if (sha256 == NULL)
673
            return BAD_FUNC_ARG;
674
675
        sha256->heap = heap;
676
    #ifdef WOLF_CRYPTO_CB
677
        sha256->devId = devId;
678
        sha256->devCtx = NULL;
679
    #endif
680
    #ifdef WOLFSSL_SMALL_STACK_CACHE
681
        sha256->W = (word32*)XMALLOC(sizeof(word32) * WC_SHA256_BLOCK_SIZE,
682
                                     sha256->heap, DYNAMIC_TYPE_DIGEST);
683
        if (sha256->W == NULL)
684
            return MEMORY_E;
685
    #endif
686
687
        ret = InitSha256(sha256);
688
        if (ret != 0)
689
            return ret;
690
691
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256)
692
        ret = wolfAsync_DevCtxInit(&sha256->asyncDev,
693
                            WOLFSSL_ASYNC_MARKER_SHA256, sha256->heap, devId);
694
    #else
695
        (void)devId;
696
    #endif /* WOLFSSL_ASYNC_CRYPT */
697
698
        return ret;
699
    }
700
#endif /* !WOLFSSL_KCAPI_HASH */
701
702
#elif defined(FREESCALE_LTC_SHA)
703
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
704
    {
705
        (void)heap;
706
        (void)devId;
707
708
        LTC_HASH_Init(LTC_BASE, &sha256->ctx, kLTC_Sha256, NULL, 0);
709
710
        return 0;
711
    }
712
713
#elif defined(FREESCALE_MMCAU_SHA)
714
715
    #ifdef FREESCALE_MMCAU_CLASSIC_SHA
716
        #include "cau_api.h"
717
    #else
718
        #include "fsl_mmcau.h"
719
    #endif
720
721
    #define XTRANSFORM(S, D)         Transform_Sha256((S),(D))
722
    #define XTRANSFORM_LEN(S, D, L)  Transform_Sha256_Len((S),(D),(L))
723
724
    #ifndef WC_HASH_DATA_ALIGNMENT
725
        /* these hardware API's require 4 byte (word32) alignment */
726
        #define WC_HASH_DATA_ALIGNMENT 4
727
    #endif
728
729
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
730
    {
731
        int ret = 0;
732
733
        (void)heap;
734
        (void)devId;
735
736
        ret = wolfSSL_CryptHwMutexLock();
737
        if (ret != 0) {
738
            return ret;
739
        }
740
741
    #ifdef FREESCALE_MMCAU_CLASSIC_SHA
742
        cau_sha256_initialize_output(sha256->digest);
743
    #else
744
        MMCAU_SHA256_InitializeOutput((uint32_t*)sha256->digest);
745
    #endif
746
        wolfSSL_CryptHwMutexUnLock();
747
748
        sha256->buffLen = 0;
749
        sha256->loLen   = 0;
750
        sha256->hiLen   = 0;
751
    #ifdef WOLFSSL_SMALL_STACK_CACHE
752
        sha256->W = NULL;
753
    #endif
754
755
        return ret;
756
    }
757
758
    static int Transform_Sha256(wc_Sha256* sha256, const byte* data)
759
    {
760
        int ret = wolfSSL_CryptHwMutexLock();
761
        if (ret == 0) {
762
    #ifdef FREESCALE_MMCAU_CLASSIC_SHA
763
            cau_sha256_hash_n((byte*)data, 1, sha256->digest);
764
    #else
765
            MMCAU_SHA256_HashN((byte*)data, 1, (uint32_t*)sha256->digest);
766
    #endif
767
            wolfSSL_CryptHwMutexUnLock();
768
        }
769
        return ret;
770
    }
771
772
    static int Transform_Sha256_Len(wc_Sha256* sha256, const byte* data,
773
        word32 len)
774
    {
775
        int ret = wolfSSL_CryptHwMutexLock();
776
        if (ret == 0) {
777
        #if defined(WC_HASH_DATA_ALIGNMENT) && WC_HASH_DATA_ALIGNMENT > 0
778
            if ((wc_ptr_t)data % WC_HASH_DATA_ALIGNMENT) {
779
                /* data pointer is NOT aligned,
780
                 * so copy and perform one block at a time */
781
                byte* local = (byte*)sha256->buffer;
782
                while (len >= WC_SHA256_BLOCK_SIZE) {
783
                    XMEMCPY(local, data, WC_SHA256_BLOCK_SIZE);
784
                #ifdef FREESCALE_MMCAU_CLASSIC_SHA
785
                    cau_sha256_hash_n(local, 1, sha256->digest);
786
                #else
787
                    MMCAU_SHA256_HashN(local, 1, (uint32_t*)sha256->digest);
788
                #endif
789
                    data += WC_SHA256_BLOCK_SIZE;
790
                    len  -= WC_SHA256_BLOCK_SIZE;
791
                }
792
            }
793
            else
794
        #endif
795
            {
796
    #ifdef FREESCALE_MMCAU_CLASSIC_SHA
797
            cau_sha256_hash_n((byte*)data, len/WC_SHA256_BLOCK_SIZE,
798
                sha256->digest);
799
    #else
800
            MMCAU_SHA256_HashN((byte*)data, len/WC_SHA256_BLOCK_SIZE,
801
                (uint32_t*)sha256->digest);
802
    #endif
803
            }
804
            wolfSSL_CryptHwMutexUnLock();
805
        }
806
        return ret;
807
    }
808
809
#elif defined(WOLFSSL_PIC32MZ_HASH)
810
    #include <wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h>
811
812
#elif defined(STM32_HASH_SHA2)
813
814
    /* Supports CubeMX HAL or Standard Peripheral Library */
815
816
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
817
    {
818
        if (sha256 == NULL)
819
            return BAD_FUNC_ARG;
820
821
        (void)devId;
822
        (void)heap;
823
824
        XMEMSET(sha256, 0, sizeof(wc_Sha256));
825
        wc_Stm32_Hash_Init(&sha256->stmCtx);
826
        return 0;
827
    }
828
829
    int wc_Sha256Update(wc_Sha256* sha256, const byte* data, word32 len)
830
    {
831
        int ret = 0;
832
833
        if (sha256 == NULL) {
834
            return BAD_FUNC_ARG;
835
        }
836
        if (data == NULL && len == 0) {
837
            /* valid, but do nothing */
838
            return 0;
839
        }
840
        if (data == NULL) {
841
            return BAD_FUNC_ARG;
842
        }
843
844
        ret = wolfSSL_CryptHwMutexLock();
845
        if (ret == 0) {
846
            ret = wc_Stm32_Hash_Update(&sha256->stmCtx,
847
                HASH_AlgoSelection_SHA256, data, len, WC_SHA256_BLOCK_SIZE);
848
            wolfSSL_CryptHwMutexUnLock();
849
        }
850
        return ret;
851
    }
852
853
    int wc_Sha256Final(wc_Sha256* sha256, byte* hash)
854
    {
855
        int ret = 0;
856
857
        if (sha256 == NULL || hash == NULL) {
858
            return BAD_FUNC_ARG;
859
        }
860
861
        ret = wolfSSL_CryptHwMutexLock();
862
        if (ret == 0) {
863
            ret = wc_Stm32_Hash_Final(&sha256->stmCtx,
864
                HASH_AlgoSelection_SHA256, hash, WC_SHA256_DIGEST_SIZE);
865
            wolfSSL_CryptHwMutexUnLock();
866
        }
867
868
        (void)wc_InitSha256(sha256); /* reset state */
869
870
        return ret;
871
    }
872
873
#elif defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_HASH) && \
874
    !defined(WOLFSSL_QNX_CAAM)
875
    /* functions defined in wolfcrypt/src/port/caam/caam_sha256.c */
876
877
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
878
879
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
880
    {
881
        if (sha256 == NULL) {
882
            return BAD_FUNC_ARG;
883
        }
884
        (void)devId;
885
886
        return se050_hash_init(&sha256->se050Ctx, heap);
887
    }
888
889
    int wc_Sha256Update(wc_Sha256* sha256, const byte* data, word32 len)
890
    {
891
        if (sha256 == NULL) {
892
            return BAD_FUNC_ARG;
893
        }
894
        if (data == NULL && len == 0) {
895
            /* valid, but do nothing */
896
            return 0;
897
        }
898
        if (data == NULL) {
899
            return BAD_FUNC_ARG;
900
        }
901
902
        return se050_hash_update(&sha256->se050Ctx, data, len);
903
    }
904
905
    int wc_Sha256Final(wc_Sha256* sha256, byte* hash)
906
    {
907
        int ret = 0;
908
        ret = se050_hash_final(&sha256->se050Ctx, hash, WC_SHA256_DIGEST_SIZE,
909
                               kAlgorithm_SSS_SHA256);
910
        return ret;
911
    }
912
913
#elif defined(WOLFSSL_AFALG_HASH)
914
    /* implemented in wolfcrypt/src/port/af_alg/afalg_hash.c */
915
916
#elif defined(WOLFSSL_DEVCRYPTO_HASH)
917
    /* implemented in wolfcrypt/src/port/devcrypto/devcrypt_hash.c */
918
919
#elif defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_HASH)
920
    #include "hal_data.h"
921
922
    #ifndef WOLFSSL_SCE_SHA256_HANDLE
923
        #define WOLFSSL_SCE_SHA256_HANDLE g_sce_hash_0
924
    #endif
925
926
    #define WC_SHA256_DIGEST_WORD_SIZE 16
927
    #define XTRANSFORM(S, D) wc_Sha256SCE_XTRANSFORM((S), (D))
928
    static int wc_Sha256SCE_XTRANSFORM(wc_Sha256* sha256, const byte* data)
929
    {
930
        if (WOLFSSL_SCE_GSCE_HANDLE.p_cfg->endian_flag ==
931
                CRYPTO_WORD_ENDIAN_LITTLE)
932
        {
933
            ByteReverseWords((word32*)data, (word32*)data,
934
                    WC_SHA256_BLOCK_SIZE);
935
            ByteReverseWords(sha256->digest, sha256->digest,
936
                    WC_SHA256_DIGEST_SIZE);
937
        }
938
939
        if (WOLFSSL_SCE_SHA256_HANDLE.p_api->hashUpdate(
940
                    WOLFSSL_SCE_SHA256_HANDLE.p_ctrl, (word32*)data,
941
                    WC_SHA256_DIGEST_WORD_SIZE, sha256->digest) != SSP_SUCCESS){
942
            WOLFSSL_MSG("Unexpected hardware return value");
943
            return WC_HW_E;
944
        }
945
946
        if (WOLFSSL_SCE_GSCE_HANDLE.p_cfg->endian_flag ==
947
                CRYPTO_WORD_ENDIAN_LITTLE)
948
        {
949
            ByteReverseWords((word32*)data, (word32*)data,
950
                    WC_SHA256_BLOCK_SIZE);
951
            ByteReverseWords(sha256->digest, sha256->digest,
952
                    WC_SHA256_DIGEST_SIZE);
953
        }
954
955
        return 0;
956
    }
957
958
959
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
960
    {
961
        int ret = 0;
962
        if (sha256 == NULL)
963
            return BAD_FUNC_ARG;
964
965
        sha256->heap = heap;
966
967
        ret = InitSha256(sha256);
968
        if (ret != 0)
969
            return ret;
970
971
        (void)devId;
972
973
        return ret;
974
    }
975
976
#elif defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW)
977
978
    /* HW may fail since there's only one, so we still need SW */
979
    #define NEED_SOFT_SHA256
980
981
    /*
982
    ** An Espressif-specific InitSha256()
983
    **
984
    ** soft SHA needs initialization digest, but HW does not.
985
    */
986
    static int InitSha256(wc_Sha256* sha256)
987
    {
988
        int ret = 0; /* zero = success */
989
990
        /* We may or may not need initial digest for HW.
991
         * Always needed for SW-only. */
992
        sha256->digest[0] = 0x6A09E667L;
993
        sha256->digest[1] = 0xBB67AE85L;
994
        sha256->digest[2] = 0x3C6EF372L;
995
        sha256->digest[3] = 0xA54FF53AL;
996
        sha256->digest[4] = 0x510E527FL;
997
        sha256->digest[5] = 0x9B05688CL;
998
        sha256->digest[6] = 0x1F83D9ABL;
999
        sha256->digest[7] = 0x5BE0CD19L;
1000
1001
        sha256->buffLen = 0;
1002
        sha256->loLen   = 0;
1003
        sha256->hiLen   = 0;
1004
1005
#ifndef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256
1006
        ret = esp_sha_init((WC_ESP32SHA*)&(sha256->ctx), WC_HASH_TYPE_SHA256);
1007
#endif
1008
        return ret;
1009
    }
1010
1011
    /*
1012
    ** An Espressif-specific wolfCrypt InitSha256 external wrapper.
1013
    **
1014
    ** we'll assume this is ALWAYS for a new, uninitialized sha256
1015
    */
1016
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
1017
    {
1018
        (void)devId;
1019
        if (sha256 == NULL) {
1020
            return BAD_FUNC_ARG;
1021
        }
1022
1023
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1024
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1025
        /* We know this is a fresh, uninitialized item, so set to INIT */
1026
        if (sha256->ctx.mode != ESP32_SHA_INIT) {
1027
            ESP_LOGV(TAG, "Set ctx mode from prior value: "
1028
                               "%d", sha256->ctx.mode);
1029
        }
1030
        sha256->ctx.mode = ESP32_SHA_INIT;
1031
    #endif
1032
1033
        return InitSha256(sha256);
1034
    }
1035
1036
#elif (defined(WOLFSSL_RENESAS_TSIP_TLS) || \
1037
       defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \
1038
    !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)
1039
1040
    /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */
1041
1042
#elif (defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_RSIP)) \
1043
     && !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
1044
1045
    /* implemented in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
1046
1047
#elif defined(PSOC6_HASH_SHA2)
1048
    /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */
1049
1050
#elif defined(WOLFSSL_IMXRT_DCP)
1051
    #include <wolfssl/wolfcrypt/port/nxp/dcp_port.h>
1052
    /* implemented in wolfcrypt/src/port/nxp/dcp_port.c */
1053
1054
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
1055
    /* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */
1056
1057
#elif defined(WOLFSSL_KCAPI_HASH)
1058
    /* implemented in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1059
1060
#elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_HASH)
1061
    /* implemented in wolfcrypt/src/port/psa/psa_hash.c */
1062
1063
#elif defined(WOLFSSL_RENESAS_RX64_HASH)
1064
1065
    /* implemented in wolfcrypt/src/port/Renesas/renesas_rx64_hw_sha.c */
1066
#elif defined(WOLFSSL_PPC32_ASM)
1067
1068
extern void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data,
1069
    word32 len);
1070
1071
int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
1072
{
1073
    int ret = 0;
1074
1075
    if (sha256 == NULL)
1076
        return BAD_FUNC_ARG;
1077
    ret = InitSha256(sha256);
1078
    if (ret != 0)
1079
        return ret;
1080
1081
    sha256->heap = heap;
1082
    (void)devId;
1083
1084
    return ret;
1085
}
1086
1087
static int Transform_Sha256(wc_Sha256* sha256, const byte* data)
1088
{
1089
    Transform_Sha256_Len(sha256, data, WC_SHA256_BLOCK_SIZE);
1090
    return 0;
1091
}
1092
1093
#define XTRANSFORM Transform_Sha256
1094
#define XTRANSFORM_LEN Transform_Sha256_Len
1095
1096
#elif defined(WOLFSSL_ARMASM)
1097
1098
int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
1099
{
1100
    int ret = 0;
1101
1102
    if (sha256 == NULL)
1103
        return BAD_FUNC_ARG;
1104
    ret = InitSha256(sha256);
1105
    if (ret != 0)
1106
        return ret;
1107
1108
    sha256->heap = heap;
1109
#ifdef WOLF_CRYPTO_CB
1110
    sha256->devId = devId;
1111
    sha256->devCtx = NULL;
1112
#else
1113
    (void)devId;
1114
#endif
1115
1116
1117
    #ifdef WOLFSSL_SMALL_STACK_CACHE
1118
    sha256->W = NULL;
1119
    #endif
1120
1121
    return ret;
1122
}
1123
1124
static WC_INLINE int Transform_Sha256(wc_Sha256* sha256, const byte* data)
1125
{
1126
#if defined(WOLFSSL_ARMASM_THUMB2) || defined(WOLFSSL_ARMASM_NO_NEON)
1127
    Transform_Sha256_Len_base(sha256, data, WC_SHA256_BLOCK_SIZE);
1128
#elif defined(WOLFSSL_ARMASM_NO_HW_CRYPTO)
1129
    Transform_Sha256_Len_neon(sha256, data, WC_SHA256_BLOCK_SIZE);
1130
#else
1131
    Transform_Sha256_Len_crypto(sha256, data, WC_SHA256_BLOCK_SIZE);
1132
#endif
1133
    return 0;
1134
}
1135
1136
static WC_INLINE int Transform_Sha256_Len(wc_Sha256* sha256, const byte* data,
1137
    word32 len)
1138
{
1139
#if defined(WOLFSSL_ARMASM_THUMB2) || defined(WOLFSSL_ARMASM_NO_NEON)
1140
    Transform_Sha256_Len_base(sha256, data, len);
1141
#elif defined(WOLFSSL_ARMASM_NO_HW_CRYPTO)
1142
    Transform_Sha256_Len_neon(sha256, data, len);
1143
#else
1144
    Transform_Sha256_Len_crypto(sha256, data, len);
1145
#endif
1146
    return 0;
1147
}
1148
#define XTRANSFORM      Transform_Sha256
1149
#define XTRANSFORM_LEN  Transform_Sha256_Len
1150
1151
#else
1152
    #define NEED_SOFT_SHA256
1153
1154
    int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
1155
5.03M
    {
1156
5.03M
        int ret = 0;
1157
5.03M
        if (sha256 == NULL)
1158
0
            return BAD_FUNC_ARG;
1159
5.03M
        ret = InitSha256(sha256);
1160
5.03M
        if (ret != 0)
1161
0
            return ret;
1162
1163
5.03M
        sha256->heap = heap;
1164
5.03M
    #ifdef WOLF_CRYPTO_CB
1165
5.03M
        sha256->devId = devId;
1166
5.03M
        sha256->devCtx = NULL;
1167
5.03M
    #endif
1168
    #ifdef WOLFSSL_SMALL_STACK_CACHE
1169
        sha256->W = (word32*)XMALLOC(sizeof(word32) * WC_SHA256_BLOCK_SIZE,
1170
                                     sha256->heap, DYNAMIC_TYPE_DIGEST);
1171
        if (sha256->W == NULL)
1172
            return MEMORY_E;
1173
    #endif
1174
1175
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256)
1176
        ret = wolfAsync_DevCtxInit(&sha256->asyncDev,
1177
                            WOLFSSL_ASYNC_MARKER_SHA256, sha256->heap, devId);
1178
    #else
1179
5.03M
        (void)devId;
1180
5.03M
    #endif /* WOLFSSL_ASYNC_CRYPT */
1181
    #ifdef WOLFSSL_IMXRT1170_CAAM
1182
         ret = wc_CAAM_HashInit(&sha256->hndl, &sha256->ctx, WC_HASH_TYPE_SHA256);
1183
    #endif
1184
1185
5.03M
        return ret;
1186
5.03M
    }
1187
#endif /* End Hardware Acceleration */
1188
1189
#ifdef NEED_SOFT_SHA256
1190
1191
    static const FLASH_QUALIFIER ALIGN32 word32 K[64] = {
1192
        0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL,
1193
        0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L,
1194
        0x243185BEL, 0x550C7DC3L, 0x72BE5D74L, 0x80DEB1FEL, 0x9BDC06A7L,
1195
        0xC19BF174L, 0xE49B69C1L, 0xEFBE4786L, 0x0FC19DC6L, 0x240CA1CCL,
1196
        0x2DE92C6FL, 0x4A7484AAL, 0x5CB0A9DCL, 0x76F988DAL, 0x983E5152L,
1197
        0xA831C66DL, 0xB00327C8L, 0xBF597FC7L, 0xC6E00BF3L, 0xD5A79147L,
1198
        0x06CA6351L, 0x14292967L, 0x27B70A85L, 0x2E1B2138L, 0x4D2C6DFCL,
1199
        0x53380D13L, 0x650A7354L, 0x766A0ABBL, 0x81C2C92EL, 0x92722C85L,
1200
        0xA2BFE8A1L, 0xA81A664BL, 0xC24B8B70L, 0xC76C51A3L, 0xD192E819L,
1201
        0xD6990624L, 0xF40E3585L, 0x106AA070L, 0x19A4C116L, 0x1E376C08L,
1202
        0x2748774CL, 0x34B0BCB5L, 0x391C0CB3L, 0x4ED8AA4AL, 0x5B9CCA4FL,
1203
        0x682E6FF3L, 0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L,
1204
        0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L
1205
    };
1206
1207
/* Both versions of Ch and Maj are logically the same, but with the second set
1208
    the compilers can recognize them better for optimization */
1209
#ifdef WOLFSSL_SHA256_BY_SPEC
1210
    /* SHA256 math based on specification */
1211
440M
    #define Ch(x,y,z)       ((z) ^ ((x) & ((y) ^ (z))))
1212
440M
    #define Maj(x,y,z)      ((((x) | (y)) & (z)) | ((x) & (y)))
1213
#else
1214
    /* SHA256 math reworked for easier compiler optimization */
1215
    #define Ch(x,y,z)       ((((y) ^ (z)) & (x)) ^ (z))
1216
    #define Maj(x,y,z)      ((((x) ^ (y)) & ((y) ^ (z))) ^ (y))
1217
#endif
1218
660M
    #define R(x, n)         (((x) & 0xFFFFFFFFU) >> (n))
1219
1220
3.96G
    #define S(x, n)         rotrFixed(x, n)
1221
440M
    #define Sigma0(x)       (S(x, 2)  ^ S(x, 13) ^ S(x, 22))
1222
440M
    #define Sigma1(x)       (S(x, 6)  ^ S(x, 11) ^ S(x, 25))
1223
330M
    #define Gamma0(x)       (S(x, 7)  ^ S(x, 18) ^ R(x, 3))
1224
330M
    #define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
1225
1226
    #define a(i) S[(0-(i)) & 7]
1227
    #define b(i) S[(1-(i)) & 7]
1228
    #define c(i) S[(2-(i)) & 7]
1229
440M
    #define d(i) S[(3-(i)) & 7]
1230
    #define e(i) S[(4-(i)) & 7]
1231
    #define f(i) S[(5-(i)) & 7]
1232
    #define g(i) S[(6-(i)) & 7]
1233
881M
    #define h(i) S[(7-(i)) & 7]
1234
1235
    #ifndef XTRANSFORM
1236
7.60M
         #define XTRANSFORM(S, D)         Transform_Sha256((S),(D))
1237
    #endif
1238
1239
#ifndef SHA256_MANY_REGISTERS
1240
    #define RND(j) \
1241
440M
         t0 = h(j) + Sigma1(e(j)) + Ch(e(j), f(j), g(j)) + K[i+(j)] + W[i+(j)]; \
1242
440M
         t1 = Sigma0(a(j)) + Maj(a(j), b(j), c(j)); \
1243
440M
         d(j) += t0; \
1244
440M
         h(j)  = t0 + t1
1245
1246
    static int Transform_Sha256(wc_Sha256* sha256, const byte* data)
1247
6.91M
    {
1248
6.91M
        word32 S[8], t0, t1;
1249
6.91M
        int i;
1250
1251
    #if defined(WOLFSSL_SMALL_STACK_CACHE) && !defined(WOLFSSL_NO_MALLOC)
1252
        word32* W = sha256->W;
1253
        if (W == NULL)
1254
            return BAD_FUNC_ARG;
1255
    #elif defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
1256
        word32* W;
1257
6.91M
        W = (word32*)XMALLOC(sizeof(word32) * WC_SHA256_BLOCK_SIZE,
1258
6.91M
                             sha256->heap, DYNAMIC_TYPE_TMP_BUFFER);
1259
6.91M
        if (W == NULL)
1260
32.8k
            return MEMORY_E;
1261
    #else
1262
        word32 W[WC_SHA256_BLOCK_SIZE];
1263
    #endif
1264
1265
        /* Copy context->state[] to working vars */
1266
61.9M
        for (i = 0; i < 8; i++)
1267
55.0M
            S[i] = sha256->digest[i];
1268
1269
117M
        for (i = 0; i < 16; i++)
1270
110M
            W[i] = *((const word32*)&data[i*(int)sizeof(word32)]);
1271
1272
337M
        for (i = 16; i < WC_SHA256_BLOCK_SIZE; i++)
1273
330M
            W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16];
1274
1275
    #ifdef USE_SLOW_SHA256
1276
        /* not unrolled - ~2k smaller and ~25% slower */
1277
        for (i = 0; i < WC_SHA256_BLOCK_SIZE; i += 8) {
1278
            int j;
1279
            for (j = 0; j < 8; j++) { /* braces needed here for macros {} */
1280
                RND(j);
1281
            }
1282
        }
1283
    #else
1284
        /* partially loop unrolled */
1285
61.9M
        for (i = 0; i < WC_SHA256_BLOCK_SIZE; i += 8) {
1286
55.0M
            RND(0); RND(1); RND(2); RND(3);
1287
55.0M
            RND(4); RND(5); RND(6); RND(7);
1288
55.0M
        }
1289
6.88M
    #endif /* USE_SLOW_SHA256 */
1290
1291
        /* Add the working vars back into digest state[] */
1292
61.9M
        for (i = 0; i < 8; i++) {
1293
55.0M
            sha256->digest[i] += S[i];
1294
55.0M
        }
1295
1296
6.88M
    #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SMALL_STACK_CACHE) &&\
1297
6.88M
        !defined(WOLFSSL_NO_MALLOC)
1298
6.88M
        ForceZero(W, sizeof(word32) * WC_SHA256_BLOCK_SIZE);
1299
6.88M
        XFREE(W, sha256->heap, DYNAMIC_TYPE_TMP_BUFFER);
1300
6.88M
    #endif
1301
6.88M
        return 0;
1302
6.91M
    }
1303
#else
1304
    /* SHA256 version that keeps all data in registers */
1305
    #define SCHED1(j) (W[j] = *((word32*)&data[j*sizeof(word32)]))
1306
    #define SCHED(j) (               \
1307
                   W[ j     & 15] += \
1308
            Gamma1(W[(j-2)  & 15])+  \
1309
                   W[(j-7)  & 15] +  \
1310
            Gamma0(W[(j-15) & 15])   \
1311
        )
1312
1313
    #define RND1(j) \
1314
         t0 = h(j) + Sigma1(e(j)) + Ch(e(j), f(j), g(j)) + K[i+j] + SCHED1(j); \
1315
         t1 = Sigma0(a(j)) + Maj(a(j), b(j), c(j)); \
1316
         d(j) += t0; \
1317
         h(j)  = t0 + t1
1318
    #define RNDN(j) \
1319
         t0 = h(j) + Sigma1(e(j)) + Ch(e(j), f(j), g(j)) + K[i+j] + SCHED(j); \
1320
         t1 = Sigma0(a(j)) + Maj(a(j), b(j), c(j)); \
1321
         d(j) += t0; \
1322
         h(j)  = t0 + t1
1323
1324
    static int Transform_Sha256(wc_Sha256* sha256, const byte* data)
1325
    {
1326
        word32 S[8], t0, t1;
1327
        int i;
1328
    #ifdef USE_SLOW_SHA256
1329
        int j;
1330
    #endif
1331
        word32 W[WC_SHA256_BLOCK_SIZE/sizeof(word32)];
1332
1333
        /* Copy digest to working vars */
1334
        S[0] = sha256->digest[0];
1335
        S[1] = sha256->digest[1];
1336
        S[2] = sha256->digest[2];
1337
        S[3] = sha256->digest[3];
1338
        S[4] = sha256->digest[4];
1339
        S[5] = sha256->digest[5];
1340
        S[6] = sha256->digest[6];
1341
        S[7] = sha256->digest[7];
1342
1343
        i = 0;
1344
    #ifdef USE_SLOW_SHA256
1345
        for (j = 0; j < 16; j++) {
1346
            RND1(j);
1347
        }
1348
        for (i = 16; i < 64; i += 16) {
1349
            for (j = 0; j < 16; j++) {
1350
                RNDN(j);
1351
            }
1352
        }
1353
    #else
1354
        RND1( 0); RND1( 1); RND1( 2); RND1( 3);
1355
        RND1( 4); RND1( 5); RND1( 6); RND1( 7);
1356
        RND1( 8); RND1( 9); RND1(10); RND1(11);
1357
        RND1(12); RND1(13); RND1(14); RND1(15);
1358
        /* 64 operations, partially loop unrolled */
1359
        for (i = 16; i < 64; i += 16) {
1360
            RNDN( 0); RNDN( 1); RNDN( 2); RNDN( 3);
1361
            RNDN( 4); RNDN( 5); RNDN( 6); RNDN( 7);
1362
            RNDN( 8); RNDN( 9); RNDN(10); RNDN(11);
1363
            RNDN(12); RNDN(13); RNDN(14); RNDN(15);
1364
        }
1365
    #endif
1366
1367
        /* Add the working vars back into digest */
1368
        sha256->digest[0] += S[0];
1369
        sha256->digest[1] += S[1];
1370
        sha256->digest[2] += S[2];
1371
        sha256->digest[3] += S[3];
1372
        sha256->digest[4] += S[4];
1373
        sha256->digest[5] += S[5];
1374
        sha256->digest[6] += S[6];
1375
        sha256->digest[7] += S[7];
1376
1377
        return 0;
1378
    }
1379
#endif /* SHA256_MANY_REGISTERS */
1380
#endif
1381
/* End wc_ software implementation */
1382
1383
1384
#ifdef XTRANSFORM
1385
1386
    static WC_INLINE void AddLength(wc_Sha256* sha256, word32 len)
1387
10.1M
    {
1388
10.1M
        word32 tmp = sha256->loLen;
1389
10.1M
        if ((sha256->loLen += len) < tmp) {
1390
0
            sha256->hiLen++;                       /* carry low to high */
1391
0
        }
1392
10.1M
    }
1393
1394
    /* do block size increments/updates */
1395
    static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data,
1396
        word32 len)
1397
10.1M
    {
1398
10.1M
        int ret = 0;
1399
10.1M
        word32 blocksLen;
1400
10.1M
        byte* local;
1401
1402
        /* check that internal buffLen is valid */
1403
10.1M
        if (sha256->buffLen >= WC_SHA256_BLOCK_SIZE) {
1404
380
            return BUFFER_E;
1405
380
        }
1406
1407
        /* add length for final */
1408
10.1M
        AddLength(sha256, len);
1409
1410
10.1M
        local = (byte*)sha256->buffer;
1411
1412
        /* process any remainder from previous operation */
1413
10.1M
        if (sha256->buffLen > 0) {
1414
4.97M
            blocksLen = min(len, WC_SHA256_BLOCK_SIZE - sha256->buffLen);
1415
4.97M
            XMEMCPY(&local[sha256->buffLen], data, blocksLen);
1416
1417
4.97M
            sha256->buffLen += blocksLen;
1418
4.97M
            data            += blocksLen;
1419
4.97M
            len             -= blocksLen;
1420
1421
4.97M
            if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) {
1422
            #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1423
               !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1424
                if (sha256->ctx.mode == ESP32_SHA_INIT) {
1425
                    ESP_LOGV(TAG, "Sha256Update try hardware");
1426
                    esp_sha_try_hw_lock(&sha256->ctx);
1427
                }
1428
            #endif
1429
1430
79.6k
            if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) {
1431
79.6k
                ByteReverseWords(sha256->buffer, sha256->buffer,
1432
79.6k
                    WC_SHA256_BLOCK_SIZE);
1433
79.6k
            }
1434
1435
            #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1436
               !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1437
                if (sha256->ctx.mode == ESP32_SHA_SW) {
1438
                    #if defined(WOLFSSL_DEBUG_MUTEX)
1439
                    {
1440
                        ESP_LOGI(TAG, "Sha256Update process software");
1441
                    }
1442
                    #endif
1443
                    #ifdef WOLFSSL_HW_METRICS
1444
                    {
1445
                        /* Track of # SW during transforms during active HW */
1446
                        esp_sw_sha256_count_add();
1447
                    }
1448
                    #endif /* WOLFSSL_HW_METRICS */
1449
                    ret = XTRANSFORM(sha256, (const byte*)local);
1450
                }
1451
                else {
1452
                    #if defined(WOLFSSL_DEBUG_MUTEX)
1453
                    {
1454
                        ESP_LOGI(TAG, "Sha256Update process hardware");
1455
                    }
1456
                    #endif
1457
                    esp_sha256_process(sha256, (const byte*)local);
1458
                }
1459
            #else
1460
                /* Always SW */
1461
79.6k
                ret = XTRANSFORM(sha256, (const byte*)local);
1462
79.6k
            #endif
1463
79.6k
                if (ret == 0)
1464
79.0k
                    sha256->buffLen = 0;
1465
645
                else
1466
645
                    len = 0; /* error */
1467
79.6k
            }
1468
4.97M
        }
1469
1470
        /* process blocks */
1471
    #ifdef XTRANSFORM_LEN
1472
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1473
                          (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1474
1475
        #ifdef WC_C_DYNAMIC_FALLBACK
1476
        if (sha256->sha_method != SHA256_C)
1477
        #elif defined(WC_NO_INTERNAL_FUNCTION_POINTERS)
1478
        if (sha_method != SHA256_C)
1479
        #else
1480
        if (Transform_Sha256_Len_p != NULL)
1481
        #endif
1482
1483
        #endif
1484
        {
1485
            if (len >= WC_SHA256_BLOCK_SIZE) {
1486
                /* get number of blocks */
1487
                /* 64-1 = 0x3F (~ Inverted = 0xFFFFFFC0) */
1488
                /* len (masked by 0xFFFFFFC0) returns block aligned length */
1489
                blocksLen = len & ~((word32)WC_SHA256_BLOCK_SIZE-1);
1490
                /* Byte reversal and alignment handled in function if required
1491
                 */
1492
                XTRANSFORM_LEN(sha256, data, blocksLen);
1493
                data += blocksLen;
1494
                len  -= blocksLen;
1495
            }
1496
        }
1497
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1498
                          (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1499
        else
1500
        #endif
1501
    #endif /* XTRANSFORM_LEN */
1502
10.1M
    #if !defined(XTRANSFORM_LEN) || \
1503
10.1M
        (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1504
10.1M
         (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
1505
10.1M
        {
1506
11.0M
            while (len >= WC_SHA256_BLOCK_SIZE) {
1507
904k
                word32* local32 = sha256->buffer;
1508
                /* optimization to avoid memcpy if data pointer is properly aligned */
1509
                /* Intel transform function requires use of sha256->buffer */
1510
                /* Little Endian requires byte swap, so can't use data directly */
1511
            #if defined(WC_HASH_DATA_ALIGNMENT) && !defined(LITTLE_ENDIAN_ORDER) && \
1512
                !(defined(WOLFSSL_X86_64_BUILD) && \
1513
                         defined(USE_INTEL_SPEEDUP) && \
1514
                         (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
1515
                if (((wc_ptr_t)data % WC_HASH_DATA_ALIGNMENT) == 0) {
1516
                    local32 = (word32*)data;
1517
                }
1518
                else
1519
            #endif
1520
904k
                {
1521
904k
                    XMEMCPY(local32, data, WC_SHA256_BLOCK_SIZE);
1522
904k
                }
1523
1524
904k
                data += WC_SHA256_BLOCK_SIZE;
1525
904k
                len  -= WC_SHA256_BLOCK_SIZE;
1526
            #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1527
               !defined( NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1528
                if (sha256->ctx.mode == ESP32_SHA_INIT){
1529
                    ESP_LOGV(TAG, "Sha256Update try hardware loop");
1530
                    esp_sha_try_hw_lock(&sha256->ctx);
1531
                }
1532
            #endif
1533
1534
904k
            if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) {
1535
904k
                ByteReverseWords(local32, local32, WC_SHA256_BLOCK_SIZE);
1536
904k
            }
1537
1538
            #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1539
               !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1540
                if (sha256->ctx.mode == ESP32_SHA_SW) {
1541
                    ESP_LOGV(TAG, "Sha256Update process software loop");
1542
                    ret = XTRANSFORM(sha256, (const byte*)local32);
1543
                }
1544
                else {
1545
                    ESP_LOGV(TAG, "Sha256Update process hardware");
1546
                    esp_sha256_process(sha256, (const byte*)local32);
1547
                }
1548
            #else
1549
904k
                ret = XTRANSFORM(sha256, (const byte*)local32);
1550
904k
            #endif
1551
1552
904k
                if (ret != 0)
1553
854
                    break;
1554
904k
            }
1555
10.1M
        }
1556
10.1M
    #endif
1557
1558
        /* save remainder */
1559
10.1M
        if (ret == 0 && len > 0) {
1560
5.13M
            XMEMCPY(local, data, len);
1561
5.13M
            sha256->buffLen = len;
1562
5.13M
        }
1563
1564
10.1M
        return ret;
1565
10.1M
    }
1566
1567
#if defined(WOLFSSL_KCAPI_HASH)
1568
    /* implemented in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1569
1570
#else
1571
    int wc_Sha256Update(wc_Sha256* sha256, const byte* data, word32 len)
1572
9.19M
    {
1573
9.19M
        if (sha256 == NULL) {
1574
0
            return BAD_FUNC_ARG;
1575
0
        }
1576
9.19M
        if (data == NULL && len == 0) {
1577
            /* valid, but do nothing */
1578
3.99k
            return 0;
1579
3.99k
        }
1580
9.19M
        if (data == NULL) {
1581
0
            return BAD_FUNC_ARG;
1582
0
        }
1583
1584
9.19M
    #ifdef WOLF_CRYPTO_CB
1585
9.19M
        #ifndef WOLF_CRYPTO_CB_FIND
1586
9.19M
        if (sha256->devId != INVALID_DEVID)
1587
2.24k
        #endif
1588
2.24k
        {
1589
2.24k
            int ret = wc_CryptoCb_Sha256Hash(sha256, data, len, NULL);
1590
2.24k
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1591
0
                return ret;
1592
            /* fall-through when unavailable */
1593
2.24k
        }
1594
9.19M
    #endif
1595
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256)
1596
        if (sha256->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA256) {
1597
        #if defined(HAVE_INTEL_QA)
1598
            return IntelQaSymSha256(&sha256->asyncDev, NULL, data, len);
1599
        #endif
1600
        }
1601
    #endif /* WOLFSSL_ASYNC_CRYPT */
1602
1603
9.19M
        return Sha256Update(sha256, data, len);
1604
9.19M
    }
1605
#endif
1606
1607
    static WC_INLINE int Sha256Final(wc_Sha256* sha256)
1608
5.03M
    {
1609
5.03M
        int ret;
1610
5.03M
        byte* local;
1611
1612
        /* we'll add a 0x80 byte at the end,
1613
        ** so make sure we have appropriate buffer length. */
1614
5.03M
        if (sha256->buffLen > WC_SHA256_BLOCK_SIZE - 1) {
1615
            /* exit with error code if there's a bad buffer size in buffLen */
1616
0
            return BAD_STATE_E;
1617
0
        } /* buffLen check */
1618
1619
5.03M
        local = (byte*)sha256->buffer;
1620
5.03M
        local[sha256->buffLen++] = 0x80; /* add 1 */
1621
1622
        /* pad with zeros */
1623
5.03M
        if (sha256->buffLen > WC_SHA256_PAD_SIZE) {
1624
1.61M
            if (sha256->buffLen < WC_SHA256_BLOCK_SIZE) {
1625
1.61M
                XMEMSET(&local[sha256->buffLen], 0,
1626
1.61M
                    WC_SHA256_BLOCK_SIZE - sha256->buffLen);
1627
1.61M
            }
1628
1629
        #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1630
           !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1631
            if (sha256->ctx.mode == ESP32_SHA_INIT) {
1632
                esp_sha_try_hw_lock(&sha256->ctx);
1633
            }
1634
        #endif
1635
1636
1.61M
        if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) {
1637
1.61M
            ByteReverseWords(sha256->buffer, sha256->buffer,
1638
1.61M
                WC_SHA256_BLOCK_SIZE);
1639
1.61M
        }
1640
1641
        #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1642
           !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1643
            if (sha256->ctx.mode == ESP32_SHA_INIT) {
1644
                esp_sha_try_hw_lock(&sha256->ctx);
1645
            }
1646
            if (sha256->ctx.mode == ESP32_SHA_SW) {
1647
                ret = XTRANSFORM(sha256, (const byte*)local);
1648
            }
1649
            else {
1650
                ret = esp_sha256_process(sha256, (const byte*)local);
1651
            }
1652
        #else
1653
1.61M
            ret = XTRANSFORM(sha256, (const byte*)local);
1654
1.61M
        #endif
1655
1.61M
            if (ret != 0)
1656
24.6k
                return ret;
1657
1658
1.58M
            sha256->buffLen = 0;
1659
1.58M
        }
1660
5.00M
        XMEMSET(&local[sha256->buffLen], 0,
1661
5.00M
            WC_SHA256_PAD_SIZE - sha256->buffLen);
1662
1663
        /* put 64 bit length in separate 32 bit parts */
1664
5.00M
        sha256->hiLen = (sha256->loLen >> (8 * sizeof(sha256->loLen) - 3)) +
1665
5.00M
                                                         (sha256->hiLen << 3);
1666
5.00M
        sha256->loLen = sha256->loLen << 3;
1667
1668
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1669
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1670
        if (sha256->ctx.mode == ESP32_SHA_INIT) {
1671
            esp_sha_try_hw_lock(&sha256->ctx);
1672
        }
1673
    #endif
1674
1675
        /* store lengths */
1676
5.00M
        if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) {
1677
5.00M
            ByteReverseWords(sha256->buffer, sha256->buffer,
1678
5.00M
                WC_SHA256_PAD_SIZE);
1679
5.00M
        }
1680
        /* ! 64-bit length ordering dependent on digest endian type ! */
1681
5.00M
        XMEMCPY(&local[WC_SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32));
1682
5.00M
        XMEMCPY(&local[WC_SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen,
1683
5.00M
                sizeof(word32));
1684
1685
    /* Only the ESP32-C3 with HW enabled may need pad size byte order reversal
1686
     * depending on HW or SW mode */
1687
    #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \
1688
          defined(CONFIG_IDF_TARGET_ESP8684) || \
1689
          defined(CONFIG_IDF_TARGET_ESP32C3) || \
1690
          defined(CONFIG_IDF_TARGET_ESP32C6)    \
1691
        ) && \
1692
        defined(WOLFSSL_ESP32_CRYPT) &&         \
1693
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \
1694
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1695
        /* For Espressif RISC-V Targets, we *may* need to reverse bytes
1696
         * depending on if HW is active or not. */
1697
        if (sha256->ctx.mode == ESP32_SHA_HW) {
1698
        #if defined(WOLFSSL_SUPER_VERBOSE_DEBUG)
1699
            ESP_LOGV(TAG, "Start: Reverse PAD SIZE Endianness.");
1700
        #endif
1701
            ByteReverseWords(
1702
                &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)], /* out */
1703
                &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)], /* in  */
1704
                2 * sizeof(word32) /* byte count to reverse */
1705
            );
1706
        #if defined(WOLFSSL_SUPER_VERBOSE_DEBUG)
1707
            ESP_LOGV(TAG, "End: Reverse PAD SIZE Endianness.");
1708
        #endif
1709
        } /* end if (sha256->ctx.mode == ESP32_SHA_HW) */
1710
    #endif
1711
1712
    #if defined(FREESCALE_MMCAU_SHA) || \
1713
        (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1714
                         (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
1715
        /* Kinetis requires only these bytes reversed */
1716
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1717
                          (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1718
        #ifdef WC_C_DYNAMIC_FALLBACK
1719
        if (sha256->sha_method != SHA256_C)
1720
        #else
1721
        if (IS_INTEL_AVX1(intel_flags) || IS_INTEL_AVX2(intel_flags) ||
1722
            IS_INTEL_SHA(intel_flags))
1723
        #endif
1724
        #endif
1725
        {
1726
            ByteReverseWords(
1727
                &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)],
1728
                &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)],
1729
                2 * sizeof(word32));
1730
        }
1731
    #endif
1732
    #if defined(WOLFSSL_ARMASM) && !defined(FREESCALE_MMCAU_SHA)
1733
        ByteReverseWords( &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)],
1734
            &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)],
1735
            2 * sizeof(word32));
1736
    #endif
1737
1738
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1739
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
1740
        if (sha256->ctx.mode == ESP32_SHA_INIT) {
1741
            esp_sha_try_hw_lock(&sha256->ctx);
1742
        }
1743
        /* depending on architecture and ctx.mode value
1744
         * we may or may not need default digest */
1745
        if (sha256->ctx.mode == ESP32_SHA_SW) {
1746
            ret = XTRANSFORM(sha256, (const byte*)local);
1747
        }
1748
        else {
1749
            ret = esp_sha256_digest_process(sha256, 1);
1750
        }
1751
    #else
1752
5.00M
        ret = XTRANSFORM(sha256, (const byte*)local);
1753
5.00M
    #endif
1754
1755
5.00M
        return ret;
1756
5.03M
    }
1757
1758
#if !defined(WOLFSSL_KCAPI_HASH)
1759
1760
    int wc_Sha256FinalRaw(wc_Sha256* sha256, byte* hash)
1761
104
    {
1762
104
    #ifdef LITTLE_ENDIAN_ORDER
1763
104
        word32 digest[WC_SHA256_DIGEST_SIZE / sizeof(word32)];
1764
104
        XMEMSET(digest, 0, sizeof(digest));
1765
104
    #endif
1766
1767
104
        if (sha256 == NULL || hash == NULL) {
1768
0
            return BAD_FUNC_ARG;
1769
0
        }
1770
1771
104
    #ifdef LITTLE_ENDIAN_ORDER
1772
104
        if (SHA256_REV_BYTES(&sha256->ctx)) {
1773
104
            ByteReverseWords((word32*)digest, (word32*)sha256->digest,
1774
104
                              WC_SHA256_DIGEST_SIZE);
1775
104
        }
1776
104
        XMEMCPY(hash, digest, WC_SHA256_DIGEST_SIZE);
1777
    #else
1778
        XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE);
1779
    #endif
1780
1781
104
        return 0;
1782
104
    }
1783
1784
    int wc_Sha256Final(wc_Sha256* sha256, byte* hash)
1785
4.56M
    {
1786
4.56M
        int ret;
1787
1788
4.56M
        if (sha256 == NULL || hash == NULL) {
1789
0
            return BAD_FUNC_ARG;
1790
0
        }
1791
1792
4.56M
    #ifdef WOLF_CRYPTO_CB
1793
4.56M
        #ifndef WOLF_CRYPTO_CB_FIND
1794
4.56M
        if (sha256->devId != INVALID_DEVID)
1795
519
        #endif
1796
519
        {
1797
519
            ret = wc_CryptoCb_Sha256Hash(sha256, NULL, 0, hash);
1798
519
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1799
0
                return ret;
1800
            /* fall-through when unavailable */
1801
519
        }
1802
4.56M
    #endif
1803
1804
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256)
1805
        if (sha256->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA256) {
1806
        #if defined(HAVE_INTEL_QA)
1807
            return IntelQaSymSha256(&sha256->asyncDev, hash, NULL,
1808
                                            WC_SHA256_DIGEST_SIZE);
1809
        #endif
1810
        }
1811
    #endif /* WOLFSSL_ASYNC_CRYPT */
1812
1813
4.56M
        ret = Sha256Final(sha256);
1814
4.56M
        if (ret != 0) {
1815
31.3k
            return ret;
1816
31.3k
        }
1817
1818
4.53M
    #if defined(LITTLE_ENDIAN_ORDER)
1819
4.53M
        if (SHA256_REV_BYTES(&sha256->ctx)) {
1820
4.53M
            ByteReverseWords(sha256->digest, sha256->digest,
1821
4.53M
                WC_SHA256_DIGEST_SIZE);
1822
4.53M
        }
1823
4.53M
    #endif
1824
4.53M
        XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE);
1825
1826
4.53M
        return InitSha256(sha256);  /* reset state */
1827
4.56M
    }
1828
1829
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
1830
/* Apply SHA256 transformation to the data                */
1831
/* @param sha  a pointer to wc_Sha256 structure           */
1832
/* @param data data to be applied SHA256 transformation   */
1833
/* @return 0 on successful, otherwise non-zero on failure */
1834
    int wc_Sha256Transform(wc_Sha256* sha256, const unsigned char* data)
1835
    {
1836
        if (sha256 == NULL || data == NULL) {
1837
            return BAD_FUNC_ARG;
1838
        }
1839
1840
    #ifdef WOLFSSL_ARMASM
1841
        {
1842
            byte buffer[WC_SHA256_BLOCK_SIZE];
1843
            ByteReverseWords((word32*)buffer, (word32*)data,
1844
                WC_SHA256_BLOCK_SIZE);
1845
            return Transform_Sha256(sha256, buffer);
1846
        }
1847
    #else
1848
        return Transform_Sha256(sha256, data);
1849
    #endif
1850
    }
1851
#endif /* OPENSSL_EXTRA || HAVE_CURL */
1852
1853
#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH)
1854
    /* One block will be used from data.
1855
     * hash must be big enough to hold all of digest output.
1856
     */
1857
    int wc_Sha256HashBlock(wc_Sha256* sha256, const unsigned char* data,
1858
        unsigned char* hash)
1859
    {
1860
        int ret;
1861
1862
        if ((sha256 == NULL) || (data == NULL)) {
1863
            return BAD_FUNC_ARG;
1864
        }
1865
1866
        if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) {
1867
            ByteReverseWords(sha256->buffer, (word32*)data,
1868
                WC_SHA256_BLOCK_SIZE);
1869
            data = (unsigned char*)sha256->buffer;
1870
        }
1871
        ret = XTRANSFORM(sha256, data);
1872
1873
        if ((ret == 0) && (hash != NULL)) {
1874
            if (!SHA256_REV_BYTES(&sha256->ctx)) {
1875
                XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE);
1876
            }
1877
            else {
1878
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP)
1879
                __asm__ __volatile__ (
1880
                    "mov    0x00(%[d]), %%esi\n\t"
1881
                    "movbe  %%esi, 0x00(%[h])\n\t"
1882
                    "mov    0x04(%[d]), %%esi\n\t"
1883
                    "movbe  %%esi, 0x04(%[h])\n\t"
1884
                    "mov    0x08(%[d]), %%esi\n\t"
1885
                    "movbe  %%esi, 0x08(%[h])\n\t"
1886
                    "mov    0x0c(%[d]), %%esi\n\t"
1887
                    "movbe  %%esi, 0x0c(%[h])\n\t"
1888
                    "mov    0x10(%[d]), %%esi\n\t"
1889
                    "movbe  %%esi, 0x10(%[h])\n\t"
1890
                    "mov    0x14(%[d]), %%esi\n\t"
1891
                    "movbe  %%esi, 0x14(%[h])\n\t"
1892
                    "mov    0x18(%[d]), %%esi\n\t"
1893
                    "movbe  %%esi, 0x18(%[h])\n\t"
1894
                    "mov    0x1c(%[d]), %%esi\n\t"
1895
                    "movbe  %%esi, 0x1c(%[h])\n\t"
1896
                    :
1897
                    : [d] "r" (sha256->digest), [h] "r" (hash)
1898
                    : "memory", "esi"
1899
                );
1900
        #else
1901
                word32* hash32 = (word32*)hash;
1902
                word32* digest = (word32*)sha256->digest;
1903
            #if WOLFSSL_GENERAL_ALIGNMENT < 4
1904
                ALIGN16 word32 buf[WC_SHA256_DIGEST_SIZE / sizeof(word32)];
1905
1906
                if (((size_t)digest & 0x3) != 0) {
1907
                    if (((size_t)hash32 & 0x3) != 0) {
1908
                        XMEMCPY(buf, digest, WC_SHA256_DIGEST_SIZE);
1909
                        hash32 = buf;
1910
                        digest = buf;
1911
                    }
1912
                    else {
1913
                        XMEMCPY(hash, digest, WC_SHA256_DIGEST_SIZE);
1914
                        digest = hash32;
1915
                    }
1916
                }
1917
                else if (((size_t)hash32 & 0x3) != 0) {
1918
                    hash32 = digest;
1919
                }
1920
            #endif
1921
                ByteReverseWords(hash32, digest, (word32)(sizeof(word32) * 8));
1922
            #if WOLFSSL_GENERAL_ALIGNMENT < 4
1923
                if (hash != (byte*)hash32) {
1924
                    XMEMCPY(hash, hash32, WC_SHA256_DIGEST_SIZE);
1925
                }
1926
            #endif
1927
        #endif /* WOLFSSL_X86_64_BUILD && USE_INTEL_SPEEDUP */
1928
            }
1929
            sha256->digest[0] = 0x6A09E667L;
1930
            sha256->digest[1] = 0xBB67AE85L;
1931
            sha256->digest[2] = 0x3C6EF372L;
1932
            sha256->digest[3] = 0xA54FF53AL;
1933
            sha256->digest[4] = 0x510E527FL;
1934
            sha256->digest[5] = 0x9B05688CL;
1935
            sha256->digest[6] = 0x1F83D9ABL;
1936
            sha256->digest[7] = 0x5BE0CD19L;
1937
        }
1938
1939
        return ret;
1940
    }
1941
#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_FULL_HASH */
1942
#endif /* !WOLFSSL_KCAPI_HASH */
1943
1944
#endif /* XTRANSFORM */
1945
1946
1947
#ifdef WOLFSSL_SHA224
1948
1949
#ifdef STM32_HASH_SHA2
1950
1951
    /* Supports CubeMX HAL or Standard Peripheral Library */
1952
1953
    int wc_InitSha224_ex(wc_Sha224* sha224, void* heap, int devId)
1954
    {
1955
        if (sha224 == NULL)
1956
            return BAD_FUNC_ARG;
1957
        (void)devId;
1958
        (void)heap;
1959
1960
        XMEMSET(sha224, 0, sizeof(wc_Sha224));
1961
        wc_Stm32_Hash_Init(&sha224->stmCtx);
1962
        return 0;
1963
    }
1964
1965
    int wc_Sha224Update(wc_Sha224* sha224, const byte* data, word32 len)
1966
    {
1967
        int ret = 0;
1968
1969
        if (sha224 == NULL || (data == NULL && len > 0)) {
1970
            return BAD_FUNC_ARG;
1971
        }
1972
1973
        ret = wolfSSL_CryptHwMutexLock();
1974
        if (ret == 0) {
1975
            ret = wc_Stm32_Hash_Update(&sha224->stmCtx,
1976
                HASH_AlgoSelection_SHA224, data, len, WC_SHA224_BLOCK_SIZE);
1977
            wolfSSL_CryptHwMutexUnLock();
1978
        }
1979
        return ret;
1980
    }
1981
1982
    int wc_Sha224Final(wc_Sha224* sha224, byte* hash)
1983
    {
1984
        int ret = 0;
1985
1986
        if (sha224 == NULL || hash == NULL) {
1987
            return BAD_FUNC_ARG;
1988
        }
1989
1990
        ret = wolfSSL_CryptHwMutexLock();
1991
        if (ret == 0) {
1992
            ret = wc_Stm32_Hash_Final(&sha224->stmCtx,
1993
                HASH_AlgoSelection_SHA224, hash, WC_SHA224_DIGEST_SIZE);
1994
            wolfSSL_CryptHwMutexUnLock();
1995
        }
1996
1997
        (void)wc_InitSha224(sha224); /* reset state */
1998
1999
        return ret;
2000
    }
2001
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2002
2003
    int wc_InitSha224_ex(wc_Sha224* sha224, void* heap, int devId)
2004
    {
2005
        if (sha224 == NULL) {
2006
            return BAD_FUNC_ARG;
2007
        }
2008
        (void)devId;
2009
2010
        return se050_hash_init(&sha224->se050Ctx, heap);
2011
    }
2012
2013
    int wc_Sha224Update(wc_Sha224* sha224, const byte* data, word32 len)
2014
    {
2015
        return se050_hash_update(&sha224->se050Ctx, data, len);
2016
    }
2017
2018
    int wc_Sha224Final(wc_Sha224* sha224, byte* hash)
2019
    {
2020
        int ret = 0;
2021
        ret = se050_hash_final(&sha224->se050Ctx, hash, WC_SHA224_DIGEST_SIZE,
2022
                               kAlgorithm_SSS_SHA224);
2023
        (void)wc_InitSha224(sha224);
2024
        return ret;
2025
    }
2026
2027
#elif defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_HASH) && \
2028
    !defined(WOLFSSL_QNX_CAAM)
2029
    /* functions defined in wolfcrypt/src/port/caam/caam_sha256.c */
2030
2031
#elif defined(WOLFSSL_AFALG_HASH)
2032
    #error SHA224 currently not supported with AF_ALG enabled
2033
2034
#elif defined(WOLFSSL_DEVCRYPTO_HASH)
2035
    /* implemented in wolfcrypt/src/port/devcrypto/devcrypt_hash.c */
2036
2037
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
2038
    /* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */
2039
2040
#elif defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_NO_KCAPI_SHA224)
2041
    /* implemented in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2042
2043
#elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_HASH)
2044
    /* implemented in wolfcrypt/src/port/psa/psa_hash.c */
2045
2046
#elif defined(MAX3266X_SHA)
2047
    /* implemented in wolfcrypt/src/port/maxim/max3266x.c */
2048
2049
#elif defined(WOLFSSL_RENESAS_RX64_HASH)
2050
2051
/* implemented in wolfcrypt/src/port/Renesas/renesas_rx64_hw_sha.c */
2052
2053
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2054
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2055
2056
    /* implemented in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2057
#elif defined(PSOC6_HASH_SHA2)
2058
    /* Implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2059
2060
#else
2061
2062
    #define NEED_SOFT_SHA224
2063
2064
2065
    static int InitSha224(wc_Sha224* sha224)
2066
17.3k
    {
2067
17.3k
        int ret = 0;
2068
2069
#ifdef WOLFSSL_SMALL_STACK_CACHE
2070
    if (sha224->W == NULL) {
2071
        sha224->W = (word32*)XMALLOC(sizeof(word32) * WC_SHA256_BLOCK_SIZE,
2072
                                     sha224->heap, DYNAMIC_TYPE_DIGEST);
2073
        if (sha224->W == NULL)
2074
            return MEMORY_E;
2075
    }
2076
#endif
2077
2078
17.3k
        sha224->digest[0] = 0xc1059ed8;
2079
17.3k
        sha224->digest[1] = 0x367cd507;
2080
17.3k
        sha224->digest[2] = 0x3070dd17;
2081
17.3k
        sha224->digest[3] = 0xf70e5939;
2082
17.3k
        sha224->digest[4] = 0xffc00b31;
2083
17.3k
        sha224->digest[5] = 0x68581511;
2084
17.3k
        sha224->digest[6] = 0x64f98fa7;
2085
17.3k
        sha224->digest[7] = 0xbefa4fa4;
2086
2087
17.3k
        sha224->buffLen = 0;
2088
17.3k
        sha224->loLen   = 0;
2089
17.3k
        sha224->hiLen   = 0;
2090
2091
    #ifdef WC_C_DYNAMIC_FALLBACK
2092
        sha224->sha_method = 0;
2093
    #endif
2094
2095
    #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
2096
                          (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
2097
        /* choose best Transform function under this runtime environment */
2098
    #ifdef WC_C_DYNAMIC_FALLBACK
2099
        Sha256_SetTransform(&sha224->sha_method);
2100
    #else
2101
        Sha256_SetTransform();
2102
    #endif
2103
    #endif
2104
17.3k
    #ifdef WOLFSSL_HASH_FLAGS
2105
17.3k
        sha224->flags = 0;
2106
17.3k
    #endif
2107
    #ifdef WOLFSSL_HASH_KEEP
2108
        sha224->msg  = NULL;
2109
        sha224->len  = 0;
2110
        sha224->used = 0;
2111
    #endif
2112
2113
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2114
       (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \
2115
        !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224))
2116
        /* not to be confused with SHAS512_224 */
2117
        ret = esp_sha_init(&(sha224->ctx), WC_HASH_TYPE_SHA224);
2118
    #endif
2119
2120
17.3k
        return ret;
2121
17.3k
    }
2122
2123
#endif
2124
2125
#ifdef NEED_SOFT_SHA224
2126
    int wc_InitSha224_ex(wc_Sha224* sha224, void* heap, int devId)
2127
5.42k
    {
2128
5.42k
        int ret = 0;
2129
2130
5.42k
        if (sha224 == NULL)
2131
0
            return BAD_FUNC_ARG;
2132
2133
5.42k
        sha224->heap = heap;
2134
    #ifdef WOLFSSL_SMALL_STACK_CACHE
2135
        sha224->W = NULL;
2136
    #endif
2137
5.42k
    #ifdef WOLF_CRYPTO_CB
2138
5.42k
        sha224->devId = devId;
2139
5.42k
        sha224->devCtx = NULL;
2140
5.42k
    #endif
2141
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW)
2142
        #if defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224)
2143
        /* We know this is a fresh, uninitialized item, so set to INIT */
2144
        if (sha224->ctx.mode != ESP32_SHA_SW) {
2145
            ESP_LOGV(TAG, "Set sha224 ctx mode init to ESP32_SHA_SW. "
2146
                          "Prior value: %d", sha224->ctx.mode);
2147
        }
2148
        /* no sha224 HW support is available, set to SW */
2149
            sha224->ctx.mode = ESP32_SHA_SW;
2150
        #else
2151
            /* We know this is a fresh, uninitialized item, so set to INIT */
2152
            sha224->ctx.mode = ESP32_SHA_INIT;
2153
        #endif
2154
    #endif
2155
2156
5.42k
        ret = InitSha224(sha224);
2157
5.42k
        if (ret != 0) {
2158
0
            return ret;
2159
0
        }
2160
2161
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224)
2162
        ret = wolfAsync_DevCtxInit(&sha224->asyncDev,
2163
                            WOLFSSL_ASYNC_MARKER_SHA224, sha224->heap, devId);
2164
    #else
2165
5.42k
        (void)devId;
2166
5.42k
    #endif /* WOLFSSL_ASYNC_CRYPT */
2167
#ifdef WOLFSSL_IMXRT1170_CAAM
2168
     ret = wc_CAAM_HashInit(&sha224->hndl, &sha224->ctx, WC_HASH_TYPE_SHA224);
2169
#endif
2170
2171
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2172
       (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \
2173
        !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224))
2174
        if (sha224->ctx.mode != ESP32_SHA_INIT) {
2175
            ESP_LOGV("SHA224", "Set ctx mode from prior value: "
2176
                               "%d", sha224->ctx.mode);
2177
        }
2178
        /* We know this is a fresh, uninitialized item, so set to INIT */
2179
        sha224->ctx.mode = ESP32_SHA_INIT;
2180
    #endif
2181
2182
5.42k
        return ret;
2183
5.42k
    }
2184
2185
    int wc_Sha224Update(wc_Sha224* sha224, const byte* data, word32 len)
2186
35.0k
    {
2187
35.0k
        int ret;
2188
2189
35.0k
        if (sha224 == NULL) {
2190
0
            return BAD_FUNC_ARG;
2191
0
        }
2192
35.0k
        if (data == NULL && len == 0) {
2193
            /* valid, but do nothing */
2194
43
            return 0;
2195
43
        }
2196
34.9k
        if (data == NULL) {
2197
0
            return BAD_FUNC_ARG;
2198
0
        }
2199
34.9k
    #ifdef WOLF_CRYPTO_CB
2200
34.9k
        #ifndef WOLF_CRYPTO_CB_FIND
2201
34.9k
        if (sha224->devId != INVALID_DEVID)
2202
4.20k
        #endif
2203
4.20k
        {
2204
4.20k
            ret = wc_CryptoCb_Sha224Hash(sha224, data, len, NULL);
2205
4.20k
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2206
0
                return ret;
2207
            /* fall-through when unavailable */
2208
4.20k
        }
2209
34.9k
    #endif
2210
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224)
2211
        if (sha224->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA224) {
2212
        #if defined(HAVE_INTEL_QA)
2213
            return IntelQaSymSha224(&sha224->asyncDev, NULL, data, len);
2214
        #endif
2215
        }
2216
    #endif /* WOLFSSL_ASYNC_CRYPT */
2217
2218
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2219
       (defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \
2220
        defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224))
2221
        sha224->ctx.mode = ESP32_SHA_SW; /* no SHA224 HW, so always SW */
2222
    #endif
2223
2224
34.9k
        ret = Sha256Update((wc_Sha256*)sha224, data, len);
2225
2226
34.9k
        return ret;
2227
34.9k
    }
2228
2229
    int wc_Sha224Final(wc_Sha224* sha224, byte* hash)
2230
11.9k
    {
2231
11.9k
        int ret;
2232
2233
11.9k
        if (sha224 == NULL || hash == NULL) {
2234
0
            return BAD_FUNC_ARG;
2235
0
        }
2236
11.9k
    #ifdef WOLF_CRYPTO_CB
2237
11.9k
        #ifndef WOLF_CRYPTO_CB_FIND
2238
11.9k
        if (sha224->devId != INVALID_DEVID)
2239
90
        #endif
2240
90
        {
2241
90
            ret = wc_CryptoCb_Sha224Hash(sha224, NULL, 0, hash);
2242
90
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2243
0
                return ret;
2244
            /* fall-through when unavailable */
2245
90
        }
2246
11.9k
    #endif
2247
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224)
2248
        if (sha224->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA224) {
2249
        #if defined(HAVE_INTEL_QA)
2250
            return IntelQaSymSha224(&sha224->asyncDev, hash, NULL,
2251
                                            WC_SHA224_DIGEST_SIZE);
2252
        #endif
2253
        }
2254
    #endif /* WOLFSSL_ASYNC_CRYPT */
2255
2256
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) &&      \
2257
       ( !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \
2258
         !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224) )
2259
2260
        /* nothing enabled here for RISC-V C2/C3/C6 success */
2261
    #endif
2262
2263
11.9k
        ret = Sha256Final((wc_Sha256*)sha224);
2264
11.9k
        if (ret != 0)
2265
0
            return ret;
2266
2267
11.9k
    #if defined(LITTLE_ENDIAN_ORDER)
2268
11.9k
        if (SHA256_REV_BYTES(&sha224->ctx)) {
2269
11.9k
            ByteReverseWords(sha224->digest,
2270
11.9k
                             sha224->digest,
2271
11.9k
                             WC_SHA224_DIGEST_SIZE);
2272
11.9k
        }
2273
11.9k
    #endif
2274
11.9k
        XMEMCPY(hash, sha224->digest, WC_SHA224_DIGEST_SIZE);
2275
2276
11.9k
        return InitSha224(sha224);  /* reset state */
2277
11.9k
    }
2278
#endif /* end of SHA224 software implementation */
2279
2280
    int wc_InitSha224(wc_Sha224* sha224)
2281
90
    {
2282
90
        int devId = INVALID_DEVID;
2283
2284
90
    #ifdef WOLF_CRYPTO_CB
2285
90
        devId = wc_CryptoCb_DefaultDevID();
2286
90
    #endif
2287
90
        return wc_InitSha224_ex(sha224, NULL, devId);
2288
90
    }
2289
2290
#if !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH)
2291
    /* implemented in wolfcrypt/src/port/psa/psa_hash.c */
2292
2293
    void wc_Sha224Free(wc_Sha224* sha224)
2294
5.62k
    {
2295
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2296
        int ret = 0;
2297
#endif
2298
2299
5.62k
        if (sha224 == NULL)
2300
0
            return;
2301
2302
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2303
    #ifndef WOLF_CRYPTO_CB_FIND
2304
        if (sha224->devId != INVALID_DEVID)
2305
    #endif
2306
        {
2307
            ret = wc_CryptoCb_Free(sha224->devId, WC_ALGO_TYPE_HASH,
2308
                             WC_HASH_TYPE_SHA224, 0, (void*)sha224);
2309
            /* If they want the standard free, they can call it themselves */
2310
            /* via their callback setting devId to INVALID_DEVID */
2311
            /* otherwise assume the callback handled it */
2312
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2313
                return;
2314
            /* fall-through when unavailable */
2315
        }
2316
2317
        /* silence compiler warning */
2318
        (void)ret;
2319
2320
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_FREE */
2321
2322
#ifdef WOLFSSL_SMALL_STACK_CACHE
2323
        if (sha224->W != NULL) {
2324
            ForceZero(sha224->W, sizeof(word32) * WC_SHA224_BLOCK_SIZE);
2325
            XFREE(sha224->W, sha224->heap, DYNAMIC_TYPE_DIGEST);
2326
            sha224->W = NULL;
2327
        }
2328
#endif
2329
2330
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224)
2331
        wolfAsync_DevCtxFree(&sha224->asyncDev, WOLFSSL_ASYNC_MARKER_SHA224);
2332
    #endif /* WOLFSSL_ASYNC_CRYPT */
2333
2334
    #ifdef WOLFSSL_PIC32MZ_HASH
2335
        wc_Sha256Pic32Free(sha224);
2336
    #endif
2337
    #if defined(WOLFSSL_KCAPI_HASH)
2338
        KcapiHashFree(&sha224->kcapi);
2339
    #endif
2340
    #if defined(WOLFSSL_RENESAS_RX64_HASH)
2341
        if (sha224->msg != NULL) {
2342
            ForceZero(sha224->msg, sha224->len);
2343
            XFREE(sha224->msg, sha224->heap, DYNAMIC_TYPE_TMP_BUFFER);
2344
            sha224->msg = NULL;
2345
        }
2346
    #endif
2347
    #if defined(PSOC6_HASH_SHA2)
2348
        wc_Psoc6_Sha_Free();
2349
    #endif
2350
5.62k
        ForceZero(sha224, sizeof(*sha224));
2351
5.62k
    }
2352
#endif /* !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH)  */
2353
#endif /*  WOLFSSL_SHA224 */
2354
2355
2356
int wc_InitSha256(wc_Sha256* sha256)
2357
455k
{
2358
455k
    int devId = INVALID_DEVID;
2359
2360
455k
#ifdef WOLF_CRYPTO_CB
2361
455k
    devId = wc_CryptoCb_DefaultDevID();
2362
455k
#endif
2363
455k
    return wc_InitSha256_ex(sha256, NULL, devId);
2364
455k
}
2365
2366
#if !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH)
2367
    /* implemented in wolfcrypt/src/port/psa/psa_hash.c */
2368
2369
void wc_Sha256Free(wc_Sha256* sha256)
2370
5.05M
{
2371
2372
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2373
    int ret = 0;
2374
#endif
2375
2376
5.05M
    if (sha256 == NULL)
2377
0
        return;
2378
2379
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2380
    #ifndef WOLF_CRYPTO_CB_FIND
2381
    if (sha256->devId != INVALID_DEVID)
2382
    #endif
2383
    {
2384
        ret = wc_CryptoCb_Free(sha256->devId, WC_ALGO_TYPE_HASH,
2385
                         WC_HASH_TYPE_SHA256, 0, (void*)sha256);
2386
        /* If they want the standard free, they can call it themselves */
2387
        /* via their callback setting devId to INVALID_DEVID */
2388
        /* otherwise assume the callback handled it */
2389
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2390
            return;
2391
        /* fall-through when unavailable */
2392
    }
2393
2394
    /* silence compiler warning */
2395
    (void)ret;
2396
2397
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_FREE */
2398
2399
#if defined(WOLFSSL_ESP32) && \
2400
    !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \
2401
    !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
2402
    esp_sha_release_unfinished_lock(&sha256->ctx);
2403
#endif
2404
2405
#ifdef WOLFSSL_SMALL_STACK_CACHE
2406
    if (sha256->W != NULL) {
2407
        ForceZero(sha256->W, sizeof(word32) * WC_SHA256_BLOCK_SIZE);
2408
        XFREE(sha256->W, sha256->heap, DYNAMIC_TYPE_DIGEST);
2409
        sha256->W = NULL;
2410
    }
2411
#endif
2412
2413
2414
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256)
2415
    wolfAsync_DevCtxFree(&sha256->asyncDev, WOLFSSL_ASYNC_MARKER_SHA256);
2416
#endif /* WOLFSSL_ASYNC_CRYPT */
2417
#ifdef WOLFSSL_PIC32MZ_HASH
2418
    wc_Sha256Pic32Free(sha256);
2419
#endif
2420
#if defined(WOLFSSL_AFALG_HASH)
2421
    if (sha256->alFd > 0) {
2422
        close(sha256->alFd);
2423
        sha256->alFd = -1; /* avoid possible double close on socket */
2424
    }
2425
    if (sha256->rdFd > 0) {
2426
        close(sha256->rdFd);
2427
        sha256->rdFd = -1; /* avoid possible double close on socket */
2428
    }
2429
#endif /* WOLFSSL_AFALG_HASH */
2430
#ifdef WOLFSSL_DEVCRYPTO_HASH
2431
    wc_DevCryptoFree(&sha256->ctx);
2432
#endif /* WOLFSSL_DEVCRYPTO */
2433
#if (defined(WOLFSSL_AFALG_HASH) && defined(WOLFSSL_AFALG_HASH_KEEP)) || \
2434
    (defined(WOLFSSL_DEVCRYPTO_HASH) && defined(WOLFSSL_DEVCRYPTO_HASH_KEEP)) || \
2435
    ((defined(WOLFSSL_RENESAS_TSIP_TLS) || \
2436
      defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \
2437
    !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) || \
2438
    ((defined(WOLFSSL_RENESAS_SCEPROTECT) || \
2439
    (defined(WOLFSSL_RENESAS_RSIP) && (WOLFSSL_RENESAS_RZFSP_VER >= 220))) && \
2440
    !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)) || \
2441
    defined(WOLFSSL_RENESAS_RX64_HASH) || \
2442
    defined(WOLFSSL_HASH_KEEP)
2443
2444
    if (sha256->msg != NULL) {
2445
        ForceZero(sha256->msg, sha256->len);
2446
        XFREE(sha256->msg, sha256->heap, DYNAMIC_TYPE_TMP_BUFFER);
2447
        sha256->msg = NULL;
2448
    }
2449
#endif
2450
#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2451
    se050_hash_free(&sha256->se050Ctx);
2452
#endif
2453
#if defined(WOLFSSL_KCAPI_HASH)
2454
    KcapiHashFree(&sha256->kcapi);
2455
#endif
2456
#ifdef WOLFSSL_IMXRT_DCP
2457
    DCPSha256Free(sha256);
2458
#endif
2459
#ifdef WOLFSSL_MAXQ10XX_CRYPTO
2460
    wc_MAXQ10XX_Sha256Free(sha256);
2461
#endif
2462
2463
#ifdef HAVE_ARIA
2464
    if (sha256->hSession != NULL) {
2465
        MC_CloseSession(sha256->hSession);
2466
        sha256->hSession = NULL;
2467
    }
2468
#endif
2469
2470
/* Espressif embedded hardware acceleration specific: */
2471
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2472
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \
2473
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
2474
    if (sha256->ctx.lockDepth > 0) {
2475
        /* probably due to unclean shutdown, error, or other problem.
2476
         *
2477
         * if you find yourself here, code needs to be cleaned up to
2478
         * properly release hardware. this init is only for handling
2479
         * the unexpected. by the time free is called, the hardware
2480
         * should have already been released (lockDepth = 0)
2481
         */
2482
        (void)InitSha256(sha256); /* unlock mutex, set mode to ESP32_SHA_INIT */
2483
        ESP_LOGV(TAG, "Alert: hardware unlock needed in wc_Sha256Free.");
2484
    }
2485
    else {
2486
        ESP_LOGV(TAG, "Hardware unlock not needed in wc_Sha256Free.");
2487
    }
2488
#endif
2489
2490
#if defined(PSOC6_HASH_SHA2)
2491
    wc_Psoc6_Sha_Free();
2492
#endif
2493
2494
5.05M
    ForceZero(sha256, sizeof(*sha256));
2495
5.05M
} /* wc_Sha256Free */
2496
2497
#endif /* !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH) */
2498
#ifdef WOLFSSL_HASH_KEEP
2499
/* Some hardware have issues with update, this function stores the data to be
2500
 * hashed into an array. Once ready, the Final operation is called on all of the
2501
 * data to be hashed at once.
2502
 * returns 0 on success
2503
 */
2504
int wc_Sha256_Grow(wc_Sha256* sha256, const byte* in, int inSz)
2505
{
2506
    return _wc_Hash_Grow(&(sha256->msg), &(sha256->used), &(sha256->len), in,
2507
                        inSz, sha256->heap);
2508
}
2509
#ifdef WOLFSSL_SHA224
2510
int wc_Sha224_Grow(wc_Sha224* sha224, const byte* in, int inSz)
2511
{
2512
    return _wc_Hash_Grow(&(sha224->msg), &(sha224->used), &(sha224->len), in,
2513
                        inSz, sha224->heap);
2514
}
2515
#endif /* WOLFSSL_SHA224 */
2516
#endif /* WOLFSSL_HASH_KEEP */
2517
2518
#endif /* !WOLFSSL_TI_HASH */
2519
2520
2521
#ifndef WOLFSSL_TI_HASH
2522
#if !defined(WOLFSSL_RENESAS_RX64_HASH) && \
2523
    (!defined(WOLFSSL_RENESAS_RSIP) || \
2524
      defined(NO_WOLFSSL_RENESAS_FSPSM_HASH))
2525
#ifdef WOLFSSL_SHA224
2526
2527
#if defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_NO_KCAPI_SHA224)
2528
    /* implemented in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2529
#elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_HASH)
2530
    /* implemented in wolfcrypt/src/port/psa/psa_hash.c */
2531
2532
#elif defined(MAX3266X_SHA)
2533
    /* implemented in wolfcrypt/src/port/maxim/max3266x.c */
2534
2535
#else
2536
2537
    int wc_Sha224GetHash(wc_Sha224* sha224, byte* hash)
2538
0
    {
2539
0
        int ret;
2540
0
        WC_DECLARE_VAR(tmpSha224, wc_Sha224, 1, 0);
2541
2542
0
        if (sha224 == NULL || hash == NULL) {
2543
0
            return BAD_FUNC_ARG;
2544
0
        }
2545
2546
0
        WC_CALLOC_VAR_EX(tmpSha224, wc_Sha224, 1, NULL,
2547
0
            DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
2548
2549
0
        ret = wc_Sha224Copy(sha224, tmpSha224);
2550
0
        if (ret == 0) {
2551
0
            ret = wc_Sha224Final(tmpSha224, hash);
2552
0
            wc_Sha224Free(tmpSha224);
2553
0
        }
2554
2555
0
        WC_FREE_VAR_EX(tmpSha224, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2556
0
        return ret;
2557
0
    }
2558
2559
    int wc_Sha224Copy(wc_Sha224* src, wc_Sha224* dst)
2560
54
    {
2561
54
        int ret = 0; /* assume success unless proven otherwise */
2562
2563
54
        if (src == NULL || dst == NULL) {
2564
0
            return BAD_FUNC_ARG;
2565
0
        }
2566
2567
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_COPY)
2568
    #ifndef WOLF_CRYPTO_CB_FIND
2569
        if (src->devId != INVALID_DEVID)
2570
    #endif
2571
        {
2572
            /* Cast the source and destination to be void to keep the abstraction */
2573
            ret = wc_CryptoCb_Copy(src->devId, WC_ALGO_TYPE_HASH,
2574
                                   WC_HASH_TYPE_SHA224, (void*)src, (void*)dst);
2575
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2576
                return ret;
2577
            /* fall-through when unavailable */
2578
        }
2579
        ret = 0; /* Reset ret to 0 to avoid returning the callback error code */
2580
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_COPY */
2581
2582
        /* Free dst resources before copy to prevent memory leaks (e.g., msg
2583
         * buffer, W cache, hardware contexts). XMEMCPY overwrites dst. */
2584
54
        wc_Sha224Free(dst);
2585
54
        XMEMCPY(dst, src, sizeof(wc_Sha224));
2586
2587
    #ifdef WOLFSSL_SMALL_STACK_CACHE
2588
        dst->W = (word32*)XMALLOC(sizeof(word32) * WC_SHA256_BLOCK_SIZE,
2589
                                  dst->heap, DYNAMIC_TYPE_DIGEST);
2590
        if (dst->W == NULL) {
2591
            XMEMSET(dst, 0, sizeof(wc_Sha224));
2592
            return MEMORY_E;
2593
        }
2594
    #endif
2595
2596
    #if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3)
2597
        dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx;
2598
        dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx;
2599
    #endif
2600
2601
    #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224)
2602
        ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
2603
    #endif
2604
2605
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2606
       (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \
2607
        !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224))
2608
        /* regardless of any other settings, there's no SHA-224 HW on ESP32 */
2609
        #ifndef CONFIG_IDF_TARGET_ESP32
2610
            ret = esp_sha224_ctx_copy(src, dst);
2611
        #endif
2612
    #endif
2613
2614
54
    #ifdef WOLFSSL_HASH_FLAGS
2615
54
        dst->flags |= WC_HASH_FLAG_ISCOPY;
2616
54
    #endif
2617
2618
    #if defined(WOLFSSL_HASH_KEEP)
2619
        if (src->msg != NULL) {
2620
            dst->msg = (byte*)XMALLOC(src->len, dst->heap,
2621
                                      DYNAMIC_TYPE_TMP_BUFFER);
2622
            if (dst->msg == NULL)
2623
                return MEMORY_E;
2624
            XMEMCPY(dst->msg, src->msg, src->len);
2625
        }
2626
    #endif
2627
2628
    #if defined(PSOC6_HASH_SHA2)
2629
        wc_Psoc6_Sha1_Sha2_Init(dst, WC_PSOC6_SHA224, 0);
2630
    #endif
2631
54
        return ret;
2632
54
    }
2633
2634
#endif /* WOLFSSL_KCAPI_HASH && !WOLFSSL_NO_KCAPI_SHA224 */
2635
2636
#ifdef WOLFSSL_HASH_FLAGS
2637
    int wc_Sha224SetFlags(wc_Sha224* sha224, word32 flags)
2638
0
    {
2639
0
        if (sha224) {
2640
0
            sha224->flags = flags;
2641
0
        }
2642
0
        return 0;
2643
0
    }
2644
    int wc_Sha224GetFlags(wc_Sha224* sha224, word32* flags)
2645
0
    {
2646
0
        if (sha224 && flags) {
2647
0
            *flags = sha224->flags;
2648
0
        }
2649
0
        return 0;
2650
0
    }
2651
#endif
2652
2653
#endif /* WOLFSSL_SHA224 */
2654
#endif /* WOLFSSL_RENESAS_RX64_HASH */
2655
2656
#ifdef WOLFSSL_AFALG_HASH
2657
    /* implemented in wolfcrypt/src/port/af_alg/afalg_hash.c */
2658
2659
#elif defined(WOLFSSL_DEVCRYPTO_HASH)
2660
    /* implemented in wolfcrypt/src/port/devcrypto/devcrypt_hash.c */
2661
2662
#elif (defined(WOLFSSL_RENESAS_TSIP_TLS) || \
2663
       defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \
2664
    !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)
2665
2666
    /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */
2667
2668
#elif (defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_RSIP))\
2669
     && !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2670
2671
    /* implemented in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2672
#elif defined(WOLFSSL_IMXRT_DCP)
2673
    /* implemented in wolfcrypt/src/port/nxp/dcp_port.c */
2674
#elif defined(WOLFSSL_KCAPI_HASH)
2675
    /* implemented in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2676
2677
#elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_HASH)
2678
    /* implemented in wolfcrypt/src/port/psa/psa_hash.c */
2679
#elif defined(WOLFSSL_RENESAS_RX64_HASH)
2680
    /* implemented in wolfcrypt/src/port/Renesas/renesas_rx64_hw_sha.c */
2681
#elif defined(MAX3266X_SHA)
2682
    /* Implemented in wolfcrypt/src/port/maxim/max3266x.c */
2683
#else
2684
2685
int wc_Sha256GetHash(wc_Sha256* sha256, byte* hash)
2686
6.44k
{
2687
6.44k
    int ret;
2688
6.44k
    WC_DECLARE_VAR(tmpSha256, wc_Sha256, 1, 0);
2689
2690
6.44k
    if (sha256 == NULL || hash == NULL) {
2691
0
        return BAD_FUNC_ARG;
2692
0
    }
2693
2694
6.44k
    WC_CALLOC_VAR_EX(tmpSha256, wc_Sha256, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2695
6.44k
        return MEMORY_E);
2696
2697
6.43k
    ret = wc_Sha256Copy(sha256, tmpSha256);
2698
6.43k
    if (ret == 0) {
2699
6.43k
        ret = wc_Sha256Final(tmpSha256, hash);
2700
6.43k
        wc_Sha256Free(tmpSha256);
2701
6.43k
    }
2702
2703
2704
6.43k
    WC_FREE_VAR_EX(tmpSha256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2705
2706
6.43k
    return ret;
2707
6.44k
}
2708
int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst)
2709
6.49k
{
2710
6.49k
    int ret = 0;
2711
2712
6.49k
    if (src == NULL || dst == NULL) {
2713
0
        return BAD_FUNC_ARG;
2714
0
    }
2715
2716
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_COPY)
2717
    #ifndef WOLF_CRYPTO_CB_FIND
2718
    if (src->devId != INVALID_DEVID)
2719
    #endif
2720
    {
2721
        /* Cast the source and destination to be void to keep the abstraction */
2722
        ret = wc_CryptoCb_Copy(src->devId, WC_ALGO_TYPE_HASH,
2723
                               WC_HASH_TYPE_SHA256, (void*)src, (void*)dst);
2724
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2725
            return ret;
2726
        /* fall-through when unavailable */
2727
    }
2728
    ret = 0; /* Reset ret to 0 to avoid returning the callback error code */
2729
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_COPY */
2730
2731
    /* Free dst resources before copy to prevent memory leaks (e.g., msg
2732
     * buffer, W cache, hardware contexts). XMEMCPY overwrites dst. */
2733
6.49k
    wc_Sha256Free(dst);
2734
6.49k
    XMEMCPY(dst, src, sizeof(wc_Sha256));
2735
2736
#ifdef WOLFSSL_MAXQ10XX_CRYPTO
2737
    wc_MAXQ10XX_Sha256Copy(src);
2738
#endif
2739
2740
2741
#ifdef WOLFSSL_SMALL_STACK_CACHE
2742
    dst->W = (word32*)XMALLOC(sizeof(word32) * WC_SHA256_BLOCK_SIZE,
2743
                              dst->heap, DYNAMIC_TYPE_DIGEST);
2744
    if (dst->W == NULL) {
2745
        XMEMSET(dst, 0, sizeof(wc_Sha256));
2746
        return MEMORY_E;
2747
    }
2748
#endif
2749
2750
#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3)
2751
    dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx;
2752
    dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx;
2753
#endif
2754
2755
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256)
2756
    ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
2757
#endif
2758
2759
#ifdef WOLFSSL_PIC32MZ_HASH
2760
    ret = wc_Pic32HashCopy(&src->cache, &dst->cache);
2761
#endif
2762
2763
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2764
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256)
2765
    esp_sha256_ctx_copy(src, dst);
2766
#endif
2767
2768
#ifdef HAVE_ARIA
2769
    dst->hSession = NULL;
2770
    if((src->hSession != NULL) && (MC_CopySession(src->hSession, &(dst->hSession)) != MC_OK)) {
2771
        return MEMORY_E;
2772
    }
2773
#endif
2774
2775
6.49k
#ifdef WOLFSSL_HASH_FLAGS
2776
6.49k
    dst->flags |= WC_HASH_FLAG_ISCOPY;
2777
6.49k
#endif
2778
2779
#if defined(WOLFSSL_HASH_KEEP)
2780
    if (src->msg != NULL) {
2781
        dst->msg = (byte*)XMALLOC(src->len, dst->heap, DYNAMIC_TYPE_TMP_BUFFER);
2782
        if (dst->msg == NULL)
2783
            return MEMORY_E;
2784
        XMEMCPY(dst->msg, src->msg, src->len);
2785
    }
2786
#endif
2787
2788
6.49k
    return ret;
2789
6.49k
}
2790
#endif
2791
2792
#ifdef WOLFSSL_HASH_FLAGS
2793
int wc_Sha256SetFlags(wc_Sha256* sha256, word32 flags)
2794
104k
{
2795
104k
    if (sha256) {
2796
104k
        sha256->flags = flags;
2797
104k
    }
2798
104k
    return 0;
2799
104k
}
2800
int wc_Sha256GetFlags(wc_Sha256* sha256, word32* flags)
2801
0
{
2802
0
    if (sha256 && flags) {
2803
0
        *flags = sha256->flags;
2804
0
    }
2805
0
    return 0;
2806
0
}
2807
#endif
2808
#endif /* !WOLFSSL_TI_HASH */
2809
2810
#endif /* NO_SHA256 */