13#define SYMCRYPT_RNG_AES_KEY_SIZE (32)
14#define SYMCRYPT_RNG_AES_KEY_AND_V_SIZE (32 + 16)
15#define SYMCRYPT_RNG_AES_MAX_REQUEST_SIZE (1<<16)
16#define SYMCRYPT_RNG_AES_MAX_REQUESTS_PER_RESEED ((UINT64)1<<48)
108#pragma prefast( suppress: 26015, "Logic why this doesn't overflow the buf[] array is too complicated for prefast" )
184#define TEST_AGAINST_OLD_CODE 0
185#if TEST_AGAINST_OLD_CODE
188 PCBYTE pbCheck = pbRandom;
189 SIZE_T cbCheck = cbRandom;
212 while( cBlocks != 0 )
229#define MAX_CTRMSB64_BLOCKS (1 << 3)
231#define MAX_CTRMSB64_BLOCKS (1 << 10)
242 pbRandom += bytesToDo;
243 cbRandom -= bytesToDo;
244 cBlocks -= blocksToDo;
256#if TEST_AGAINST_OLD_CODE
267 while( cbCheck != 0 )
306 SYMCRYPT_UNALIGNED
const SIZE_T * p1 = (SYMCRYPT_UNALIGNED
const SIZE_T *) pSrc1;
307 SYMCRYPT_UNALIGNED
const SIZE_T * p2 = (SYMCRYPT_UNALIGNED
const SIZE_T *) pSrc2;
311#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_ARM
314 tmp = (p1[0] ^ p2[0]) | (p1[1] ^ p2[1]) | (p1[2] ^ p2[2]) | (p1[3] ^ p2[3]);
316#elif SYMCRYPT_CPU_AMD64 | SYMCRYPT_CPU_ARM64
319 tmp = (p1[0] ^ p2[0]) | (p1[1] ^ p2[1]);
328 for(
i=0;
i < 16/
sizeof(
SIZE_T );
i ++ )
330 tmp |= p1[
i] ^ p2[
i];
415 sizeof(
pState->keyAndV) );
417 if( pbProvidedData !=
NULL )
428 if(
pKey == &aesKey )
441 SIZE_T cbAdditionalInput )
456 return SYMCRYPT_WRONG_DATA_SIZE;
466 return SYMCRYPT_FIPS_FAILURE;
469 if( pbAdditionalInput !=
NULL )
473 pbAdditionalInput = &
abSeed[0];
488 if( pRngState->fips140_2Check )
492 pbRandom += wholeBlocks;
493 cbRandom -= wholeBlocks;
503 if( pRngState->fips140_2Check )
514 ++pRngState->requestCounter;
519 return SYMCRYPT_NO_ERROR;
543 return SYMCRYPT_EXTERNAL_FAILURE;
581 if( scError != SYMCRYPT_NO_ERROR )
592 if( scError != SYMCRYPT_NO_ERROR )
618 return SYMCRYPT_EXTERNAL_FAILURE;
632 pRngState->requestCounter = 1;
636 return SYMCRYPT_NO_ERROR;
658 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
659 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
660 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
661 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
662 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
663 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
666 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
667 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
675 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
676 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
677 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
678 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
679 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,
680 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF
685 0xD1,0xE9,0xC7,0x37,0xB6,0xEB,0xAE,0xD7,
686 0x65,0xA0,0xD4,0xE4,0xC6,0xEA,0xEB,0xE2,
687 0x67,0xF5,0xE9,0x19,0x36,0x80,0xFD,0xFF,
688 0xA6,0x2F,0x48,0x65,0xB3,0xF0,0x09,0xEC,
694 0x8C,0x10,0xB6,0x58,0x44,0x0C,0x71,0x35,
695 0x64,0x9D,0xC7,0x7B,0xE6,0xE5,0x75,0xCE,
696 0x87,0xE7,0x48,0x90,0x83,0x9B,0x89,0x59,
697 0x14,0x17,0xAF,0xAD,0x14,0xB2,0x26,0xD5,
699 0xB4,0x03,0x6B,0x1D,0xBA,0x04,0x3A,0xE6,
700 0x55,0xAC,0xD6,0x46,0xEC,0x5A,0xD3,0x5C,
706 0x17,0x98,0xC0,0xDF,0x09,0x69,0x6A,0x46,
707 0x19,0x46,0xFE,0x6D,0x68,0x7D,0x8C,0xC8,
708 0x3F,0xEE,0xF1,0x22,0xF3,0xBB,0xC5,0xF2,
709 0x9D,0xAC,0x85,0x10,0xF3,0x4A,0xF0,0x15,
711 0x0B,0xF3,0x34,0x4D,0xF5,0x29,0x27,0x6B,
712 0x0D,0x5B,0xBC,0x83,0x9B,0xD3,0x65,0x6A,
718 0x28, 0xbc, 0x65, 0xa8, 0x6a, 0xb7, 0xc7, 0x4e, 0xdf, 0x4b, 0xb8, 0x72, 0x87, 0xd3, 0x4f, 0xbb,
719 0x8d, 0x6f, 0x16, 0xd7, 0xb9, 0x1b, 0x6a, 0xbb, 0xee, 0x7b, 0x88, 0x86, 0x5b, 0x0f, 0xc7, 0xbd,
721 0xb7, 0x46, 0x11, 0xf3, 0x92, 0x95, 0xa6, 0x25, 0x7c, 0x39, 0x98, 0x4c, 0x9c, 0x09, 0x9b, 0x30,
737#pragma prefast( suppress: 26060 6309 28020, "Deliberate test of invalid parameter");
739 if( scError == SYMCRYPT_NO_ERROR )
752 if ( scError != SYMCRYPT_NO_ERROR ||
753 0 !=
memcmp( pRngState->keyAndV,
772 pRngState->requestCounter = 7;
773 pRngState->fips140_2Check =
FALSE;
778#pragma prefast(suppress: 26060 6309 28020, "Deliberate test of invalid parameter");
780 if( scError == SYMCRYPT_NO_ERROR )
789 if ( scError != SYMCRYPT_NO_ERROR ||
790 0 !=
memcmp( pRngState->keyAndV,
810 pRngState->requestCounter = 7;
811 pRngState->fips140_2Check =
FALSE;
822 if( scError == SYMCRYPT_NO_ERROR )
826 pRngState->requestCounter = 7;
828#pragma prefast( suppress: 6202 26000, "buffer size of cbOutput is purposely incorrect");
831 if( scError == SYMCRYPT_NO_ERROR )
853 if ( 0 !=
memcmp( pRngState->keyAndV,
877 for(
i=0;
i<
sizeof( *pRngState ) /
sizeof(
SIZE_T );
i ++ )
947 if( scError == SYMCRYPT_NO_ERROR )
952 SymCryptRngAesGenerate( &pRngState->rng, pRngState->rng.previousBlock,
sizeof( pRngState->rng.previousBlock ) );
953 pRngState->rng.fips140_2Check =
TRUE;
COMPILER_DEPENDENT_UINT64 UINT64
_Use_decl_annotations_ SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptRngAesUninstantiate(PSYMCRYPT_RNG_AES_STATE pRngState)
#define SYMCRYPT_RNG_AES_MAX_REQUESTS_PER_RESEED
#define SYMCRYPT_RNG_AES_KEY_SIZE
VOID SYMCRYPT_CALL SymCryptRngAesInstantiateSelftest(void)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRngAesFips140_2Reseed(PSYMCRYPT_RNG_AES_FIPS140_2_STATE pRngState, PCBYTE pcbSeedMaterial, SIZE_T cbSeedMaterial)
static const BYTE g_expectedStateAfterGenerate[SYMCRYPT_RNG_AES_KEY_AND_V_SIZE]
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptRngAesFips140_2Uninstantiate(PSYMCRYPT_RNG_AES_FIPS140_2_STATE pRngState)
static const BYTE g_abReseedEntropy[]
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRngAesFips140_2Instantiate(PSYMCRYPT_RNG_AES_FIPS140_2_STATE pRngState, PCBYTE pcbSeedMaterial, SIZE_T cbSeedMaterial)
_Use_decl_annotations_ SYMCRYPT_NOINLINE SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRngAesReseed(PSYMCRYPT_RNG_AES_STATE pRngState, PCBYTE pcbSeedMaterial, SIZE_T cbSeedMaterial)
VOID SYMCRYPT_CALL SymCryptRngAesTestGenerate(PSYMCRYPT_RNG_AES_STATE pRngState)
#define SYMCRYPT_RNG_AES_MAX_REQUEST_SIZE
static const BYTE g_expectedStateAfterReseed[SYMCRYPT_RNG_AES_KEY_AND_V_SIZE]
static const BYTE g_expectedStateAfterInstantiate[SYMCRYPT_RNG_AES_KEY_AND_V_SIZE]
VOID SYMCRYPT_CALL SymCryptRngAesUpdate(_Inout_ PSYMCRYPT_RNG_AES_STATE pState, _In_reads_opt_(SYMCRYPT_RNG_AES_INTERNAL_SEED_SIZE) PCBYTE pbProvidedData, _In_opt_ PSYMCRYPT_AES_EXPANDED_KEY pAesKey)
VOID SYMCRYPT_CALL SymCryptRngAesReseedSelftest(void)
static const BYTE g_abInstantiateEntropyInputPlusNonce[]
VOID SYMCRYPT_CALL SymCryptRngAesGenerateBlocks(_In_ PSYMCRYPT_AES_EXPANDED_KEY pAesKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pV, _Out_writes_(cbRandom) PBYTE pbRandom, _In_ SIZE_T cbRandom)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptRngAesFips140_2Generate(PSYMCRYPT_RNG_AES_FIPS140_2_STATE pRngState, PBYTE pbRandom, SIZE_T cbRandom)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRngAesGenerateSmall(_Inout_ PSYMCRYPT_RNG_AES_STATE pRngState, _Out_writes_(cbRandom) PBYTE pbRandom, SIZE_T cbRandom, _In_reads_opt_(cbAdditionalInput) PCBYTE pbAdditionalInput, SIZE_T cbAdditionalInput)
_Use_decl_annotations_ SYMCRYPT_NOINLINE SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRngAesInstantiate(PSYMCRYPT_RNG_AES_STATE pRngState, PCBYTE pcbSeedMaterial, SIZE_T cbSeedMaterial)
VOID SYMCRYPT_CALL SymCryptRngAesBcc(_In_ PSYMCRYPT_AES_EXPANDED_KEY pKey, _In_reads_(cbData) PCBYTE pcbData, _In_ SIZE_T cbData, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbResult)
VOID SYMCRYPT_CALL SymCryptRngAesCheckBlocksNotIdentical(_Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbPreviousBlock, _In_reads_(cbData) PCBYTE pcbData, SIZE_T cbData)
static const BYTE g_abOutput1[32]
_Use_decl_annotations_ SYMCRYPT_NOINLINE VOID SYMCRYPT_CALL SymCryptRngAesGenerate(PSYMCRYPT_RNG_AES_STATE pRngState, PBYTE pbRandom, SIZE_T cbRandom)
#define SYMCRYPT_RNG_AES_KEY_AND_V_SIZE
#define MAX_CTRMSB64_BLOCKS
VOID SYMCRYPT_CALL SymCryptRngAesGenerateSelftest(void)
VOID SYMCRYPT_CALL SymCryptRngAesTestInstantiate(PSYMCRYPT_RNG_AES_STATE pRngState)
FORCEINLINE int SymCryptRngAesAreBlocksIdentical(_In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pSrc1, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pSrc2)
VOID SYMCRYPT_CALL SymCryptRngAesDf(_In_reads_(cbData) PCBYTE pcbData, _In_ SIZE_T cbData, _Out_writes_(SYMCRYPT_RNG_AES_INTERNAL_SEED_SIZE) PBYTE pbSeed)
VOID SYMCRYPT_CALL SymCryptRngAesTestUninstantiate(PSYMCRYPT_RNG_AES_STATE pRngState)
VOID SYMCRYPT_CALL SymCryptRngAesTestReseed(PSYMCRYPT_RNG_AES_STATE pRngState)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
int identical(Knot x, Knot y)
#define memcpy(s1, s2, n)
#define _Inout_updates_(s)
#define _Use_decl_annotations_
#define _In_reads_opt_(s)
_In_ _Out_writes_opt_ pcchValueName _Inout_opt_ LPDWORD _Out_opt_ _Out_writes_bytes_to_opt_ pcbData _Inout_opt_ LPDWORD pcbData
VOID SYMCRYPT_CALL SymCryptInjectError(PBYTE pbData, SIZE_T cbData)
BYTE abSeed[SYMCRYPT_LMS_MAX_N]
static const BYTE pbResult[]
#define SYMCRYPT_ASSERT(_x)
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptAesExpandKeyEncryptOnly(_Out_ PSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbKey) PCBYTE pbKey, SIZE_T cbKey)
#define SYMCRYPT_LOAD_MSBFIRST64(p)
VOID SYMCRYPT_CALL SymCryptAesEncrypt(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
VOID SYMCRYPT_CALL SymCryptXorBytes(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, _Out_writes_(cbBytes) PBYTE pbResult, SIZE_T cbBytes)
#define SYMCRYPT_RNG_AES_MIN_RESEED_SIZE
#define SYMCRYPT_RNG_AES_MIN_INSTANTIATE_SIZE
#define SYMCRYPT_RNG_AES_MAX_SEED_SIZE
VOID SYMCRYPT_CALL SymCryptAesCtrMsb64(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
#define SYMCRYPT_AES_BLOCK_SIZE
#define SYMCRYPT_STORE_MSBFIRST32(p, v)
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
VOID SYMCRYPT_CALL SymCryptAesCbcMac(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
#define SYMCRYPT_MIN(_a, _b)
PCBYTE PBYTE SIZE_T cbData
#define SYMCRYPT_SET_MAGIC(p)
SYMCRYPT_MAGIC_FIELD * PSYMCRYPT_RNG_AES_STATE
SYMCRYPT_MAGIC_FIELD SYMCRYPT_RNG_AES_STATE
SYMCRYPT_MAGIC_FIELD SYMCRYPT_AES_EXPANDED_KEY
PCSYMCRYPT_HMAC_MD5_EXPANDED_KEY pKey
* PSYMCRYPT_RNG_AES_FIPS140_2_STATE
PSYMCRYPT_COMMON_HASH_STATE pState
SYMCRYPT_MAGIC_FIELD * PSYMCRYPT_AES_EXPANDED_KEY
#define SYMCRYPT_CHECK_MAGIC(p)
#define SYMCRYPT_RNG_AES_INTERNAL_SEED_SIZE