229 lines
4 KiB
C
229 lines
4 KiB
C
/*++
|
|
|
|
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__
|