28#ifndef WOLF_CRYPT_RANDOM_H
29#define WOLF_CRYPT_RANDOM_H
33#if defined(HAVE_FIPS) && \
34 defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)
35 #include <wolfssl/wolfcrypt/fips.h>
39#if defined(HAVE_FIPS) && \
40 (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
41#include <cyassl/ctaocrypt/random.h>
49#ifndef RNG_MAX_BLOCK_LEN
51 #define RNG_MAX_BLOCK_LEN (0xFFFFl)
53 #define RNG_MAX_BLOCK_LEN (0x10000l)
59 #define DRBG_SEED_LEN (440/8)
63#if !defined(CUSTOM_RAND_TYPE)
65 #define CUSTOM_RAND_TYPE byte
70#if !defined(WC_NO_HASHDRBG) && !defined(CUSTOM_RAND_GENERATE_BLOCK)
73 #ifndef WC_RESEED_INTERVAL
74 #define WC_RESEED_INTERVAL (1000000)
80#if !defined(HAVE_FIPS) || \
81 (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
97#if defined(CUSTOM_RAND_GENERATE_BLOCK)
102#elif defined(HAVE_HASHDRBG)
104 #error "Hash DRBG requires SHA-256."
107#elif defined(HAVE_WNR)
109#elif defined(HAVE_INTEL_RDRAND)
111#elif !defined(WC_NO_RNG)
112 #error No RNG source defined!
119#ifdef WOLFSSL_ASYNC_CRYPT
120 #include <wolfssl/wolfcrypt/async.h>
124#if defined(USE_WINDOWS_API)
126 typedef unsigned __int64 ProviderHandle;
129 typedef unsigned long ProviderHandle;
136 #if defined(USE_WINDOWS_API)
137 ProviderHandle handle;
141 #if defined(WOLF_CRYPTO_CB)
147#ifndef WC_RNG_TYPE_DEFINED
149 #define WC_RNG_TYPE_DEFINED
159#if defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_STATIC_MEMORY)
160 #define DRBG_STRUCT_SZ ((sizeof(word32)*3) + (DRBG_SEED_LEN*2))
161 #ifdef WOLFSSL_SMALL_STACK_CACHE
162 #define DRBG_STRUCT_SZ_SHA256 (sizeof(wc_Sha256))
164 #define DRBG_STRUCT_SZ_SHA256 0
166 #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLF_CRYPTO_CB)
167 #define DRBG_STRUCT_SZ_ASYNC (sizeof(void*) + sizeof(int))
169 #define DRBG_STRUCT_SZ_ASYNC 0
171 byte drbg_data[DRBG_STRUCT_SZ + DRBG_STRUCT_SZ_SHA256 + DRBG_STRUCT_SZ_ASYNC];
175#ifdef WOLFSSL_ASYNC_CRYPT
176 WC_ASYNC_DEV asyncDev;
178#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLF_CRYPTO_CB)
187#if !defined(NO_OLD_RNGNAME) && !defined(HAVE_FIPS)
193int wc_GenerateSeed(
OS_Seed* os,
byte* seed, word32 sz);
203WOLFSSL_ABI WOLFSSL_API
WC_RNG* wc_rng_new(
byte*, word32,
void*);
204WOLFSSL_ABI WOLFSSL_API
void wc_rng_free(
WC_RNG*);
209WOLFSSL_API
int wc_InitRng_ex(
WC_RNG* rng,
void* heap,
int devId);
210WOLFSSL_API
int wc_InitRngNonce(
WC_RNG* rng,
byte* nonce, word32 nonceSz);
211WOLFSSL_API
int wc_InitRngNonce_ex(
WC_RNG* rng,
byte* nonce, word32 nonceSz,
212 void* heap,
int devId);
218#define wc_InitRng(rng) NOT_COMPILED_IN
219#define wc_InitRng_ex(rng, h, d) NOT_COMPILED_IN
220#define wc_InitRngNonce(rng, n, s) NOT_COMPILED_IN
221#define wc_InitRngNonce_ex(rng, n, s, h, d) NOT_COMPILED_IN
222#define wc_RNG_GenerateBlock(rng, b, s) NOT_COMPILED_IN
223#define wc_RNG_GenerateByte(rng, b) NOT_COMPILED_IN
224#define wc_FreeRng(rng) (void)NOT_COMPILED_IN
230 WOLFSSL_LOCAL
int wc_RNG_DRBG_Reseed(
WC_RNG* rng,
const byte* entropy,
232 WOLFSSL_API
int wc_RNG_TestSeed(
const byte* seed, word32 seedSz);
234 const byte* entropyA, word32 entropyASz,
235 const byte* entropyB, word32 entropyBSz,
236 byte* output, word32 outputSz);
237 WOLFSSL_API
int wc_RNG_HealthTest_ex(
int reseed,
238 const byte* nonce, word32 nonceSz,
239 const byte* entropyA, word32 entropyASz,
240 const byte* entropyB, word32 entropyBSz,
241 byte* output, word32 outputSz,
242 void* heap,
int devId);
WOLFSSL_API int wc_RNG_GenerateByte(WC_RNG *, byte *)
Calls wc_RNG_GenerateBlock to copy a byte of pseudorandom data to b. Will reseed rng if needed.
Definition random.c:989
WOLFSSL_API int wc_RNG_GenerateBlock(WC_RNG *, byte *, word32 sz)
Copies a sz bytes of pseudorandom data to output. Will reseed rng if needed (blocking).
Definition random.c:896
WOLFSSL_API int wc_InitRng(WC_RNG *)
Gets the seed (from OS) and key cipher for rng. rng->drbg (deterministic random bit generator) alloca...
Definition random.c:869
WOLFSSL_API int wc_FreeRng(WC_RNG *)
Should be called when RNG no longer needed in order to securely free drgb. Zeros and XFREEs rng-drbg.
Definition random.c:995
WOLFSSL_API int wc_RNG_HealthTest(int reseed, const byte *entropyA, word32 entropyASz, const byte *entropyB, word32 entropyBSz, byte *output, word32 outputSz)
Creates and tests functionality of drbg.
Definition random.c:1024
WOLFSSL_API int wc_InitNetRandom(const char *, wnr_hmac_key, int)
Init global Whitewood netRandom context.
Definition random.c:1231
WOLFSSL_API int wc_FreeNetRandom(void)
Free global Whitewood netRandom context.
Definition random.c:1296