29 #ifndef __RANDOM_HEADER__ 30 #define __RANDOM_HEADER__ 32 #include "../crypto/hw_accel.h" 34 #ifdef __ENABLE_MOCANA_CRYPTO_INTERFACE_RANDOM__ 35 #include "../crypto_interface/crypto_interface_random_priv.h" 42 #define RANDOM_CONTEXT(X) (X)->pRandomContext 44 #ifdef MOC_EXTERN_RANDOM_H 45 #undef MOC_EXTERN_RANDOM_H 50 #ifdef WIN_EXPORT_RANDOM_H 51 #define MOC_EXTERN_RANDOM_H __declspec(dllexport) 53 #define MOC_EXTERN_RANDOM_H __declspec(dllimport) extern 57 #undef MOC_EXTERN_RANDOM_H 58 #define MOC_EXTERN_RANDOM_H extern 63 #define MOC_EXTERN_RANDOM_H MOC_EXTERN 71 #define MOC_EXTERN_P MOC_EXTERN_RANDOM_H 80 typedef void randomContext;
98 typedef sbyte4 (*
RNGFun)(
void* rngFunArg, ubyte4 length, ubyte *buffer);
99 MOC_EXTERN_RANDOM_H randomContext* g_pRandomContext;
107 typedef struct MocRandCtx
123 #ifdef __ENABLE_MOCANA_CRYPTO_INTERFACE_EXPORT__ 124 #define MOC_RAND_CTX_WRAPPER_STORAGE_SIZE 16 126 #define MOC_RAND_CTX_WRAPPER_STORAGE_SIZE 900 129 typedef struct RandomCtxWrapper
131 hwAccelDescr hwAccelCtx;
133 randomContextType WrappedCtxType;
134 ubyte4 reseedBitCounter;
138 ubyte storage[MOC_RAND_CTX_WRAPPER_STORAGE_SIZE];
144 #define IS_MOC_RAND(wrap) \ 145 ((wrap->WrappedCtxType == MOC_RAND)) 147 #define GET_MOC_RAND_CTX(wrap) \ 148 ((wrap->WrappedCtxType == MOC_RAND) ? ((MocRandCtx *)(wrap->WrappedCtx.storage)):(NULL)) 153 #define MOC_DEFAULT_NUM_ENTROPY_BYTES 48 156 #define ENTROPY_SRC_INTERNAL 0 157 #define ENTROPY_SRC_EXTERNAL 1 159 #if (defined(__DISABLE_MOCANA_RAND_ENTROPY_THREADS__) || defined(__ENABLE_MOCANA_FIPS_MODULE__)) 160 #define ENTROPY_DEFAULT_SRC ENTROPY_SRC_EXTERNAL 162 #define ENTROPY_DEFAULT_SRC ENTROPY_SRC_INTERNAL 166 #define MOC_AUTOSEED MOC_INIT_FLAG_AUTOSEED 167 #define MOC_NO_AUTOSEED MOC_INIT_FLAG_NO_AUTOSEED 168 #define MOC_SEED_FROM_DEV_URANDOM MOC_INIT_FLAG_SEED_FROM_DEV_URANDOM 170 #ifdef __DISABLE_MOCANA_RAND_ENTROPY_THREADS__ 171 #define MOC_SEED_DEFAULT MOC_NO_AUTOSEED 173 #define MOC_SEED_DEFAULT MOC_AUTOSEED 176 #define MOC_AUTOSEED_MIN_NUM_BYTES 8 177 #define MOC_AUTOSEED_MAX_NUM_BYTES 64 181 #ifndef MOCANA_RNG_GET_PERSONALIZATION_STRING 182 #define MOCANA_RNG_GET_PERSONALIZATION_STRING GetNullPersonalizationString 185 #define NIST_CTRDRBG_DEFAULT_KEY_LEN_BYTES 32 186 #define NIST_CTRDRBG_DEFAULT_OUT_LEN_BYTES 16 190 #define MODE_RNG_ANY 0 191 #define MODE_RNG_FIPS186 1 192 #define MODE_DRBG_CTR 3 194 #define RANDOM_DEFAULT_ALGO MODE_DRBG_CTR 222 MOC_EXTERN MSTATUS RANDOM_acquireContextEx(randomContext **pp_randomContext, ubyte algoId);
249 MOC_EXTERN MSTATUS RANDOM_releaseContextEx (randomContext **pp_randomContext);
251 #ifndef __DISABLE_MOCANA_ADD_ENTROPY__ 279 MOC_EXTERN MSTATUS RANDOM_addEntropyBitEx(randomContext *pRandomContext, ubyte entropyBit);
356 randomContext **ppRandomContext,
357 intBoolean *pIsMocSym
487 MOC_EXTERN sbyte4
RANDOM_rngFun(
void* rngFunArg, ubyte4 length, ubyte *buffer);
534 MOC_EXTERN MSTATUS RANDOM_KSrcGenerator(randomContext *pRandomContext, ubyte buffer[40]);
566 MOC_EXTERN MSTATUS
RANDOM_newFIPS186Context( randomContext **ppRandomContext, ubyte b,
const ubyte pXKey[], sbyte4 seedLen,
const ubyte pXSeed[]);
633 randomContext *pRandomCtx,
699 ubyte *pAdditionalData,
700 ubyte4 additionalDataLen
719 randomContext *pRandomContext,
720 ubyte *pRetRandomBytes,
721 ubyte4 numRandomBytes,
722 ubyte *pAdditionalData,
723 ubyte4 additionalDataLen
736 #ifdef __FIPS_OPS_TEST__ 751 #ifdef __ENABLE_MOCANA_DEV_URANDOM__ 762 #define MOC_SEED_FROM_DEV_URAND(_status, _randCtx, _numBytes) \ 763 _status = RANDOM_seedFromDevURandom (_randCtx, _numBytes); \ 769 #define MOC_SEED_FROM_DEV_URAND(_status, _randCtx, _numBytes) \ 770 _status = ERR_RAND_SEED_METHOD_NOT_SUPPORTED; \ 777 #ifdef __DISABLE_MOCANA_RAND_ENTROPY_THREADS__ 793 #define MOC_VERIFY_AUTOSEED_ENABLED(_status) \ 794 _status = ERR_RAND_SEED_METHOD_NOT_SUPPORTED; \ 797 #define MOC_VERIFY_AUTOSEED_ENABLED(_status) 803 #if defined(__MOCANA_FORCE_ENTROPY__) || defined(__ENABLE_MOCANA_CUSTOM_ENTROPY_INJECT__) 804 #ifndef __DISABLE_MOCANA_ADD_ENTROPY__ 821 #define MOC_ADD_ENTROPY_PRE_INIT(_status) \ 822 _status = RANDOM_setEntropySource(ENTROPY_SRC_EXTERNAL); \ 829 #if defined(__ENABLE_MOCANA_CUSTOM_ENTROPY_INJECT__) 830 #ifndef __DISABLE_MOCANA_ADD_ENTROPY__ 848 #define MOC_ADD_ENTROPY_INIT(_status, _pSetupInfo) \ 849 _status = MOCANA_addCustomEntropyInjection(); \ 856 #if defined(__MOCANA_FORCE_ENTROPY__) && !defined(__ENABLE_MOCANA_CUSTOM_ENTROPY_INJECT__) 857 #ifndef __DISABLE_MOCANA_ADD_ENTROPY__ 875 #define MOC_ADD_ENTROPY_INIT(_status, _pSetupInfo) \ 876 if (NULL != _pSetupInfo) \ 878 if (0 != (MOC_NO_AUTOSEED & _pSetupInfo->flags)) \ 880 _status = RANDOM_setEntropySource(ENTROPY_SRC_EXTERNAL); \ 885 _status = MOCANA_addExternalEntropy(1); \ 906 #define MOC_ADD_ENTROPY_UNINIT() \ 907 MOCANA_cancelExternalEntropy(); 912 #ifndef MOC_ADD_ENTROPY_INIT 913 #define MOC_ADD_ENTROPY_INIT(_status, _pSetupInfo) 915 #ifndef MOC_ADD_ENTROPY_UNINIT 916 #define MOC_ADD_ENTROPY_UNINIT() 918 #ifndef MOC_ADD_ENTROPY_PRE_INIT 919 #define MOC_ADD_ENTROPY_PRE_INIT(_status) 924 #ifndef __DISABLE_MOCANA_RNG__ 926 #ifdef __ENABLE_MOCANA_CRYPTO_INTERFACE__ 938 #define MOC_GRNG_DEFAULT_INIT(_status) \ 939 if (NULL == g_pRandomContext) \ 941 _status = CRYPTO_INTERFACE_RANDOM_acquireContextEx ( \ 942 &g_pRandomContext, RANDOM_DEFAULT_ALGO); \ 958 #define MOC_GRNG_DEFAULT_FREE(_status, _dStatus) \ 959 _dStatus = CRYPTO_INTERFACE_RANDOM_releaseContextEx(&g_pRandomContext); \ 975 #define MOC_GRNG_DEFAULT_INIT(_status) \ 976 if (NULL == g_pRandomContext) \ 978 _status = RANDOM_acquireContext(&g_pRandomContext); \ 994 #define MOC_GRNG_DEFAULT_FREE(_status, _dStatus) \ 995 _dStatus = RANDOM_releaseContext(&g_pRandomContext); \ 1013 #define MOC_GRNG_DEPOT_INIT(_status) \ 1014 _status = RNG_SEED_initDepotState(); \ 1015 if (OK != _status) \ 1029 #define MOC_GRNG_DEPOT_FREE() \ 1030 RNG_SEED_freeDepotState(); 1034 #ifdef __ENABLE_MOCANA_SYM__ 1066 #define MOC_GRNG_FULL_INIT(_status, _pSetupInfo, _pMocCtx) \ 1067 if (NULL != _pSetupInfo) \ 1069 if (0 != (MOC_NO_AUTOSEED & _pSetupInfo->flags)) \ 1071 _status = RANDOM_setEntropySource(ENTROPY_SRC_EXTERNAL); \ 1072 if (OK != _status) \ 1076 _status = ERR_RAND_CTX_ALREADY_INITIALIZED; \ 1077 if (NULL != g_pRandomContext) \ 1080 if (NULL != _pSetupInfo->MocSymRandOperator) \ 1082 intBoolean support = FALSE; \ 1083 MocRandCtx *pRandCtx = NULL; \ 1084 RandomCtxWrapper *pWrap = NULL; \ 1085 MocSymCtx pCtx = NULL; \ 1087 _status = CRYPTO_createMocSymRandom(_pSetupInfo->MocSymRandOperator, \ 1088 _pSetupInfo->pOperatorInfo, \ 1089 _pMocCtx, &g_pRandomContext); \ 1090 if (OK != _status) \ 1093 pWrap = (RandomCtxWrapper *) g_pRandomContext; \ 1095 _status = ERR_NULL_POINTER; \ 1096 if (NULL == pWrap) \ 1099 pRandCtx = (MocRandCtx *)&(pWrap->WrappedCtx.storage); \ 1100 pCtx = (MocSymCtx)(pRandCtx->pMocSymObj); \ 1101 if ( (NULL == pCtx) || (NULL == pCtx->SymOperator) ) \ 1104 _status = pCtx->SymOperator ( \ 1105 pCtx, _pMocCtx, MOC_SYM_OP_RAND_GET_SEED_TYPE, NULL, \ 1106 (void *)&support); \ 1107 if (OK != _status) \ 1110 if ( (0 == (MOC_NO_AUTOSEED & _pSetupInfo->flags)) && \ 1111 (MOC_SYM_RAND_SEED_TYPE_DIRECT == support) ) \ 1113 if (0 != (MOC_SEED_FROM_DEV_URANDOM & _pSetupInfo->flags)) \ 1115 MOC_SEED_FROM_DEV_URAND ( \ 1116 _status, g_pRandomContext, MOC_DEFAULT_NUM_ENTROPY_BYTES) \ 1120 ubyte entropy[MOC_DEFAULT_NUM_ENTROPY_BYTES] = {0}; \ 1121 _status = RANDOM_getAutoSeedBytes ( \ 1122 entropy, MOC_DEFAULT_NUM_ENTROPY_BYTES); \ 1123 if (OK != _status) \ 1126 _status = CRYPTO_seedRandomContext(g_pRandomContext, \ 1129 MOC_DEFAULT_NUM_ENTROPY_BYTES); \ 1130 MOC_MEMSET(entropy, 0, MOC_DEFAULT_NUM_ENTROPY_BYTES); \ 1132 if (OK != _status) \ 1138 MOC_GRNG_DEFAULT_INIT(_status) \ 1139 if (0 != (MOC_SEED_FROM_DEV_URANDOM & _pSetupInfo->flags)) \ 1141 MOC_SEED_FROM_DEV_URAND ( \ 1142 _status, g_pRandomContext, MOC_DEFAULT_NUM_ENTROPY_BYTES) \ 1148 MOC_GRNG_DEFAULT_INIT(_status) \ 1173 #define MOC_GRNG_FULL_FREE(_status, _dStatus) \ 1174 intBoolean isMocSymRand = FALSE; \ 1175 _dStatus = RANDOM_isMocSymContext(&g_pRandomContext, &isMocSymRand); \ 1176 if (OK != _dStatus) \ 1177 _status = _dStatus; \ 1178 if (TRUE == isMocSymRand) \ 1180 _dStatus = CRYPTO_freeMocSymRandom(&g_pRandomContext); \ 1181 if (OK != _dStatus) \ 1182 _status = _dStatus; \ 1186 MOC_GRNG_DEFAULT_FREE(_status, _dStatus) \ 1192 #define MOC_GRNG_FULL_INIT(_status, _pSetupInfo, _pMocCtx) \ 1193 MOC_GRNG_DEFAULT_INIT(_status) 1194 #define MOC_GRNG_FULL_FREE(_status, _dStatus) \ 1195 MOC_GRNG_DEFAULT_FREE(_status, _dStatus) 1214 #define MOC_GRNG_INIT(_status, _pSetupInfo, _pMocCtx) \ 1215 MOC_ADD_ENTROPY_PRE_INIT(_status) \ 1216 MOC_GRNG_DEPOT_INIT(_status) \ 1217 MOC_GRNG_FULL_INIT(_status, _pSetupInfo, _pMocCtx) \ 1218 MOC_ADD_ENTROPY_INIT(_status, _pSetupInfo) 1232 #define MOC_GRNG_FREE(_status, _dStatus) \ 1233 MOC_GRNG_FULL_FREE(_status, _dStatus) \ 1234 MOC_GRNG_DEPOT_FREE() \ 1235 MOC_ADD_ENTROPY_UNINIT() 1240 #ifndef MOC_GRNG_INIT 1241 #define MOC_GRNG_INIT(_status, _pSetupInfo, _pMocCtx) 1243 #ifndef MOC_GRNG_FREE 1244 #define MOC_GRNG_FREE(_status, _dStatus) MOC_EXTERN MSTATUS RANDOM_addEntropyBit(randomContext *pRandomContext, ubyte entropyBit)
Add entropy to the RNG (random number generator) module.
MOC_EXTERN MSTATUS RANDOM_reseedContext(randomContext *pCtx, ubyte *pEntropy, ubyte4 entropyLen, ubyte *pAdditionalData, ubyte4 additionalDataLen)
Reseed a random context.
MOC_EXTERN MSTATUS RANDOM_seedFromDevURandom(randomContext *pCtx, ubyte4 numBytes)
Seed a random context with bytes from /dev/urandom.
MOC_EXTERN MSTATUS RANDOM_isMocSymContext(randomContext **ppRandomContext, intBoolean *pIsMocSym)
Determine if a randomContext refers to a MocSym random implementation.
MOC_EXTERN MSTATUS RANDOM_seedFIPS186Context(randomContext *pRandomCtx, ubyte *seed, ubyte4 seedLen)
Seed a previously allocated FIPS186 Random Context.
MOC_EXTERN MSTATUS RANDOM_numberGenerator(randomContext *pRandomContext, ubyte *pBuffer, sbyte4 bufSize)
Generate the specified number of random bits.
MOC_EXTERN MSTATUS RANDOM_acquireContext(randomContext **pp_randomContext)
Create an RNG (random number generator) context data structure.
MOC_EXTERN MSTATUS RANDOM_getAutoSeedBytes(ubyte *pSeedBytes, ubyte4 numBytes)
Collect entropy bytes for seed material.
MOC_EXTERN MSTATUS RANDOM_deleteFIPS186Context(randomContext **ppRandomContext)
Deletes a FIPS186 RNG context.
MOC_EXTERN MSTATUS RANDOM_releaseContext(randomContext **pp_randomContext)
Delete RNG (random number generator) context data structure.
MOC_EXTERN void triggerRNGFail(void)
Sets the global RNG fail flag to TRUE (1).
MOC_EXTERN MSTATUS RANDOM_launchAutoSeed(randomContext *pCtx)
Seed a random context using the built-in entropy collection.
MOC_EXTERN MSTATUS RANDOM_numberGeneratorAdd(randomContext *pRandomContext, ubyte *pRetRandomBytes, ubyte4 numRandomBytes, ubyte *pAdditionalData, ubyte4 additionalDataLen)
Generate random bytes with optional additional input.
MOC_EXTERN MSTATUS RANDOM_generateASCIIString(randomContext *pRandomContext, ubyte *pBuffer, ubyte4 bufferLen)
Function to return a random ASCII character string.
MOC_EXTERN MSTATUS RANDOM_numberGeneratorFIPS186(randomContext *pRandomContext, ubyte *pRetRandomBytes, sbyte4 numRandomBytes)
Generate the specified number of random bits via FIPS186.
sbyte4(* RNGFun)(void *rngFunArg, ubyte4 length, ubyte *buffer)
Function pointer type for a method that produces (pseudo) random bytes.
Definition: random.h:98
MOC_EXTERN MSTATUS RANDOM_newFIPS186Context(randomContext **ppRandomContext, ubyte b, const ubyte pXKey[], sbyte4 seedLen, const ubyte pXSeed[])
Generate FIPS-specific RNG context data structure using provided seed.
MOC_EXTERN void resetRNGFail(void)
Resets the global RNG fail flag back to FALSE (0).
MOC_EXTERN sbyte4 RANDOM_rngFun(void *rngFunArg, ubyte4 length, ubyte *buffer)
Generate a random number.
MOC_EXTERN MSTATUS RANDOM_setEntropySource(ubyte EntropySrc)
Sets the global entropy source flag.
MOC_EXTERN MSTATUS RANDOM_seedOldRandom(randomContext *pCtx, ubyte *pSeedBytes, ubyte4 seedLen)
Seeds randomContexts that are not MocSym Operators.
MOC_EXTERN ubyte * GetNullPersonalizationString(ubyte4 *pLen)
Returns a NULL string.
MOC_EXTERN ubyte RANDOM_getEntropySource(void)
Gets the global entropy source flag.