/*++ Copyright (c) 1993, 1998 Microsoft Corporation Module Name: randlib.h Abstract: Exported procedures for core cryptographic random number generation. Author: Scott Field (sfield) 27-Oct-98 Revision History: Oct 11 1996 jeffspel moved from ntagimp1.h Aug 27 1997 sfield Increase RAND_CTXT_LEN Aug 15 1998 sfield Kernel mode and general cleanup --*/ #ifndef __RANDLIB_H__ #define __RANDLIB_H__ #ifndef RSA32API #define RSA32API __stdcall #endif #ifdef __cplusplus extern "C" { #endif typedef struct { unsigned long cbSize; unsigned long Flags; unsigned char *pbRandSeed; unsigned long cbRandSeed; } RNG_CONTEXT, *PRNG_CONTEXT, *LPRNG_CONTEXT; #define RNG_FLAG_REKEY_ONLY 1 // // primary random number generation interface // Functions return TRUE for success, FALSE for failure. // unsigned int RSA32API NewGenRandomEx( IN RNG_CONTEXT *pRNGContext, IN OUT unsigned char *pbRandBuffer, IN unsigned long cbRandBuffer ); unsigned int RSA32API NewGenRandom( IN OUT unsigned char **ppbRandSeed, // initial seed value (ignored if already set) IN unsigned long *pcbRandSeed, IN OUT unsigned char *pbBuffer, IN unsigned long dwLength ); // // RNG seed set and query // unsigned int RSA32API InitRand( IN OUT unsigned char **ppbRandSeed, // new seed value to set (over-writes current) IN unsigned long *pcbRandSeed ); unsigned int RSA32API DeInitRand( IN OUT unsigned char *pbRandSeed, // output of current seed IN unsigned long cbRandSeed ); // // RNG initializers for DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH // unsigned int RSA32API InitializeRNG( VOID *pvReserved ); void RSA32API ShutdownRNG( VOID *pvReserved ); // // RC4 thread safe primitives, for the bold users who stream data from RC4 // themselves. // // // rc4_safe_startup called to initialize internal structures. // typically called during DLL_PROCESS_ATTACH type initialiation code. // unsigned int RSA32API rc4_safe_startup( IN OUT void **ppContext ); unsigned int RSA32API rc4_safe_startup_np( IN OUT void **ppContext ); // // typically call rc4_safe_shutdown during DLL_PROCESS_DETACH, with the // value obtained during rc4_safe_startup // void RSA32API rc4_safe_shutdown( IN void *pContext ); void RSA32API rc4_safe_shutdown_np( IN void *pContext ); // // select a safe entry. // outputs: entry index // bytes used for specified index. 0xffffffff indicates caller // MUST call rc4_safe_key to initialize the key. // caller decides when to rekey based on non-zero output of pBytesUsed // example is RNG re-keying when pBytesUsed >= 16384 // void RSA32API rc4_safe_select( IN void *pContext, OUT unsigned int *pEntry, OUT unsigned int *pBytesUsed ); void RSA32API rc4_safe_select_np( IN void *pContext, OUT unsigned int *pEntry, OUT unsigned int *pBytesUsed ); // // initialize the key specified by Entry index. // key material is size cb, pointer to key is pv. // this routine is the safe version of rc4_key() // void RSA32API rc4_safe_key( IN void *pContext, IN unsigned int Entry, IN unsigned int cb, IN const void *pv ); void RSA32API rc4_safe_key_np( IN void *pContext, IN unsigned int Entry, // 0xffffffff for default IN unsigned int cb, IN const void *pv ); // // encrypt using the key specified by Entry index. // buffer of size cb at location pv is encrypted. // this routine is the safe version of rc4() // void RSA32API rc4_safe( IN void *pContext, IN unsigned int Entry, IN unsigned int cb, IN void *pv ); void RSA32API rc4_safe_np( IN void *pContext, IN unsigned int Entry, IN unsigned int cb, IN void *pv ); #ifdef __cplusplus } #endif #endif // __RANDLIB_H__