Coverage Report

Created: 2025-12-31 07:08

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
142k
{
286
142k
    if (sha512 == NULL)
287
0
        return BAD_FUNC_ARG;
288
289
142k
    sha512->digest[0] = W64LIT(0x6a09e667f3bcc908);
290
142k
    sha512->digest[1] = W64LIT(0xbb67ae8584caa73b);
291
142k
    sha512->digest[2] = W64LIT(0x3c6ef372fe94f82b);
292
142k
    sha512->digest[3] = W64LIT(0xa54ff53a5f1d36f1);
293
142k
    sha512->digest[4] = W64LIT(0x510e527fade682d1);
294
142k
    sha512->digest[5] = W64LIT(0x9b05688c2b3e6c1f);
295
142k
    sha512->digest[6] = W64LIT(0x1f83d9abfb41bd6b);
296
142k
    sha512->digest[7] = W64LIT(0x5be0cd19137e2179);
297
298
142k
    sha512->buffLen = 0;
299
142k
    sha512->loLen   = 0;
300
142k
    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
142k
#ifdef WOLFSSL_HASH_FLAGS
322
142k
    sha512->flags = 0;
323
142k
#endif
324
#if defined(WOLFSSL_SHA512_HASHTYPE)
325
    sha512->hashType = WC_HASH_TYPE_SHA512;
326
#endif /* WOLFSSL_SHA512_HASHTYPE */
327
142k
    return 0;
328
142k
}
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.21k
{
341
1.21k
    if (sha512 == NULL)
342
0
        return BAD_FUNC_ARG;
343
344
1.21k
    sha512->digest[0] = W64LIT(0x8c3d37c819544da2);
345
1.21k
    sha512->digest[1] = W64LIT(0x73e1996689dcd4d6);
346
1.21k
    sha512->digest[2] = W64LIT(0x1dfab7ae32ff9c82);
347
1.21k
    sha512->digest[3] = W64LIT(0x679dd514582f9fcf);
348
1.21k
    sha512->digest[4] = W64LIT(0x0f6d2b697bd44da8);
349
1.21k
    sha512->digest[5] = W64LIT(0x77e36f7304c48942);
350
1.21k
    sha512->digest[6] = W64LIT(0x3f9d85a86a1d36c8);
351
1.21k
    sha512->digest[7] = W64LIT(0x1112e6ad91d692a1);
352
353
1.21k
    sha512->buffLen = 0;
354
1.21k
    sha512->loLen   = 0;
355
1.21k
    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.21k
#ifdef WOLFSSL_HASH_FLAGS
379
1.21k
    sha512->flags = 0;
380
1.21k
#endif
381
#if defined(WOLFSSL_SHA512_HASHTYPE)
382
    sha512->hashType = WC_HASH_TYPE_SHA512_224;
383
#endif /* WOLFSSL_SHA512_HASHTYPE */
384
1.21k
    return 0;
385
1.21k
}
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
442
{
398
442
    if (sha512 == NULL)
399
0
        return BAD_FUNC_ARG;
400
401
442
    sha512->digest[0] = W64LIT(0x22312194fc2bf72c);
402
442
    sha512->digest[1] = W64LIT(0x9f555fa3c84c64c2);
403
442
    sha512->digest[2] = W64LIT(0x2393b86b6f53b151);
404
442
    sha512->digest[3] = W64LIT(0x963877195940eabd);
405
442
    sha512->digest[4] = W64LIT(0x96283ee2a88effe3);
406
442
    sha512->digest[5] = W64LIT(0xbe5e1e2553863992);
407
442
    sha512->digest[6] = W64LIT(0x2b0199fc2c85b8aa);
408
442
    sha512->digest[7] = W64LIT(0x0eb72ddc81c52ca2);
409
410
442
    sha512->buffLen = 0;
411
442
    sha512->loLen   = 0;
412
442
    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
442
#ifdef WOLFSSL_HASH_FLAGS
436
442
    sha512->flags = 0;
437
442
#endif
438
#if defined(WOLFSSL_SHA512_HASHTYPE)
439
    sha512->hashType = WC_HASH_TYPE_SHA512_256;
440
#endif /* WOLFSSL_SHA512_HASHTYPE */
441
442
    return 0;
442
442
}
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
640k
    #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
107k
{
864
107k
    int ret = 0;
865
866
107k
    if (sha512 == NULL) {
867
0
        return BAD_FUNC_ARG;
868
0
    }
869
870
871
107k
    sha512->heap = heap;
872
#ifdef WOLFSSL_SMALL_STACK_CACHE
873
    /* This allocation combines the customary W buffer used by
874
     * _Transform_Sha512() with additional buffer space used by
875
     * wc_Sha512Transform().
876
     */
877
    sha512->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE,
878
                                  sha512->heap, DYNAMIC_TYPE_DIGEST);
879
    if (sha512->W == NULL)
880
        return MEMORY_E;
881
#endif
882
107k
#ifdef WOLF_CRYPTO_CB
883
107k
    sha512->devId = devId;
884
107k
    sha512->devCtx = NULL;
885
107k
#endif
886
887
    /* call the initialization function pointed to by initfp */
888
107k
    ret = initfp(sha512);
889
107k
    if (ret != 0)
890
0
        return ret;
891
892
#ifdef WOLFSSL_HASH_KEEP
893
    sha512->msg  = NULL;
894
    sha512->len  = 0;
895
    sha512->used = 0;
896
#endif
897
898
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
899
    ret = wolfAsync_DevCtxInit(&sha512->asyncDev,
900
                        WOLFSSL_ASYNC_MARKER_SHA512, sha512->heap, devId);
901
#else
902
107k
    (void)devId;
903
107k
#endif /* WOLFSSL_ASYNC_CRYPT */
904
#ifdef WOLFSSL_IMXRT1170_CAAM
905
     ret = wc_CAAM_HashInit(&sha512->hndl, &sha512->ctx, WC_HASH_TYPE_SHA512);
906
#endif
907
107k
    return ret;
908
107k
} /* InitSha512_Family */
909
910
int wc_InitSha512_ex(wc_Sha512* sha512, void* heap, int devId)
911
107k
{
912
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
913
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
914
    if (sha512->ctx.mode != ESP32_SHA_INIT) {
915
        ESP_LOGV(TAG, "Set ctx mode from prior value: "
916
                      "%d", sha512->ctx.mode);
917
    }
918
    /* We know this is a fresh, uninitialized item, so set to INIT */
919
    sha512->ctx.mode = ESP32_SHA_INIT;
920
#endif
921
922
#ifdef MAX3266X_SHA_CB
923
    if (wc_MXC_TPU_SHA_Init(&(sha512->mxcCtx)) != 0){
924
        return BAD_FUNC_ARG;
925
    }
926
#endif
927
928
107k
    return InitSha512_Family(sha512, heap, devId, InitSha512);
929
107k
}
930
931
#if !defined(WOLFSSL_NOSHA512_224) && \
932
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
933
int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId)
934
608
{
935
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
936
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
937
    /* No SHA512/224 HW support is available, set to SW. */
938
    sha512->ctx.mode = ESP32_SHA_SW; /* no SHA224 HW, so always SW */
939
#endif
940
608
    return InitSha512_Family(sha512, heap, devId, InitSha512_224);
941
608
}
942
#endif /* !WOLFSSL_NOSHA512_224 ... */
943
944
#if !defined(WOLFSSL_NOSHA512_256) && \
945
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
946
int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId)
947
221
{
948
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
949
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
950
    /* No SHA512/256 HW support is available on ESP32, set to SW. */
951
    sha512->ctx.mode = ESP32_SHA_SW;
952
#endif
953
221
    return InitSha512_Family(sha512, heap, devId, InitSha512_256);
954
221
}
955
#endif /* !WOLFSSL_NOSHA512_256 ... */
956
957
#endif /* WOLFSSL_SHA512 */
958
959
#ifndef WOLFSSL_ARMASM
960
961
static const word64 K512[80] = {
962
    W64LIT(0x428a2f98d728ae22), W64LIT(0x7137449123ef65cd),
963
    W64LIT(0xb5c0fbcfec4d3b2f), W64LIT(0xe9b5dba58189dbbc),
964
    W64LIT(0x3956c25bf348b538), W64LIT(0x59f111f1b605d019),
965
    W64LIT(0x923f82a4af194f9b), W64LIT(0xab1c5ed5da6d8118),
966
    W64LIT(0xd807aa98a3030242), W64LIT(0x12835b0145706fbe),
967
    W64LIT(0x243185be4ee4b28c), W64LIT(0x550c7dc3d5ffb4e2),
968
    W64LIT(0x72be5d74f27b896f), W64LIT(0x80deb1fe3b1696b1),
969
    W64LIT(0x9bdc06a725c71235), W64LIT(0xc19bf174cf692694),
970
    W64LIT(0xe49b69c19ef14ad2), W64LIT(0xefbe4786384f25e3),
971
    W64LIT(0x0fc19dc68b8cd5b5), W64LIT(0x240ca1cc77ac9c65),
972
    W64LIT(0x2de92c6f592b0275), W64LIT(0x4a7484aa6ea6e483),
973
    W64LIT(0x5cb0a9dcbd41fbd4), W64LIT(0x76f988da831153b5),
974
    W64LIT(0x983e5152ee66dfab), W64LIT(0xa831c66d2db43210),
975
    W64LIT(0xb00327c898fb213f), W64LIT(0xbf597fc7beef0ee4),
976
    W64LIT(0xc6e00bf33da88fc2), W64LIT(0xd5a79147930aa725),
977
    W64LIT(0x06ca6351e003826f), W64LIT(0x142929670a0e6e70),
978
    W64LIT(0x27b70a8546d22ffc), W64LIT(0x2e1b21385c26c926),
979
    W64LIT(0x4d2c6dfc5ac42aed), W64LIT(0x53380d139d95b3df),
980
    W64LIT(0x650a73548baf63de), W64LIT(0x766a0abb3c77b2a8),
981
    W64LIT(0x81c2c92e47edaee6), W64LIT(0x92722c851482353b),
982
    W64LIT(0xa2bfe8a14cf10364), W64LIT(0xa81a664bbc423001),
983
    W64LIT(0xc24b8b70d0f89791), W64LIT(0xc76c51a30654be30),
984
    W64LIT(0xd192e819d6ef5218), W64LIT(0xd69906245565a910),
985
    W64LIT(0xf40e35855771202a), W64LIT(0x106aa07032bbd1b8),
986
    W64LIT(0x19a4c116b8d2d0c8), W64LIT(0x1e376c085141ab53),
987
    W64LIT(0x2748774cdf8eeb99), W64LIT(0x34b0bcb5e19b48a8),
988
    W64LIT(0x391c0cb3c5c95a63), W64LIT(0x4ed8aa4ae3418acb),
989
    W64LIT(0x5b9cca4f7763e373), W64LIT(0x682e6ff3d6b2b8a3),
990
    W64LIT(0x748f82ee5defb2fc), W64LIT(0x78a5636f43172f60),
991
    W64LIT(0x84c87814a1f0ab72), W64LIT(0x8cc702081a6439ec),
992
    W64LIT(0x90befffa23631e28), W64LIT(0xa4506cebde82bde9),
993
    W64LIT(0xbef9a3f7b2c67915), W64LIT(0xc67178f2e372532b),
994
    W64LIT(0xca273eceea26619c), W64LIT(0xd186b8c721c0c207),
995
    W64LIT(0xeada7dd6cde0eb1e), W64LIT(0xf57d4f7fee6ed178),
996
    W64LIT(0x06f067aa72176fba), W64LIT(0x0a637dc5a2c898a6),
997
    W64LIT(0x113f9804bef90dae), W64LIT(0x1b710b35131c471b),
998
    W64LIT(0x28db77f523047d84), W64LIT(0x32caab7b40c72493),
999
    W64LIT(0x3c9ebe0a15c9bebc), W64LIT(0x431d67c49c100d4c),
1000
    W64LIT(0x4cc5d4becb3e42b6), W64LIT(0x597f299cfc657e2a),
1001
    W64LIT(0x5fcb6fab3ad6faec), W64LIT(0x6c44198c4a475817)
1002
};
1003
1004
9.94M
#define blk0(i) (W[i] = sha512->buffer[i])
1005
1006
39.7M
#define blk2(i) (\
1007
39.7M
               W[ (i)     & 15] += \
1008
39.7M
            s1(W[((i)-2)  & 15])+ \
1009
39.7M
               W[((i)-7)  & 15] + \
1010
39.7M
            s0(W[((i)-15) & 15])  \
1011
39.7M
        )
1012
1013
49.7M
#define Ch(x,y,z)  ((z) ^ ((x) & ((y) ^ (z))))
1014
49.7M
#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
1015
1016
621k
#define a(i) T[(0-(i)) & 7]
1017
621k
#define b(i) T[(1-(i)) & 7]
1018
621k
#define c(i) T[(2-(i)) & 7]
1019
50.3M
#define d(i) T[(3-(i)) & 7]
1020
621k
#define e(i) T[(4-(i)) & 7]
1021
621k
#define f(i) T[(5-(i)) & 7]
1022
621k
#define g(i) T[(6-(i)) & 7]
1023
149M
#define h(i) T[(7-(i)) & 7]
1024
1025
49.7M
#define S0(x) (rotrFixed64(x,28) ^ rotrFixed64(x,34) ^ rotrFixed64(x,39))
1026
49.7M
#define S1(x) (rotrFixed64(x,14) ^ rotrFixed64(x,18) ^ rotrFixed64(x,41))
1027
39.7M
#define s0(x) (rotrFixed64(x,1)  ^ rotrFixed64(x,8)  ^ ((x)>>7))
1028
39.7M
#define s1(x) (rotrFixed64(x,19) ^ rotrFixed64(x,61) ^ ((x)>>6))
1029
1030
#define R(i) \
1031
49.7M
    h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[(i)+j] + (j ? blk2(i) : blk0(i)); \
1032
49.7M
    d(i) += h(i); \
1033
49.7M
    h(i) += S0(a(i)) + Maj(a(i),b(i),c(i))
1034
1035
static int _Transform_Sha512(wc_Sha512* sha512)
1036
623k
{
1037
623k
    const word64* K = K512;
1038
623k
    word32 j;
1039
623k
    word64 T[8];
1040
1041
#if defined(WOLFSSL_SMALL_STACK_CACHE)
1042
    word64* W = sha512->W;
1043
    if (W == NULL)
1044
        return BAD_FUNC_ARG;
1045
#elif defined(WOLFSSL_SMALL_STACK)
1046
    word64* W;
1047
623k
    W = (word64*) XMALLOC(sizeof(word64) * 16, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1048
623k
    if (W == NULL)
1049
1.44k
        return MEMORY_E;
1050
#else
1051
    word64 W[16];
1052
#endif
1053
1054
    /* Copy digest to working vars */
1055
621k
    XMEMCPY(T, sha512->digest, sizeof(T));
1056
1057
#ifdef USE_SLOW_SHA512
1058
    /* over twice as small, but 50% slower */
1059
    /* 80 operations, not unrolled */
1060
    for (j = 0; j < 80; j += 16) {
1061
        int m;
1062
        for (m = 0; m < 16; m++) { /* braces needed here for macros {} */
1063
            R(m);
1064
        }
1065
    }
1066
#else
1067
    /* 80 operations, partially loop unrolled */
1068
3.72M
    for (j = 0; j < 80; j += 16) {
1069
3.10M
        R( 0); R( 1); R( 2); R( 3);
1070
3.10M
        R( 4); R( 5); R( 6); R( 7);
1071
3.10M
        R( 8); R( 9); R(10); R(11);
1072
3.10M
        R(12); R(13); R(14); R(15);
1073
3.10M
    }
1074
621k
#endif /* USE_SLOW_SHA512 */
1075
1076
    /* Add the working vars back into digest */
1077
621k
    sha512->digest[0] += a(0);
1078
621k
    sha512->digest[1] += b(0);
1079
621k
    sha512->digest[2] += c(0);
1080
621k
    sha512->digest[3] += d(0);
1081
621k
    sha512->digest[4] += e(0);
1082
621k
    sha512->digest[5] += f(0);
1083
621k
    sha512->digest[6] += g(0);
1084
621k
    sha512->digest[7] += h(0);
1085
1086
    /* Wipe variables */
1087
621k
    ForceZero(W, sizeof(word64) * 16);
1088
621k
    ForceZero(T, sizeof(T));
1089
1090
621k
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SMALL_STACK_CACHE)
1091
621k
    XFREE(W, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1092
621k
#endif
1093
1094
621k
    return 0;
1095
623k
}
1096
#endif
1097
1098
1099
static WC_INLINE void AddLength(wc_Sha512* sha512, word32 len)
1100
480k
{
1101
480k
    word64 tmp = sha512->loLen;
1102
480k
    if ( (sha512->loLen += len) < tmp)
1103
0
        sha512->hiLen++;                       /* carry low to high */
1104
480k
}
1105
1106
static WC_INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, word32 len)
1107
604k
{
1108
604k
    int ret = 0;
1109
    /* do block size increments */
1110
604k
    byte* local = (byte*)sha512->buffer;
1111
1112
    /* check that internal buffLen is valid */
1113
604k
    if (sha512->buffLen >= WC_SHA512_BLOCK_SIZE)
1114
22
        return BUFFER_E;
1115
1116
604k
    if (len == 0)
1117
123k
        return 0;
1118
1119
480k
    AddLength(sha512, len);
1120
1121
480k
    if (sha512->buffLen > 0) {
1122
296k
        word32 add = min(len, WC_SHA512_BLOCK_SIZE - sha512->buffLen);
1123
296k
        if (add > 0) {
1124
296k
            XMEMCPY(&local[sha512->buffLen], data, add);
1125
1126
296k
            sha512->buffLen += add;
1127
296k
            data            += add;
1128
296k
            len             -= add;
1129
296k
        }
1130
1131
296k
        if (sha512->buffLen == WC_SHA512_BLOCK_SIZE) {
1132
78.4k
    #if defined(LITTLE_ENDIAN_ORDER)
1133
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1134
            (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1135
            #ifdef WC_C_DYNAMIC_FALLBACK
1136
            if (sha512->sha_method == SHA512_C)
1137
            #else
1138
            if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1139
            #endif
1140
        #endif
1141
78.4k
            {
1142
78.4k
        #if (!defined(WOLFSSL_ESP32_CRYPT) || \
1143
78.4k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1144
78.4k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \
1145
78.4k
             !defined(WOLFSSL_ARMASM)
1146
78.4k
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1147
78.4k
                                                         WC_SHA512_BLOCK_SIZE);
1148
78.4k
        #endif
1149
78.4k
            }
1150
78.4k
    #endif
1151
    #ifdef WOLFSSL_ARMASM
1152
            Transform_Sha512(sha512, (const byte*)sha512->buffer);
1153
    #elif !defined(WOLFSSL_ESP32_CRYPT) || \
1154
           defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1155
           defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1156
78.4k
            ret = Transform_Sha512(sha512);
1157
    #else
1158
            if (sha512->ctx.mode == ESP32_SHA_INIT) {
1159
                esp_sha_try_hw_lock(&sha512->ctx);
1160
            }
1161
            if (sha512->ctx.mode == ESP32_SHA_SW) {
1162
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1163
                                                         WC_SHA512_BLOCK_SIZE);
1164
                ret = Transform_Sha512(sha512);
1165
            }
1166
            else {
1167
                ret = esp_sha512_process(sha512);
1168
            }
1169
    #endif
1170
78.4k
            if (ret == 0)
1171
78.2k
                sha512->buffLen = 0;
1172
233
            else
1173
233
                len = 0;
1174
78.4k
        }
1175
296k
    }
1176
1177
#if defined(WOLFSSL_ARMASM)
1178
    if (len >= WC_SHA512_BLOCK_SIZE) {
1179
        word32 blocksLen = len & ~((word32)WC_SHA512_BLOCK_SIZE-1);
1180
1181
        Transform_Sha512_Len(sha512, data, blocksLen);
1182
        data += blocksLen;
1183
        len  -= blocksLen;
1184
    }
1185
#else
1186
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1187
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
1188
1189
    #ifdef WC_C_DYNAMIC_FALLBACK
1190
    if (sha512->sha_method != SHA512_C)
1191
    #elif defined(WC_NO_INTERNAL_FUNCTION_POINTERS)
1192
    if (sha_method != SHA512_C)
1193
    #else
1194
    if (Transform_Sha512_Len_p != NULL)
1195
    #endif
1196
1197
    {
1198
        word32 blocksLen = len & ~((word32)WC_SHA512_BLOCK_SIZE-1);
1199
1200
        if (blocksLen > 0) {
1201
            sha512->data = data;
1202
            /* Byte reversal performed in function if required. */
1203
            Transform_Sha512_Len(sha512, blocksLen);
1204
            data += blocksLen;
1205
            len  -= blocksLen;
1206
        }
1207
    }
1208
    else
1209
#endif
1210
#if !defined(LITTLE_ENDIAN_ORDER) || (defined(WOLFSSL_X86_64_BUILD) && \
1211
        defined(USE_INTEL_SPEEDUP) && (defined(HAVE_INTEL_AVX1) || \
1212
        defined(HAVE_INTEL_AVX2)))
1213
    {
1214
        while (len >= WC_SHA512_BLOCK_SIZE) {
1215
            XMEMCPY(local, data, WC_SHA512_BLOCK_SIZE);
1216
1217
            data += WC_SHA512_BLOCK_SIZE;
1218
            len  -= WC_SHA512_BLOCK_SIZE;
1219
1220
        #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1221
            (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1222
            #ifdef WC_C_DYNAMIC_FALLBACK
1223
            if (sha512->sha_method == SHA512_C)
1224
            #else
1225
            if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1226
            #endif
1227
            {
1228
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1229
                                                          WC_SHA512_BLOCK_SIZE);
1230
            }
1231
        #endif
1232
            /* Byte reversal performed in function if required. */
1233
            ret = Transform_Sha512(sha512);
1234
            if (ret != 0)
1235
                break;
1236
        }
1237
    }
1238
#else
1239
480k
    {
1240
965k
        while (len >= WC_SHA512_BLOCK_SIZE) {
1241
485k
            XMEMCPY(local, data, WC_SHA512_BLOCK_SIZE);
1242
1243
485k
            data += WC_SHA512_BLOCK_SIZE;
1244
485k
            len  -= WC_SHA512_BLOCK_SIZE;
1245
485k
    #if !defined(WOLFSSL_ESP32_CRYPT) || \
1246
485k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1247
485k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1248
485k
            ByteReverseWords64(sha512->buffer, sha512->buffer,
1249
485k
                                                       WC_SHA512_BLOCK_SIZE);
1250
485k
    #endif
1251
485k
    #if !defined(WOLFSSL_ESP32_CRYPT) || \
1252
485k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1253
485k
         defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1254
485k
            ret = Transform_Sha512(sha512);
1255
    #else
1256
            if(sha512->ctx.mode == ESP32_SHA_INIT) {
1257
                esp_sha_try_hw_lock(&sha512->ctx);
1258
            }
1259
            if (sha512->ctx.mode == ESP32_SHA_SW) {
1260
                ByteReverseWords64(sha512->buffer, sha512->buffer,
1261
                                                          WC_SHA512_BLOCK_SIZE);
1262
                ret = Transform_Sha512(sha512);
1263
            }
1264
            else {
1265
                ret = esp_sha512_process(sha512);
1266
            }
1267
    #endif
1268
485k
            if (ret != 0)
1269
550
                break;
1270
485k
        } /* while (len >= WC_SHA512_BLOCK_SIZE) */
1271
480k
    }
1272
480k
#endif
1273
480k
#endif
1274
1275
480k
    if (ret == 0 && len > 0) {
1276
209k
        XMEMCPY(local, data, len);
1277
209k
        sha512->buffLen = len;
1278
209k
    }
1279
1280
480k
    return ret;
1281
604k
}
1282
1283
#ifdef WOLFSSL_SHA512
1284
1285
int wc_Sha512Update(wc_Sha512* sha512, const byte* data, word32 len)
1286
363k
{
1287
363k
    if (sha512 == NULL) {
1288
0
        return BAD_FUNC_ARG;
1289
0
    }
1290
363k
    if (data == NULL && len == 0) {
1291
        /* valid, but do nothing */
1292
39
        return 0;
1293
39
    }
1294
363k
    if (data == NULL) {
1295
0
        return BAD_FUNC_ARG;
1296
0
    }
1297
1298
363k
#ifdef WOLF_CRYPTO_CB
1299
363k
    #ifndef WOLF_CRYPTO_CB_FIND
1300
363k
    if (sha512->devId != INVALID_DEVID)
1301
5.33k
    #endif
1302
5.33k
    {
1303
5.33k
        int ret = wc_CryptoCb_Sha512Hash(sha512, data, len, NULL, 0);
1304
5.33k
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1305
0
            return ret;
1306
        /* fall-through when unavailable */
1307
5.33k
    }
1308
363k
#endif
1309
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
1310
    if (sha512->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA512) {
1311
    #if defined(HAVE_INTEL_QA)
1312
        return IntelQaSymSha512(&sha512->asyncDev, NULL, data, len);
1313
    #endif
1314
    }
1315
#endif /* WOLFSSL_ASYNC_CRYPT */
1316
1317
363k
    return Sha512Update(sha512, data, len);
1318
363k
}
1319
1320
#endif /* WOLFSSL_SHA512 */
1321
1322
#endif /* WOLFSSL_IMX6_CAAM || WOLFSSL_SILABS_SHA512 */
1323
1324
1325
#if defined(WOLFSSL_KCAPI_HASH)
1326
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1327
#elif defined(WOLFSSL_RENESAS_RSIP) && \
1328
   !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
1329
    /* functions defined in wolfcrypt/src/port/renesas/renesas_fspsm_sha.c */
1330
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
1331
1332
#elif defined(MAX3266X_SHA)
1333
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1334
#elif defined(STM32_HASH_SHA512)
1335
#elif defined(PSOC6_HASH_SHA2)
1336
#else
1337
1338
static WC_INLINE int Sha512Final(wc_Sha512* sha512)
1339
71.6k
{
1340
71.6k
#ifndef WOLFSSL_ARMASM
1341
71.6k
    int ret;
1342
71.6k
#endif
1343
71.6k
    byte* local;
1344
1345
71.6k
    if (sha512 == NULL) {
1346
0
        return BAD_FUNC_ARG;
1347
0
    }
1348
1349
71.6k
    local = (byte*)sha512->buffer;
1350
1351
    /* we'll add a 0x80 byte at the end,
1352
    ** so make sure we have appropriate buffer length. */
1353
71.6k
    if (sha512->buffLen > WC_SHA512_BLOCK_SIZE - 1) {
1354
0
        return BAD_STATE_E;
1355
0
    } /* buffLen check */
1356
1357
71.6k
    local[sha512->buffLen++] = 0x80;  /* add 1 */
1358
1359
    /* pad with zeros */
1360
71.6k
    if (sha512->buffLen > WC_SHA512_PAD_SIZE) {
1361
4.86k
        if (sha512->buffLen < WC_SHA512_BLOCK_SIZE ) {
1362
4.33k
            XMEMSET(&local[sha512->buffLen], 0,
1363
4.33k
                WC_SHA512_BLOCK_SIZE - sha512->buffLen);
1364
4.33k
        }
1365
1366
4.86k
        sha512->buffLen += WC_SHA512_BLOCK_SIZE - sha512->buffLen;
1367
4.86k
#if defined(LITTLE_ENDIAN_ORDER)
1368
    #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1369
        (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1370
        #ifdef WC_C_DYNAMIC_FALLBACK
1371
        if (sha512->sha_method == SHA512_C)
1372
        #else
1373
        if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1374
        #endif
1375
    #endif
1376
4.86k
        {
1377
1378
4.86k
        #if (!defined(WOLFSSL_ESP32_CRYPT) || \
1379
4.86k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1380
4.86k
              defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \
1381
4.86k
             !defined(WOLFSSL_ARMASM)
1382
4.86k
            ByteReverseWords64(sha512->buffer,sha512->buffer,
1383
4.86k
                                                         WC_SHA512_BLOCK_SIZE);
1384
4.86k
        #endif
1385
4.86k
        }
1386
1387
4.86k
#endif /* LITTLE_ENDIAN_ORDER */
1388
#ifdef WOLFSSL_ARMASM
1389
        Transform_Sha512(sha512, (const byte*)sha512->buffer);
1390
#else
1391
    #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
1392
       !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1393
        if (sha512->ctx.mode == ESP32_SHA_INIT) {
1394
            esp_sha_try_hw_lock(&sha512->ctx);
1395
        }
1396
        if (sha512->ctx.mode == ESP32_SHA_SW) {
1397
            ByteReverseWords64(sha512->buffer,sha512->buffer,
1398
                                                         WC_SHA512_BLOCK_SIZE);
1399
            ret = Transform_Sha512(sha512);
1400
        }
1401
        else {
1402
            ret = esp_sha512_process(sha512);
1403
        }
1404
    #else
1405
4.86k
        ret = Transform_Sha512(sha512);
1406
4.86k
    #endif
1407
4.86k
        if (ret != 0) {
1408
48
            return ret;
1409
48
        }
1410
4.81k
#endif
1411
1412
4.81k
        sha512->buffLen = 0;
1413
4.81k
    } /* (sha512->buffLen > WC_SHA512_PAD_SIZE) pad with zeros */
1414
1415
71.6k
    XMEMSET(&local[sha512->buffLen], 0, WC_SHA512_PAD_SIZE - sha512->buffLen);
1416
1417
    /* put lengths in bits */
1418
71.6k
    sha512->hiLen = (sha512->loLen >> (8 * sizeof(sha512->loLen) - 3)) +
1419
71.6k
                                                         (sha512->hiLen << 3);
1420
71.6k
    sha512->loLen = sha512->loLen << 3;
1421
1422
    /* store lengths */
1423
71.6k
#if defined(LITTLE_ENDIAN_ORDER)
1424
    #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1425
        (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1426
        #ifdef WC_C_DYNAMIC_FALLBACK
1427
        if (sha512->sha_method == SHA512_C)
1428
        #else
1429
        if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1430
        #endif
1431
    #endif
1432
71.6k
    #if (!defined(WOLFSSL_ESP32_CRYPT) || \
1433
71.6k
          defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1434
71.6k
          defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)) && \
1435
71.6k
         !defined(WOLFSSL_ARMASM)
1436
71.6k
            ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_PAD_SIZE);
1437
71.6k
    #endif
1438
71.6k
#endif
1439
    /* ! length ordering dependent on digest endian type ! */
1440
1441
71.6k
#if !defined(WOLFSSL_ESP32_CRYPT) || \
1442
71.6k
     defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1443
71.6k
     defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1444
71.6k
    sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2] = sha512->hiLen;
1445
71.6k
    sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 1] = sha512->loLen;
1446
71.6k
#endif
1447
1448
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1449
    (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1450
    #ifdef WC_C_DYNAMIC_FALLBACK
1451
    if (sha512->sha_method != SHA512_C)
1452
    #else
1453
    if (IS_INTEL_AVX1(intel_flags) || IS_INTEL_AVX2(intel_flags))
1454
    #endif
1455
    {
1456
        ByteReverseWords64(&(sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2]),
1457
                           &(sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2]),
1458
                           WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE);
1459
    }
1460
#elif defined(WOLFSSL_ARMASM)
1461
    #define SHA512_PAD_LEN_64  (WC_SHA512_PAD_SIZE / sizeof(word64))
1462
    {
1463
        ByteReverseWords64(&(sha512->buffer[SHA512_PAD_LEN_64]),
1464
                           &(sha512->buffer[SHA512_PAD_LEN_64]),
1465
                           WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE);
1466
    }
1467
#endif
1468
1469
#ifdef WOLFSSL_ARMASM
1470
    Transform_Sha512(sha512, (const byte*)sha512->buffer);
1471
#else
1472
71.6k
#if !defined(WOLFSSL_ESP32_CRYPT) || \
1473
71.6k
      defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \
1474
71.6k
      defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1475
71.6k
    ret = Transform_Sha512(sha512);
1476
#else
1477
    if(sha512->ctx.mode == ESP32_SHA_INIT) {
1478
        /* typically for tiny block: first = last */
1479
        esp_sha_try_hw_lock(&sha512->ctx);
1480
    }
1481
    if (sha512->ctx.mode == ESP32_SHA_SW) {
1482
        ByteReverseWords64(sha512->buffer,
1483
                           sha512->buffer,
1484
                           WC_SHA512_BLOCK_SIZE);
1485
        sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2] = sha512->hiLen;
1486
        sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 1] = sha512->loLen;
1487
        ret = Transform_Sha512(sha512);
1488
    }
1489
    else {
1490
        ret = esp_sha512_digest_process(sha512, 1);
1491
    }
1492
#endif
1493
1494
71.6k
    if (ret != 0)
1495
613
        return ret;
1496
70.9k
#endif
1497
1498
70.9k
    #ifdef LITTLE_ENDIAN_ORDER
1499
70.9k
        ByteReverseWords64(sha512->digest, sha512->digest,
1500
70.9k
            WC_SHA512_DIGEST_SIZE);
1501
70.9k
    #endif
1502
1503
1504
70.9k
    return 0;
1505
71.6k
}
1506
1507
#endif /* WOLFSSL_KCAPI_HASH */
1508
1509
#ifdef WOLFSSL_SHA512
1510
1511
#if defined(WOLFSSL_KCAPI_HASH)
1512
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1513
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
1514
1515
#elif defined(WOLFSSL_RENESAS_RSIP) && \
1516
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
1517
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
1518
1519
#elif defined(MAX3266X_SHA)
1520
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1521
#elif defined(STM32_HASH_SHA512)
1522
#elif defined(PSOC6_HASH_SHA2)
1523
#elif defined(WOLFSSL_SILABS_SHA512)
1524
#else
1525
1526
static int Sha512FinalRaw(wc_Sha512* sha512, byte* hash, word32 digestSz)
1527
0
{
1528
0
    if (sha512 == NULL || hash == NULL) {
1529
0
        return BAD_FUNC_ARG;
1530
0
    }
1531
1532
0
#ifdef LITTLE_ENDIAN_ORDER
1533
0
    if ((digestSz & 0x7) == 0)
1534
0
        ByteReverseWords64((word64 *)hash, sha512->digest, digestSz);
1535
0
    else {
1536
0
        ByteReverseWords64(sha512->digest, sha512->digest,
1537
0
                           WC_SHA512_DIGEST_SIZE);
1538
0
        XMEMCPY(hash, sha512->digest, digestSz);
1539
0
    }
1540
#else
1541
    XMEMCPY(hash, sha512->digest, digestSz);
1542
#endif
1543
1544
0
    return 0;
1545
0
}
1546
1547
int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash)
1548
0
{
1549
0
    return Sha512FinalRaw(sha512, hash, WC_SHA512_DIGEST_SIZE);
1550
0
}
1551
1552
static int Sha512_Family_Final(wc_Sha512* sha512, byte* hash, size_t digestSz,
1553
                               int (*initfp)(wc_Sha512*))
1554
36.3k
{
1555
36.3k
    int ret;
1556
1557
36.3k
    if (sha512 == NULL || hash == NULL) {
1558
0
        return BAD_FUNC_ARG;
1559
0
    }
1560
1561
36.3k
#ifdef WOLF_CRYPTO_CB
1562
36.3k
    #ifndef WOLF_CRYPTO_CB_FIND
1563
36.3k
    if (sha512->devId != INVALID_DEVID)
1564
111
    #endif
1565
111
    {
1566
111
        ret = wc_CryptoCb_Sha512Hash(sha512, NULL, 0, hash, digestSz);
1567
111
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
1568
0
            return ret;
1569
0
        }
1570
        /* fall-through when unavailable */
1571
111
    }
1572
36.3k
#endif
1573
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
1574
    if (sha512->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA512) {
1575
    #if defined(HAVE_INTEL_QA)
1576
        return IntelQaSymSha512(&sha512->asyncDev, hash, NULL, digestSz);
1577
    #endif
1578
    }
1579
#endif /* WOLFSSL_ASYNC_CRYPT */
1580
1581
36.3k
    ret = Sha512Final(sha512);
1582
36.3k
    if (ret != 0)
1583
582
        return ret;
1584
1585
35.7k
    XMEMCPY(hash, sha512->digest, digestSz);
1586
1587
    /* initialize Sha512 structure for the next use */
1588
35.7k
    return initfp(sha512);
1589
36.3k
}
1590
1591
#ifndef STM32_HASH_SHA512
1592
int wc_Sha512Final(wc_Sha512* sha512, byte* hash)
1593
35.8k
{
1594
35.8k
    return Sha512_Family_Final(sha512, hash, WC_SHA512_DIGEST_SIZE, InitSha512);
1595
35.8k
}
1596
#endif
1597
1598
#endif /* WOLFSSL_KCAPI_HASH */
1599
1600
#if defined(MAX3266X_SHA)
1601
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1602
1603
#else
1604
#if !defined(WOLFSSL_SE050) || !defined(WOLFSSL_SE050_HASH)
1605
int wc_InitSha512(wc_Sha512* sha512)
1606
196
{
1607
196
    int devId = INVALID_DEVID;
1608
1609
196
#ifdef WOLF_CRYPTO_CB
1610
196
    devId = wc_CryptoCb_DefaultDevID();
1611
196
#endif
1612
196
    return wc_InitSha512_ex(sha512, NULL, devId);
1613
196
}
1614
1615
void wc_Sha512Free(wc_Sha512* sha512)
1616
108k
{
1617
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
1618
    int ret = 0;
1619
#endif
1620
1621
108k
    if (sha512 == NULL)
1622
0
        return;
1623
1624
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
1625
    #ifndef WOLF_CRYPTO_CB_FIND
1626
    if (sha512->devId != INVALID_DEVID)
1627
    #endif
1628
    {
1629
        ret = wc_CryptoCb_Free(sha512->devId, WC_ALGO_TYPE_HASH,
1630
                         WC_HASH_TYPE_SHA512, (void*)sha512);
1631
        /* If they want the standard free, they can call it themselves */
1632
        /* via their callback setting devId to INVALID_DEVID */
1633
        /* otherwise assume the callback handled it */
1634
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1635
            return;
1636
        /* fall-through when unavailable */
1637
    }
1638
1639
    /* silence compiler warning */
1640
    (void)ret;
1641
1642
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_FREE */
1643
1644
#if defined(WOLFSSL_ESP32) && \
1645
    !defined(NO_WOLFSSL_ESP32_CRYPT_HASH)  && \
1646
    !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
1647
    esp_sha_release_unfinished_lock(&sha512->ctx);
1648
#endif
1649
1650
#ifdef WOLFSSL_SMALL_STACK_CACHE
1651
    if (sha512->W != NULL) {
1652
        ForceZero(sha512->W, (sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE);
1653
        XFREE(sha512->W, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1654
        sha512->W = NULL;
1655
    }
1656
#endif
1657
1658
#if defined(WOLFSSL_KCAPI_HASH)
1659
    KcapiHashFree(&sha512->kcapi);
1660
#endif
1661
1662
#if defined(WOLFSSL_HASH_KEEP) ||\
1663
   (defined(WOLFSSL_RENESAS_RSIP) && (WOLFSSL_RENESAS_RZFSP_VER >= 220))
1664
    if (sha512->msg != NULL) {
1665
        ForceZero(sha512->msg, sha512->len);
1666
        XFREE(sha512->msg, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER);
1667
        sha512->msg = NULL;
1668
    }
1669
#endif
1670
1671
#ifdef MAX3266X_SHA_CB
1672
    wc_MXC_TPU_SHA_Free(&(sha512->mxcCtx));
1673
#endif
1674
1675
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
1676
    wolfAsync_DevCtxFree(&sha512->asyncDev, WOLFSSL_ASYNC_MARKER_SHA512);
1677
#endif /* WOLFSSL_ASYNC_CRYPT */
1678
1679
#if defined(PSOC6_HASH_SHA2)
1680
    wc_Psoc6_Sha_Free();
1681
#endif
1682
1683
108k
    ForceZero(sha512, sizeof(*sha512));
1684
108k
}
1685
#endif
1686
1687
#if (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) \
1688
    && !defined(WOLFSSL_KCAPI_HASH)
1689
/* Apply SHA512 transformation to the data                */
1690
/* @param sha  a pointer to wc_Sha512 structure           */
1691
/* @param data data to be applied SHA512 transformation   */
1692
/* @return 0 on successful, otherwise non-zero on failure */
1693
int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data)
1694
{
1695
    int ret;
1696
    /* back up buffer */
1697
    WC_DECLARE_VAR(buffer, word64, WC_SHA512_BLOCK_SIZE  / sizeof(word64),
1698
        0);
1699
1700
    /* sanity check */
1701
    if (sha == NULL || data == NULL) {
1702
        return BAD_FUNC_ARG;
1703
    }
1704
1705
1706
#if defined(WOLFSSL_SMALL_STACK_CACHE)
1707
    if (sha->W == NULL)
1708
        return BAD_FUNC_ARG;
1709
    /* Skip over the initial `W' buffer at the start (used by
1710
     * _Transform_Sha512()).
1711
     */
1712
    buffer = sha->W + 16;
1713
#elif defined(WOLFSSL_SMALL_STACK)
1714
    buffer = (word64*)XMALLOC(WC_SHA512_BLOCK_SIZE, sha->heap,
1715
        DYNAMIC_TYPE_TMP_BUFFER);
1716
    if (buffer == NULL)
1717
        return MEMORY_E;
1718
#endif
1719
1720
#if defined(LITTLE_ENDIAN_ORDER)
1721
#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1722
    (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
1723
    #ifdef WC_C_DYNAMIC_FALLBACK
1724
    if (sha->sha_method == SHA512_C)
1725
    #else
1726
    if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
1727
    #endif
1728
#endif
1729
    {
1730
        ByteReverseWords64((word64*)data, (word64*)data,
1731
                                                WC_SHA512_BLOCK_SIZE);
1732
    }
1733
#endif /* LITTLE_ENDIAN_ORDER */
1734
1735
#if defined(WOLFSSL_ARMASM)
1736
    ByteReverseWords64(buffer, (word64*)data, WC_SHA512_BLOCK_SIZE);
1737
    Transform_Sha512(sha, (const byte*)buffer);
1738
    ret = 0;
1739
#else
1740
    XMEMCPY(buffer, sha->buffer, WC_SHA512_BLOCK_SIZE);
1741
    XMEMCPY(sha->buffer, data, WC_SHA512_BLOCK_SIZE);
1742
1743
    ret = Transform_Sha512(sha);
1744
1745
    XMEMCPY(sha->buffer, buffer, WC_SHA512_BLOCK_SIZE);
1746
#endif
1747
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SMALL_STACK_CACHE)
1748
    ForceZero(buffer, WC_SHA512_BLOCK_SIZE);
1749
    XFREE(buffer, sha->heap, DYNAMIC_TYPE_TMP_BUFFER);
1750
#endif
1751
    return ret;
1752
}
1753
#endif /* OPENSSL_EXTRA */
1754
#endif /* WOLFSSL_SHA512 */
1755
#endif /* !WOLFSSL_SE050 || !WOLFSSL_SE050_HASH */
1756
1757
1758
/* -------------------------------------------------------------------------- */
1759
/* SHA384 */
1760
/* -------------------------------------------------------------------------- */
1761
#ifdef WOLFSSL_SHA384
1762
1763
#if defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_HASH) && \
1764
    !defined(WOLFSSL_QNX_CAAM)
1765
    /* functions defined in wolfcrypt/src/port/caam/caam_sha.c */
1766
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
1767
    int wc_InitSha384_ex(wc_Sha384* sha384, void* heap, int devId)
1768
    {
1769
        if (sha384 == NULL) {
1770
            return BAD_FUNC_ARG;
1771
        }
1772
        (void)devId;
1773
        return se050_hash_init(&sha384->se050Ctx, heap);
1774
    }
1775
    int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len)
1776
    {
1777
        if (sha384 == NULL) {
1778
            return BAD_FUNC_ARG;
1779
        }
1780
        if (data == NULL && len == 0) {
1781
            /* valid, but do nothing */
1782
            return 0;
1783
        }
1784
        if (data == NULL) {
1785
            return BAD_FUNC_ARG;
1786
        }
1787
1788
        return se050_hash_update(&sha384->se050Ctx, data, len);
1789
1790
    }
1791
    int wc_Sha384Final(wc_Sha384* sha384, byte* hash)
1792
    {
1793
        int ret = 0;
1794
        ret = se050_hash_final(&sha384->se050Ctx, hash, WC_SHA384_DIGEST_SIZE,
1795
                               kAlgorithm_SSS_SHA384);
1796
        return ret;
1797
    }
1798
1799
#elif defined(WOLFSSL_SILABS_SHA384)
1800
    /* functions defined in wolfcrypt/src/port/silabs/silabs_hash.c */
1801
1802
#elif defined(WOLFSSL_KCAPI_HASH)
1803
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
1804
1805
#elif defined(WOLFSSL_RENESAS_RSIP) && \
1806
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
1807
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
1808
1809
#elif defined(MAX3266X_SHA)
1810
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
1811
#elif defined(STM32_HASH_SHA384)
1812
1813
    int wc_InitSha384_ex(wc_Sha384* sha384, void* heap, int devId)
1814
    {
1815
        if (sha384 == NULL)
1816
            return BAD_FUNC_ARG;
1817
1818
        (void)devId;
1819
        (void)heap;
1820
1821
        XMEMSET(sha384, 0, sizeof(wc_Sha384));
1822
        wc_Stm32_Hash_Init(&sha384->stmCtx);
1823
        return 0;
1824
    }
1825
1826
    int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len)
1827
    {
1828
        int ret = 0;
1829
1830
        if (sha384 == NULL) {
1831
            return BAD_FUNC_ARG;
1832
        }
1833
        if (data == NULL && len == 0) {
1834
            /* valid, but do nothing */
1835
            return 0;
1836
        }
1837
        if (data == NULL) {
1838
            return BAD_FUNC_ARG;
1839
        }
1840
1841
        ret = wolfSSL_CryptHwMutexLock();
1842
        if (ret == 0) {
1843
            ret = wc_Stm32_Hash_Update(&sha384->stmCtx,
1844
                HASH_ALGOSELECTION_SHA384, data, len, WC_SHA384_BLOCK_SIZE);
1845
            wolfSSL_CryptHwMutexUnLock();
1846
        }
1847
        return ret;
1848
    }
1849
1850
    int wc_Sha384Final(wc_Sha384* sha384, byte* hash)
1851
    {
1852
        int ret = 0;
1853
1854
        if (sha384 == NULL || hash == NULL) {
1855
            return BAD_FUNC_ARG;
1856
        }
1857
1858
        ret = wolfSSL_CryptHwMutexLock();
1859
        if (ret == 0) {
1860
            ret = wc_Stm32_Hash_Final(&sha384->stmCtx,
1861
                HASH_ALGOSELECTION_SHA384, hash, WC_SHA384_DIGEST_SIZE);
1862
            wolfSSL_CryptHwMutexUnLock();
1863
        }
1864
1865
        (void)wc_InitSha384(sha384); /* reset state */
1866
1867
        return ret;
1868
    }
1869
1870
#elif defined(PSOC6_HASH_SHA2)
1871
    /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */
1872
1873
#else
1874
1875
static int InitSha384(wc_Sha384* sha384)
1876
134k
{
1877
134k
    if (sha384 == NULL) {
1878
0
        return BAD_FUNC_ARG;
1879
0
    }
1880
1881
#ifdef WOLFSSL_SMALL_STACK_CACHE
1882
    if (sha384->W == NULL) {
1883
        /* This allocation combines the customary W buffer used by
1884
         * _Transform_Sha512() with additional buffer space used by
1885
         * wc_Sha512Transform().
1886
         */
1887
        sha384->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE,
1888
                                      sha384->heap, DYNAMIC_TYPE_DIGEST);
1889
        if (sha384->W == NULL)
1890
            return MEMORY_E;
1891
    }
1892
#endif
1893
1894
134k
    sha384->digest[0] = W64LIT(0xcbbb9d5dc1059ed8);
1895
134k
    sha384->digest[1] = W64LIT(0x629a292a367cd507);
1896
134k
    sha384->digest[2] = W64LIT(0x9159015a3070dd17);
1897
134k
    sha384->digest[3] = W64LIT(0x152fecd8f70e5939);
1898
134k
    sha384->digest[4] = W64LIT(0x67332667ffc00b31);
1899
134k
    sha384->digest[5] = W64LIT(0x8eb44a8768581511);
1900
134k
    sha384->digest[6] = W64LIT(0xdb0c2e0d64f98fa7);
1901
134k
    sha384->digest[7] = W64LIT(0x47b5481dbefa4fa4);
1902
1903
134k
    sha384->buffLen = 0;
1904
134k
    sha384->loLen   = 0;
1905
134k
    sha384->hiLen   = 0;
1906
1907
#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \
1908
     (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) || \
1909
    defined(WOLFSSL_ARMASM)
1910
#ifdef WC_C_DYNAMIC_FALLBACK
1911
    sha384->sha_method = 0;
1912
    Sha512_SetTransform(&sha384->sha_method);
1913
#else
1914
    Sha512_SetTransform();
1915
#endif
1916
#endif
1917
1918
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW)  && \
1919
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
1920
    /* HW needs to be carefully initialized, taking into account soft copy.
1921
    ** If already in use; copy may revert to SW as needed. */
1922
    esp_sha_init(&(sha384->ctx), WC_HASH_TYPE_SHA384);
1923
#endif
1924
1925
134k
#ifdef WOLFSSL_HASH_FLAGS
1926
134k
    sha384->flags = 0;
1927
134k
#endif
1928
1929
#ifdef HAVE_ARIA
1930
    sha384->hSession = NULL;
1931
#endif
1932
1933
#ifdef WOLFSSL_HASH_KEEP
1934
    sha384->msg  = NULL;
1935
    sha384->len  = 0;
1936
    sha384->used = 0;
1937
#endif
1938
1939
134k
    return 0;
1940
134k
}
1941
1942
int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len)
1943
230k
{
1944
1945
230k
    if (sha384 == NULL) {
1946
0
        return BAD_FUNC_ARG;
1947
0
    }
1948
230k
    if (data == NULL && len == 0) {
1949
        /* valid, but do nothing */
1950
377
        return 0;
1951
377
    }
1952
230k
    if (data == NULL) {
1953
0
        return BAD_FUNC_ARG;
1954
0
    }
1955
1956
230k
#ifdef WOLF_CRYPTO_CB
1957
230k
    #ifndef WOLF_CRYPTO_CB_FIND
1958
230k
    if (sha384->devId != INVALID_DEVID)
1959
1.48k
    #endif
1960
1.48k
    {
1961
1.48k
        int ret = wc_CryptoCb_Sha384Hash(sha384, data, len, NULL);
1962
1.48k
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
1963
0
            return ret;
1964
        /* fall-through when unavailable */
1965
1.48k
    }
1966
230k
#endif
1967
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
1968
    if (sha384->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA384) {
1969
    #if defined(HAVE_INTEL_QA)
1970
        return IntelQaSymSha384(&sha384->asyncDev, NULL, data, len);
1971
    #endif
1972
    }
1973
#endif /* WOLFSSL_ASYNC_CRYPT */
1974
1975
230k
    return Sha512Update((wc_Sha512*)sha384, data, len);
1976
230k
}
1977
1978
1979
int wc_Sha384FinalRaw(wc_Sha384* sha384, byte* hash)
1980
128
{
1981
128
    if (sha384 == NULL || hash == NULL) {
1982
0
        return BAD_FUNC_ARG;
1983
0
    }
1984
1985
128
#ifdef LITTLE_ENDIAN_ORDER
1986
128
    ByteReverseWords64((word64 *)hash, sha384->digest, WC_SHA384_DIGEST_SIZE);
1987
#else
1988
    XMEMCPY(hash, sha384->digest, WC_SHA384_DIGEST_SIZE);
1989
#endif
1990
1991
128
    return 0;
1992
128
}
1993
1994
int wc_Sha384Final(wc_Sha384* sha384, byte* hash)
1995
34.9k
{
1996
34.9k
    int ret;
1997
1998
34.9k
    if (sha384 == NULL || hash == NULL) {
1999
0
        return BAD_FUNC_ARG;
2000
0
    }
2001
2002
34.9k
#ifdef WOLF_CRYPTO_CB
2003
34.9k
    #ifndef WOLF_CRYPTO_CB_FIND
2004
34.9k
    if (sha384->devId != INVALID_DEVID)
2005
67
    #endif
2006
67
    {
2007
67
        ret = wc_CryptoCb_Sha384Hash(sha384, NULL, 0, hash);
2008
67
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2009
0
            return ret;
2010
        /* fall-through when unavailable */
2011
67
    }
2012
34.9k
#endif
2013
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2014
    if (sha384->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA384) {
2015
    #if defined(HAVE_INTEL_QA)
2016
        return IntelQaSymSha384(&sha384->asyncDev, hash, NULL,
2017
                                            WC_SHA384_DIGEST_SIZE);
2018
    #endif
2019
    }
2020
#endif /* WOLFSSL_ASYNC_CRYPT */
2021
2022
34.9k
    ret = Sha512Final((wc_Sha512*)sha384);
2023
34.9k
    if (ret != 0)
2024
79
        return ret;
2025
2026
34.8k
    XMEMCPY(hash, sha384->digest, WC_SHA384_DIGEST_SIZE);
2027
2028
34.8k
    return InitSha384(sha384);  /* reset state */
2029
34.9k
}
2030
2031
int wc_InitSha384_ex(wc_Sha384* sha384, void* heap, int devId)
2032
100k
{
2033
100k
    int ret;
2034
2035
100k
    if (sha384 == NULL) {
2036
0
        return BAD_FUNC_ARG;
2037
0
    }
2038
2039
100k
    sha384->heap = heap;
2040
#ifdef WOLFSSL_SMALL_STACK_CACHE
2041
    sha384->W = NULL;
2042
#endif
2043
100k
#ifdef WOLF_CRYPTO_CB
2044
100k
    sha384->devId = devId;
2045
100k
    sha384->devCtx = NULL;
2046
100k
#endif
2047
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW)  && \
2048
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
2049
    if (sha384->ctx.mode != ESP32_SHA_INIT) {
2050
        ESP_LOGV(TAG, "Set ctx mode from prior value: "
2051
                           "%d", sha384->ctx.mode);
2052
    }
2053
    /* We know this is a fresh, uninitialized item, so set to INIT */
2054
    sha384->ctx.mode = ESP32_SHA_INIT;
2055
#endif
2056
2057
#ifdef MAX3266X_SHA_CB
2058
    ret = wc_MXC_TPU_SHA_Init(&(sha384->mxcCtx));
2059
    if (ret != 0) {
2060
        return ret;
2061
    }
2062
#endif
2063
2064
100k
    ret = InitSha384(sha384);
2065
100k
    if (ret != 0) {
2066
0
        return ret;
2067
0
    }
2068
2069
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2070
    ret = wolfAsync_DevCtxInit(&sha384->asyncDev, WOLFSSL_ASYNC_MARKER_SHA384,
2071
                                                           sha384->heap, devId);
2072
#else
2073
100k
    (void)devId;
2074
100k
#endif /* WOLFSSL_ASYNC_CRYPT */
2075
#ifdef WOLFSSL_IMXRT1170_CAAM
2076
     ret = wc_CAAM_HashInit(&sha384->hndl, &sha384->ctx, WC_HASH_TYPE_SHA384);
2077
#endif
2078
100k
    return ret;
2079
100k
}
2080
2081
#endif /* WOLFSSL_IMX6_CAAM || WOLFSSL_SILABS_SHA384 || WOLFSSL_KCAPI_HASH */
2082
2083
#if defined(MAX3266X_SHA)
2084
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
2085
2086
#else
2087
int wc_InitSha384(wc_Sha384* sha384)
2088
126
{
2089
126
    int devId = INVALID_DEVID;
2090
2091
126
#ifdef WOLF_CRYPTO_CB
2092
126
    devId = wc_CryptoCb_DefaultDevID();
2093
126
#endif
2094
126
    return wc_InitSha384_ex(sha384, NULL, devId);
2095
126
}
2096
2097
void wc_Sha384Free(wc_Sha384* sha384)
2098
101k
{
2099
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2100
    int ret = 0;
2101
#endif
2102
2103
101k
    if (sha384 == NULL)
2104
0
        return;
2105
2106
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE)
2107
    #ifndef WOLF_CRYPTO_CB_FIND
2108
    if (sha384->devId != INVALID_DEVID)
2109
    #endif
2110
    {
2111
        ret = wc_CryptoCb_Free(sha384->devId, WC_ALGO_TYPE_HASH,
2112
                         WC_HASH_TYPE_SHA384, (void*)sha384);
2113
        /* If they want the standard free, they can call it themselves */
2114
        /* via their callback setting devId to INVALID_DEVID */
2115
        /* otherwise assume the callback handled it */
2116
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2117
            return;
2118
        /* fall-through when unavailable */
2119
    }
2120
2121
    /* silence compiler warning */
2122
    (void)ret;
2123
2124
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_FREE */
2125
2126
#if defined(WOLFSSL_ESP32) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH)  && \
2127
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
2128
    esp_sha_release_unfinished_lock(&sha384->ctx);
2129
#endif
2130
2131
#ifdef WOLFSSL_SMALL_STACK_CACHE
2132
    if (sha384->W != NULL) {
2133
        ForceZero(sha384->W, (sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE);
2134
        XFREE(sha384->W, sha384->heap, DYNAMIC_TYPE_TMP_BUFFER);
2135
        sha384->W = NULL;
2136
    }
2137
#endif
2138
2139
#if defined(WOLFSSL_KCAPI_HASH)
2140
    KcapiHashFree(&sha384->kcapi);
2141
#endif
2142
2143
#if defined(WOLFSSL_HASH_KEEP) || \
2144
   (defined(WOLFSSL_RENESAS_RSIP) && (WOLFSSL_RENESAS_RZFSP_VER >= 220))
2145
    if (sha384->msg != NULL) {
2146
        ForceZero(sha384->msg, sha384->len);
2147
        XFREE(sha384->msg, sha384->heap, DYNAMIC_TYPE_TMP_BUFFER);
2148
        sha384->msg = NULL;
2149
    }
2150
#endif
2151
2152
#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2153
    se050_hash_free(&sha384->se050Ctx);
2154
#endif
2155
2156
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2157
    wolfAsync_DevCtxFree(&sha384->asyncDev, WOLFSSL_ASYNC_MARKER_SHA384);
2158
#endif /* WOLFSSL_ASYNC_CRYPT */
2159
2160
#ifdef HAVE_ARIA
2161
    if (sha384->hSession != NULL) {
2162
        MC_CloseSession(sha384->hSession);
2163
        sha384->hSession = NULL;
2164
    }
2165
#endif
2166
2167
#ifdef MAX3266X_SHA_CB
2168
    wc_MXC_TPU_SHA_Free(&(sha384->mxcCtx));
2169
#endif
2170
2171
101k
    ForceZero(sha384, sizeof(*sha384));
2172
101k
}
2173
2174
#endif
2175
#endif /* WOLFSSL_SHA384 */
2176
2177
#ifdef WOLFSSL_SHA512
2178
2179
#if defined(WOLFSSL_KCAPI_HASH)
2180
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2181
2182
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2183
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2184
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2185
2186
#elif defined(MAX3266X_SHA)
2187
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
2188
2189
#else
2190
2191
static int Sha512_Family_GetHash(wc_Sha512* sha512, byte* hash,
2192
                                 int (*finalfp)(wc_Sha512*, byte*))
2193
134
{
2194
134
    int ret;
2195
134
    WC_DECLARE_VAR(tmpSha512, wc_Sha512, 1, 0);
2196
2197
134
    if (sha512 == NULL || hash == NULL) {
2198
0
        return BAD_FUNC_ARG;
2199
0
    }
2200
2201
134
    WC_ALLOC_VAR_EX(tmpSha512, wc_Sha512, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2202
134
        return MEMORY_E);
2203
2204
    /* copy this sha512 into tmpSha */
2205
132
    ret = wc_Sha512Copy(sha512, tmpSha512);
2206
132
    if (ret == 0) {
2207
132
        ret = finalfp(tmpSha512, hash);
2208
132
        wc_Sha512Free(tmpSha512);
2209
132
    }
2210
2211
132
    WC_FREE_VAR_EX(tmpSha512, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2212
2213
132
    return ret;
2214
134
}
2215
2216
int wc_Sha512GetHash(wc_Sha512* sha512, byte* hash)
2217
134
{
2218
134
    return Sha512_Family_GetHash(sha512, hash, wc_Sha512Final);
2219
134
}
2220
2221
int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst)
2222
287
{
2223
287
    int ret = 0;
2224
2225
287
    if (src == NULL || dst == NULL) {
2226
0
        return BAD_FUNC_ARG;
2227
0
    }
2228
2229
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_COPY)
2230
    #ifndef WOLF_CRYPTO_CB_FIND
2231
    if (src->devId != INVALID_DEVID)
2232
    #endif
2233
    {
2234
        /* Cast the source and destination to be void to keep the abstraction */
2235
        ret = wc_CryptoCb_Copy(src->devId, WC_ALGO_TYPE_HASH,
2236
                               WC_HASH_TYPE_SHA512, (void*)src, (void*)dst);
2237
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2238
            return ret;
2239
        /* fall-through when unavailable */
2240
    }
2241
    ret = 0; /* Reset ret to 0 to avoid returning the callback error code */
2242
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_COPY */
2243
2244
287
    XMEMCPY(dst, src, sizeof(wc_Sha512));
2245
#ifdef WOLFSSL_SMALL_STACK_CACHE
2246
    /* This allocation combines the customary W buffer used by
2247
     * _Transform_Sha512() with additional buffer space used by
2248
     * wc_Sha512Transform().
2249
     */
2250
    dst->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA512_BLOCK_SIZE,
2251
                               dst->heap, DYNAMIC_TYPE_DIGEST);
2252
    if (dst->W == NULL) {
2253
        XMEMSET(dst, 0, sizeof(wc_Sha512));
2254
        return MEMORY_E;
2255
    }
2256
#endif
2257
2258
#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) && \
2259
    defined(WOLFSSL_SILABS_SHA512)
2260
    dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx;
2261
    dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx;
2262
#endif
2263
2264
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512)
2265
    ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
2266
#endif
2267
2268
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2269
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512)
2270
    #if defined(CONFIG_IDF_TARGET_ESP32)
2271
    if (ret == 0) {
2272
        ret = esp_sha512_ctx_copy(src, dst);
2273
    }
2274
    #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \
2275
          defined(CONFIG_IDF_TARGET_ESP8684) || \
2276
          defined(CONFIG_IDF_TARGET_ESP32C3) || \
2277
          defined(CONFIG_IDF_TARGET_ESP32C6)
2278
        ESP_LOGV(TAG, "No SHA-512 HW on the ESP32-C3");
2279
2280
    #elif defined(CONFIG_IDF_TARGET_ESP32S2) || \
2281
          defined(CONFIG_IDF_TARGET_ESP32S3)
2282
        if (ret == 0) {
2283
            ret = esp_sha512_ctx_copy(src, dst);
2284
        }
2285
    #else
2286
        ESP_LOGW(TAG, "No SHA384 HW or not yet implemented for %s",
2287
                       CONFIG_IDF_TARGET);
2288
    #endif
2289
2290
#endif /* WOLFSSL_USE_ESP32_CRYPT_HASH_HW */
2291
2292
287
#ifdef WOLFSSL_HASH_FLAGS
2293
287
     dst->flags |= WC_HASH_FLAG_ISCOPY;
2294
287
#endif
2295
2296
#if defined(WOLFSSL_HASH_KEEP)
2297
    if (src->msg != NULL) {
2298
        dst->msg = (byte*)XMALLOC(src->len, dst->heap, DYNAMIC_TYPE_TMP_BUFFER);
2299
        if (dst->msg == NULL)
2300
            return MEMORY_E;
2301
        XMEMCPY(dst->msg, src->msg, src->len);
2302
    }
2303
#endif
2304
2305
#ifdef MAX3266X_SHA_CB
2306
    ret = wc_MXC_TPU_SHA_Copy(&(src->mxcCtx), &(dst->mxcCtx));
2307
    if (ret != 0) {
2308
        return ret;
2309
    }
2310
#endif
2311
2312
#if defined(PSOC6_HASH_SHA2)
2313
    wc_Psoc6_Sha1_Sha2_Init(dst, WC_PSOC6_SHA512, 0);
2314
#endif
2315
2316
287
    return ret;
2317
287
}
2318
2319
#endif /* WOLFSSL_KCAPI_HASH */
2320
2321
#ifdef WOLFSSL_HASH_FLAGS
2322
int wc_Sha512SetFlags(wc_Sha512* sha512, word32 flags)
2323
85.7k
{
2324
85.7k
    if (sha512) {
2325
85.7k
        sha512->flags = flags;
2326
85.7k
    }
2327
85.7k
    return 0;
2328
85.7k
}
2329
int wc_Sha512GetFlags(wc_Sha512* sha512, word32* flags)
2330
0
{
2331
0
    if (sha512 && flags) {
2332
0
        *flags = sha512->flags;
2333
0
    }
2334
0
    return 0;
2335
0
}
2336
#endif /* WOLFSSL_HASH_FLAGS */
2337
2338
#if !defined(WOLFSSL_NOSHA512_224) && \
2339
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
2340
2341
#if defined(STM32_HASH_SHA512_224)
2342
2343
int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId)
2344
{
2345
    if (sha512 == NULL)
2346
        return BAD_FUNC_ARG;
2347
2348
    (void)devId;
2349
    (void)heap;
2350
2351
    XMEMSET(sha512, 0, sizeof(wc_Sha512));
2352
    wc_Stm32_Hash_Init(&sha512->stmCtx);
2353
    return 0;
2354
}
2355
2356
int wc_Sha512_224Update(wc_Sha512* sha512, const byte* data, word32 len)
2357
{
2358
    int ret = 0;
2359
2360
    if (sha512 == NULL) {
2361
        return BAD_FUNC_ARG;
2362
    }
2363
    if (data == NULL && len == 0) {
2364
        /* valid, but do nothing */
2365
        return 0;
2366
    }
2367
    if (data == NULL) {
2368
        return BAD_FUNC_ARG;
2369
    }
2370
2371
    ret = wolfSSL_CryptHwMutexLock();
2372
    if (ret == 0) {
2373
        ret = wc_Stm32_Hash_Update(&sha512->stmCtx,
2374
            HASH_ALGOSELECTION_SHA512_224, data, len, WC_SHA512_224_BLOCK_SIZE);
2375
        wolfSSL_CryptHwMutexUnLock();
2376
    }
2377
    return ret;
2378
}
2379
2380
int wc_Sha512_224Final(wc_Sha512* sha512, byte* hash)
2381
{
2382
    int ret = 0;
2383
2384
    if (sha512 == NULL || hash == NULL) {
2385
        return BAD_FUNC_ARG;
2386
    }
2387
2388
    ret = wolfSSL_CryptHwMutexLock();
2389
    if (ret == 0) {
2390
        ret = wc_Stm32_Hash_Final(&sha512->stmCtx,
2391
            HASH_ALGOSELECTION_SHA512_224, hash, WC_SHA512_224_DIGEST_SIZE);
2392
        wolfSSL_CryptHwMutexUnLock();
2393
    }
2394
2395
    (void)wc_InitSha512_224(sha512); /* reset state */
2396
2397
    return ret;
2398
}
2399
#elif defined(PSOC6_HASH_SHA2)
2400
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2401
#endif
2402
int wc_InitSha512_224(wc_Sha512* sha)
2403
0
{
2404
0
    return wc_InitSha512_224_ex(sha, NULL, INVALID_DEVID);
2405
0
}
2406
#if !defined(STM32_HASH_SHA512_224) && !defined(PSOC6_HASH_SHA2)
2407
int wc_Sha512_224Update(wc_Sha512* sha, const byte* data, word32 len)
2408
608
{
2409
608
    return wc_Sha512Update(sha, data, len);
2410
608
}
2411
#endif
2412
#if defined(WOLFSSL_KCAPI_HASH)
2413
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2414
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2415
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2416
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2417
2418
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2419
#elif defined(STM32_HASH_SHA512_224)
2420
#elif defined(PSOC6_HASH_SHA2)
2421
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2422
2423
#else
2424
int wc_Sha512_224FinalRaw(wc_Sha512* sha, byte* hash)
2425
0
{
2426
0
    return Sha512FinalRaw(sha, hash, WC_SHA512_224_DIGEST_SIZE);
2427
0
}
2428
2429
int wc_Sha512_224Final(wc_Sha512* sha512, byte* hash)
2430
608
{
2431
608
    return Sha512_Family_Final(sha512, hash, WC_SHA512_224_DIGEST_SIZE,
2432
608
                               InitSha512_224);
2433
608
}
2434
#endif /* else none of the above: WOLFSSL_KCAPI_HASH, WOLFSSL_SE050 */
2435
2436
void wc_Sha512_224Free(wc_Sha512* sha)
2437
608
{
2438
608
    wc_Sha512Free(sha);
2439
608
}
2440
2441
#if defined(WOLFSSL_KCAPI_HASH)
2442
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2443
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2444
2445
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2446
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2447
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2448
2449
#else
2450
int wc_Sha512_224GetHash(wc_Sha512* sha512, byte* hash)
2451
0
{
2452
0
    return Sha512_Family_GetHash(sha512, hash, wc_Sha512_224Final);
2453
0
}
2454
2455
int wc_Sha512_224Copy(wc_Sha512* src, wc_Sha512* dst)
2456
0
{
2457
0
    return wc_Sha512Copy(src, dst);
2458
0
}
2459
#endif /* else none of the above: WOLFSSL_KCAPI_HASH, WOLFSSL_SE050 */
2460
2461
#ifdef WOLFSSL_HASH_FLAGS
2462
int wc_Sha512_224SetFlags(wc_Sha512* sha, word32 flags)
2463
0
{
2464
0
    return wc_Sha512SetFlags(sha, flags);
2465
0
}
2466
int wc_Sha512_224GetFlags(wc_Sha512* sha, word32* flags)
2467
0
{
2468
0
    return wc_Sha512GetFlags(sha, flags);
2469
0
}
2470
#endif /* WOLFSSL_HASH_FLAGS */
2471
2472
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
2473
int wc_Sha512_224Transform(wc_Sha512* sha, const unsigned char* data)
2474
{
2475
    return wc_Sha512Transform(sha, data);
2476
}
2477
#endif /* OPENSSL_EXTRA */
2478
2479
2480
#endif /* !WOLFSSL_NOSHA512_224 && !FIPS ... */
2481
2482
#if !defined(WOLFSSL_NOSHA512_256) && \
2483
   (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST)
2484
#if defined(STM32_HASH_SHA512_256)
2485
2486
    int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId)
2487
    {
2488
        if (sha512 == NULL)
2489
            return BAD_FUNC_ARG;
2490
2491
        (void)devId;
2492
        (void)heap;
2493
2494
        XMEMSET(sha512, 0, sizeof(wc_Sha512));
2495
        wc_Stm32_Hash_Init(&sha512->stmCtx);
2496
        return 0;
2497
    }
2498
2499
    int wc_Sha512_256Update(wc_Sha512* sha512, const byte* data, word32 len)
2500
    {
2501
        int ret = 0;
2502
2503
        if (sha512 == NULL) {
2504
            return BAD_FUNC_ARG;
2505
        }
2506
        if (data == NULL && len == 0) {
2507
            /* valid, but do nothing */
2508
            return 0;
2509
        }
2510
        if (data == NULL) {
2511
            return BAD_FUNC_ARG;
2512
        }
2513
2514
        ret = wolfSSL_CryptHwMutexLock();
2515
        if (ret == 0) {
2516
            ret = wc_Stm32_Hash_Update(&sha512->stmCtx,
2517
                HASH_ALGOSELECTION_SHA512_256, data, len, WC_SHA512_256_BLOCK_SIZE);
2518
            wolfSSL_CryptHwMutexUnLock();
2519
        }
2520
        return ret;
2521
    }
2522
2523
    int wc_Sha512_256Final(wc_Sha512* sha512, byte* hash)
2524
    {
2525
        int ret = 0;
2526
2527
        if (sha512 == NULL || hash == NULL) {
2528
            return BAD_FUNC_ARG;
2529
        }
2530
2531
        ret = wolfSSL_CryptHwMutexLock();
2532
        if (ret == 0) {
2533
            ret = wc_Stm32_Hash_Final(&sha512->stmCtx,
2534
                HASH_ALGOSELECTION_SHA512_256, hash, WC_SHA512_256_DIGEST_SIZE);
2535
            wolfSSL_CryptHwMutexUnLock();
2536
        }
2537
2538
        (void)wc_InitSha512_256(sha512); /* reset state */
2539
2540
        return ret;
2541
    }
2542
#elif defined(PSOC6_HASH_SHA2)
2543
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2544
#endif
2545
int wc_InitSha512_256(wc_Sha512* sha)
2546
0
{
2547
0
    return wc_InitSha512_256_ex(sha, NULL, INVALID_DEVID);
2548
0
}
2549
#if !defined(STM32_HASH_SHA512_256) && !defined(PSOC6_HASH_SHA2)
2550
int wc_Sha512_256Update(wc_Sha512* sha, const byte* data, word32 len)
2551
221
{
2552
221
    return wc_Sha512Update(sha, data, len);
2553
221
}
2554
#endif
2555
#if defined(WOLFSSL_KCAPI_HASH)
2556
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2557
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2558
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2559
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2560
2561
#elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH)
2562
#elif defined(STM32_HASH_SHA512_256)
2563
#elif defined(PSOC6_HASH_SHA2)
2564
    /* functions defined in wolfcrypt/src/port/cypress/psoc6_crypto.c */
2565
#else
2566
int wc_Sha512_256FinalRaw(wc_Sha512* sha, byte* hash)
2567
0
{
2568
0
    return Sha512FinalRaw(sha, hash, WC_SHA512_256_DIGEST_SIZE);
2569
0
}
2570
2571
int wc_Sha512_256Final(wc_Sha512* sha512, byte* hash)
2572
221
{
2573
221
    return Sha512_Family_Final(sha512, hash, WC_SHA512_256_DIGEST_SIZE,
2574
221
                               InitSha512_256);
2575
221
}
2576
#endif
2577
2578
void wc_Sha512_256Free(wc_Sha512* sha)
2579
221
{
2580
221
    wc_Sha512Free(sha);
2581
221
}
2582
2583
#if defined(WOLFSSL_KCAPI_HASH)
2584
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2585
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2586
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2587
    /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */
2588
2589
#else
2590
int wc_Sha512_256GetHash(wc_Sha512* sha512, byte* hash)
2591
0
{
2592
0
    return Sha512_Family_GetHash(sha512, hash, wc_Sha512_256Final);
2593
0
}
2594
int wc_Sha512_256Copy(wc_Sha512* src, wc_Sha512* dst)
2595
0
{
2596
0
    return wc_Sha512Copy(src, dst);
2597
0
}
2598
#endif
2599
2600
#ifdef WOLFSSL_HASH_FLAGS
2601
int wc_Sha512_256SetFlags(wc_Sha512* sha, word32 flags)
2602
0
{
2603
0
    return wc_Sha512SetFlags(sha, flags);
2604
0
}
2605
int wc_Sha512_256GetFlags(wc_Sha512* sha, word32* flags)
2606
0
{
2607
0
    return wc_Sha512GetFlags(sha, flags);
2608
0
}
2609
#endif /* WOLFSSL_HASH_FLAGS */
2610
2611
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
2612
int wc_Sha512_256Transform(wc_Sha512* sha, const unsigned char* data)
2613
{
2614
    return wc_Sha512Transform(sha, data);
2615
}
2616
#endif /* OPENSSL_EXTRA */
2617
2618
2619
#endif /* !WOLFSSL_NOSHA512_256 && !FIPS ... */
2620
2621
#endif /* WOLFSSL_SHA512 */
2622
2623
#ifdef WOLFSSL_SHA384
2624
2625
#if defined(WOLFSSL_KCAPI_HASH)
2626
    /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */
2627
#elif defined(WOLFSSL_RENESAS_RSIP) && \
2628
     !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)
2629
    /* functions defined in wolfcrypt/src/port/renesas/renesas_fspsm_sha.c */
2630
#elif defined(MAX3266X_SHA)
2631
    /* Functions defined in wolfcrypt/src/port/maxim/max3266x.c */
2632
2633
#else
2634
2635
int wc_Sha384GetHash(wc_Sha384* sha384, byte* hash)
2636
1.25k
{
2637
1.25k
    int ret;
2638
1.25k
    WC_DECLARE_VAR(tmpSha384, wc_Sha384, 1, 0);
2639
2640
1.25k
    if (sha384 == NULL || hash == NULL) {
2641
0
        return BAD_FUNC_ARG;
2642
0
    }
2643
2644
1.25k
    WC_ALLOC_VAR_EX(tmpSha384, wc_Sha384, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
2645
1.25k
        return MEMORY_E);
2646
2647
    /* copy this sha384 into tmpSha */
2648
1.24k
    ret = wc_Sha384Copy(sha384, tmpSha384);
2649
1.24k
    if (ret == 0) {
2650
1.24k
        ret = wc_Sha384Final(tmpSha384, hash);
2651
1.24k
        wc_Sha384Free(tmpSha384);
2652
1.24k
    }
2653
2654
1.24k
    WC_FREE_VAR_EX(tmpSha384, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2655
2656
1.24k
    return ret;
2657
1.25k
}
2658
2659
int wc_Sha384Copy(wc_Sha384* src, wc_Sha384* dst)
2660
1.25k
{
2661
1.25k
    int ret = 0;
2662
2663
1.25k
    if (src == NULL || dst == NULL) {
2664
0
        return BAD_FUNC_ARG;
2665
0
    }
2666
2667
#if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_COPY)
2668
    #ifndef WOLF_CRYPTO_CB_FIND
2669
    if (src->devId != INVALID_DEVID)
2670
    #endif
2671
    {
2672
        /* Cast the source and destination to be void to keep the abstraction */
2673
        ret = wc_CryptoCb_Copy(src->devId, WC_ALGO_TYPE_HASH,
2674
                               WC_HASH_TYPE_SHA384, (void*)src, (void*)dst);
2675
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2676
            return ret;
2677
        /* fall-through when unavailable */
2678
    }
2679
    ret = 0; /* Reset ret to 0 to avoid returning the callback error code */
2680
#endif /* WOLF_CRYPTO_CB && WOLF_CRYPTO_CB_COPY */
2681
2682
1.25k
    XMEMCPY(dst, src, sizeof(wc_Sha384));
2683
2684
#ifdef WOLFSSL_SMALL_STACK_CACHE
2685
    /* This allocation combines the customary W buffer used by
2686
     * _Transform_Sha512() with additional buffer space used by
2687
     * wc_Sha512Transform().
2688
     */
2689
    dst->W = (word64 *)XMALLOC((sizeof(word64) * 16) + WC_SHA384_BLOCK_SIZE,
2690
                               dst->heap, DYNAMIC_TYPE_DIGEST);
2691
    if (dst->W == NULL) {
2692
        XMEMSET(dst, 0, sizeof(wc_Sha384));
2693
        return MEMORY_E;
2694
    }
2695
#endif
2696
2697
#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) && \
2698
    defined(WOLFSSL_SILABS_SHA384)
2699
    dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx;
2700
    dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx;
2701
#endif
2702
2703
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384)
2704
    ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev);
2705
#endif
2706
2707
#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \
2708
   !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)
2709
    #if defined(CONFIG_IDF_TARGET_ESP32)
2710
        esp_sha384_ctx_copy(src, dst);
2711
    #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \
2712
          defined(CONFIG_IDF_TARGET_ESP8684) || \
2713
          defined(CONFIG_IDF_TARGET_ESP32C3) || \
2714
          defined(CONFIG_IDF_TARGET_ESP32C6)
2715
        ESP_LOGV(TAG, "No SHA-384 HW on the ESP32-C3");
2716
    #elif defined(CONFIG_IDF_TARGET_ESP32S2) || \
2717
          defined(CONFIG_IDF_TARGET_ESP32S3)
2718
        esp_sha384_ctx_copy(src, dst);
2719
    #else
2720
        ESP_LOGW(TAG, "No SHA384 HW or not yet implemented for %s",
2721
                       CONFIG_IDF_TARGET);
2722
    #endif
2723
#endif
2724
2725
#ifdef HAVE_ARIA
2726
    dst->hSession = NULL;
2727
    if((src->hSession != NULL) && (MC_CopySession(src->hSession, &(dst->hSession)) != MC_OK)) {
2728
        return MEMORY_E;
2729
    }
2730
#endif
2731
2732
1.25k
#ifdef WOLFSSL_HASH_FLAGS
2733
1.25k
     dst->flags |= WC_HASH_FLAG_ISCOPY;
2734
1.25k
#endif
2735
2736
#if defined(WOLFSSL_HASH_KEEP)
2737
    if (src->msg != NULL) {
2738
        dst->msg = (byte*)XMALLOC(src->len, dst->heap, DYNAMIC_TYPE_TMP_BUFFER);
2739
        if (dst->msg == NULL)
2740
            return MEMORY_E;
2741
        XMEMCPY(dst->msg, src->msg, src->len);
2742
    }
2743
#endif
2744
2745
#ifdef MAX3266X_SHA_CB
2746
    ret = wc_MXC_TPU_SHA_Copy(&(src->mxcCtx), &(dst->mxcCtx));
2747
    if (ret != 0) {
2748
        return ret;
2749
    }
2750
#endif
2751
2752
#if defined(PSOC6_HASH_SHA2)
2753
    wc_Psoc6_Sha1_Sha2_Init(dst, WC_PSOC6_SHA384, 0);
2754
#endif
2755
2756
1.25k
    return ret;
2757
1.25k
}
2758
2759
#endif /* WOLFSSL_KCAPI_HASH */
2760
2761
#ifdef WOLFSSL_HASH_FLAGS
2762
int wc_Sha384SetFlags(wc_Sha384* sha384, word32 flags)
2763
85.7k
{
2764
85.7k
    if (sha384) {
2765
85.7k
        sha384->flags = flags;
2766
85.7k
    }
2767
85.7k
    return 0;
2768
85.7k
}
2769
int wc_Sha384GetFlags(wc_Sha384* sha384, word32* flags)
2770
0
{
2771
0
    if (sha384 && flags) {
2772
0
        *flags = sha384->flags;
2773
0
    }
2774
0
    return 0;
2775
0
}
2776
#endif
2777
2778
#endif /* WOLFSSL_SHA384 */
2779
2780
#ifdef WOLFSSL_HASH_KEEP
2781
/* Some hardware have issues with update, this function stores the data to be
2782
 * hashed into an array. Once ready, the Final operation is called on all of the
2783
 * data to be hashed at once.
2784
 * returns 0 on success
2785
 */
2786
int wc_Sha512_Grow(wc_Sha512* sha512, const byte* in, int inSz)
2787
{
2788
    return _wc_Hash_Grow(&(sha512->msg), &(sha512->used), &(sha512->len), in,
2789
                        inSz, sha512->heap);
2790
}
2791
#ifdef WOLFSSL_SHA384
2792
int wc_Sha384_Grow(wc_Sha384* sha384, const byte* in, int inSz)
2793
{
2794
    return _wc_Hash_Grow(&(sha384->msg), &(sha384->used), &(sha384->len), in,
2795
                        inSz, sha384->heap);
2796
}
2797
#endif /* WOLFSSL_SHA384 */
2798
#endif /* WOLFSSL_HASH_KEEP */
2799
#endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */