windows-nt/Source/XPSP1/NT/public/internal/ds/inc/crypto/randlib.h
2020-09-26 16:20:57 +08:00

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__