Coverage Report

Created: 2025-11-16 07:15

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