|
|
/*++
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__
|