Coverage Report

Created: 2026-01-06 06:52

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