45 0x0000000000000001ULL, 0x0000000000008082ULL, 0x800000000000808aULL, 0x8000000080008000ULL,
46 0x000000000000808bULL, 0x0000000080000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL,
47 0x000000000000008aULL, 0x0000000000000088ULL, 0x0000000080008009ULL, 0x000000008000000aULL,
48 0x000000008000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL,
49 0x8000000000008002ULL, 0x8000000000000080ULL, 0x000000000000800aULL, 0x800000008000000aULL,
50 0x8000000080008081ULL, 0x8000000000008080ULL, 0x0000000080000001ULL, 0x8000000080008008ULL
54#define KECCAK_COLUMN_SUM(state, c) \
55 (state[0 + (c)] ^ state[5 + (c)] ^ state[10 + (c)] ^ state[15 + (c)] ^ state[20 + (c)])
60#define KECCAK_COLUMN_UPDATE(state, c, w) { \
62 state[ 0 + (c)] ^= t; \
63 state[ 5 + (c)] ^= t; \
64 state[10 + (c)] ^= t; \
65 state[15 + (c)] ^= t; \
66 state[20 + (c)] ^= t; \
70#define KECCAK_THETA(state) { \
72 colSum[0] = KECCAK_COLUMN_SUM(state, 0); \
73 colSum[1] = KECCAK_COLUMN_SUM(state, 1); \
74 colSum[2] = KECCAK_COLUMN_SUM(state, 2); \
75 colSum[3] = KECCAK_COLUMN_SUM(state, 3); \
76 colSum[4] = KECCAK_COLUMN_SUM(state, 4); \
77 KECCAK_COLUMN_UPDATE(state, 0, colSum[4] ^ ROL64(colSum[1], 1)); \
78 KECCAK_COLUMN_UPDATE(state, 1, colSum[0] ^ ROL64(colSum[2], 1)); \
79 KECCAK_COLUMN_UPDATE(state, 2, colSum[1] ^ ROL64(colSum[3], 1)); \
80 KECCAK_COLUMN_UPDATE(state, 3, colSum[2] ^ ROL64(colSum[4], 1)); \
81 KECCAK_COLUMN_UPDATE(state, 4, colSum[3] ^ ROL64(colSum[0], 1)); \
85#define KECCAK_RHO_ROW(state, r) { \
86 state[5 * (r) + 0] = ROL64(state[5 * (r) + 0], KeccakRhoK[5 * (r) + 0]); \
87 state[5 * (r) + 1] = ROL64(state[5 * (r) + 1], KeccakRhoK[5 * (r) + 1]); \
88 state[5 * (r) + 2] = ROL64(state[5 * (r) + 2], KeccakRhoK[5 * (r) + 2]); \
89 state[5 * (r) + 3] = ROL64(state[5 * (r) + 3], KeccakRhoK[5 * (r) + 3]); \
90 state[5 * (r) + 4] = ROL64(state[5 * (r) + 4], KeccakRhoK[5 * (r) + 4]); \
97#define KECCAK_RHO_ROW0(state) { \
98 state[1] = ROL64(state[1], KeccakRhoK[1]); \
99 state[2] = ROL64(state[2], KeccakRhoK[2]); \
100 state[3] = ROL64(state[3], KeccakRhoK[3]); \
101 state[4] = ROL64(state[4], KeccakRhoK[4]); \
105#define KECCAK_RHO(state) { \
106 KECCAK_RHO_ROW0(state); \
107 KECCAK_RHO_ROW(state, 1); \
108 KECCAK_RHO_ROW(state, 2); \
109 KECCAK_RHO_ROW(state, 3); \
110 KECCAK_RHO_ROW(state, 4); \
114#define KECCAK_PI(state) { \
115 UINT64 t = state[ 1]; state[ 1] = state[ 6]; state[ 6] = state[ 9]; state[ 9] = state[22]; state[22] = state[14]; \
116 state[14] = state[20]; state[20] = state[ 2]; state[ 2] = state[12]; state[12] = state[13]; state[13] = state[19]; \
117 state[19] = state[23]; state[23] = state[15]; state[15] = state[ 4]; state[ 4] = state[24]; state[24] = state[21]; \
118 state[21] = state[ 8]; state[ 8] = state[16]; state[16] = state[ 5]; state[ 5] = state[ 3]; state[ 3] = state[18]; \
119 state[18] = state[17]; state[17] = state[11]; state[11] = state[ 7]; state[ 7] = state[10]; state[10] = t; \
123#define KECCAK_CHI_ROW(state, r) { \
124 UINT64 t1 = state[5 * (r) + 0] ^ (~state[5 * (r) + 1] & state[5 * (r) + 2]); \
125 UINT64 t2 = state[5 * (r) + 1] ^ (~state[5 * (r) + 2] & state[5 * (r) + 3]); \
126 state[5 * (r) + 2] = state[5 * (r) + 2] ^ (~state[5 * (r) + 3] & state[5 * (r) + 4]); \
127 state[5 * (r) + 3] = state[5 * (r) + 3] ^ (~state[5 * (r) + 4] & state[5 * (r) + 0]); \
128 state[5 * (r) + 4] = state[5 * (r) + 4] ^ (~state[5 * (r) + 0] & state[5 * (r) + 1]); \
129 state[5 * (r) + 0] = t1; \
130 state[5 * (r) + 1] = t2; \
134#define KECCAK_CHI(state) { \
135 KECCAK_CHI_ROW(state, 0); \
136 KECCAK_CHI_ROW(state, 1); \
137 KECCAK_CHI_ROW(state, 2); \
138 KECCAK_CHI_ROW(state, 3); \
139 KECCAK_CHI_ROW(state, 4); \
143#define KECCAK_IOTA(state, rnd) state[0] ^= KeccakIotaK[rnd]
146#define KECCAK_PERM_ROUND(state, rnd) { \
147 KECCAK_THETA(state); \
151 KECCAK_IOTA(state, rnd); \
162 for (
int r = 0;
r < 24;
r++)
424 if ( (cbResult > 0) && (
pState->stateIndex ==
pState->inputBlockSize) )
434 while (cbResult > 0 && (
pState->stateIndex & 0x7))
449 cbResult -= uFullLanes *
sizeof(
UINT64);
535 scError = SYMCRYPT_INVALID_BLOB;
542 scError = SYMCRYPT_INVALID_BLOB;
556 pState->inputBlockSize = 0;
559 switch (
blob.header.type)
592 scError = SYMCRYPT_INVALID_BLOB;
596 if (
pState->inputBlockSize == 0 ||
pState->paddingValue == 0)
598 scError = SYMCRYPT_INVALID_BLOB;
604 scError = SYMCRYPT_INVALID_BLOB;
611 scError = SYMCRYPT_INVALID_BLOB;
COMPILER_DEPENDENT_UINT64 UINT64
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
static void cleanup(void)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
GLuint GLuint GLsizei GLenum type
GLdouble GLdouble GLdouble r
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
VOID SYMCRYPT_CALL SymCryptKeccakZeroAppendBlock(_Inout_ PSYMCRYPT_KECCAK_STATE pState)
static const UINT8 KeccakRhoK[25]
VOID SYMCRYPT_CALL SymCryptKeccakReset(_Out_ PSYMCRYPT_KECCAK_STATE pState)
VOID SYMCRYPT_CALL SymCryptKeccakAppend(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
static UINT64 KeccakIotaK[24]
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptKeccakStateImport(SYMCRYPT_BLOB_TYPE type, _Out_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_bytes_(SYMCRYPT_KECCAK_STATE_EXPORT_SIZE) PCBYTE pbBlob)
#define KECCAK_PERM_ROUND(state, rnd)
VOID SYMCRYPT_CALL SymCryptKeccakInit(_Out_ PSYMCRYPT_KECCAK_STATE pState, UINT32 inputBlockSize, UINT8 paddingValue)
FORCEINLINE BYTE SYMCRYPT_CALL SymCryptKeccakExtractByte(_Inout_ PSYMCRYPT_KECCAK_STATE pState)
VOID SYMCRYPT_CALL SymCryptKeccakExtractLanes(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _Out_writes_(uLaneCount *sizeof(UINT64)) PBYTE pbResult, SIZE_T uLaneCount)
VOID SYMCRYPT_CALL SymCryptKeccakStateExport(SYMCRYPT_BLOB_TYPE type, _In_ PCSYMCRYPT_KECCAK_STATE pState, _Out_writes_bytes_(SYMCRYPT_KECCAK_STATE_EXPORT_SIZE) PBYTE pbBlob)
VOID SYMCRYPT_CALL SymCryptKeccakApplyPadding(_Inout_ PSYMCRYPT_KECCAK_STATE pState)
VOID SYMCRYPT_CALL SymCryptKeccakExtract(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult, BOOLEAN bWipe)
FORCEINLINE VOID SYMCRYPT_CALL SymCryptKeccakAppendByte(_Inout_ PSYMCRYPT_KECCAK_STATE pState, BYTE val)
FORCEINLINE VOID SYMCRYPT_CALL SymCryptKeccakAppendBytes(_Inout_ PSYMCRYPT_KECCAK_STATE pState, PCBYTE pbBuffer, SIZE_T cbBuffer)
VOID SYMCRYPT_CALL SymCryptKeccakPermute(_Inout_updates_(25) UINT64 *pState)
VOID SYMCRYPT_CALL SymCryptKeccakAppendLanes(_Inout_ PSYMCRYPT_KECCAK_STATE pState, _In_reads_(uLaneCount *sizeof(UINT64)) PCBYTE pbData, SIZE_T uLaneCount)
#define memcpy(s1, s2, n)
#define _In_reads_bytes_(s)
#define _Inout_updates_(s)
#define _Out_writes_bytes_(s)
#define SYMCRYPT_BLOB_MAGIC
FORCEINLINE VOID SYMCRYPT_CALL SymCryptUint64ToLsbFirst(_In_reads_(cuData) PCUINT64 puData, _Out_writes_(8 *cuData) PBYTE pbResult, SIZE_T cuData)
FORCEINLINE VOID SYMCRYPT_CALL SymCryptLsbFirstToUint64(_In_reads_(8 *cuResult) PCBYTE pbData, _Out_writes_(cuResult) PUINT64 puResult, SIZE_T cuResult)
@ SymCryptBlobTypeSha3_256State
@ SymCryptBlobTypeSha3_224State
@ SymCryptBlobTypeSha3_384State
@ SymCryptBlobTypeSha3_512State
#define SYMCRYPT_SHA3_PADDING_VALUE
enum _SYMCRYPT_BLOB_TYPE SYMCRYPT_BLOB_TYPE
static const BYTE pbResult[]
#define SYMCRYPT_ASSERT(_x)
#define SYMCRYPT_SHA3_256_INPUT_BLOCK_SIZE
VOID SYMCRYPT_CALL SymCryptMarvin32(_In_ PCSYMCRYPT_MARVIN32_EXPANDED_SEED pExpandedSeed, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(SYMCRYPT_MARVIN32_RESULT_SIZE) PBYTE pbResult)
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_LOAD_LSBFIRST64(p)
#define SYMCRYPT_SHA3_224_INPUT_BLOCK_SIZE
PCSYMCRYPT_MARVIN32_EXPANDED_SEED const SymCryptMarvin32DefaultSeed
#define SYMCRYPT_STORE_LSBFIRST64(p, v)
#define SYMCRYPT_SHA3_512_INPUT_BLOCK_SIZE
#define SYMCRYPT_SHA3_384_INPUT_BLOCK_SIZE
const SYMCRYPT_KECCAK_STATE * PCSYMCRYPT_KECCAK_STATE
#define SYMCRYPT_KECCAK_STATE_EXPORT_SIZE
PCBYTE PBYTE SIZE_T cbData
PSYMCRYPT_COMMON_HASH_STATE pState