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) 193 int wc_GenerateSeed(
OS_Seed* os, byte* seed, word32 sz);
203 WOLFSSL_ABI WOLFSSL_API
WC_RNG* wc_rng_new(byte*, word32,
void*);
204 WOLFSSL_ABI WOLFSSL_API
void wc_rng_free(
WC_RNG*);
209 WOLFSSL_API
int wc_InitRng_ex(
WC_RNG* rng,
void* heap,
int devId);
210 WOLFSSL_API
int wc_InitRngNonce(
WC_RNG* rng, byte* nonce, word32 nonceSz);
211 WOLFSSL_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_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_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_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_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_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
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