Coverage Report

Created: 2026-02-14 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-heapmath/wolfcrypt/src/sha512.c
Line
Count
Source
1
/* sha512.c
2
 *
3
 * Copyright (C) 2006-2025 wolfSSL Inc.
4
 *
5
 * This file is part of wolfSSL.
6
 *
7
 * wolfSSL is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
23
24
#if (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) && \
25
    !defined(WOLFSSL_RISCV_ASM)
26
27
/* determine if we are using Espressif SHA hardware acceleration */
28
#undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW
29
#if defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH)
30
    #include "sdkconfig.h"
31
    /* Define a single keyword for simplicity & readability.
32
     *
33
     * By default the HW acceleration is on for ESP32 Chipsets,
34
     * but individual components can be turned off. See user_settings.h
35
     */
36
    #define TAG "wc_sha_512"
37
    #define WOLFSSL_USE_ESP32_CRYPT_HASH_HW
38
#else
39
    #undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW
40
#endif
41
42
#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)
43
    /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */
44
    #define FIPS_NO_WRAPPERS
45
46
    #ifdef USE_WINDOWS_API
47
        #pragma code_seg(".fipsA$m")
48
        #pragma const_seg(".fipsB$m")
49
    #endif
50
#endif
51
52
#include <wolfssl/wolfcrypt/sha512.h>
53
#include <wolfssl/wolfcrypt/cpuid.h>
54
#include <wolfssl/wolfcrypt/hash.h>
55
56
#ifdef WOLF_CRYPTO_CB
57
    #include <wolfssl/wolfcrypt/cryptocb.h>
58
#endif
59
60
#ifdef WOLFSSL_IMXRT1170_CAAM
61
    #include <wolfssl/wolfcrypt/port/caam/wolfcaam_fsl_nxp.h>
62
#endif
63
64
/* deprecated USE_SLOW_SHA2 (replaced with USE_SLOW_SHA512) */
65
#if defined(USE_SLOW_SHA2) && !defined(USE_SLOW_SHA512)
66
    #define USE_SLOW_SHA512
67
#endif
68
69
#ifdef NO_INLINE
70
    #include <wolfssl/wolfcrypt/misc.h>
71
#else
72
    #define WOLFSSL_MISC_INCLUDED
73
    #include <wolfcrypt/src/misc.c>
74
#endif
75
76
#if FIPS_VERSION3_GE(6,0,0)
77
    const unsigned int wolfCrypt_FIPS_sha512_ro_sanity[2] =
78
                                                     { 0x1a2b3c4d, 0x00000015 };
79
    int wolfCrypt_FIPS_SHA512_sanity(void)
80
    {
81
        return 0;
82
    }
83
#endif
84
85
86
#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
87
    #include <wolfssl/wolfcrypt/port/nxp/se050_port.h>
88
#endif
89
90
#if defined(MAX3266X_SHA)
91
    /* Already brought in by sha512.h */
92
    /* #include <wolfssl/wolfcrypt/port/maxim/max3266x.h> */
93
#endif
94
95
#if defined(WOLFSSL_PSOC6_CRYPTO)
96
    #include <wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h>
97
#endif
98
99
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP)
100
    #if defined(__GNUC__) && ((__GNUC__ < 4) || \
101
                              (__GNUC__ == 4 && __GNUC_MINOR__ <= 8))
102
        #undef  NO_AVX2_SUPPORT
103
        #define NO_AVX2_SUPPORT
104
    #endif
105
    #if defined(__clang__) && ((__clang_major__ < 3) || \
106
                               (__clang_major__ == 3 && __clang_minor__ <= 5))
107
        #define NO_AVX2_SUPPORT
108
    #elif defined(__clang__) && defined(NO_AVX2_SUPPORT)
109
        #undef NO_AVX2_SUPPORT
110
    #endif
111
112
    #define HAVE_INTEL_AVX1
113
    #ifndef NO_AVX2_SUPPORT
114
        #define HAVE_INTEL_AVX2
115
    #endif
116
#endif
117
118
#if defined(HAVE_INTEL_AVX1)
119
    /* #define DEBUG_XMM  */
120
#endif
121
122
#if defined(HAVE_INTEL_AVX2)
123
    #define HAVE_INTEL_RORX
124
    /* #define DEBUG_YMM  */
125
#endif
126
127
#if defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_HASH) && \
128
    !defined(WOLFSSL_QNX_CAAM)
129
    /* functions defined in wolfcrypt/src/port/caam/caam_sha.c */
130
131
#elif defined(WOLFSSL_SILABS_SHA512)
132
    /* functions defined in wolfcrypt/src/port/silabs/silabs_hash.c */
133
134
#elif defined(WOLFSSL_KCAPI_HASH)
135
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
136
137
#elif defined(WOLFSSL_RENESAS_RSIP) && \
138
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
139
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
140
141
#elif defined(MAX3266X_SHA)
142
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
143
144
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
145
    int wc_InitSha512(wc_Sha512* sha512)
146
    {
147
        if (sha512 == NULL)
148
            return BAD_FUNC_ARG;
149
        return se050_hash_init(&sha512->se050Ctx, NULL);
150
    }
151
    int wc_InitSha512_ex(wc_Sha512* sha512, void* heap, int devId)
152
    {
153
        if (sha512 == NULL) {
154
            return BAD_FUNC_ARG;
155
        }
156
        (void)devId;
157
        return se050_hash_init(&sha512->se050Ctx, heap);
158
    }
159
    int wc_Sha512Update(wc_Sha512* sha512, const byte* data, word32 len)
160
    {
161
        if (sha512 == NULL) {
162
            return BAD_FUNC_ARG;
163
        }
164
        if (data == NULL && len == 0) {
165
            /* valid, but do nothing */
166
            return 0;
167
        }
168
        if (data == NULL) {
169
            return BAD_FUNC_ARG;
170
        }
171
172
        return se050_hash_update(&sha512->se050Ctx, data, len);
173
    }
174
    int wc_Sha512Final(wc_Sha512* sha512, byte* hash)
175
    {
176
        int ret = 0;
177
        int devId = INVALID_DEVID;
178
        if (sha512 == NULL) {
179
            return BAD_FUNC_ARG;
180
        }
181
    #ifdef WOLF_CRYPTO_CB
182
        devId = sha512->devId;
183
    #endif
184
        ret = se050_hash_final(&sha512->se050Ctx, hash, WC_SHA512_DIGEST_SIZE,
185
                               kAlgorithm_SSS_SHA512);
186
        return ret;
187
    }
188
    int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash)
189
    {
190
        int ret = 0;
191
        int devId = INVALID_DEVID;
192
        if (sha512 == NULL) {
193
            return BAD_FUNC_ARG;
194
        }
195
    #ifdef WOLF_CRYPTO_CB
196
        devId = sha512->devId;
197
    #endif
198
        ret = se050_hash_final(&sha512->se050Ctx, hash, WC_SHA512_DIGEST_SIZE,
199
                               kAlgorithm_SSS_SHA512);
200
        return ret;
201
    }
202
    void wc_Sha512Free(wc_Sha512* sha512)
203
    {
204
        se050_hash_free(&sha512->se050Ctx);
205
    }
206
#elif defined(STM32_HASH_SHA512)
207
208
    /* Supports CubeMX HAL or Standard Peripheral Library */
209
210
    int wc_InitSha512_ex(wc_Sha512* sha512, void* heap, int devId)
211
    {
212
        if (sha512 == NULL)
213
            return BAD_FUNC_ARG;
214
215
        (void)devId;
216
        (void)heap;
217
218
        XMEMSET(sha512, 0, sizeof(wc_Sha512));
219
        wc_Stm32_Hash_Init(&sha512->stmCtx);
220
        return 0;
221
    }
222
223
    int wc_Sha512Update(wc_Sha512* sha512, const byte* data, word32 len)
224
    {
225
        int ret = 0;
226
227
        if (sha512 == NULL) {
228
            return BAD_FUNC_ARG;
229
        }
230
        if (data == NULL && len == 0) {
231
            /* valid, but do nothing */
232
            return 0;
233
        }
234
        if (data == NULL) {
235
            return BAD_FUNC_ARG;
236
        }
237
238
        ret = wolfSSL_CryptHwMutexLock();
239
        if (ret == 0) {
240
            ret = wc_Stm32_Hash_Update(&sha512->stmCtx,
241
                HASH_ALGOSELECTION_SHA512, data, len, WC_SHA512_BLOCK_SIZE);
242
            wolfSSL_CryptHwMutexUnLock();
243
        }
244
        return ret;
245
    }
246
247
    int wc_Sha512Final(wc_Sha512* sha512, byte* hash)
248
    {
249
        int ret = 0;
250
251
        if (sha512 == NULL || hash == NULL) {
252
            return BAD_FUNC_ARG;
253
        }
254
255
        ret = wolfSSL_CryptHwMutexLock();
256
        if (ret == 0) {
257
            ret = wc_Stm32_Hash_Final(&sha512->stmCtx,
258
                HASH_ALGOSELECTION_SHA512, hash, WC_SHA512_DIGEST_SIZE);
259
            wolfSSL_CryptHwMutexUnLock();
260
        }
261
262
        (void)wc_InitSha512(sha512); /* reset state */
263
264
        return ret;
265
    }
266
#elif defined(PSOC6_HASH_SHA2)
267
    /* Functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
268
269
#else
270
271
#ifdef WOLFSSL_SHA512
272
273
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
274
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) || \
275
    defined(WOLFSSL_ARMASM)
276
#ifdef WC_C_DYNAMIC_FALLBACK
277
    #define SHA512_SETTRANSFORM_ARGS int *sha_method
278
#else
279
    #define SHA512_SETTRANSFORM_ARGS void
280
#endif
281
static void Sha512_SetTransform(SHA512_SETTRANSFORM_ARGS);
282
#endif
283
284
static int InitSha512(wc_Sha512* sha512)
285
152k
{
286
152k
    if (sha512 == NULL)
287
0
        return BAD_FUNC_ARG;
288
289
152k
    sha512->digest[0] = W64LIT(0x6a09e667f3bcc908);
290
152k
    sha512->digest[1] = W64LIT(0xbb67ae8584caa73b);
291
152k
    sha512->digest[2] = W64LIT(0x3c6ef372fe94f82b);
292
152k
    sha512->digest[3] = W64LIT(0xa54ff53a5f1d36f1);
293
152k
    sha512->digest[4] = W64LIT(0x510e527fade682d1);
294
152k
    sha512->digest[5] = W64LIT(0x9b05688c2b3e6c1f);
295
152k
    sha512->digest[6] = W64LIT(0x1f83d9abfb41bd6b);
296
152k
    sha512->digest[7] = W64LIT(0x5be0cd19137e2179);
297
298
152k
    sha512->buffLen = 0;
299
152k
    sha512->loLen   = 0;
300
152k
    sha512->hiLen   = 0;
301
302
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
303
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) || \
304
    defined(WOLFSSL_ARMASM)
305
#ifdef WC_C_DYNAMIC_FALLBACK
306
    sha512->sha_method = 0;
307
    Sha512_SetTransform(&sha512->sha_method);
308
#else
309
    Sha512_SetTransform();
310
#endif
311
#endif
312
313
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
314
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
315
316
    /* HW needs to be carefully initialized, taking into account soft copy.
317
    ** If already in use; copy may revert to SW as needed. */
318
    esp_sha_init(&(sha512->ctx), WC_HASH_TYPE_SHA512);
319
#endif
320
321
152k
#ifdef WOLFSSL_HASH_FLAGS
322
152k
    sha512->flags = 0;
323
152k
#endif
324
#if defined(WOLFSSL_SHA512_HASHTYPE)
325
    sha512->hashType = WC_HASH_TYPE_SHA512;
326
#endif /* WOLFSSL_SHA512_HASHTYPE */
327
152k
    return 0;
328
152k
}
329
330
#if !defined(WOLFSSL_NOSHA512_224) && \
331
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
332
333
/**
334
 * Initialize given wc_Sha512 structure with value specific to sha512/224.
335
 * Note that sha512/224 has different initial hash value from sha512.
336
 * The initial hash value consists of eight 64bit words. They are given
337
 * in FIPS180-4.
338
 */
339
static int InitSha512_224(wc_Sha512* sha512)
340
1.40k
{
341
1.40k
    if (sha512 == NULL)
342
0
        return BAD_FUNC_ARG;
343
344
1.40k
    sha512->digest[0] = W64LIT(0x8c3d37c819544da2);
345
1.40k
    sha512->digest[1] = W64LIT(0x73e1996689dcd4d6);
346
1.40k
    sha512->digest[2] = W64LIT(0x1dfab7ae32ff9c82);
347
1.40k
    sha512->digest[3] = W64LIT(0x679dd514582f9fcf);
348
1.40k
    sha512->digest[4] = W64LIT(0x0f6d2b697bd44da8);
349
1.40k
    sha512->digest[5] = W64LIT(0x77e36f7304c48942);
350
1.40k
    sha512->digest[6] = W64LIT(0x3f9d85a86a1d36c8);
351
1.40k
    sha512->digest[7] = W64LIT(0x1112e6ad91d692a1);
352
353
1.40k
    sha512->buffLen = 0;
354
1.40k
    sha512->loLen   = 0;
355
1.40k
    sha512->hiLen   = 0;
356
357
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
358
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) || \
359
    defined(WOLFSSL_ARMASM)
360
#ifdef WC_C_DYNAMIC_FALLBACK
361
    sha512->sha_method = 0;
362
    Sha512_SetTransform(&sha512->sha_method);
363
#else
364
    Sha512_SetTransform();
365
#endif
366
#endif
367
368
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
369
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
370
    /* HW needs to be carefully initialized, taking into account soft copy.
371
    ** If already in use; copy may revert to SW as needed.
372
    **
373
    ** Note for original ESP32, there's no HW for SHA512/224
374
    */
375
    esp_sha_init(&(sha512->ctx), WC_HASH_TYPE_SHA512_224);
376
#endif
377
378
1.40k
#ifdef WOLFSSL_HASH_FLAGS
379
1.40k
    sha512->flags = 0;
380
1.40k
#endif
381
#if defined(WOLFSSL_SHA512_HASHTYPE)
382
    sha512->hashType = WC_HASH_TYPE_SHA512_224;
383
#endif /* WOLFSSL_SHA512_HASHTYPE */
384
1.40k
    return 0;
385
1.40k
}
386
#endif /* !WOLFSSL_NOSHA512_224 && !FIPS ... */
387
388
#if !defined(WOLFSSL_NOSHA512_256) && \
389
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
390
/**
391
 * Initialize given wc_Sha512 structure with value specific to sha512/256.
392
 * Note that sha512/256 has different initial hash value from sha512.
393
 * The initial hash value consists of eight 64bit words. They are given
394
 * in FIPS180-4.
395
 */
396
static int InitSha512_256(wc_Sha512* sha512)
397
376
{
398
376
    if (sha512 == NULL)
399
0
        return BAD_FUNC_ARG;
400
401
376
    sha512->digest[0] = W64LIT(0x22312194fc2bf72c);
402
376
    sha512->digest[1] = W64LIT(0x9f555fa3c84c64c2);
403
376
    sha512->digest[2] = W64LIT(0x2393b86b6f53b151);
404
376
    sha512->digest[3] = W64LIT(0x963877195940eabd);
405
376
    sha512->digest[4] = W64LIT(0x96283ee2a88effe3);
406
376
    sha512->digest[5] = W64LIT(0xbe5e1e2553863992);
407
376
    sha512->digest[6] = W64LIT(0x2b0199fc2c85b8aa);
408
376
    sha512->digest[7] = W64LIT(0x0eb72ddc81c52ca2);
409
410
376
    sha512->buffLen = 0;
411
376
    sha512->loLen   = 0;
412
376
    sha512->hiLen   = 0;
413
414
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
415
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) || \
416
    defined(WOLFSSL_ARMASM)
417
#ifdef WC_C_DYNAMIC_FALLBACK
418
    sha512->sha_method = 0;
419
    Sha512_SetTransform(&sha512->sha_method);
420
#else
421
    Sha512_SetTransform();
422
#endif
423
#endif
424
425
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
426
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
427
    /* HW needs to be carefully initialized, taking into account soft copy.
428
    ** If already in use; copy may revert to SW as needed.
429
    **
430
    ** Note for original ESP32, there's no HW for SHA512/2256.
431
    */
432
    esp_sha_init(&(sha512->ctx), WC_HASH_TYPE_SHA512_256);
433
#endif
434
435
376
#ifdef WOLFSSL_HASH_FLAGS
436
376
    sha512->flags = 0;
437
376
#endif
438
#if defined(WOLFSSL_SHA512_HASHTYPE)
439
    sha512->hashType = WC_HASH_TYPE_SHA512_256;
440
#endif /* WOLFSSL_SHA512_HASHTYPE */
441
376
    return 0;
442
376
}
443
#endif /* !WOLFSSL_NOSHA512_256 && !FIPS... */
444
445
#endif /* WOLFSSL_SHA512 */
446
447
/* Hardware Acceleration */
448
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
449
    (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
450
451
    /*****
452
    Intel AVX1/AVX2 Macro Control Structure
453
454
    #if defined(HAVE_INTEL_SPEEDUP)
455
        #define HAVE_INTEL_AVX1
456
        #define HAVE_INTEL_AVX2
457
    #endif
458
459
    int InitSha512(wc_Sha512* sha512) {
460
         Save/Recover XMM, YMM
461
         ...
462
463
         Check Intel AVX cpuid flags
464
    }
465
466
    #if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2)
467
      Transform_Sha512_AVX1(); # Function prototype
468
      Transform_Sha512_AVX2(); #
469
    #endif
470
471
      _Transform_Sha512() {     # Native Transform Function body
472
473
      }
474
475
      int Sha512Update() {
476
         Save/Recover XMM, YMM
477
         ...
478
      }
479
480
      int Sha512Final() {
481
         Save/Recover XMM, YMM
482
         ...
483
      }
484
485
486
    #if defined(HAVE_INTEL_AVX1)
487
488
       XMM Instructions/INLINE asm Definitions
489
490
    #endif
491
492
    #if defined(HAVE_INTEL_AVX2)
493
494
       YMM Instructions/INLINE asm Definitions
495
496
    #endif
497
498
    #if defined(HAVE_INTEL_AVX1)
499
500
      int Transform_Sha512_AVX1() {
501
          Stitched Message Sched/Round
502
      }
503
504
    #endif
505
506
    #if defined(HAVE_INTEL_AVX2)
507
508
      int Transform_Sha512_AVX2() {
509
          Stitched Message Sched/Round
510
      }
511
    #endif
512
513
    */
514
515
516
    /* Each platform needs to query info type 1 from cpuid to see if aesni is
517
     * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts
518
     */
519
520
#ifdef __cplusplus
521
    extern "C" {
522
#endif
523
524
    #if defined(HAVE_INTEL_AVX1)
525
        extern int Transform_Sha512_AVX1(wc_Sha512 *sha512);
526
        extern int Transform_Sha512_AVX1_Len(wc_Sha512 *sha512, word32 len);
527
    #endif
528
    #if defined(HAVE_INTEL_AVX2)
529
        extern int Transform_Sha512_AVX2(wc_Sha512 *sha512);
530
        extern int Transform_Sha512_AVX2_Len(wc_Sha512 *sha512, word32 len);
531
        #if defined(HAVE_INTEL_RORX)
532
            extern int Transform_Sha512_AVX1_RORX(wc_Sha512 *sha512);
533
            extern int Transform_Sha512_AVX1_RORX_Len(wc_Sha512 *sha512,
534
                                                      word32 len);
535
            extern int Transform_Sha512_AVX2_RORX(wc_Sha512 *sha512);
536
            extern int Transform_Sha512_AVX2_RORX_Len(wc_Sha512 *sha512,
537
                                                      word32 len);
538
        #endif
539
    #endif
540
541
#ifdef __cplusplus
542
    }  /* extern "C" */
543
#endif
544
545
    static cpuid_flags_t intel_flags = WC_CPUID_INITIALIZER;
546
547
#if defined(WC_C_DYNAMIC_FALLBACK) && !defined(WC_NO_INTERNAL_FUNCTION_POINTERS)
548
    #define WC_NO_INTERNAL_FUNCTION_POINTERS
549
#endif
550
551
    static int _Transform_Sha512(wc_Sha512 *sha512);
552
553
#ifdef WC_NO_INTERNAL_FUNCTION_POINTERS
554
555
    enum sha_methods { SHA512_UNSET = 0, SHA512_AVX1, SHA512_AVX2,
556
                       SHA512_AVX1_RORX, SHA512_AVX2_RORX, SHA512_C };
557
558
#ifndef WC_C_DYNAMIC_FALLBACK
559
    /* note that all write access to this static variable must be idempotent,
560
     * as arranged by Sha512_SetTransform(), else it will be susceptible to
561
     * data races.
562
     */
563
    static enum sha_methods sha_method = SHA512_UNSET;
564
#endif
565
566
    static void Sha512_SetTransform(SHA512_SETTRANSFORM_ARGS)
567
    {
568
    #ifdef WC_C_DYNAMIC_FALLBACK
569
        #define SHA_METHOD (*sha_method)
570
    #else
571
        #define SHA_METHOD sha_method
572
    #endif
573
        if (SHA_METHOD != SHA512_UNSET)
574
            return;
575
576
    #ifdef WC_C_DYNAMIC_FALLBACK
577
        if (! CAN_SAVE_VECTOR_REGISTERS()) {
578
            SHA_METHOD = SHA512_C;
579
            return;
580
        }
581
    #endif
582
583
        cpuid_get_flags_ex(&intel_flags);
584
585
    #if defined(HAVE_INTEL_AVX2)
586
        if (IS_INTEL_AVX2(intel_flags)) {
587
        #ifdef HAVE_INTEL_RORX
588
            if (IS_INTEL_BMI2(intel_flags)) {
589
                SHA_METHOD = SHA512_AVX2_RORX;
590
            }
591
            else
592
        #endif
593
            {
594
                SHA_METHOD = SHA512_AVX2;
595
            }
596
        }
597
        else
598
    #endif
599
    #if defined(HAVE_INTEL_AVX1)
600
        if (IS_INTEL_AVX1(intel_flags)) {
601
        #ifdef HAVE_INTEL_RORX
602
            if (IS_INTEL_BMI2(intel_flags)) {
603
                SHA_METHOD = SHA512_AVX1_RORX;
604
            }
605
            else
606
        #endif
607
            {
608
                SHA_METHOD = SHA512_AVX1;
609
            }
610
        }
611
        else
612
    #endif
613
        {
614
            SHA_METHOD = SHA512_C;
615
        }
616
    #undef SHA_METHOD
617
    }
618
619
    static WC_INLINE int Transform_Sha512(wc_Sha512 *sha512) {
620
    #ifdef WC_C_DYNAMIC_FALLBACK
621
        #define SHA_METHOD (sha512->sha_method)
622
    #else
623
        #define SHA_METHOD sha_method
624
    #endif
625
        int ret;
626
        if (SHA_METHOD == SHA512_C)
627
            return _Transform_Sha512(sha512);
628
        SAVE_VECTOR_REGISTERS(return _svr_ret;);
629
        switch (SHA_METHOD) {
630
        case SHA512_AVX2:
631
            ret = Transform_Sha512_AVX2(sha512);
632
            break;
633
        case SHA512_AVX2_RORX:
634
            ret = Transform_Sha512_AVX2_RORX(sha512);
635
            break;
636
        case SHA512_AVX1:
637
            ret = Transform_Sha512_AVX1(sha512);
638
            break;
639
        case SHA512_AVX1_RORX:
640
            ret = Transform_Sha512_AVX1_RORX(sha512);
641
            break;
642
        case SHA512_C:
643
        case SHA512_UNSET:
644
        default:
645
            ret = _Transform_Sha512(sha512);
646
            break;
647
        }
648
        RESTORE_VECTOR_REGISTERS();
649
        return ret;
650
    #undef SHA_METHOD
651
    }
652
653
    static WC_INLINE int Transform_Sha512_Len(wc_Sha512 *sha512, word32 len) {
654
    #ifdef WC_C_DYNAMIC_FALLBACK
655
        #define SHA_METHOD (sha512->sha_method)
656
    #else
657
        #define SHA_METHOD sha_method
658
    #endif
659
        int ret;
660
        SAVE_VECTOR_REGISTERS(return _svr_ret;);
661
        switch (SHA_METHOD) {
662
        case SHA512_AVX2:
663
            ret = Transform_Sha512_AVX2_Len(sha512, len);
664
            break;
665
        case SHA512_AVX2_RORX:
666
            ret = Transform_Sha512_AVX2_RORX_Len(sha512, len);
667
            break;
668
        case SHA512_AVX1:
669
            ret = Transform_Sha512_AVX1_Len(sha512, len);
670
            break;
671
        case SHA512_AVX1_RORX:
672
            ret = Transform_Sha512_AVX1_RORX_Len(sha512, len);
673
            break;
674
        case SHA512_C:
675
        case SHA512_UNSET:
676
        default:
677
            ret = 0;
678
            break;
679
        }
680
        RESTORE_VECTOR_REGISTERS();
681
        return ret;
682
    #undef SHA_METHOD
683
    }
684
685
#else /* !WC_NO_INTERNAL_FUNCTION_POINTERS */
686
687
    static int (*Transform_Sha512_p)(wc_Sha512* sha512) = _Transform_Sha512;
688
    static int (*Transform_Sha512_Len_p)(wc_Sha512* sha512, word32 len) = NULL;
689
    static int transform_check = 0;
690
    static int Transform_Sha512_is_vectorized = 0;
691
692
    static WC_INLINE int Transform_Sha512(wc_Sha512 *sha512) {
693
        int ret;
694
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
695
        if (Transform_Sha512_is_vectorized)
696
            SAVE_VECTOR_REGISTERS(return _svr_ret;);
697
    #endif
698
        ret = (*Transform_Sha512_p)(sha512);
699
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
700
        if (Transform_Sha512_is_vectorized)
701
            RESTORE_VECTOR_REGISTERS();
702
    #endif
703
        return ret;
704
    }
705
    static WC_INLINE int Transform_Sha512_Len(wc_Sha512 *sha512, word32 len) {
706
        int ret;
707
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
708
        if (Transform_Sha512_is_vectorized)
709
            SAVE_VECTOR_REGISTERS(return _svr_ret;);
710
    #endif
711
        ret = (*Transform_Sha512_Len_p)(sha512, len);
712
    #ifdef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
713
        if (Transform_Sha512_is_vectorized)
714
            RESTORE_VECTOR_REGISTERS();
715
    #endif
716
        return ret;
717
    }
718
719
    static void Sha512_SetTransform(void)
720
    {
721
        if (transform_check)
722
            return;
723
724
        cpuid_get_flags_ex(&intel_flags);
725
726
    #if defined(HAVE_INTEL_AVX2)
727
        if (IS_INTEL_AVX2(intel_flags)) {
728
        #ifdef HAVE_INTEL_RORX
729
            if (IS_INTEL_BMI2(intel_flags)) {
730
                Transform_Sha512_p = Transform_Sha512_AVX2_RORX;
731
                Transform_Sha512_Len_p = Transform_Sha512_AVX2_RORX_Len;
732
                Transform_Sha512_is_vectorized = 1;
733
            }
734
            else
735
        #endif
736
            {
737
                Transform_Sha512_p = Transform_Sha512_AVX2;
738
                Transform_Sha512_Len_p = Transform_Sha512_AVX2_Len;
739
                Transform_Sha512_is_vectorized = 1;
740
            }
741
        }
742
        else
743
    #endif
744
    #if defined(HAVE_INTEL_AVX1)
745
        if (IS_INTEL_AVX1(intel_flags)) {
746
        #ifdef HAVE_INTEL_RORX
747
            if (IS_INTEL_BMI2(intel_flags)) {
748
                Transform_Sha512_p = Transform_Sha512_AVX1_RORX;
749
                Transform_Sha512_Len_p = Transform_Sha512_AVX1_RORX_Len;
750
                Transform_Sha512_is_vectorized = 1;
751
            }
752
            else
753
        #endif
754
            {
755
                Transform_Sha512_p = Transform_Sha512_AVX1;
756
                Transform_Sha512_Len_p = Transform_Sha512_AVX1_Len;
757
                Transform_Sha512_is_vectorized = 1;
758
            }
759
        }
760
        else
761
    #endif
762
        {
763
            Transform_Sha512_p = _Transform_Sha512;
764
            Transform_Sha512_Len_p = NULL;
765
            Transform_Sha512_is_vectorized = 0;
766
        }
767
768
        transform_check = 1;
769
    }
770
771
#endif /* !WC_NO_INTERNAL_FUNCTION_POINTERS */
772
773
#elif defined(WOLFSSL_ARMASM)
774
775
#if defined(__aarch64__) && defined(WOLFSSL_ARMASM_NO_NEON)
776
#error "No SHA-512 implementation."
777
#endif
778
779
static int transform_check = 0;
780
#if defined(__aarch64__) && defined(WOLFSSL_ARMASM_CRYPTO_SHA512)
781
static word32 cpuid_flags = 0;
782
static int cpuid_flags_set = 0;
783
#endif
784
785
#if defined(__aarch64__) && defined(WOLFSSL_ARMASM_CRYPTO_SHA512)
786
static void Transform_Sha512_crypto(wc_Sha512* sha512, const byte* data)
787
{
788
    Transform_Sha512_Len_crypto(sha512, data, WC_SHA512_BLOCK_SIZE);
789
}
790
#endif
791
#if !defined(WOLFSSL_ARMASM_THUMB2) && !defined(WOLFSSL_ARMASM_NO_NEON)
792
static void Transform_Sha512_neon(wc_Sha512* sha512, const byte* data)
793
{
794
    Transform_Sha512_Len_neon(sha512, data, WC_SHA512_BLOCK_SIZE);
795
}
796
#endif
797
#if defined(WOLFSSL_ARMASM_THUMB2) || defined(WOLFSSL_ARMASM_NO_NEON)
798
static void Transform_Sha512_base(wc_Sha512* sha512, const byte* data)
799
{
800
    Transform_Sha512_Len_base(sha512, data, WC_SHA512_BLOCK_SIZE);
801
}
802
#endif
803
804
static void (*Transform_Sha512_p)(wc_Sha512* sha512, const byte* data) = NULL;
805
static void (*Transform_Sha512_Len_p)(wc_Sha512* sha512, const byte* data,
806
    word32 len) = NULL;
807
808
static WC_INLINE int Transform_Sha512(wc_Sha512 *sha512, const byte* data)
809
{
810
    (*Transform_Sha512_p)(sha512, data);
811
    return 0;
812
}
813
static WC_INLINE int Transform_Sha512_Len(wc_Sha512 *sha512, const byte* data,
814
    word32 len)
815
{
816
    (*Transform_Sha512_Len_p)(sha512, data, len);
817
    return 0;
818
}
819
820
static void Sha512_SetTransform(void)
821
{
822
    if (transform_check)
823
        return;
824
825
#if defined(__aarch64__) && defined(WOLFSSL_ARMASM_CRYPTO_SHA512)
826
    if (!cpuid_flags_set) {
827
        cpuid_flags = cpuid_get_flags();
828
        cpuid_flags_set = 1;
829
    }
830
#endif
831
832
#if defined(__aarch64__) && defined(WOLFSSL_ARMASM_CRYPTO_SHA512)
833
    if (IS_AARCH64_SHA512(cpuid_flags)) {
834
        Transform_Sha512_p = Transform_Sha512_crypto;
835
        Transform_Sha512_Len_p = Transform_Sha512_Len_crypto;
836
    }
837
    else
838
#endif
839
#if !defined(WOLFSSL_ARMASM_THUMB2) && !defined(WOLFSSL_ARMASM_NO_NEON)
840
    {
841
        Transform_Sha512_p = Transform_Sha512_neon;
842
        Transform_Sha512_Len_p = Transform_Sha512_Len_neon;
843
    }
844
#else
845
    {
846
        Transform_Sha512_p = Transform_Sha512_base;
847
        Transform_Sha512_Len_p = Transform_Sha512_Len_base;
848
    }
849
#endif
850
851
    transform_check = 1;
852
}
853
854
#else
855
729k
    #define Transform_Sha512(sha512) _Transform_Sha512(sha512)
856
857
#endif
858
859
#ifdef WOLFSSL_SHA512
860
861
static int InitSha512_Family(wc_Sha512* sha512, void* heap, int devId,
862
                             int (*initfp)(wc_Sha512*))
863
117k
{
864
117k
    int ret = 0;
865
866
117k
    if (sha512 == NULL) {
867
0
        return BAD_FUNC_ARG;
868
0
    }
869
870
117k
    XMEMSET(sha512, 0, sizeof(*sha512));
871
872
117k
    sha512->heap = heap;
873
#ifdef WOLFSSL_SMALL_STACK_CACHE
874
    /* This allocation combines the customary W buffer used by
875
     * _Transform_Sha512() with additional buffer space used by
876
     * wc_Sha512Transform().
877
     */
878
    sha512->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE,
879
                                  sha512->heap, DYNAMIC_TYPE_DIGEST);
880
    if (sha512->W == NULL)
881
        return MEMORY_E;
882
#endif
883
117k
#ifdef WOLF_CRYPTO_CB
884
117k
    sha512->devId = devId;
885
117k
    sha512->devCtx = NULL;
886
117k
#endif
887
888
#ifdef WOLFSSL_HASH_KEEP
889
    sha512->msg  = NULL;
890
#endif
891
892
    /* call the initialization function pointed to by initfp */
893
117k
    ret = initfp(sha512);
894
895
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
896
    if (ret == 0) {
897
        ret = wolfAsync_DevCtxInit(&sha512->asyncDev,
898
                        WOLFSSL_ASYNC_MARKER_SHA512, sha512->heap, devId);
899
    }
900
#else
901
117k
    (void)devId;
902
117k
#endif /* WOLFSSL_ASYNC_CRYPT */
903
#ifdef WOLFSSL_IMXRT1170_CAAM
904
    if (ret == 0)
905
        ret = wc_CAAM_HashInit(&sha512->hndl, &sha512->ctx, WC_HASH_TYPE_SHA512);
906
#endif
907
908
#ifdef WOLFSSL_SMALL_STACK_CACHE
909
    if (ret != 0) {
910
        XFREE(sha512->W, sha512->heap, DYNAMIC_TYPE_DIGEST);
911
        sha512->W = NULL;
912
    }
913
#endif
914
915
117k
    return ret;
916
117k
} /* InitSha512_Family */
917
918
int wc_InitSha512_ex(wc_Sha512* sha512, void* heap, int devId)
919
116k
{
920
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
921
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
922
    if (sha512->ctx.mode != ESP32_SHA_INIT) {
923
        ESP_LOGV(TAG, "Set ctx mode from prior value: "
924
                      "%d", sha512->ctx.mode);
925
    }
926
    /* We know this is a fresh, uninitialized item, so set to INIT */
927
    sha512->ctx.mode = ESP32_SHA_INIT;
928
#endif
929
930
#ifdef MAX3266X_SHA_CB
931
    if (wc_MXC_TPU_SHA_Init(&(sha512->mxcCtx)) != 0){
932
        return BAD_FUNC_ARG;
933
    }
934
#endif
935
936
116k
    return InitSha512_Family(sha512, heap, devId, InitSha512);
937
116k
}
938
939
#if !defined(WOLFSSL_NOSHA512_224) && \
940
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
941
int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId)
942
701
{
943
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
944
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
945
    /* No SHA512/224 HW support is available, set to SW. */
946
    sha512->ctx.mode = ESP32_SHA_SW; /* no SHA224 HW, so always SW */
947
#endif
948
701
    return InitSha512_Family(sha512, heap, devId, InitSha512_224);
949
701
}
950
#endif /* !WOLFSSL_NOSHA512_224 ... */
951
952
#if !defined(WOLFSSL_NOSHA512_256) && \
953
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
954
int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId)
955
188
{
956
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
957
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
958
    /* No SHA512/256 HW support is available on ESP32, set to SW. */
959
    sha512->ctx.mode = ESP32_SHA_SW;
960
#endif
961
188
    return InitSha512_Family(sha512, heap, devId, InitSha512_256);
962
188
}
963
#endif /* !WOLFSSL_NOSHA512_256 ... */
964
965
#endif /* WOLFSSL_SHA512 */
966
967
#ifndef WOLFSSL_ARMASM
968
969
static const word64 K512[80] = {
970
    W64LIT(0x428a2f98d728ae22), W64LIT(0x7137449123ef65cd),
971
    W64LIT(0xb5c0fbcfec4d3b2f), W64LIT(0xe9b5dba58189dbbc),
972
    W64LIT(0x3956c25bf348b538), W64LIT(0x59f111f1b605d019),
973
    W64LIT(0x923f82a4af194f9b), W64LIT(0xab1c5ed5da6d8118),
974
    W64LIT(0xd807aa98a3030242), W64LIT(0x12835b0145706fbe),
975
    W64LIT(0x243185be4ee4b28c), W64LIT(0x550c7dc3d5ffb4e2),
976
    W64LIT(0x72be5d74f27b896f), W64LIT(0x80deb1fe3b1696b1),
977
    W64LIT(0x9bdc06a725c71235), W64LIT(0xc19bf174cf692694),
978
    W64LIT(0xe49b69c19ef14ad2), W64LIT(0xefbe4786384f25e3),
979
    W64LIT(0x0fc19dc68b8cd5b5), W64LIT(0x240ca1cc77ac9c65),
980
    W64LIT(0x2de92c6f592b0275), W64LIT(0x4a7484aa6ea6e483),
981
    W64LIT(0x5cb0a9dcbd41fbd4), W64LIT(0x76f988da831153b5),
982
    W64LIT(0x983e5152ee66dfab), W64LIT(0xa831c66d2db43210),
983
    W64LIT(0xb00327c898fb213f), W64LIT(0xbf597fc7beef0ee4),
984
    W64LIT(0xc6e00bf33da88fc2), W64LIT(0xd5a79147930aa725),
985
    W64LIT(0x06ca6351e003826f), W64LIT(0x142929670a0e6e70),
986
    W64LIT(0x27b70a8546d22ffc), W64LIT(0x2e1b21385c26c926),
987
    W64LIT(0x4d2c6dfc5ac42aed), W64LIT(0x53380d139d95b3df),
988
    W64LIT(0x650a73548baf63de), W64LIT(0x766a0abb3c77b2a8),
989
    W64LIT(0x81c2c92e47edaee6), W64LIT(0x92722c851482353b),
990
    W64LIT(0xa2bfe8a14cf10364), W64LIT(0xa81a664bbc423001),
991
    W64LIT(0xc24b8b70d0f89791), W64LIT(0xc76c51a30654be30),
992
    W64LIT(0xd192e819d6ef5218), W64LIT(0xd69906245565a910),
993
    W64LIT(0xf40e35855771202a), W64LIT(0x106aa07032bbd1b8),
994
    W64LIT(0x19a4c116b8d2d0c8), W64LIT(0x1e376c085141ab53),
995
    W64LIT(0x2748774cdf8eeb99), W64LIT(0x34b0bcb5e19b48a8),
996
    W64LIT(0x391c0cb3c5c95a63), W64LIT(0x4ed8aa4ae3418acb),
997
    W64LIT(0x5b9cca4f7763e373), W64LIT(0x682e6ff3d6b2b8a3),
998
    W64LIT(0x748f82ee5defb2fc), W64LIT(0x78a5636f43172f60),
999
    W64LIT(0x84c87814a1f0ab72), W64LIT(0x8cc702081a6439ec),
1000
    W64LIT(0x90befffa23631e28), W64LIT(0xa4506cebde82bde9),
1001
    W64LIT(0xbef9a3f7b2c67915), W64LIT(0xc67178f2e372532b),
1002
    W64LIT(0xca273eceea26619c), W64LIT(0xd186b8c721c0c207),
1003
    W64LIT(0xeada7dd6cde0eb1e), W64LIT(0xf57d4f7fee6ed178),
1004
    W64LIT(0x06f067aa72176fba), W64LIT(0x0a637dc5a2c898a6),
1005
    W64LIT(0x113f9804bef90dae), W64LIT(0x1b710b35131c471b),
1006
    W64LIT(0x28db77f523047d84), W64LIT(0x32caab7b40c72493),
1007
    W64LIT(0x3c9ebe0a15c9bebc), W64LIT(0x431d67c49c100d4c),
1008
    W64LIT(0x4cc5d4becb3e42b6), W64LIT(0x597f299cfc657e2a),
1009
    W64LIT(0x5fcb6fab3ad6faec), W64LIT(0x6c44198c4a475817)
1010
};
1011
1012
11.0M
#define blk0(i) (W[i] = sha512->buffer[i])
1013
1014
44.3M
#define blk2(i) (\
1015
44.3M
               W[ (i)     & 15] += \
1016
44.3M
            s1(W[((i)-2)  & 15])+ \
1017
44.3M
               W[((i)-7)  & 15] + \
1018
44.3M
            s0(W[((i)-15) & 15])  \
1019
44.3M
        )
1020
1021
55.4M
#define Ch(x,y,z)  ((z) ^ ((x) & ((y) ^ (z))))
1022
55.4M
#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
1023
1024
693k
#define a(i) T[(0-(i)) & 7]
1025
693k
#define b(i) T[(1-(i)) & 7]
1026
693k
#define c(i) T[(2-(i)) & 7]
1027
56.1M
#define d(i) T[(3-(i)) & 7]
1028
693k
#define e(i) T[(4-(i)) & 7]
1029
693k
#define f(i) T[(5-(i)) & 7]
1030
693k
#define g(i) T[(6-(i)) & 7]
1031
167M
#define h(i) T[(7-(i)) & 7]
1032
1033
55.4M
#define S0(x) (rotrFixed64(x,28) ^ rotrFixed64(x,34) ^ rotrFixed64(x,39))
1034
55.4M
#define S1(x) (rotrFixed64(x,14) ^ rotrFixed64(x,18) ^ rotrFixed64(x,41))
1035
44.3M
#define s0(x) (rotrFixed64(x,1)  ^ rotrFixed64(x,8)  ^ ((x)>>7))
1036
44.3M
#define s1(x) (rotrFixed64(x,19) ^ rotrFixed64(x,61) ^ ((x)>>6))
1037
1038
#define R(i) \
1039
55.4M
    h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[(i)+j] + (j ? blk2(i) : blk0(i)); \
1040
55.4M
    d(i) += h(i); \
1041
55.4M
    h(i) += S0(a(i)) + Maj(a(i),b(i),c(i))
1042
1043
static int _Transform_Sha512(wc_Sha512* sha512)
1044
695k
{
1045
695k
    const word64* K = K512;
1046
695k
    word32 j;
1047
695k
    word64 T[8];
1048
1049
#if defined(WOLFSSL_SMALL_STACK_CACHE)
1050
    word64* W = sha512->W;
1051
    if (W == NULL)
1052
        return BAD_FUNC_ARG;
1053
#elif defined(WOLFSSL_SMALL_STACK)
1054
    word64* W;
1055
695k
    W = (word64*) XMALLOC(sizeof(word64) * 16, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1056
695k
    if (W == NULL)
1057
1.52k
        return MEMORY_E;
1058
#else
1059
    word64 W[16];
1060
#endif
1061
1062
    /* Copy digest to working vars */
1063
693k
    XMEMCPY(T, sha512->digest, sizeof(T));
1064
1065
#ifdef USE_SLOW_SHA512
1066
    /* over twice as small, but 50% slower */
1067
    /* 80 operations, not unrolled */
1068
    for (j = 0; j < 80; j += 16) {
1069
        int m;
1070
        for (m = 0; m < 16; m++) { /* braces needed here for macros {} */
1071
            R(m);
1072
        }
1073
    }
1074
#else
1075
    /* 80 operations, partially loop unrolled */
1076
4.16M
    for (j = 0; j < 80; j += 16) {
1077
3.46M
        R( 0); R( 1); R( 2); R( 3);
1078
3.46M
        R( 4); R( 5); R( 6); R( 7);
1079
3.46M
        R( 8); R( 9); R(10); R(11);
1080
3.46M
        R(12); R(13); R(14); R(15);
1081
3.46M
    }
1082
693k
#endif /* USE_SLOW_SHA512 */
1083
1084
    /* Add the working vars back into digest */
1085
693k
    sha512->digest[0] += a(0);
1086
693k
    sha512->digest[1] += b(0);
1087
693k
    sha512->digest[2] += c(0);
1088
693k
    sha512->digest[3] += d(0);
1089
693k
    sha512->digest[4] += e(0);
1090
693k
    sha512->digest[5] += f(0);
1091
693k
    sha512->digest[6] += g(0);
1092
693k
    sha512->digest[7] += h(0);
1093
1094
    /* Wipe variables */
1095
693k
    ForceZero(W, sizeof(word64) * 16);
1096
693k
    ForceZero(T, sizeof(T));
1097
1098
693k
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SMALL_STACK_CACHE)
1099
693k
    XFREE(W, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1100
693k
#endif
1101
1102
693k
    return 0;
1103
695k
}
1104
#endif
1105
1106
1107
static WC_INLINE void AddLength(wc_Sha512* sha512, word32 len)
1108
542k
{
1109
542k
    word64 tmp = sha512->loLen;
1110
542k
    if ( (sha512->loLen += len) < tmp)
1111
0
        sha512->hiLen++;                       /* carry low to high */
1112
542k
}
1113
1114
static WC_INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, word32 len)
1115
721k
{
1116
721k
    int ret = 0;
1117
    /* do block size increments */
1118
721k
    byte* local = (byte*)sha512->buffer;
1119
1120
    /* check that internal buffLen is valid */
1121
721k
    if (sha512->buffLen >= WC_SHA512_BLOCK_SIZE)
1122
27
        return BUFFER_E;
1123
1124
721k
    if (len == 0)
1125
178k
        return 0;
1126
1127
542k
    AddLength(sha512, len);
1128
1129
542k
    if (sha512->buffLen > 0) {
1130
344k
        word32 add = min(len, WC_SHA512_BLOCK_SIZE - sha512->buffLen);
1131
344k
        if (add > 0) {
1132
344k
            XMEMCPY(&local[sha512->buffLen], data, add);
1133
1134
344k
            sha512->buffLen += add;
1135
344k
            data            += add;
1136
344k
            len             -= add;
1137
344k
        }
1138
1139
344k
        if (sha512->buffLen == WC_SHA512_BLOCK_SIZE) {
1140
88.3k
    #if defined(LITTLE_ENDIAN_ORDER)
1141
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1142
            (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1143
            #ifdef WC_C_DYNAMIC_FALLBACK
1144
            if (sha512->sha_method == SHA512_C)
1145
            #else
1146
            if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1147
            #endif
1148
        #endif
1149
88.3k
            {
1150
88.3k
        #if (!defined(WOLFSSL_ESP32_CRYPT) || \
1151
88.3k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1152
88.3k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \
1153
88.3k
             !defined(WOLFSSL_ARMASM)
1154
88.3k
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1155
88.3k
                                                         WC_SHA512_BLOCK_SIZE);
1156
88.3k
        #endif
1157
88.3k
            }
1158
88.3k
    #endif
1159
    #ifdef WOLFSSL_ARMASM
1160
            Transform_Sha512(sha512, (const byte*)sha512->buffer);
1161
    #elif !defined(WOLFSSL_ESP32_CRYPT) || \
1162
           defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1163
           defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1164
88.3k
            ret = Transform_Sha512(sha512);
1165
    #else
1166
            if (sha512->ctx.mode == ESP32_SHA_INIT) {
1167
                esp_sha_try_hw_lock(&sha512->ctx);
1168
            }
1169
            if (sha512->ctx.mode == ESP32_SHA_SW) {
1170
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1171
                                                         WC_SHA512_BLOCK_SIZE);
1172
                ret = Transform_Sha512(sha512);
1173
            }
1174
            else {
1175
                ret = esp_sha512_process(sha512);
1176
            }
1177
    #endif
1178
88.3k
            if (ret == 0)
1179
88.0k
                sha512->buffLen = 0;
1180
256
            else
1181
256
                len = 0;
1182
88.3k
        }
1183
344k
    }
1184
1185
#if defined(WOLFSSL_ARMASM)
1186
    if (len >= WC_SHA512_BLOCK_SIZE) {
1187
        word32 blocksLen = len & ~((word32)WC_SHA512_BLOCK_SIZE-1);
1188
1189
        Transform_Sha512_Len(sha512, data, blocksLen);
1190
        data += blocksLen;
1191
        len  -= blocksLen;
1192
    }
1193
#else
1194
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1195
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
1196
1197
    #ifdef WC_C_DYNAMIC_FALLBACK
1198
    if (sha512->sha_method != SHA512_C)
1199
    #elif defined(WC_NO_INTERNAL_FUNCTION_POINTERS)
1200
    if (sha_method != SHA512_C)
1201
    #else
1202
    if (Transform_Sha512_Len_p != NULL)
1203
    #endif
1204
1205
    {
1206
        word32 blocksLen = len & ~((word32)WC_SHA512_BLOCK_SIZE-1);
1207
1208
        if (blocksLen > 0) {
1209
            sha512->data = data;
1210
            /* Byte reversal performed in function if required. */
1211
            Transform_Sha512_Len(sha512, blocksLen);
1212
            data += blocksLen;
1213
            len  -= blocksLen;
1214
        }
1215
    }
1216
    else
1217
#endif
1218
#if !defined(LITTLE_ENDIAN_ORDER) || (defined(WOLFSSL_X86_64_BUILD) && \
1219
        defined(USE_INTEL_SPEEDUP) && (defined(HAVE_INTEL_AVX1) || \
1220
        defined(HAVE_INTEL_AVX2)))
1221
    {
1222
        while (len >= WC_SHA512_BLOCK_SIZE) {
1223
            XMEMCPY(local, data, WC_SHA512_BLOCK_SIZE);
1224
1225
            data += WC_SHA512_BLOCK_SIZE;
1226
            len  -= WC_SHA512_BLOCK_SIZE;
1227
1228
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1229
            (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1230
            #ifdef WC_C_DYNAMIC_FALLBACK
1231
            if (sha512->sha_method == SHA512_C)
1232
            #else
1233
            if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1234
            #endif
1235
            {
1236
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1237
                                                          WC_SHA512_BLOCK_SIZE);
1238
            }
1239
        #endif
1240
            /* Byte reversal performed in function if required. */
1241
            ret = Transform_Sha512(sha512);
1242
            if (ret != 0)
1243
                break;
1244
        }
1245
    }
1246
#else
1247
542k
    {
1248
1.10M
        while (len >= WC_SHA512_BLOCK_SIZE) {
1249
560k
            XMEMCPY(local, data, WC_SHA512_BLOCK_SIZE);
1250
1251
560k
            data += WC_SHA512_BLOCK_SIZE;
1252
560k
            len  -= WC_SHA512_BLOCK_SIZE;
1253
560k
    #if !defined(WOLFSSL_ESP32_CRYPT) || \
1254
560k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1255
560k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1256
560k
            ByteReverseWords64(sha512->buffer, sha512->buffer,
1257
560k
                                                       WC_SHA512_BLOCK_SIZE);
1258
560k
    #endif
1259
560k
    #if !defined(WOLFSSL_ESP32_CRYPT) || \
1260
560k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1261
560k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1262
560k
            ret = Transform_Sha512(sha512);
1263
    #else
1264
            if(sha512->ctx.mode == ESP32_SHA_INIT) {
1265
                esp_sha_try_hw_lock(&sha512->ctx);
1266
            }
1267
            if (sha512->ctx.mode == ESP32_SHA_SW) {
1268
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1269
                                                          WC_SHA512_BLOCK_SIZE);
1270
                ret = Transform_Sha512(sha512);
1271
            }
1272
            else {
1273
                ret = esp_sha512_process(sha512);
1274
            }
1275
    #endif
1276
560k
            if (ret != 0)
1277
601
                break;
1278
560k
        } /* while (len >= WC_SHA512_BLOCK_SIZE) */
1279
542k
    }
1280
542k
#endif
1281
542k
#endif
1282
1283
542k
    if (ret == 0 && len > 0) {
1284
229k
        XMEMCPY(local, data, len);
1285
229k
        sha512->buffLen = len;
1286
229k
    }
1287
1288
542k
    return ret;
1289
721k
}
1290
1291
#ifdef WOLFSSL_SHA512
1292
1293
int wc_Sha512Update(wc_Sha512* sha512, const byte* data, word32 len)
1294
441k
{
1295
441k
    if (sha512 == NULL) {
1296
0
        return BAD_FUNC_ARG;
1297
0
    }
1298
441k
    if (data == NULL && len == 0) {
1299
        /* valid, but do nothing */
1300
40
        return 0;
1301
40
    }
1302
441k
    if (data == NULL) {
1303
0
        return BAD_FUNC_ARG;
1304
0
    }
1305
1306
441k
#ifdef WOLF_CRYPTO_CB
1307
441k
    #ifndef WOLF_CRYPTO_CB_FIND
1308
441k
    if (sha512->devId != INVALID_DEVID)
1309
7.20k
    #endif
1310
7.20k
    {
1311
7.20k
        int ret = wc_CryptoCb_Sha512Hash(sha512, data, len, NULL, 0);
1312
7.20k
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1313
0
            return ret;
1314
        /* fall-through when unavailable */
1315
7.20k
    }
1316
441k
#endif
1317
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
1318
    if (sha512->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA512) {
1319
    #if defined(HAVE_INTEL_QA)
1320
        return IntelQaSymSha512(&sha512->asyncDev, NULL, data, len);
1321
    #endif
1322
    }
1323
#endif /* WOLFSSL_ASYNC_CRYPT */
1324
1325
441k
    return Sha512Update(sha512, data, len);
1326
441k
}
1327
1328
#endif /* WOLFSSL_SHA512 */
1329
1330
#endif /* WOLFSSL_IMX6_CAAM || WOLFSSL_SILABS_SHA512 */
1331
1332
1333
#if defined(WOLFSSL_KCAPI_HASH)
1334
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1335
#elif defined(WOLFSSL_RENESAS_RSIP) && \
1336
   !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
1337
    /* functions defined in wolfcrypt/src/port/renesas/renesas_fspsm_sha.c */
1338
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
1339
1340
#elif defined(MAX3266X_SHA)
1341
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1342
#elif defined(STM32_HASH_SHA512)
1343
#elif defined(PSOC6_HASH_SHA2)
1344
#else
1345
1346
static WC_INLINE int Sha512Final(wc_Sha512* sha512)
1347
77.0k
{
1348
77.0k
#ifndef WOLFSSL_ARMASM
1349
77.0k
    int ret;
1350
77.0k
#endif
1351
77.0k
    byte* local;
1352
1353
77.0k
    if (sha512 == NULL) {
1354
0
        return BAD_FUNC_ARG;
1355
0
    }
1356
1357
77.0k
    local = (byte*)sha512->buffer;
1358
1359
    /* we'll add a 0x80 byte at the end,
1360
    ** so make sure we have appropriate buffer length. */
1361
77.0k
    if (sha512->buffLen > WC_SHA512_BLOCK_SIZE - 1) {
1362
0
        return BAD_STATE_E;
1363
0
    } /* buffLen check */
1364
1365
77.0k
    local[sha512->buffLen++] = 0x80;  /* add 1 */
1366
1367
    /* pad with zeros */
1368
77.0k
    if (sha512->buffLen > WC_SHA512_PAD_SIZE) {
1369
4.27k
        if (sha512->buffLen < WC_SHA512_BLOCK_SIZE ) {
1370
3.76k
            XMEMSET(&local[sha512->buffLen], 0,
1371
3.76k
                WC_SHA512_BLOCK_SIZE - sha512->buffLen);
1372
3.76k
        }
1373
1374
4.27k
        sha512->buffLen += WC_SHA512_BLOCK_SIZE - sha512->buffLen;
1375
4.27k
#if defined(LITTLE_ENDIAN_ORDER)
1376
    #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1377
        (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1378
        #ifdef WC_C_DYNAMIC_FALLBACK
1379
        if (sha512->sha_method == SHA512_C)
1380
        #else
1381
        if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1382
        #endif
1383
    #endif
1384
4.27k
        {
1385
1386
4.27k
        #if (!defined(WOLFSSL_ESP32_CRYPT) || \
1387
4.27k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1388
4.27k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \
1389
4.27k
             !defined(WOLFSSL_ARMASM)
1390
4.27k
            ByteReverseWords64(sha512->buffer,sha512->buffer,
1391
4.27k
                                                         WC_SHA512_BLOCK_SIZE);
1392
4.27k
        #endif
1393
4.27k
        }
1394
1395
4.27k
#endif /* LITTLE_ENDIAN_ORDER */
1396
#ifdef WOLFSSL_ARMASM
1397
        Transform_Sha512(sha512, (const byte*)sha512->buffer);
1398
#else
1399
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1400
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1401
        if (sha512->ctx.mode == ESP32_SHA_INIT) {
1402
            esp_sha_try_hw_lock(&sha512->ctx);
1403
        }
1404
        if (sha512->ctx.mode == ESP32_SHA_SW) {
1405
            ByteReverseWords64(sha512->buffer,sha512->buffer,
1406
                                                         WC_SHA512_BLOCK_SIZE);
1407
            ret = Transform_Sha512(sha512);
1408
        }
1409
        else {
1410
            ret = esp_sha512_process(sha512);
1411
        }
1412
    #else
1413
4.27k
        ret = Transform_Sha512(sha512);
1414
4.27k
    #endif
1415
4.27k
        if (ret != 0) {
1416
50
            return ret;
1417
50
        }
1418
4.22k
#endif
1419
1420
4.22k
        sha512->buffLen = 0;
1421
4.22k
    } /* (sha512->buffLen > WC_SHA512_PAD_SIZE) pad with zeros */
1422
1423
77.0k
    XMEMSET(&local[sha512->buffLen], 0, WC_SHA512_PAD_SIZE - sha512->buffLen);
1424
1425
    /* put lengths in bits */
1426
77.0k
    sha512->hiLen = (sha512->loLen >> (8 * sizeof(sha512->loLen) - 3)) +
1427
77.0k
                                                         (sha512->hiLen << 3);
1428
77.0k
    sha512->loLen = sha512->loLen << 3;
1429
1430
    /* store lengths */
1431
77.0k
#if defined(LITTLE_ENDIAN_ORDER)
1432
    #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1433
        (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1434
        #ifdef WC_C_DYNAMIC_FALLBACK
1435
        if (sha512->sha_method == SHA512_C)
1436
        #else
1437
        if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1438
        #endif
1439
    #endif
1440
77.0k
    #if (!defined(WOLFSSL_ESP32_CRYPT) || \
1441
77.0k
          defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1442
77.0k
          defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \
1443
77.0k
         !defined(WOLFSSL_ARMASM)
1444
77.0k
            ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_PAD_SIZE);
1445
77.0k
    #endif
1446
77.0k
#endif
1447
    /* ! length ordering dependent on digest endian type ! */
1448
1449
77.0k
#if !defined(WOLFSSL_ESP32_CRYPT) || \
1450
77.0k
     defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1451
77.0k
     defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1452
77.0k
    sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2] = sha512->hiLen;
1453
77.0k
    sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 1] = sha512->loLen;
1454
77.0k
#endif
1455
1456
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1457
    (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1458
    #ifdef WC_C_DYNAMIC_FALLBACK
1459
    if (sha512->sha_method != SHA512_C)
1460
    #else
1461
    if (IS_INTEL_AVX1(intel_flags) || IS_INTEL_AVX2(intel_flags))
1462
    #endif
1463
    {
1464
        ByteReverseWords64(&(sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2]),
1465
                           &(sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2]),
1466
                           WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE);
1467
    }
1468
#elif defined(WOLFSSL_ARMASM)
1469
    #define SHA512_PAD_LEN_64  (WC_SHA512_PAD_SIZE / sizeof(word64))
1470
    {
1471
        ByteReverseWords64(&(sha512->buffer[SHA512_PAD_LEN_64]),
1472
                           &(sha512->buffer[SHA512_PAD_LEN_64]),
1473
                           WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE);
1474
    }
1475
#endif
1476
1477
#ifdef WOLFSSL_ARMASM
1478
    Transform_Sha512(sha512, (const byte*)sha512->buffer);
1479
#else
1480
77.0k
#if !defined(WOLFSSL_ESP32_CRYPT) || \
1481
77.0k
      defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1482
77.0k
      defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1483
77.0k
    ret = Transform_Sha512(sha512);
1484
#else
1485
    if(sha512->ctx.mode == ESP32_SHA_INIT) {
1486
        /* typically for tiny block: first = last */
1487
        esp_sha_try_hw_lock(&sha512->ctx);
1488
    }
1489
    if (sha512->ctx.mode == ESP32_SHA_SW) {
1490
        ByteReverseWords64(sha512->buffer,
1491
                           sha512->buffer,
1492
                           WC_SHA512_BLOCK_SIZE);
1493
        sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2] = sha512->hiLen;
1494
        sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 1] = sha512->loLen;
1495
        ret = Transform_Sha512(sha512);
1496
    }
1497
    else {
1498
        ret = esp_sha512_digest_process(sha512, 1);
1499
    }
1500
#endif
1501
1502
77.0k
    if (ret != 0)
1503
615
        return ret;
1504
76.4k
#endif
1505
1506
76.4k
    #ifdef LITTLE_ENDIAN_ORDER
1507
76.4k
        ByteReverseWords64(sha512->digest, sha512->digest,
1508
76.4k
            WC_SHA512_DIGEST_SIZE);
1509
76.4k
    #endif
1510
1511
1512
76.4k
    return 0;
1513
77.0k
}
1514
1515
#endif /* WOLFSSL_KCAPI_HASH */
1516
1517
#ifdef WOLFSSL_SHA512
1518
1519
#if defined(WOLFSSL_KCAPI_HASH)
1520
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1521
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
1522
1523
#elif defined(WOLFSSL_RENESAS_RSIP) && \
1524
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
1525
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
1526
1527
#elif defined(MAX3266X_SHA)
1528
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1529
#elif defined(STM32_HASH_SHA512)
1530
#elif defined(PSOC6_HASH_SHA2)
1531
#elif defined(WOLFSSL_SILABS_SHA512)
1532
#else
1533
1534
static int Sha512FinalRaw(wc_Sha512* sha512, byte* hash, word32 digestSz)
1535
0
{
1536
0
    if (sha512 == NULL || hash == NULL) {
1537
0
        return BAD_FUNC_ARG;
1538
0
    }
1539
1540
0
#ifdef LITTLE_ENDIAN_ORDER
1541
0
    if ((digestSz & 0x7) == 0)
1542
0
        ByteReverseWords64((word64 *)hash, sha512->digest, digestSz);
1543
0
    else {
1544
0
        ByteReverseWords64(sha512->digest, sha512->digest,
1545
0
                           WC_SHA512_DIGEST_SIZE);
1546
0
        XMEMCPY(hash, sha512->digest, digestSz);
1547
0
    }
1548
#else
1549
    XMEMCPY(hash, sha512->digest, digestSz);
1550
#endif
1551
1552
0
    return 0;
1553
0
}
1554
1555
int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash)
1556
0
{
1557
0
    return Sha512FinalRaw(sha512, hash, WC_SHA512_DIGEST_SIZE);
1558
0
}
1559
1560
static int Sha512_Family_Final(wc_Sha512* sha512, byte* hash, size_t digestSz,
1561
                               int (*initfp)(wc_Sha512*))
1562
36.6k
{
1563
36.6k
    int ret;
1564
1565
36.6k
    if (sha512 == NULL || hash == NULL) {
1566
0
        return BAD_FUNC_ARG;
1567
0
    }
1568
1569
36.6k
#ifdef WOLF_CRYPTO_CB
1570
36.6k
    #ifndef WOLF_CRYPTO_CB_FIND
1571
36.6k
    if (sha512->devId != INVALID_DEVID)
1572
132
    #endif
1573
132
    {
1574
132
        ret = wc_CryptoCb_Sha512Hash(sha512, NULL, 0, hash, digestSz);
1575
132
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
1576
0
            return ret;
1577
0
        }
1578
        /* fall-through when unavailable */
1579
132
    }
1580
36.6k
#endif
1581
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
1582
    if (sha512->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA512) {
1583
    #if defined(HAVE_INTEL_QA)
1584
        return IntelQaSymSha512(&sha512->asyncDev, hash, NULL, digestSz);
1585
    #endif
1586
    }
1587
#endif /* WOLFSSL_ASYNC_CRYPT */
1588
1589
36.6k
    ret = Sha512Final(sha512);
1590
36.6k
    if (ret != 0)
1591
587
        return ret;
1592
1593
36.0k
    XMEMCPY(hash, sha512->digest, digestSz);
1594
1595
    /* initialize Sha512 structure for the next use */
1596
36.0k
    return initfp(sha512);
1597
36.6k
}
1598
1599
#ifndef STM32_HASH_SHA512
1600
int wc_Sha512Final(wc_Sha512* sha512, byte* hash)
1601
36.1k
{
1602
36.1k
    return Sha512_Family_Final(sha512, hash, WC_SHA512_DIGEST_SIZE, InitSha512);
1603
36.1k
}
1604
#endif
1605
1606
#endif /* WOLFSSL_KCAPI_HASH */
1607
1608
#if defined(MAX3266X_SHA)
1609
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1610
1611
#else
1612
#if !defined(WOLFSSL_SE050) || !defined(WOLFSSL_SE050_HASH)
1613
int wc_InitSha512(wc_Sha512* sha512)
1614
225
{
1615
225
    int devId = INVALID_DEVID;
1616
1617
225
#ifdef WOLF_CRYPTO_CB
1618
225
    devId = wc_CryptoCb_DefaultDevID();
1619
225
#endif
1620
225
    return wc_InitSha512_ex(sha512, NULL, devId);
1621
225
}
1622
1623
void wc_Sha512Free(wc_Sha512* sha512)
1624
117k
{
1625
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
1626
    int ret = 0;
1627
#endif
1628
1629
117k
    if (sha512 == NULL)
1630
0
        return;
1631
1632
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
1633
    #ifndef WOLF_CRYPTO_CB_FIND
1634
    if (sha512->devId != INVALID_DEVID)
1635
    #endif
1636
    {
1637
        ret = wc_CryptoCb_Free(sha512->devId, WC_ALGO_TYPE_HASH,
1638
                         WC_HASH_TYPE_SHA512, (void*)sha512);
1639
        /* If they want the standard free, they can call it themselves */
1640
        /* via their callback setting devId to INVALID_DEVID */
1641
        /* otherwise assume the callback handled it */
1642
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1643
            return;
1644
        /* fall-through when unavailable */
1645
    }
1646
1647
    /* silence compiler warning */
1648
    (void)ret;
1649
1650
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_FREE */
1651
1652
#if defined(WOLFSSL_ESP32) && \
1653
    !defined(NO_WOLFSSL_ESP32_CRYPT_HASH)  && \
1654
    !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1655
    esp_sha_release_unfinished_lock(&sha512->ctx);
1656
#endif
1657
1658
#ifdef WOLFSSL_SMALL_STACK_CACHE
1659
    if (sha512->W != NULL) {
1660
        ForceZero(sha512->W, (sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE);
1661
        XFREE(sha512->W, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1662
        sha512->W = NULL;
1663
    }
1664
#endif
1665
1666
#if defined(WOLFSSL_KCAPI_HASH)
1667
    KcapiHashFree(&sha512->kcapi);
1668
#endif
1669
1670
#if defined(WOLFSSL_HASH_KEEP) ||\
1671
   (defined(WOLFSSL_RENESAS_RSIP) && (WOLFSSL_RENESAS_RZFSP_VER >= 220))
1672
    if (sha512->msg != NULL) {
1673
        ForceZero(sha512->msg, sha512->len);
1674
        XFREE(sha512->msg, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1675
        sha512->msg = NULL;
1676
    }
1677
#endif
1678
1679
#ifdef MAX3266X_SHA_CB
1680
    wc_MXC_TPU_SHA_Free(&(sha512->mxcCtx));
1681
#endif
1682
1683
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
1684
    wolfAsync_DevCtxFree(&sha512->asyncDev, WOLFSSL_ASYNC_MARKER_SHA512);
1685
#endif /* WOLFSSL_ASYNC_CRYPT */
1686
1687
#if defined(PSOC6_HASH_SHA2)
1688
    wc_Psoc6_Sha_Free();
1689
#endif
1690
1691
117k
    ForceZero(sha512, sizeof(*sha512));
1692
117k
}
1693
#endif
1694
1695
#if (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) \
1696
    && !defined(WOLFSSL_KCAPI_HASH)
1697
/* Apply SHA512 transformation to the data                */
1698
/* @param sha  a pointer to wc_Sha512 structure           */
1699
/* @param data data to be applied SHA512 transformation   */
1700
/* @return 0 on successful, otherwise non-zero on failure */
1701
int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data)
1702
{
1703
    int ret;
1704
    /* back up buffer */
1705
    WC_DECLARE_VAR(buffer, word64, WC_SHA512_BLOCK_SIZE  / sizeof(word64),
1706
        0);
1707
1708
    /* sanity check */
1709
    if (sha == NULL || data == NULL) {
1710
        return BAD_FUNC_ARG;
1711
    }
1712
1713
1714
#if defined(WOLFSSL_SMALL_STACK_CACHE)
1715
    if (sha->W == NULL)
1716
        return BAD_FUNC_ARG;
1717
    /* Skip over the initial `W' buffer at the start (used by
1718
     * _Transform_Sha512()).
1719
     */
1720
    buffer = sha->W + 16;
1721
#elif defined(WOLFSSL_SMALL_STACK)
1722
    buffer = (word64*)XMALLOC(WC_SHA512_BLOCK_SIZE, sha->heap,
1723
        DYNAMIC_TYPE_TMP_BUFFER);
1724
    if (buffer == NULL)
1725
        return MEMORY_E;
1726
#endif
1727
1728
#if defined(LITTLE_ENDIAN_ORDER)
1729
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1730
    (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1731
    #ifdef WC_C_DYNAMIC_FALLBACK
1732
    if (sha->sha_method == SHA512_C)
1733
    #else
1734
    if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1735
    #endif
1736
#endif
1737
    {
1738
        ByteReverseWords64((word64*)data, (word64*)data,
1739
                                                WC_SHA512_BLOCK_SIZE);
1740
    }
1741
#endif /* LITTLE_ENDIAN_ORDER */
1742
1743
#if defined(WOLFSSL_ARMASM)
1744
    ByteReverseWords64(buffer, (word64*)data, WC_SHA512_BLOCK_SIZE);
1745
    Transform_Sha512(sha, (const byte*)buffer);
1746
    ret = 0;
1747
#else
1748
    XMEMCPY(buffer, sha->buffer, WC_SHA512_BLOCK_SIZE);
1749
    XMEMCPY(sha->buffer, data, WC_SHA512_BLOCK_SIZE);
1750
1751
    ret = Transform_Sha512(sha);
1752
1753
    XMEMCPY(sha->buffer, buffer, WC_SHA512_BLOCK_SIZE);
1754
#endif
1755
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SMALL_STACK_CACHE)
1756
    ForceZero(buffer, WC_SHA512_BLOCK_SIZE);
1757
    XFREE(buffer, sha->heap, DYNAMIC_TYPE_TMP_BUFFER);
1758
#endif
1759
    return ret;
1760
}
1761
#endif /* OPENSSL_EXTRA */
1762
#endif /* WOLFSSL_SHA512 */
1763
#endif /* !WOLFSSL_SE050 || !WOLFSSL_SE050_HASH */
1764
1765
1766
/* -------------------------------------------------------------------------- */
1767
/* SHA384 */
1768
/* -------------------------------------------------------------------------- */
1769
#ifdef WOLFSSL_SHA384
1770
1771
#if defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_HASH) && \
1772
    !defined(WOLFSSL_QNX_CAAM)
1773
    /* functions defined in wolfcrypt/src/port/caam/caam_sha.c */
1774
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
1775
    int wc_InitSha384_ex(wc_Sha384* sha384, void* heap, int devId)
1776
    {
1777
        if (sha384 == NULL) {
1778
            return BAD_FUNC_ARG;
1779
        }
1780
        (void)devId;
1781
        return se050_hash_init(&sha384->se050Ctx, heap);
1782
    }
1783
    int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len)
1784
    {
1785
        if (sha384 == NULL) {
1786
            return BAD_FUNC_ARG;
1787
        }
1788
        if (data == NULL && len == 0) {
1789
            /* valid, but do nothing */
1790
            return 0;
1791
        }
1792
        if (data == NULL) {
1793
            return BAD_FUNC_ARG;
1794
        }
1795
1796
        return se050_hash_update(&sha384->se050Ctx, data, len);
1797
1798
    }
1799
    int wc_Sha384Final(wc_Sha384* sha384, byte* hash)
1800
    {
1801
        int ret = 0;
1802
        ret = se050_hash_final(&sha384->se050Ctx, hash, WC_SHA384_DIGEST_SIZE,
1803
                               kAlgorithm_SSS_SHA384);
1804
        return ret;
1805
    }
1806
1807
#elif defined(WOLFSSL_SILABS_SHA384)
1808
    /* functions defined in wolfcrypt/src/port/silabs/silabs_hash.c */
1809
1810
#elif defined(WOLFSSL_KCAPI_HASH)
1811
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1812
1813
#elif defined(WOLFSSL_RENESAS_RSIP) && \
1814
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
1815
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
1816
1817
#elif defined(MAX3266X_SHA)
1818
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1819
#elif defined(STM32_HASH_SHA384)
1820
1821
    int wc_InitSha384_ex(wc_Sha384* sha384, void* heap, int devId)
1822
    {
1823
        if (sha384 == NULL)
1824
            return BAD_FUNC_ARG;
1825
1826
        (void)devId;
1827
        (void)heap;
1828
1829
        XMEMSET(sha384, 0, sizeof(wc_Sha384));
1830
        wc_Stm32_Hash_Init(&sha384->stmCtx);
1831
        return 0;
1832
    }
1833
1834
    int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len)
1835
    {
1836
        int ret = 0;
1837
1838
        if (sha384 == NULL) {
1839
            return BAD_FUNC_ARG;
1840
        }
1841
        if (data == NULL && len == 0) {
1842
            /* valid, but do nothing */
1843
            return 0;
1844
        }
1845
        if (data == NULL) {
1846
            return BAD_FUNC_ARG;
1847
        }
1848
1849
        ret = wolfSSL_CryptHwMutexLock();
1850
        if (ret == 0) {
1851
            ret = wc_Stm32_Hash_Update(&sha384->stmCtx,
1852
                HASH_ALGOSELECTION_SHA384, data, len, WC_SHA384_BLOCK_SIZE);
1853
            wolfSSL_CryptHwMutexUnLock();
1854
        }
1855
        return ret;
1856
    }
1857
1858
    int wc_Sha384Final(wc_Sha384* sha384, byte* hash)
1859
    {
1860
        int ret = 0;
1861
1862
        if (sha384 == NULL || hash == NULL) {
1863
            return BAD_FUNC_ARG;
1864
        }
1865
1866
        ret = wolfSSL_CryptHwMutexLock();
1867
        if (ret == 0) {
1868
            ret = wc_Stm32_Hash_Final(&sha384->stmCtx,
1869
                HASH_ALGOSELECTION_SHA384, hash, WC_SHA384_DIGEST_SIZE);
1870
            wolfSSL_CryptHwMutexUnLock();
1871
        }
1872
1873
        (void)wc_InitSha384(sha384); /* reset state */
1874
1875
        return ret;
1876
    }
1877
1878
#elif defined(PSOC6_HASH_SHA2)
1879
    /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */
1880
1881
#else
1882
1883
static int InitSha384(wc_Sha384* sha384)
1884
151k
{
1885
151k
    if (sha384 == NULL) {
1886
0
        return BAD_FUNC_ARG;
1887
0
    }
1888
1889
#ifdef WOLFSSL_SMALL_STACK_CACHE
1890
    if (sha384->W == NULL) {
1891
        /* This allocation combines the customary W buffer used by
1892
         * _Transform_Sha512() with additional buffer space used by
1893
         * wc_Sha512Transform().
1894
         */
1895
        sha384->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE,
1896
                                      sha384->heap, DYNAMIC_TYPE_DIGEST);
1897
        if (sha384->W == NULL)
1898
            return MEMORY_E;
1899
    }
1900
#endif
1901
1902
151k
    sha384->digest[0] = W64LIT(0xcbbb9d5dc1059ed8);
1903
151k
    sha384->digest[1] = W64LIT(0x629a292a367cd507);
1904
151k
    sha384->digest[2] = W64LIT(0x9159015a3070dd17);
1905
151k
    sha384->digest[3] = W64LIT(0x152fecd8f70e5939);
1906
151k
    sha384->digest[4] = W64LIT(0x67332667ffc00b31);
1907
151k
    sha384->digest[5] = W64LIT(0x8eb44a8768581511);
1908
151k
    sha384->digest[6] = W64LIT(0xdb0c2e0d64f98fa7);
1909
151k
    sha384->digest[7] = W64LIT(0x47b5481dbefa4fa4);
1910
1911
151k
    sha384->buffLen = 0;
1912
151k
    sha384->loLen   = 0;
1913
151k
    sha384->hiLen   = 0;
1914
1915
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1916
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) || \
1917
    defined(WOLFSSL_ARMASM)
1918
#ifdef WC_C_DYNAMIC_FALLBACK
1919
    sha384->sha_method = 0;
1920
    Sha512_SetTransform(&sha384->sha_method);
1921
#else
1922
    Sha512_SetTransform();
1923
#endif
1924
#endif
1925
1926
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW)  && \
1927
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
1928
    /* HW needs to be carefully initialized, taking into account soft copy.
1929
    ** If already in use; copy may revert to SW as needed. */
1930
    esp_sha_init(&(sha384->ctx), WC_HASH_TYPE_SHA384);
1931
#endif
1932
1933
151k
#ifdef WOLFSSL_HASH_FLAGS
1934
151k
    sha384->flags = 0;
1935
151k
#endif
1936
1937
#ifdef HAVE_ARIA
1938
    sha384->hSession = NULL;
1939
#endif
1940
1941
#ifdef WOLFSSL_HASH_KEEP
1942
    sha384->msg  = NULL;
1943
    sha384->len  = 0;
1944
    sha384->used = 0;
1945
#endif
1946
1947
151k
    return 0;
1948
151k
}
1949
1950
int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len)
1951
261k
{
1952
1953
261k
    if (sha384 == NULL) {
1954
0
        return BAD_FUNC_ARG;
1955
0
    }
1956
261k
    if (data == NULL && len == 0) {
1957
        /* valid, but do nothing */
1958
387
        return 0;
1959
387
    }
1960
261k
    if (data == NULL) {
1961
0
        return BAD_FUNC_ARG;
1962
0
    }
1963
1964
261k
#ifdef WOLF_CRYPTO_CB
1965
261k
    #ifndef WOLF_CRYPTO_CB_FIND
1966
261k
    if (sha384->devId != INVALID_DEVID)
1967
1.45k
    #endif
1968
1.45k
    {
1969
1.45k
        int ret = wc_CryptoCb_Sha384Hash(sha384, data, len, NULL);
1970
1.45k
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1971
0
            return ret;
1972
        /* fall-through when unavailable */
1973
1.45k
    }
1974
261k
#endif
1975
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
1976
    if (sha384->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA384) {
1977
    #if defined(HAVE_INTEL_QA)
1978
        return IntelQaSymSha384(&sha384->asyncDev, NULL, data, len);
1979
    #endif
1980
    }
1981
#endif /* WOLFSSL_ASYNC_CRYPT */
1982
1983
261k
    return Sha512Update((wc_Sha512*)sha384, data, len);
1984
261k
}
1985
1986
1987
int wc_Sha384FinalRaw(wc_Sha384* sha384, byte* hash)
1988
116
{
1989
116
    if (sha384 == NULL || hash == NULL) {
1990
0
        return BAD_FUNC_ARG;
1991
0
    }
1992
1993
116
#ifdef LITTLE_ENDIAN_ORDER
1994
116
    ByteReverseWords64((word64 *)hash, sha384->digest, WC_SHA384_DIGEST_SIZE);
1995
#else
1996
    XMEMCPY(hash, sha384->digest, WC_SHA384_DIGEST_SIZE);
1997
#endif
1998
1999
116
    return 0;
2000
116
}
2001
2002
int wc_Sha384Final(wc_Sha384* sha384, byte* hash)
2003
39.4k
{
2004
39.4k
    int ret;
2005
2006
39.4k
    if (sha384 == NULL || hash == NULL) {
2007
0
        return BAD_FUNC_ARG;
2008
0
    }
2009
2010
39.4k
#ifdef WOLF_CRYPTO_CB
2011
39.4k
    #ifndef WOLF_CRYPTO_CB_FIND
2012
39.4k
    if (sha384->devId != INVALID_DEVID)
2013
64
    #endif
2014
64
    {
2015
64
        ret = wc_CryptoCb_Sha384Hash(sha384, NULL, 0, hash);
2016
64
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2017
0
            return ret;
2018
        /* fall-through when unavailable */
2019
64
    }
2020
39.4k
#endif
2021
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2022
    if (sha384->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA384) {
2023
    #if defined(HAVE_INTEL_QA)
2024
        return IntelQaSymSha384(&sha384->asyncDev, hash, NULL,
2025
                                            WC_SHA384_DIGEST_SIZE);
2026
    #endif
2027
    }
2028
#endif /* WOLFSSL_ASYNC_CRYPT */
2029
2030
39.4k
    ret = Sha512Final((wc_Sha512*)sha384);
2031
39.4k
    if (ret != 0)
2032
78
        return ret;
2033
2034
39.3k
    XMEMCPY(hash, sha384->digest, WC_SHA384_DIGEST_SIZE);
2035
2036
39.3k
    return InitSha384(sha384);  /* reset state */
2037
39.4k
}
2038
2039
int wc_InitSha384_ex(wc_Sha384* sha384, void* heap, int devId)
2040
111k
{
2041
111k
    int ret;
2042
2043
111k
    if (sha384 == NULL) {
2044
0
        return BAD_FUNC_ARG;
2045
0
    }
2046
2047
111k
    sha384->heap = heap;
2048
#ifdef WOLFSSL_SMALL_STACK_CACHE
2049
    sha384->W = NULL;
2050
#endif
2051
111k
#ifdef WOLF_CRYPTO_CB
2052
111k
    sha384->devId = devId;
2053
111k
    sha384->devCtx = NULL;
2054
111k
#endif
2055
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW)  && \
2056
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
2057
    if (sha384->ctx.mode != ESP32_SHA_INIT) {
2058
        ESP_LOGV(TAG, "Set ctx mode from prior value: "
2059
                           "%d", sha384->ctx.mode);
2060
    }
2061
    /* We know this is a fresh, uninitialized item, so set to INIT */
2062
    sha384->ctx.mode = ESP32_SHA_INIT;
2063
#endif
2064
2065
#ifdef MAX3266X_SHA_CB
2066
    ret = wc_MXC_TPU_SHA_Init(&(sha384->mxcCtx));
2067
    if (ret != 0) {
2068
        return ret;
2069
    }
2070
#endif
2071
2072
111k
    ret = InitSha384(sha384);
2073
111k
    if (ret != 0) {
2074
0
        return ret;
2075
0
    }
2076
2077
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2078
    ret = wolfAsync_DevCtxInit(&sha384->asyncDev, WOLFSSL_ASYNC_MARKER_SHA384,
2079
                                                           sha384->heap, devId);
2080
#else
2081
111k
    (void)devId;
2082
111k
#endif /* WOLFSSL_ASYNC_CRYPT */
2083
#ifdef WOLFSSL_IMXRT1170_CAAM
2084
     ret = wc_CAAM_HashInit(&sha384->hndl, &sha384->ctx, WC_HASH_TYPE_SHA384);
2085
#endif
2086
111k
    return ret;
2087
111k
}
2088
2089
#endif /* WOLFSSL_IMX6_CAAM || WOLFSSL_SILABS_SHA384 || WOLFSSL_KCAPI_HASH */
2090
2091
#if defined(MAX3266X_SHA)
2092
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
2093
2094
#else
2095
int wc_InitSha384(wc_Sha384* sha384)
2096
130
{
2097
130
    int devId = INVALID_DEVID;
2098
2099
130
#ifdef WOLF_CRYPTO_CB
2100
130
    devId = wc_CryptoCb_DefaultDevID();
2101
130
#endif
2102
130
    return wc_InitSha384_ex(sha384, NULL, devId);
2103
130
}
2104
2105
void wc_Sha384Free(wc_Sha384* sha384)
2106
112k
{
2107
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2108
    int ret = 0;
2109
#endif
2110
2111
112k
    if (sha384 == NULL)
2112
0
        return;
2113
2114
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2115
    #ifndef WOLF_CRYPTO_CB_FIND
2116
    if (sha384->devId != INVALID_DEVID)
2117
    #endif
2118
    {
2119
        ret = wc_CryptoCb_Free(sha384->devId, WC_ALGO_TYPE_HASH,
2120
                         WC_HASH_TYPE_SHA384, (void*)sha384);
2121
        /* If they want the standard free, they can call it themselves */
2122
        /* via their callback setting devId to INVALID_DEVID */
2123
        /* otherwise assume the callback handled it */
2124
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2125
            return;
2126
        /* fall-through when unavailable */
2127
    }
2128
2129
    /* silence compiler warning */
2130
    (void)ret;
2131
2132
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_FREE */
2133
2134
#if defined(WOLFSSL_ESP32) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH)  && \
2135
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
2136
    esp_sha_release_unfinished_lock(&sha384->ctx);
2137
#endif
2138
2139
#ifdef WOLFSSL_SMALL_STACK_CACHE
2140
    if (sha384->W != NULL) {
2141
        ForceZero(sha384->W, (sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE);
2142
        XFREE(sha384->W, sha384->heap, DYNAMIC_TYPE_TMP_BUFFER);
2143
        sha384->W = NULL;
2144
    }
2145
#endif
2146
2147
#if defined(WOLFSSL_KCAPI_HASH)
2148
    KcapiHashFree(&sha384->kcapi);
2149
#endif
2150
2151
#if defined(WOLFSSL_HASH_KEEP) || \
2152
   (defined(WOLFSSL_RENESAS_RSIP) && (WOLFSSL_RENESAS_RZFSP_VER >= 220))
2153
    if (sha384->msg != NULL) {
2154
        ForceZero(sha384->msg, sha384->len);
2155
        XFREE(sha384->msg, sha384->heap, DYNAMIC_TYPE_TMP_BUFFER);
2156
        sha384->msg = NULL;
2157
    }
2158
#endif
2159
2160
#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2161
    se050_hash_free(&sha384->se050Ctx);
2162
#endif
2163
2164
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2165
    wolfAsync_DevCtxFree(&sha384->asyncDev, WOLFSSL_ASYNC_MARKER_SHA384);
2166
#endif /* WOLFSSL_ASYNC_CRYPT */
2167
2168
#ifdef HAVE_ARIA
2169
    if (sha384->hSession != NULL) {
2170
        MC_CloseSession(sha384->hSession);
2171
        sha384->hSession = NULL;
2172
    }
2173
#endif
2174
2175
#ifdef MAX3266X_SHA_CB
2176
    wc_MXC_TPU_SHA_Free(&(sha384->mxcCtx));
2177
#endif
2178
2179
112k
    ForceZero(sha384, sizeof(*sha384));
2180
112k
}
2181
2182
#endif
2183
#endif /* WOLFSSL_SHA384 */
2184
2185
#ifdef WOLFSSL_SHA512
2186
2187
#if defined(WOLFSSL_KCAPI_HASH)
2188
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2189
2190
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2191
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2192
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2193
2194
#elif defined(MAX3266X_SHA)
2195
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
2196
2197
#else
2198
2199
static int Sha512_Family_GetHash(wc_Sha512* sha512, byte* hash,
2200
                                 int (*finalfp)(wc_Sha512*, byte*))
2201
135
{
2202
135
    int ret;
2203
135
    WC_DECLARE_VAR(tmpSha512, wc_Sha512, 1, 0);
2204
2205
135
    if (sha512 == NULL || hash == NULL) {
2206
0
        return BAD_FUNC_ARG;
2207
0
    }
2208
2209
135
    WC_ALLOC_VAR_EX(tmpSha512, wc_Sha512, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2210
135
        return MEMORY_E);
2211
2212
    /* copy this sha512 into tmpSha */
2213
134
    ret = wc_Sha512Copy(sha512, tmpSha512);
2214
134
    if (ret == 0) {
2215
134
        ret = finalfp(tmpSha512, hash);
2216
134
        wc_Sha512Free(tmpSha512);
2217
134
    }
2218
2219
134
    WC_FREE_VAR_EX(tmpSha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2220
2221
134
    return ret;
2222
135
}
2223
2224
int wc_Sha512GetHash(wc_Sha512* sha512, byte* hash)
2225
135
{
2226
135
    return Sha512_Family_GetHash(sha512, hash, wc_Sha512Final);
2227
135
}
2228
2229
int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst)
2230
230
{
2231
230
    int ret = 0;
2232
2233
230
    if (src == NULL || dst == NULL) {
2234
0
        return BAD_FUNC_ARG;
2235
0
    }
2236
2237
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_COPY)
2238
    #ifndef WOLF_CRYPTO_CB_FIND
2239
    if (src->devId != INVALID_DEVID)
2240
    #endif
2241
    {
2242
        /* Cast the source and destination to be void to keep the abstraction */
2243
        ret = wc_CryptoCb_Copy(src->devId, WC_ALGO_TYPE_HASH,
2244
                               WC_HASH_TYPE_SHA512, (void*)src, (void*)dst);
2245
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2246
            return ret;
2247
        /* fall-through when unavailable */
2248
    }
2249
    ret = 0; /* Reset ret to 0 to avoid returning the callback error code */
2250
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_COPY */
2251
2252
230
    XMEMCPY(dst, src, sizeof(wc_Sha512));
2253
#ifdef WOLFSSL_SMALL_STACK_CACHE
2254
    /* This allocation combines the customary W buffer used by
2255
     * _Transform_Sha512() with additional buffer space used by
2256
     * wc_Sha512Transform().
2257
     */
2258
    dst->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE,
2259
                               dst->heap, DYNAMIC_TYPE_DIGEST);
2260
    if (dst->W == NULL) {
2261
        XMEMSET(dst, 0, sizeof(wc_Sha512));
2262
        return MEMORY_E;
2263
    }
2264
#endif
2265
2266
#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) && \
2267
    defined(WOLFSSL_SILABS_SHA512)
2268
    dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx;
2269
    dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx;
2270
#endif
2271
2272
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
2273
    ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
2274
#endif
2275
2276
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2277
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
2278
    #if defined(CONFIG_IDF_TARGET_ESP32)
2279
    if (ret == 0) {
2280
        ret = esp_sha512_ctx_copy(src, dst);
2281
    }
2282
    #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \
2283
          defined(CONFIG_IDF_TARGET_ESP8684) || \
2284
          defined(CONFIG_IDF_TARGET_ESP32C3) || \
2285
          defined(CONFIG_IDF_TARGET_ESP32C6)
2286
        ESP_LOGV(TAG, "No SHA-512 HW on the ESP32-C3");
2287
2288
    #elif defined(CONFIG_IDF_TARGET_ESP32S2) || \
2289
          defined(CONFIG_IDF_TARGET_ESP32S3)
2290
        if (ret == 0) {
2291
            ret = esp_sha512_ctx_copy(src, dst);
2292
        }
2293
    #else
2294
        ESP_LOGW(TAG, "No SHA384 HW or not yet implemented for %s",
2295
                       CONFIG_IDF_TARGET);
2296
    #endif
2297
2298
#endif /* WOLFSSL_USE_ESP32_CRYPT_HASH_HW */
2299
2300
230
#ifdef WOLFSSL_HASH_FLAGS
2301
230
     dst->flags |= WC_HASH_FLAG_ISCOPY;
2302
230
#endif
2303
2304
#if defined(WOLFSSL_HASH_KEEP)
2305
    if (src->msg != NULL) {
2306
        dst->msg = (byte*)XMALLOC(src->len, dst->heap, DYNAMIC_TYPE_TMP_BUFFER);
2307
        if (dst->msg == NULL)
2308
            return MEMORY_E;
2309
        XMEMCPY(dst->msg, src->msg, src->len);
2310
    }
2311
#endif
2312
2313
#ifdef MAX3266X_SHA_CB
2314
    ret = wc_MXC_TPU_SHA_Copy(&(src->mxcCtx), &(dst->mxcCtx));
2315
    if (ret != 0) {
2316
        return ret;
2317
    }
2318
#endif
2319
2320
#if defined(PSOC6_HASH_SHA2)
2321
    wc_Psoc6_Sha1_Sha2_Init(dst, WC_PSOC6_SHA512, 0);
2322
#endif
2323
2324
230
    return ret;
2325
230
}
2326
2327
#endif /* WOLFSSL_KCAPI_HASH */
2328
2329
#ifdef WOLFSSL_HASH_FLAGS
2330
int wc_Sha512SetFlags(wc_Sha512* sha512, word32 flags)
2331
95.6k
{
2332
95.6k
    if (sha512) {
2333
95.6k
        sha512->flags = flags;
2334
95.6k
    }
2335
95.6k
    return 0;
2336
95.6k
}
2337
int wc_Sha512GetFlags(wc_Sha512* sha512, word32* flags)
2338
0
{
2339
0
    if (sha512 && flags) {
2340
0
        *flags = sha512->flags;
2341
0
    }
2342
0
    return 0;
2343
0
}
2344
#endif /* WOLFSSL_HASH_FLAGS */
2345
2346
#if !defined(WOLFSSL_NOSHA512_224) && \
2347
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
2348
2349
#if defined(STM32_HASH_SHA512_224)
2350
2351
int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId)
2352
{
2353
    if (sha512 == NULL)
2354
        return BAD_FUNC_ARG;
2355
2356
    (void)devId;
2357
    (void)heap;
2358
2359
    XMEMSET(sha512, 0, sizeof(wc_Sha512));
2360
    wc_Stm32_Hash_Init(&sha512->stmCtx);
2361
    return 0;
2362
}
2363
2364
int wc_Sha512_224Update(wc_Sha512* sha512, const byte* data, word32 len)
2365
{
2366
    int ret = 0;
2367
2368
    if (sha512 == NULL) {
2369
        return BAD_FUNC_ARG;
2370
    }
2371
    if (data == NULL && len == 0) {
2372
        /* valid, but do nothing */
2373
        return 0;
2374
    }
2375
    if (data == NULL) {
2376
        return BAD_FUNC_ARG;
2377
    }
2378
2379
    ret = wolfSSL_CryptHwMutexLock();
2380
    if (ret == 0) {
2381
        ret = wc_Stm32_Hash_Update(&sha512->stmCtx,
2382
            HASH_ALGOSELECTION_SHA512_224, data, len, WC_SHA512_224_BLOCK_SIZE);
2383
        wolfSSL_CryptHwMutexUnLock();
2384
    }
2385
    return ret;
2386
}
2387
2388
int wc_Sha512_224Final(wc_Sha512* sha512, byte* hash)
2389
{
2390
    int ret = 0;
2391
2392
    if (sha512 == NULL || hash == NULL) {
2393
        return BAD_FUNC_ARG;
2394
    }
2395
2396
    ret = wolfSSL_CryptHwMutexLock();
2397
    if (ret == 0) {
2398
        ret = wc_Stm32_Hash_Final(&sha512->stmCtx,
2399
            HASH_ALGOSELECTION_SHA512_224, hash, WC_SHA512_224_DIGEST_SIZE);
2400
        wolfSSL_CryptHwMutexUnLock();
2401
    }
2402
2403
    (void)wc_InitSha512_224(sha512); /* reset state */
2404
2405
    return ret;
2406
}
2407
#elif defined(PSOC6_HASH_SHA2)
2408
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2409
#endif
2410
int wc_InitSha512_224(wc_Sha512* sha)
2411
0
{
2412
0
    return wc_InitSha512_224_ex(sha, NULL, INVALID_DEVID);
2413
0
}
2414
#if !defined(STM32_HASH_SHA512_224) && !defined(PSOC6_HASH_SHA2)
2415
int wc_Sha512_224Update(wc_Sha512* sha, const byte* data, word32 len)
2416
701
{
2417
701
    return wc_Sha512Update(sha, data, len);
2418
701
}
2419
#endif
2420
#if defined(WOLFSSL_KCAPI_HASH)
2421
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2422
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2423
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2424
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2425
2426
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2427
#elif defined(STM32_HASH_SHA512_224)
2428
#elif defined(PSOC6_HASH_SHA2)
2429
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2430
2431
#else
2432
int wc_Sha512_224FinalRaw(wc_Sha512* sha, byte* hash)
2433
0
{
2434
0
    return Sha512FinalRaw(sha, hash, WC_SHA512_224_DIGEST_SIZE);
2435
0
}
2436
2437
int wc_Sha512_224Final(wc_Sha512* sha512, byte* hash)
2438
701
{
2439
701
    return Sha512_Family_Final(sha512, hash, WC_SHA512_224_DIGEST_SIZE,
2440
701
                               InitSha512_224);
2441
701
}
2442
#endif /* else none of the above: WOLFSSL_KCAPI_HASH, WOLFSSL_SE050 */
2443
2444
void wc_Sha512_224Free(wc_Sha512* sha)
2445
701
{
2446
701
    wc_Sha512Free(sha);
2447
701
}
2448
2449
#if defined(WOLFSSL_KCAPI_HASH)
2450
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2451
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2452
2453
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2454
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2455
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2456
2457
#else
2458
int wc_Sha512_224GetHash(wc_Sha512* sha512, byte* hash)
2459
0
{
2460
0
    return Sha512_Family_GetHash(sha512, hash, wc_Sha512_224Final);
2461
0
}
2462
2463
int wc_Sha512_224Copy(wc_Sha512* src, wc_Sha512* dst)
2464
0
{
2465
0
    return wc_Sha512Copy(src, dst);
2466
0
}
2467
#endif /* else none of the above: WOLFSSL_KCAPI_HASH, WOLFSSL_SE050 */
2468
2469
#ifdef WOLFSSL_HASH_FLAGS
2470
int wc_Sha512_224SetFlags(wc_Sha512* sha, word32 flags)
2471
0
{
2472
0
    return wc_Sha512SetFlags(sha, flags);
2473
0
}
2474
int wc_Sha512_224GetFlags(wc_Sha512* sha, word32* flags)
2475
0
{
2476
0
    return wc_Sha512GetFlags(sha, flags);
2477
0
}
2478
#endif /* WOLFSSL_HASH_FLAGS */
2479
2480
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
2481
int wc_Sha512_224Transform(wc_Sha512* sha, const unsigned char* data)
2482
{
2483
    return wc_Sha512Transform(sha, data);
2484
}
2485
#endif /* OPENSSL_EXTRA */
2486
2487
2488
#endif /* !WOLFSSL_NOSHA512_224 && !FIPS ... */
2489
2490
#if !defined(WOLFSSL_NOSHA512_256) && \
2491
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
2492
#if defined(STM32_HASH_SHA512_256)
2493
2494
    int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId)
2495
    {
2496
        if (sha512 == NULL)
2497
            return BAD_FUNC_ARG;
2498
2499
        (void)devId;
2500
        (void)heap;
2501
2502
        XMEMSET(sha512, 0, sizeof(wc_Sha512));
2503
        wc_Stm32_Hash_Init(&sha512->stmCtx);
2504
        return 0;
2505
    }
2506
2507
    int wc_Sha512_256Update(wc_Sha512* sha512, const byte* data, word32 len)
2508
    {
2509
        int ret = 0;
2510
2511
        if (sha512 == NULL) {
2512
            return BAD_FUNC_ARG;
2513
        }
2514
        if (data == NULL && len == 0) {
2515
            /* valid, but do nothing */
2516
            return 0;
2517
        }
2518
        if (data == NULL) {
2519
            return BAD_FUNC_ARG;
2520
        }
2521
2522
        ret = wolfSSL_CryptHwMutexLock();
2523
        if (ret == 0) {
2524
            ret = wc_Stm32_Hash_Update(&sha512->stmCtx,
2525
                HASH_ALGOSELECTION_SHA512_256, data, len, WC_SHA512_256_BLOCK_SIZE);
2526
            wolfSSL_CryptHwMutexUnLock();
2527
        }
2528
        return ret;
2529
    }
2530
2531
    int wc_Sha512_256Final(wc_Sha512* sha512, byte* hash)
2532
    {
2533
        int ret = 0;
2534
2535
        if (sha512 == NULL || hash == NULL) {
2536
            return BAD_FUNC_ARG;
2537
        }
2538
2539
        ret = wolfSSL_CryptHwMutexLock();
2540
        if (ret == 0) {
2541
            ret = wc_Stm32_Hash_Final(&sha512->stmCtx,
2542
                HASH_ALGOSELECTION_SHA512_256, hash, WC_SHA512_256_DIGEST_SIZE);
2543
            wolfSSL_CryptHwMutexUnLock();
2544
        }
2545
2546
        (void)wc_InitSha512_256(sha512); /* reset state */
2547
2548
        return ret;
2549
    }
2550
#elif defined(PSOC6_HASH_SHA2)
2551
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2552
#endif
2553
int wc_InitSha512_256(wc_Sha512* sha)
2554
0
{
2555
0
    return wc_InitSha512_256_ex(sha, NULL, INVALID_DEVID);
2556
0
}
2557
#if !defined(STM32_HASH_SHA512_256) && !defined(PSOC6_HASH_SHA2)
2558
int wc_Sha512_256Update(wc_Sha512* sha, const byte* data, word32 len)
2559
188
{
2560
188
    return wc_Sha512Update(sha, data, len);
2561
188
}
2562
#endif
2563
#if defined(WOLFSSL_KCAPI_HASH)
2564
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2565
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2566
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2567
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2568
2569
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2570
#elif defined(STM32_HASH_SHA512_256)
2571
#elif defined(PSOC6_HASH_SHA2)
2572
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2573
#else
2574
int wc_Sha512_256FinalRaw(wc_Sha512* sha, byte* hash)
2575
0
{
2576
0
    return Sha512FinalRaw(sha, hash, WC_SHA512_256_DIGEST_SIZE);
2577
0
}
2578
2579
int wc_Sha512_256Final(wc_Sha512* sha512, byte* hash)
2580
188
{
2581
188
    return Sha512_Family_Final(sha512, hash, WC_SHA512_256_DIGEST_SIZE,
2582
188
                               InitSha512_256);
2583
188
}
2584
#endif
2585
2586
void wc_Sha512_256Free(wc_Sha512* sha)
2587
188
{
2588
188
    wc_Sha512Free(sha);
2589
188
}
2590
2591
#if defined(WOLFSSL_KCAPI_HASH)
2592
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2593
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2594
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2595
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2596
2597
#else
2598
int wc_Sha512_256GetHash(wc_Sha512* sha512, byte* hash)
2599
0
{
2600
0
    return Sha512_Family_GetHash(sha512, hash, wc_Sha512_256Final);
2601
0
}
2602
int wc_Sha512_256Copy(wc_Sha512* src, wc_Sha512* dst)
2603
0
{
2604
0
    return wc_Sha512Copy(src, dst);
2605
0
}
2606
#endif
2607
2608
#ifdef WOLFSSL_HASH_FLAGS
2609
int wc_Sha512_256SetFlags(wc_Sha512* sha, word32 flags)
2610
0
{
2611
0
    return wc_Sha512SetFlags(sha, flags);
2612
0
}
2613
int wc_Sha512_256GetFlags(wc_Sha512* sha, word32* flags)
2614
0
{
2615
0
    return wc_Sha512GetFlags(sha, flags);
2616
0
}
2617
#endif /* WOLFSSL_HASH_FLAGS */
2618
2619
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
2620
int wc_Sha512_256Transform(wc_Sha512* sha, const unsigned char* data)
2621
{
2622
    return wc_Sha512Transform(sha, data);
2623
}
2624
#endif /* OPENSSL_EXTRA */
2625
2626
2627
#endif /* !WOLFSSL_NOSHA512_256 && !FIPS ... */
2628
2629
#endif /* WOLFSSL_SHA512 */
2630
2631
#ifdef WOLFSSL_SHA384
2632
2633
#if defined(WOLFSSL_KCAPI_HASH)
2634
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2635
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2636
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2637
    /* functions defined in wolfcrypt/src/port/renesas/renesas_fspsm_sha.c */
2638
#elif defined(MAX3266X_SHA)
2639
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
2640
2641
#else
2642
2643
int wc_Sha384GetHash(wc_Sha384* sha384, byte* hash)
2644
1.23k
{
2645
1.23k
    int ret;
2646
1.23k
    WC_DECLARE_VAR(tmpSha384, wc_Sha384, 1, 0);
2647
2648
1.23k
    if (sha384 == NULL || hash == NULL) {
2649
0
        return BAD_FUNC_ARG;
2650
0
    }
2651
2652
1.23k
    WC_ALLOC_VAR_EX(tmpSha384, wc_Sha384, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2653
1.23k
        return MEMORY_E);
2654
2655
    /* copy this sha384 into tmpSha */
2656
1.22k
    ret = wc_Sha384Copy(sha384, tmpSha384);
2657
1.22k
    if (ret == 0) {
2658
1.22k
        ret = wc_Sha384Final(tmpSha384, hash);
2659
1.22k
        wc_Sha384Free(tmpSha384);
2660
1.22k
    }
2661
2662
1.22k
    WC_FREE_VAR_EX(tmpSha384, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2663
2664
1.22k
    return ret;
2665
1.23k
}
2666
2667
int wc_Sha384Copy(wc_Sha384* src, wc_Sha384* dst)
2668
1.24k
{
2669
1.24k
    int ret = 0;
2670
2671
1.24k
    if (src == NULL || dst == NULL) {
2672
0
        return BAD_FUNC_ARG;
2673
0
    }
2674
2675
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_COPY)
2676
    #ifndef WOLF_CRYPTO_CB_FIND
2677
    if (src->devId != INVALID_DEVID)
2678
    #endif
2679
    {
2680
        /* Cast the source and destination to be void to keep the abstraction */
2681
        ret = wc_CryptoCb_Copy(src->devId, WC_ALGO_TYPE_HASH,
2682
                               WC_HASH_TYPE_SHA384, (void*)src, (void*)dst);
2683
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2684
            return ret;
2685
        /* fall-through when unavailable */
2686
    }
2687
    ret = 0; /* Reset ret to 0 to avoid returning the callback error code */
2688
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_COPY */
2689
2690
1.24k
    XMEMCPY(dst, src, sizeof(wc_Sha384));
2691
2692
#ifdef WOLFSSL_SMALL_STACK_CACHE
2693
    /* This allocation combines the customary W buffer used by
2694
     * _Transform_Sha512() with additional buffer space used by
2695
     * wc_Sha512Transform().
2696
     */
2697
    dst->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA384_BLOCK_SIZE,
2698
                               dst->heap, DYNAMIC_TYPE_DIGEST);
2699
    if (dst->W == NULL) {
2700
        XMEMSET(dst, 0, sizeof(wc_Sha384));
2701
        return MEMORY_E;
2702
    }
2703
#endif
2704
2705
#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) && \
2706
    defined(WOLFSSL_SILABS_SHA384)
2707
    dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx;
2708
    dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx;
2709
#endif
2710
2711
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2712
    ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
2713
#endif
2714
2715
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2716
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
2717
    #if defined(CONFIG_IDF_TARGET_ESP32)
2718
        esp_sha384_ctx_copy(src, dst);
2719
    #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \
2720
          defined(CONFIG_IDF_TARGET_ESP8684) || \
2721
          defined(CONFIG_IDF_TARGET_ESP32C3) || \
2722
          defined(CONFIG_IDF_TARGET_ESP32C6)
2723
        ESP_LOGV(TAG, "No SHA-384 HW on the ESP32-C3");
2724
    #elif defined(CONFIG_IDF_TARGET_ESP32S2) || \
2725
          defined(CONFIG_IDF_TARGET_ESP32S3)
2726
        esp_sha384_ctx_copy(src, dst);
2727
    #else
2728
        ESP_LOGW(TAG, "No SHA384 HW or not yet implemented for %s",
2729
                       CONFIG_IDF_TARGET);
2730
    #endif
2731
#endif
2732
2733
#ifdef HAVE_ARIA
2734
    dst->hSession = NULL;
2735
    if((src->hSession != NULL) && (MC_CopySession(src->hSession, &(dst->hSession)) != MC_OK)) {
2736
        return MEMORY_E;
2737
    }
2738
#endif
2739
2740
1.24k
#ifdef WOLFSSL_HASH_FLAGS
2741
1.24k
     dst->flags |= WC_HASH_FLAG_ISCOPY;
2742
1.24k
#endif
2743
2744
#if defined(WOLFSSL_HASH_KEEP)
2745
    if (src->msg != NULL) {
2746
        dst->msg = (byte*)XMALLOC(src->len, dst->heap, DYNAMIC_TYPE_TMP_BUFFER);
2747
        if (dst->msg == NULL)
2748
            return MEMORY_E;
2749
        XMEMCPY(dst->msg, src->msg, src->len);
2750
    }
2751
#endif
2752
2753
#ifdef MAX3266X_SHA_CB
2754
    ret = wc_MXC_TPU_SHA_Copy(&(src->mxcCtx), &(dst->mxcCtx));
2755
    if (ret != 0) {
2756
        return ret;
2757
    }
2758
#endif
2759
2760
#if defined(PSOC6_HASH_SHA2)
2761
    wc_Psoc6_Sha1_Sha2_Init(dst, WC_PSOC6_SHA384, 0);
2762
#endif
2763
2764
1.24k
    return ret;
2765
1.24k
}
2766
2767
#endif /* WOLFSSL_KCAPI_HASH */
2768
2769
#ifdef WOLFSSL_HASH_FLAGS
2770
int wc_Sha384SetFlags(wc_Sha384* sha384, word32 flags)
2771
95.6k
{
2772
95.6k
    if (sha384) {
2773
95.6k
        sha384->flags = flags;
2774
95.6k
    }
2775
95.6k
    return 0;
2776
95.6k
}
2777
int wc_Sha384GetFlags(wc_Sha384* sha384, word32* flags)
2778
0
{
2779
0
    if (sha384 && flags) {
2780
0
        *flags = sha384->flags;
2781
0
    }
2782
0
    return 0;
2783
0
}
2784
#endif
2785
2786
#endif /* WOLFSSL_SHA384 */
2787
2788
#ifdef WOLFSSL_HASH_KEEP
2789
/* Some hardware have issues with update, this function stores the data to be
2790
 * hashed into an array. Once ready, the Final operation is called on all of the
2791
 * data to be hashed at once.
2792
 * returns 0 on success
2793
 */
2794
int wc_Sha512_Grow(wc_Sha512* sha512, const byte* in, int inSz)
2795
{
2796
    return _wc_Hash_Grow(&(sha512->msg), &(sha512->used), &(sha512->len), in,
2797
                        inSz, sha512->heap);
2798
}
2799
#ifdef WOLFSSL_SHA384
2800
int wc_Sha384_Grow(wc_Sha384* sha384, const byte* in, int inSz)
2801
{
2802
    return _wc_Hash_Grow(&(sha384->msg), &(sha384->used), &(sha384->len), in,
2803
                        inSz, sha384->heap);
2804
}
2805
#endif /* WOLFSSL_SHA384 */
2806
#endif /* WOLFSSL_HASH_KEEP */
2807
#endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */