Skip to content

Commit f8d12a1

Browse files
committed
Add HAVE_SELFTEST and rng_bank SHA512 awareness
1 parent a94900f commit f8d12a1

8 files changed

Lines changed: 98 additions & 24 deletions

File tree

configure.ac

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4453,6 +4453,12 @@ AC_ARG_ENABLE([sha512-drbg],
44534453
[ ENABLED_SHA512_DRBG=yes ]
44544454
)
44554455

4456+
# SHA-512 DRBG requires SHA-512
4457+
if test "$ENABLED_SHA512" != "yes"
4458+
then
4459+
ENABLED_SHA512_DRBG=no
4460+
fi
4461+
44564462
# SHA384
44574463
AC_ARG_ENABLE([sha384],
44584464
[AS_HELP_STRING([--enable-sha384],[Enable wolfSSL SHA-384 support (default: enabled)])],
@@ -6823,6 +6829,11 @@ AS_CASE([$SELFTEST_VERSION],
68236829
AM_CFLAGS="$AM_CFLAGS -DHAVE_SELFTEST -DHAVE_PUBLIC_FFDHE"
68246830
])
68256831
6832+
# Selftest uses its own random.c which doesn't support SHA-512 DRBG
6833+
# or runtime DRBG disable/enable APIs
6834+
AS_IF([test "x$ENABLED_SELFTEST" = "xyes"],
6835+
[ENABLED_SHA512_DRBG=no])
6836+
68266837
AS_IF([test "x$ENABLED_AESXTS" = "xyes"],
68276838
[AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_XTS -DWOLFSSL_AES_DIRECT"])
68286839
AS_IF([test "x$ENABLED_AESXTS" = "xyes" && test "x$ENABLED_INTELASM" = "xyes"],

tests/api/test_random.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,9 @@ int test_wc_RNG_HealthTest(void)
539539
int test_wc_RNG_HealthTest_SHA512(void)
540540
{
541541
EXPECT_DECLS;
542-
#if defined(HAVE_HASHDRBG) && defined(WOLFSSL_DRBG_SHA512)
542+
#if defined(HAVE_HASHDRBG) && defined(WOLFSSL_DRBG_SHA512) && \
543+
!defined(HAVE_SELFTEST) && \
544+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
543545

544546
/* No-reseed test: drbgvectors_no_reseed/Hash_DRBG.rsp, [SHA-512],
545547
* COUNT=0 */
@@ -667,7 +669,7 @@ int test_wc_RNG_HealthTest_SHA512(void)
667669
test2SeedB, sizeof(test2SeedB), output, sizeof(output)), 0);
668670
ExpectBufEQ(test2Output, output, sizeof(output));
669671

670-
#endif /* HAVE_HASHDRBG && WOLFSSL_DRBG_SHA512 */
672+
#endif /* HAVE_HASHDRBG && WOLFSSL_DRBG_SHA512 && !HAVE_SELFTEST && FIPS v7+ */
671673
return EXPECT_RESULT();
672674
}
673675

wolfcrypt/benchmark/benchmark.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,8 @@ static WC_INLINE void bench_append_memory_info(char* buffer, size_t size,
969969
/* Other */
970970
#define BENCH_RNG 0x00000001
971971
#define BENCH_SCRYPT 0x00000002
972-
#ifdef WOLFSSL_DRBG_SHA512
972+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
973+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
973974
#define BENCH_RNG_SHA512 0x00000004
974975
#endif
975976

@@ -1278,7 +1279,8 @@ static const bench_alg bench_other_opt[] = {
12781279
#ifndef WC_NO_RNG
12791280
{ "-rng", BENCH_RNG },
12801281
#endif
1281-
#ifdef WOLFSSL_DRBG_SHA512
1282+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
1283+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
12821284
{ "-rng-sha512", BENCH_RNG_SHA512 },
12831285
#endif
12841286
#ifdef HAVE_SCRYPT
@@ -3815,7 +3817,8 @@ static void* benchmarks_do(void* args)
38153817
if (bench_all || (bench_other_algs & BENCH_RNG))
38163818
bench_rng();
38173819
#endif /* WC_NO_RNG */
3818-
#ifdef WOLFSSL_DRBG_SHA512
3820+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
3821+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
38193822
if (bench_all || (bench_other_algs & BENCH_RNG_SHA512))
38203823
bench_rng_sha512();
38213824
#endif
@@ -4889,15 +4892,18 @@ void bench_rng(void)
48894892
DECLARE_MULTI_VALUE_STATS_VARS()
48904893

48914894
/* Force SHA-256 DRBG by temporarily disabling SHA-512 DRBG */
4892-
#if defined(WOLFSSL_DRBG_SHA512) && defined(WOLFSSL_DRBG_SHA256)
4895+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
4896+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
4897+
#if defined(WOLFSSL_DRBG_SHA256)
48934898
ret = wc_Sha512Drbg_Disable();
48944899
if (ret != 0) {
48954900
printf("wc_Sha512Drbg_Disable failed %d\n", ret);
48964901
return;
48974902
}
4898-
#elif defined(WOLFSSL_DRBG_SHA512) && !defined(WOLFSSL_DRBG_SHA256)
4903+
#else
48994904
printf("RNG SHA-256 DRBG (Skipped: Disabled)\n");
49004905
return;
4906+
#endif
49014907
#endif
49024908

49034909
bench_stats_prepare();
@@ -4909,7 +4915,8 @@ void bench_rng(void)
49094915
#endif
49104916
if (ret < 0) {
49114917
printf("InitRNG (SHA-256) failed %d\n", ret);
4912-
#ifdef WOLFSSL_DRBG_SHA512
4918+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
4919+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
49134920
wc_Sha512Drbg_Enable();
49144921
#endif
49154922
return;
@@ -4951,13 +4958,15 @@ void bench_rng(void)
49514958
wc_FreeRng(&myrng);
49524959

49534960
/* Restore SHA-512 DRBG */
4954-
#ifdef WOLFSSL_DRBG_SHA512
4961+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
4962+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
49554963
wc_Sha512Drbg_Enable();
49564964
#endif
49574965
}
49584966
#endif /* WC_NO_RNG */
49594967

4960-
#ifdef WOLFSSL_DRBG_SHA512
4968+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
4969+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
49614970
void bench_rng_sha512(void)
49624971
{
49634972
int ret, i, count;
@@ -5030,7 +5039,7 @@ void bench_rng_sha512(void)
50305039
wc_Sha256Drbg_Enable();
50315040
#endif
50325041
}
5033-
#endif /* WOLFSSL_DRBG_SHA512 */
5042+
#endif /* WOLFSSL_DRBG_SHA512 && !HAVE_SELFTEST && FIPS v7+ */
50345043

50355044
#ifndef NO_AES
50365045

wolfcrypt/benchmark/benchmark.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,10 @@ void bench_sakkeRskGen(void);
127127
void bench_sakkeValidate(void);
128128
void bench_sakke(void);
129129
void bench_rng(void);
130+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
131+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
130132
void bench_rng_sha512(void);
133+
#endif
131134
void bench_blake2b(void);
132135
void bench_blake2s(void);
133136
void bench_ascon_hash(void);

wolfcrypt/src/random.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1316,7 +1316,10 @@ int wc_RNG_TestSeed(const byte* seed, word32 seedSz)
13161316

13171317
return ret;
13181318
}
1319-
/* Runtime DRBG disable/enable API */
1319+
/* Runtime DRBG disable/enable API — only available in non-selftest and
1320+
* FIPS v7+ builds (older FIPS/selftest random.c doesn't have these) */
1321+
#if !defined(HAVE_SELFTEST) && \
1322+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
13201323
#ifndef NO_SHA256
13211324
int wc_Sha256Drbg_Disable(void)
13221325
{
@@ -1346,6 +1349,7 @@ int wc_Sha256Drbg_Disable(void) { return NOT_COMPILED_IN; }
13461349
int wc_Sha256Drbg_Enable(void) { return 0; }
13471350
int wc_Sha256Drbg_GetStatus(void) { return 1; } /* always disabled */
13481351
#endif /* !NO_SHA256 */
1352+
#endif /* !HAVE_SELFTEST && (!HAVE_FIPS || FIPS v7+) */
13491353

13501354
#ifdef WOLFSSL_DRBG_SHA512
13511355
int wc_Sha512Drbg_Disable(void)

wolfcrypt/src/rng_bank.c

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,33 @@
2626
#include <wolfssl/wolfcrypt/random.h>
2727
#include <wolfssl/wolfcrypt/rng_bank.h>
2828

29+
/* Helper to get reseedCtr from the active DRBG, regardless of SHA-256/SHA-512 */
30+
#ifdef WOLFSSL_DRBG_SHA512
31+
#define WC_RNG_BANK_RESEED_CTR(rng_ptr) \
32+
(((rng_ptr)->drbgType == WC_DRBG_SHA512) \
33+
? ((struct DRBG_SHA512_internal *)(rng_ptr)->drbg512)->reseedCtr \
34+
: ((struct DRBG_internal *)(rng_ptr)->drbg)->reseedCtr)
35+
#define WC_RNG_BANK_SET_RESEED_CTR(rng_ptr, val) \
36+
do { \
37+
if ((rng_ptr)->drbgType == WC_DRBG_SHA512) \
38+
((struct DRBG_SHA512_internal *)(rng_ptr)->drbg512)->reseedCtr \
39+
= (val); \
40+
else \
41+
((struct DRBG_internal *)(rng_ptr)->drbg)->reseedCtr = (val); \
42+
} while (0)
43+
#define WC_RNG_BANK_DRBG_NULL(rng_ptr) \
44+
((rng_ptr)->drbg == NULL && (rng_ptr)->drbg512 == NULL)
45+
#else
46+
#define WC_RNG_BANK_RESEED_CTR(rng_ptr) \
47+
(((struct DRBG_internal *)(rng_ptr)->drbg)->reseedCtr)
48+
#define WC_RNG_BANK_SET_RESEED_CTR(rng_ptr, val) \
49+
do { \
50+
((struct DRBG_internal *)(rng_ptr)->drbg)->reseedCtr = (val); \
51+
} while (0)
52+
#define WC_RNG_BANK_DRBG_NULL(rng_ptr) \
53+
((rng_ptr)->drbg == NULL)
54+
#endif
55+
2956
WOLFSSL_API int wc_rng_bank_init(
3057
struct wc_rng_bank *ctx,
3158
int n_rngs,
@@ -343,7 +370,7 @@ WOLFSSL_API int wc_rng_bank_checkout(
343370
*rng_inst = &bank->rngs[preferred_inst_offset];
344371

345372
if ((! (flags & WC_RNG_BANK_FLAG_CAN_WAIT)) &&
346-
(((struct DRBG_internal *)(*rng_inst)->rng.drbg)->reseedCtr >=
373+
(WC_RNG_BANK_RESEED_CTR(&(*rng_inst)->rng) >=
347374
WC_RESEED_INTERVAL) &&
348375
(flags & WC_RNG_BANK_FLAG_CAN_FAIL_OVER_INST) &&
349376
(n_rngs_tried < bank->n_rngs))
@@ -353,7 +380,7 @@ WOLFSSL_API int wc_rng_bank_checkout(
353380
else {
354381
#ifdef WC_VERBOSE_RNG
355382
if ((! (flags & WC_RNG_BANK_FLAG_CAN_WAIT)) &&
356-
(((struct DRBG_internal *)(*rng_inst)->rng.drbg)->reseedCtr >=
383+
(WC_RNG_BANK_RESEED_CTR(&(*rng_inst)->rng) >=
357384
WC_RESEED_INTERVAL))
358385
{
359386
WOLFSSL_DEBUG_PRINTF(
@@ -484,7 +511,7 @@ WOLFSSL_API int wc_rng_bank_inst_reinit(
484511
int devId;
485512

486513
if ((rng_inst == NULL) ||
487-
(rng_inst->rng.drbg == NULL))
514+
WC_RNG_BANK_DRBG_NULL(&rng_inst->rng))
488515
{
489516
return BAD_FUNC_ARG;
490517
}
@@ -561,7 +588,7 @@ WOLFSSL_API int wc_rng_bank_seed(struct wc_rng_bank *bank,
561588
#endif
562589
break;
563590
}
564-
else if (drbg->rng.drbg == NULL) {
591+
else if (WC_RNG_BANK_DRBG_NULL(&drbg->rng)) {
565592
#ifdef WC_VERBOSE_RNG
566593
WOLFSSL_DEBUG_PRINTF(
567594
"WARNING: wc_rng_bank_seed(): inst#%d has null .drbg.\n", n);
@@ -612,8 +639,7 @@ WOLFSSL_API int wc_rng_bank_reseed(struct wc_rng_bank *bank,
612639
if (ret != 0)
613640
return ret;
614641

615-
((struct DRBG_internal *)drbg->rng.drbg)->reseedCtr =
616-
WC_RESEED_INTERVAL;
642+
WC_RNG_BANK_SET_RESEED_CTR(&drbg->rng, WC_RESEED_INTERVAL);
617643

618644
if (flags & WC_RNG_BANK_FLAG_CAN_WAIT) {
619645
byte scratch[4];

wolfcrypt/test/test.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20143,7 +20143,8 @@ static wc_test_ret_t _rng_test(WC_RNG* rng)
2014320143
WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))
2014420144
{
2014520145
#endif
20146-
#ifdef WOLFSSL_DRBG_SHA512
20146+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
20147+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
2014720148
if (rng->drbgType == WC_DRBG_SHA512) {
2014820149
((struct DRBG_SHA512_internal *)rng->drbg512)->reseedCtr =
2014920150
WC_RESEED_INTERVAL;
@@ -20159,7 +20160,8 @@ static wc_test_ret_t _rng_test(WC_RNG* rng)
2015920160
if (ret != 0)
2016020161
return WC_TEST_RET_ENC_EC(ret);
2016120162

20162-
#ifdef WOLFSSL_DRBG_SHA512
20163+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
20164+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
2016320165
if (rng->drbgType == WC_DRBG_SHA512) {
2016420166
if (((struct DRBG_SHA512_internal *)rng->drbg512)->reseedCtr ==
2016520167
WC_RESEED_INTERVAL)
@@ -20492,7 +20494,8 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t random_test(void)
2049220494
if (XMEMCMP(test2Output, output, sizeof(output)) != 0)
2049320495
return WC_TEST_RET_ENC_NC;
2049420496

20495-
#ifdef WOLFSSL_DRBG_SHA512
20497+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
20498+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
2049620499
/* SHA-512 DRBG Health Tests using NIST CAVP test vectors.
2049720500
* Source: NIST CAVP drbgtestvectors.zip, Hash_DRBG.rsp, [SHA-512],
2049820501
* https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-
@@ -20633,7 +20636,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t random_test(void)
2063320636
if (XMEMCMP(sha512test2Output, output512, sizeof(output512)) != 0)
2063420637
return WC_TEST_RET_ENC_NC;
2063520638
}
20636-
#endif /* WOLFSSL_DRBG_SHA512 */
20639+
#endif /* WOLFSSL_DRBG_SHA512 && !HAVE_SELFTEST && FIPS v7+ */
2063720640

2063820641
/* Basic RNG generate block test */
2063920642
if ((ret = random_rng_test()) != 0)
@@ -20855,8 +20858,20 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t random_bank_test(void)
2085520858
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
2085620859

2085720860
for (i = 0; i < bank->n_rngs; ++i) {
20861+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
20862+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
20863+
word64 bankReseedCtr;
20864+
if (bank->rngs[i].rng.drbgType == WC_DRBG_SHA512)
20865+
bankReseedCtr = ((struct DRBG_SHA512_internal *)
20866+
bank->rngs[i].rng.drbg512)->reseedCtr;
20867+
else
20868+
bankReseedCtr = ((struct DRBG_internal *)
20869+
bank->rngs[i].rng.drbg)->reseedCtr;
20870+
if (bankReseedCtr != WC_RESEED_INTERVAL)
20871+
#else
2085820872
if (((struct DRBG_internal *)bank->rngs[i].rng.drbg)
2085920873
->reseedCtr != WC_RESEED_INTERVAL)
20874+
#endif
2086020875
{
2086120876
ERROR_OUT(WC_TEST_RET_ENC_I(i), out);
2086220877
}

wolfssl/wolfcrypt/random.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,8 @@ WOLFSSL_API int wc_FreeRng(WC_RNG* rng);
482482
const byte* seedB, word32 seedBSz,
483483
byte* output, word32 outputSz,
484484
void* heap, int devId);
485-
#ifdef WOLFSSL_DRBG_SHA512
485+
#if defined(WOLFSSL_DRBG_SHA512) && !defined(HAVE_SELFTEST) && \
486+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
486487
WOLFSSL_API int wc_RNG_HealthTest_SHA512(int reseed,
487488
const byte* seedA, word32 seedASz,
488489
const byte* seedB, word32 seedBSz,
@@ -499,9 +500,11 @@ WOLFSSL_API int wc_FreeRng(WC_RNG* rng);
499500
word32 additionalBSz,
500501
byte* output, word32 outputSz,
501502
void* heap, int devId);
502-
#endif /* WOLFSSL_DRBG_SHA512 */
503+
#endif /* WOLFSSL_DRBG_SHA512 && !HAVE_SELFTEST && FIPS v7+ */
503504

504505
/* Runtime DRBG disable/enable API */
506+
#if !defined(HAVE_SELFTEST) && \
507+
(!defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0))
505508
WOLFSSL_API int wc_Sha256Drbg_Disable(void);
506509
WOLFSSL_API int wc_Sha256Drbg_Enable(void);
507510
WOLFSSL_API int wc_Sha256Drbg_GetStatus(void);
@@ -510,6 +513,7 @@ WOLFSSL_API int wc_FreeRng(WC_RNG* rng);
510513
WOLFSSL_API int wc_Sha512Drbg_Enable(void);
511514
WOLFSSL_API int wc_Sha512Drbg_GetStatus(void);
512515
#endif
516+
#endif /* !HAVE_SELFTEST && (!HAVE_FIPS || FIPS v7+) */
513517

514518
#endif /* HAVE_HASHDRBG */
515519

0 commit comments

Comments
 (0)