15#define SYMCRYPT_XMSS_MAX_PREFIX_SIZE SYMCRYPT_HASH_MAX_RESULT_SIZE
18#define SYMCRYPT_XMSS_F 0x00
19#define SYMCRYPT_XMSS_H 0x01
20#define SYMCRYPT_XMSS_H_MSG 0x02
21#define SYMCRYPT_XMSS_PRF 0x03
22#define SYMCRYPT_XMSS_PRF_KEYGEN 0x04
207 maxChecksum =
len1 * ((1 <<
w) - 1);
213 len2 = (msb + 1 + (
w - 1)) /
w;
240 scError = SYMCRYPT_INVALID_ARGUMENT;
259 pParams->cbHashOutput,
260 pParams->nWinternitzWidth,
264 pParams->len = pParams->len1 + pParams->len2;
266 UINT32 nChecksumBits = pParams->len2 * pParams->nWinternitzWidth;
268 pParams->nLeftShift32 = (
UINT8)(32 - nChecksumBits);
270 if (pParams->nLayers == 1)
278 pParams->cbIdx = (pParams->nTotalTreeHeight + 7) / 8;
281 pParams->nLayerHeight = pParams->nTotalTreeHeight / pParams->nLayers;
313 for (
UINT32 i = 0;
i < uParameterCount;
i++)
315 if (pParameters[
i].idAlg ==
id)
319 if (scError == SYMCRYPT_NO_ERROR)
324 pParams->nTotalTreeHeight = pParameters[
i].
h;
325 pParams->nLayers = pParameters[
i].
d;
380 scError = SYMCRYPT_INVALID_ARGUMENT;
388 scError = SYMCRYPT_INVALID_ARGUMENT;
397 scError = SYMCRYPT_INVALID_ARGUMENT;
406 scError = SYMCRYPT_INVALID_ARGUMENT;
416 scError = SYMCRYPT_INVALID_ARGUMENT;
423 scError = SYMCRYPT_INVALID_ARGUMENT;
430 scError = SYMCRYPT_INVALID_ARGUMENT;
436 scError = SYMCRYPT_INVALID_ARGUMENT;
441 pParams->hash = pHash;
485 size += pParams->cbIdx;
486 size += pParams->cbHashOutput;
489 size += pParams->nLayers * ( pParams->cbHashOutput * (pParams->len + pParams->nLayerHeight) );
507 cbPublicKey +=
sizeof(
UINT32);
508 cbPublicKey += 2 * pParams->cbHashOutput;
511 cbPrivateKey = cbPublicKey;
512 cbPrivateKey +=
sizeof(
UINT64);
513 cbPrivateKey += 2 * pParams->cbHashOutput;
518 *pcbKey = cbPublicKey;
522 *pcbKey = cbPrivateKey;
526 scError = SYMCRYPT_INVALID_ARGUMENT;
559 pKey->params = *pParams;
615 pNode +=
index * pIncHash->cbNode;
632 pNode->
index = nLeafIndex;
669 pIncHash->funcCompressNodes(
744 prefix[prefixLength - 1] = PrfType;
810 SymCryptHashResult(pParams->hash, &stateMask, &bitmask[pParams->cbHashOutput], pParams->cbHashOutput);
817 SymCryptXorBytes(&bitmask[pParams->cbHashOutput], pbRight, &bitmask[pParams->cbHashOutput], pParams->cbHashOutput);
835 pCtxIncHash->pParams,
842 pNodeOut->index = pNodeLeft->index / 2;
843 pNodeOut->height = pNodeLeft->height + 1;
858 pCtxIncHash->pParams,
865 pNodeOut->index = pNodeLeft->index / 2;
866 pNodeOut->height = pNodeLeft->height + 1;
904 memcpy(tmp, pbInput, pParams->cbHashOutput);
930 memcpy(pbOutput, tmp, pParams->cbHashOutput);
955 ctxIncHash.
adrs = *adrs;
963 pParams->cbHashOutput,
967 for (
UINT32 i = 0;
i < pParams->len;
i++)
986 (1 << pParams->nWinternitzWidth) - 1,
997 memcpy(pbOutput, pNode->
value, pParams->cbHashOutput);
1028 PBYTE pbScratchTree = pbScratch;
1029 PBYTE pbScratchLtree = pbScratch + cbScratchTree;
1033 ctxIncHash.
adrs = *adrs;
1041 pParams->cbHashOutput,
1045 for (
UINT32 nLeafIndex = uLeaf; nLeafIndex < uLeaf + (1UL << uHeight); nLeafIndex++)
1063 memcpy(pbRoot, pNode->
value, pParams->cbHashOutput);
1085 if (pbRoot ==
NULL || cbRoot != pParams->cbHashOutput ||
1087 pbSkXmss ==
NULL || cbSkXmss != pParams->cbHashOutput)
1089 scError = SYMCRYPT_INVALID_ARGUMENT;
1099 if (pbScratch ==
NULL)
1101 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1114 pParams->nLayerHeight,
1121 if (pbScratch !=
NULL)
1144 scError = SYMCRYPT_INVALID_ARGUMENT;
1153 pKey->params.cbHashOutput,
1155 pKey->params.cbHashOutput,
1157 pKey->params.cbHashOutput);
1159 if (scError != SYMCRYPT_NO_ERROR)
1166 scError = SYMCRYPT_HBS_PUBLIC_ROOT_MISMATCH;
1187 scError = SYMCRYPT_INVALID_ARGUMENT;
1200 if (scError != SYMCRYPT_NO_ERROR)
1207 if (scError != SYMCRYPT_NO_ERROR)
1214 if (scError != SYMCRYPT_NO_ERROR)
1223 pKey->params.cbHashOutput,
1225 pKey->params.cbHashOutput,
1227 pKey->params.cbHashOutput);
1229 if (scError != SYMCRYPT_NO_ERROR)
1238 if (scError != SYMCRYPT_NO_ERROR)
1269 scError = SYMCRYPT_INVALID_ARGUMENT;
1277 scError = SYMCRYPT_INVALID_ARGUMENT;
1283 if (cbInput !=
cbKey)
1285 scError = SYMCRYPT_INVALID_ARGUMENT;
1290 pbInput +=
sizeof(
UINT32);
1292 if (uAlgId !=
pKey->params.id)
1294 scError = SYMCRYPT_INVALID_BLOB;
1306 pbInput +=
pKey->params.cbHashOutput;
1309 pbInput +=
pKey->params.cbHashOutput;
1314 pbInput +=
sizeof(
UINT64);
1317 pbInput +=
pKey->params.cbHashOutput;
1320 pbInput +=
pKey->params.cbHashOutput;
1327 if (scError != SYMCRYPT_NO_ERROR)
1336 if (scError != SYMCRYPT_NO_ERROR)
1367 scError = SYMCRYPT_INVALID_ARGUMENT;
1374 scError = SYMCRYPT_INVALID_ARGUMENT;
1380 if (cbOutput !=
cbKey)
1382 scError = SYMCRYPT_INVALID_ARGUMENT;
1392 pbOutput +=
sizeof(
UINT32);
1396 pbOutput +=
pKey->params.cbHashOutput;
1400 pbOutput +=
pKey->params.cbHashOutput;
1410 pbOutput +=
sizeof(
pKey->Idx);
1414 pbOutput +=
pKey->params.cbHashOutput;
1418 pbOutput +=
pKey->params.cbHashOutput;
1469 UINT32 uNodeIndex = uLeaf;
1471 memcpy(
node, pbStartingNode, pParams->cbHashOutput);
1476 for (
UINT32 i = 0;
i < pParams->nLayerHeight;
i++)
1480 if ( ((uLeaf >>
i) & 1) == 0 )
1482 uNodeIndex = uNodeIndex / 2;
1488 uNodeIndex = (uNodeIndex - 1) / 2;
1496 memcpy(pbOutput,
node, pParams->cbHashOutput);
1546 BYTE en32Checksum[4];
1547 const UINT32 maxChainIndex = (1 << pParams->nWinternitzWidth) - 1;
1555 ctxIncHash.
adrs = *adrs;
1563 pParams->cbHashOutput,
1567 for (
UINT32 i = 0;
i < pParams->len;
i++)
1569 if (i < pParams->
len1)
1577 if (
i == pParams->len1)
1579 checksum <<= pParams->nLeftShift32;
1583 digit =
SymCryptHbsGetDigit(pParams->nWinternitzWidth, en32Checksum,
sizeof(en32Checksum),
i - pParams->len1);
1594 &pbSignature[pParams->cbHashOutput *
i],
1596 maxChainIndex - digit,
1606 memcpy(pbOutput, pNode->
value, pParams->cbHashOutput);
1658 return pParams->cbHashOutput * pParams->len;
1667 return pParams->cbHashOutput * pParams->nLayerHeight;
1678 for (
UINT8 i = 0;
i < pParams->cbIdx;
i++)
1696 pb += pParams->cbIdx;
1711 pb += pParams->cbHashOutput;
1754 const UINT64 LeafMask = (1ULL << pParams->nLayerHeight) - 1;
1761 pbSignature ==
NULL ||
1765 scError = SYMCRYPT_INVALID_ARGUMENT;
1774 if (pbScratch ==
NULL)
1776 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1794 for (uLayer = 0; uLayer < pParams->nLayers; uLayer++)
1796 uTree = Idx >> pParams->nLayerHeight;
1797 uLeaf = (
UINT32)(Idx & LeafMask);
1805 uLayer == 0 ? RandomizedHash : ComputedRoot,
1813 Idx >>= pParams->nLayerHeight;
1818 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
1871 const UINT32 maxChainIndex = (1UL << pParams->nWinternitzWidth) - 1;
1877 for (
UINT32 i = 0;
i < pParams->len;
i++)
1887 if (i < pParams->
len1)
1891 nChecksum += maxChainIndex - digit;
1895 if (
i == pParams->len1)
1897 nChecksum <<= pParams->nLeftShift32;
1901 digit =
SymCryptHbsGetDigit(pParams->nWinternitzWidth, en32Checksum,
sizeof(en32Checksum),
i - pParams->len1);
1911 &pbOutput[
i * pParams->cbHashOutput]);
1952 for (
UINT32 h = 0;
h < pParams->nLayerHeight;
h++)
1954 UINT32 uLeaf = ((Idx >>
h) ^ 1UL) <<
h;
1964 &pbAuthNodes[
h * pParams->cbHashOutput]);
2014 pKey->params.cbHashOutput,
2044 const UINT64 LeafMask = (1ULL << pParams->nLayerHeight) - 1;
2051 pbSignature ==
NULL ||
2055 scError = SYMCRYPT_INVALID_ARGUMENT;
2064 if (pbScratch ==
NULL)
2066 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
2070 Idx = SYMCRYPT_ATOMIC_ADD64_POST_RELAXED(&
pKey->Idx, 1) - 1;
2071 if (Idx >= (1ULL << pParams->nTotalTreeHeight))
2074 pKey->Idx = (1ULL << pParams->nTotalTreeHeight);
2076 scError = SYMCRYPT_HBS_NO_OTS_KEYS_LEFT;
2081 memcpy(pbSignature, &en64Idx[
sizeof(en64Idx) - pParams->cbIdx], pParams->cbIdx);
2090 for (uLayer = 0; uLayer < pParams->nLayers; uLayer++)
2092 uTree = Idx >> pParams->nLayerHeight;
2093 uLeaf = (
UINT32)(Idx & LeafMask);
2103 uLayer == 0 ? RandomizedHash : TreeRoot,
2107 uLayer == (
UINT32)(pParams->nLayers - 1) ?
NULL : TreeRoot,
2111 Idx >>= pParams->nLayerHeight;
2114 if (scError != SYMCRYPT_NO_ERROR)
COMPILER_DEPENDENT_UINT64 UINT64
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
static void cleanup(void)
GLuint GLuint GLsizei GLenum type
GLint GLint GLsizei width
GLubyte GLubyte GLubyte GLubyte w
GLfloat GLfloat GLfloat GLfloat h
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 SymCryptCallbackFree(void *ptr)
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCallbackRandom(BYTE *buf, SIZE_T size)
#define memcpy(s1, s2, n)
static DWORD DWORD DWORD DWORD * steps
#define _In_reads_bytes_(s)
#define _Out_writes_bytes_opt_(s)
#define _Out_writes_bytes_(s)
#define UNREFERENCED_PARAMETER(P)
VOID(SYMCRYPT_CALL * PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC)(_In_ PSYMCRYPT_TREEHASH_NODE pNodeLeft, _In_ PSYMCRYPT_TREEHASH_NODE pNodeRight, _Out_ PSYMCRYPT_TREEHASH_NODE pNodeOut, _Inout_ PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext)
struct _SYMCRYPT_INCREMENTAL_TREEHASH * PSYMCRYPT_INCREMENTAL_TREEHASH
SYMCRYPT_XMSSKEY_TYPE keyType
@ XMSS_ADRS_TYPE_HASH_TREE
FORCEINLINE UINT32 SymCryptCountLeadingZeros32(UINT32 value)
struct _SYMCRYPT_INCREMENTAL_TREEHASH SYMCRYPT_INCREMENTAL_TREEHASH
#define SYMCRYPT_RUN_SELFTEST_ONCE(AlgorithmSelftestFunction, AlgorithmSelftestFlag)
#define SYMCRYPT_ARRAY_SIZE(_x)
UINT32 UINT32 UINT32 UINT32 cbScratch
static const BYTE pbHash[]
PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC funcCompressNodes
PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext
BYTE value[SYMCRYPT_ANYSIZE_ARRAY]
PCSYMCRYPT_XMSS_PARAMS pParams
SYMCRYPT_XMSS_WOTSP_ALGID idWotsp
SYMCRYPT_XMSS_WOTSP_ALGID wotspId
#define SYMCRYPT_ASSERT(_x)
const PCSYMCRYPT_HASH SymCryptShake256HashAlgorithm
VOID SYMCRYPT_CALL SymCryptHashAppend(_In_ PCSYMCRYPT_HASH pHash, _Inout_updates_bytes_(pHash->stateSize) PVOID pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
#define SYMCRYPT_LOAD_MSBFIRST32(p)
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)
const PCSYMCRYPT_HASH SymCryptSha256Algorithm
VOID SYMCRYPT_CALL SymCryptHashInit(_In_ PCSYMCRYPT_HASH pHash, _Out_writes_bytes_(pHash->stateSize) PVOID pState)
@ SYMCRYPT_XMSSMT_SHAKE256_40_4_256
@ SYMCRYPT_XMSSMT_SHA2_20_2_256
@ SYMCRYPT_XMSSMT_SHAKE_40_8_256
@ SYMCRYPT_XMSSMT_SHA2_60_3_512
@ SYMCRYPT_XMSSMT_SHAKE_60_6_512
@ SYMCRYPT_XMSSMT_SHAKE_60_12_256
@ SYMCRYPT_XMSSMT_SHAKE256_40_4_192
@ SYMCRYPT_XMSSMT_SHA2_40_2_512
@ SYMCRYPT_XMSSMT_SHA2_20_2_192
@ SYMCRYPT_XMSSMT_SHAKE_20_4_512
@ SYMCRYPT_XMSSMT_SHAKE256_20_4_192
@ SYMCRYPT_XMSSMT_SHA2_60_12_512
@ SYMCRYPT_XMSSMT_SHA2_60_12_192
@ SYMCRYPT_XMSSMT_SHAKE_60_6_256
@ SYMCRYPT_XMSSMT_SHAKE_20_2_512
@ SYMCRYPT_XMSSMT_SHA2_60_6_512
@ SYMCRYPT_XMSSMT_SHA2_20_4_192
@ SYMCRYPT_XMSSMT_SHAKE256_60_3_256
@ SYMCRYPT_XMSSMT_SHA2_40_4_256
@ SYMCRYPT_XMSSMT_SHA2_60_3_256
@ SYMCRYPT_XMSSMT_SHAKE256_20_2_256
@ SYMCRYPT_XMSSMT_SHAKE256_60_6_256
@ SYMCRYPT_XMSSMT_SHA2_40_8_192
@ SYMCRYPT_XMSSMT_SHAKE_40_2_256
@ SYMCRYPT_XMSSMT_SHA2_40_4_192
@ SYMCRYPT_XMSSMT_SHA2_40_8_512
@ SYMCRYPT_XMSSMT_SHAKE256_60_12_256
@ SYMCRYPT_XMSSMT_SHA2_40_2_256
@ SYMCRYPT_XMSSMT_SHAKE256_60_3_192
@ SYMCRYPT_XMSSMT_SHAKE_20_4_256
@ SYMCRYPT_XMSSMT_SHA2_60_6_256
@ SYMCRYPT_XMSSMT_SHAKE256_40_2_192
@ SYMCRYPT_XMSSMT_SHAKE_40_2_512
@ SYMCRYPT_XMSSMT_SHA2_20_2_512
@ SYMCRYPT_XMSSMT_SHA2_40_2_192
@ SYMCRYPT_XMSSMT_SHAKE256_40_8_192
@ SYMCRYPT_XMSSMT_SHAKE256_60_6_192
@ SYMCRYPT_XMSSMT_SHAKE256_40_2_256
@ SYMCRYPT_XMSSMT_SHA2_20_4_256
@ SYMCRYPT_XMSSMT_SHAKE_20_2_256
@ SYMCRYPT_XMSSMT_SHAKE_60_3_512
@ SYMCRYPT_XMSSMT_SHA2_60_6_192
@ SYMCRYPT_XMSSMT_SHA2_20_4_512
@ SYMCRYPT_XMSSMT_SHAKE_60_12_512
@ SYMCRYPT_XMSSMT_SHAKE256_20_4_256
@ SYMCRYPT_XMSSMT_SHA2_40_4_512
@ SYMCRYPT_XMSSMT_SHA2_40_8_256
@ SYMCRYPT_XMSSMT_SHAKE256_20_2_192
@ SYMCRYPT_XMSSMT_SHA2_60_12_256
@ SYMCRYPT_XMSSMT_SHAKE_40_4_512
@ SYMCRYPT_XMSSMT_SHA2_60_3_192
@ SYMCRYPT_XMSSMT_SHAKE_40_4_256
@ SYMCRYPT_XMSSMT_SHAKE_60_3_256
@ SYMCRYPT_XMSSMT_SHAKE256_40_8_256
@ SYMCRYPT_XMSSMT_SHAKE_40_8_512
@ SYMCRYPT_XMSSMT_SHAKE256_60_12_192
#define SYMCRYPT_LOAD_MSBFIRST64(p)
VOID SYMCRYPT_CALL SymCryptHashStateCopy(_In_ PCSYMCRYPT_HASH pHash, _In_reads_(pHash->stateSize) PCVOID pSrc, _Out_writes_(pHash->stateSize) PVOID pDst)
VOID SYMCRYPT_CALL SymCryptXmssSelftest(void)
#define SYMCRYPT_FLAG_XMSSKEY_VERIFY_ROOT
VOID SYMCRYPT_CALL SymCryptXorBytes(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, _Out_writes_(cbBytes) PBYTE pbResult, SIZE_T cbBytes)
enum _SYMCRYPT_XMSS_ALGID SYMCRYPT_XMSS_ALGID
const PCSYMCRYPT_HASH SymCryptShake128HashAlgorithm
#define SYMCRYPT_STORE_MSBFIRST32(p, v)
const PCSYMCRYPT_HASH SymCryptSha512Algorithm
BOOLEAN SYMCRYPT_CALL SymCryptEqual(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, SIZE_T cbBytes)
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
enum _SYMCRYPT_XMSSKEY_TYPE SYMCRYPT_XMSSKEY_TYPE
@ SYMCRYPT_XMSSKEY_TYPE_PUBLIC
@ SYMCRYPT_XMSSKEY_TYPE_PRIVATE
@ SYMCRYPT_XMSSKEY_TYPE_NONE
VOID SYMCRYPT_CALL SymCryptHashResult(_In_ PCSYMCRYPT_HASH pHash, _Inout_updates_bytes_(pHash->stateSize) PVOID pState, _Out_writes_(SYMCRYPT_MIN(cbResult, pHash->resultSize)) PBYTE pbResult, SIZE_T cbResult)
enum _SYMCRYPT_XMSSMT_ALGID SYMCRYPT_XMSSMT_ALGID
@ SYMCRYPT_XMSS_SHAKE256_16_192
@ SYMCRYPT_XMSS_SHA2_16_512
@ SYMCRYPT_XMSS_SHA2_20_256
@ SYMCRYPT_XMSS_SHAKE256_16_256
@ SYMCRYPT_XMSS_SHA2_16_256
@ SYMCRYPT_XMSS_SHA2_10_512
@ SYMCRYPT_XMSS_SHAKE_16_512
@ SYMCRYPT_XMSS_SHAKE_10_256
@ SYMCRYPT_XMSS_SHAKE256_20_192
@ SYMCRYPT_XMSS_SHAKE256_10_256
@ SYMCRYPT_XMSS_SHA2_10_192
@ SYMCRYPT_XMSS_SHA2_10_256
@ SYMCRYPT_XMSS_SHAKE_16_256
@ SYMCRYPT_XMSS_SHA2_20_512
@ SYMCRYPT_XMSS_SHAKE_10_512
@ SYMCRYPT_XMSS_SHAKE_20_256
@ SYMCRYPT_XMSS_SHA2_20_192
@ SYMCRYPT_XMSS_SHA2_16_192
@ SYMCRYPT_XMSS_SHAKE256_20_256
@ SYMCRYPT_XMSS_SHAKE256_10_192
@ SYMCRYPT_XMSS_SHAKE_20_512
struct _SYMCRYPT_XMSS_KEY SYMCRYPT_XMSS_KEY
const SYMCRYPT_XMSS_PARAMS * PCSYMCRYPT_XMSS_PARAMS
@ SYMCRYPT_SELFTEST_ALGORITHM_XMSS
#define SYMCRYPT_HASH_MAX_RESULT_SIZE
SYMCRYPT_XMSS_KEY * PSYMCRYPT_XMSS_KEY
const SYMCRYPT_HASH * PCSYMCRYPT_HASH
SYMCRYPT_XMSS_PARAMS * PSYMCRYPT_XMSS_PARAMS
#define SYMCRYPT_SET_MAGIC(p)
const SYMCRYPT_XMSS_KEY * PCSYMCRYPT_XMSS_KEY
PCSYMCRYPT_HMAC_MD5_EXPANDED_KEY pKey
PSYMCRYPT_COMMON_HASH_STATE pState
#define SYMCRYPT_CHECK_MAGIC(p)
Character const *const prefix
struct _SYMCRYPT_XMSS_WOTSP_PARAMS * PSYMCRYPT_XMSS_WOTSP_PARAMS
#define SYMCRYPT_XMSS_PRF_KEYGEN
VOID SYMCRYPT_CALL SymCryptXmssComputeSubtreeRoot(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ XMSS_ADRS *adrs, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSkXmss, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, UINT32 uLeaf, UINT32 uHeight, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbRoot)
static const SYMCRYPT_XMSS_PARAMETER_PREDEFINED XmssMtParametersPredefined[]
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeyGetValue(_In_ PCSYMCRYPT_XMSS_KEY pKey, SYMCRYPT_XMSSKEY_TYPE keyType, UINT32 flags, _Out_writes_bytes_(cbOutput) PBYTE pbOutput, SIZE_T cbOutput)
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetRandomness(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig)
VOID SYMCRYPT_CALL SymCryptXmssTreeRootFromSignature(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbHash, UINT32 uLeaf, _In_reads_bytes_(pParams->cbHashOutput *pParams->len) PCBYTE pbWotspSig, _In_reads_bytes_(pParams->cbHashOutput *pParams->nLayerHeight) PCBYTE pbAuthNodes, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssComputePublicRoot(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_reads_bytes_(cbSeed) PCBYTE pbSeed, SIZE_T cbSeed, _In_reads_bytes_(cbSkXmss) PCBYTE pbSkXmss, SIZE_T cbSkXmss, _Out_writes_bytes_(cbRoot) PBYTE pbRoot, SIZE_T cbRoot)
VOID SYMCRYPT_CALL SymCryptHbsGetWinternitzLengths(UINT32 n, UINT32 w, _Out_ PUINT32 puLen1, _Out_ PUINT32 puLen2)
VOID SYMCRYPT_CALL SymCryptXmssTreeRootFromAuthenticationPath(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, UINT32 uLeaf, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbStartingNode, _In_reads_bytes_(pParams->cbHashOutput *pParams->nLayerHeight) PCBYTE pbAuthNodes, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashFinalize(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash)
UINT64 SYMCRYPT_CALL SymCryptXmssSignatureGetIdx(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig)
#define SYMCRYPT_XMSS_H_MSG
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssParamsFromAlgId(SYMCRYPT_XMSS_ALGID id, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssSetParams(_Out_ PSYMCRYPT_XMSS_PARAMS pParams, UINT32 id, _In_ PCSYMCRYPT_HASH pHash, UINT32 cbHashOutput, UINT32 nWinternitzWidth, UINT32 nTotalTreeHeight, UINT32 nLayers, UINT32 cbPrefix)
static const SYMCRYPT_XMSS_WOTSP_PARAMS XmssWotspParams[]
VOID SYMCRYPT_CALL SymCryptXmsskeyFree(_Inout_ PSYMCRYPT_XMSS_KEY pKey)
VOID SYMCRYPT_CALL SymCryptXmssChain(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbInput, UINT32 startIndex, UINT32 steps, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _Inout_ XMSS_ADRS *adrs, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
VOID SYMCRYPT_CALL SymCryptXmssWotspPublickeyFromSignature(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, UINT32 idx, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbMsg, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _In_reads_bytes_(pParams->cbHashOutput *pParams->len) PCBYTE pbSignature, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
#define SYMCRYPT_XMSS_PRF
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeySetValue(_In_reads_bytes_(cbInput) PCBYTE pbInput, SIZE_T cbInput, SYMCRYPT_XMSSKEY_TYPE keyType, UINT32 flags, _Inout_ PSYMCRYPT_XMSS_KEY pKey)
enum _SYMCRYPT_XMSS_WOTSP_ALGID * PSYMCRYPT_XMSS_WOTSP_ALGID
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssSign(_Inout_ PSYMCRYPT_XMSS_KEY pKey, _In_reads_bytes_(cbMessage) PCBYTE pbMessage, SIZE_T cbMessage, UINT32 flags, _Out_writes_bytes_(cbSignature) PBYTE pbSignature, SIZE_T cbSignature)
UINT32 SYMCRYPT_CALL SymCryptHbsIncrementalTreehashStackDepth(UINT32 nLeaves)
VOID SYMCRYPT_CALL SymCryptXmssLtreeNodeCompress(_In_ PSYMCRYPT_TREEHASH_NODE pNodeLeft, _In_ PSYMCRYPT_TREEHASH_NODE pNodeRight, _Out_ PSYMCRYPT_TREEHASH_NODE pNodeOut, _Inout_ PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pCtxIncHash)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeyGenerate(_Inout_ PSYMCRYPT_XMSS_KEY pKey, UINT32 flags)
#define SYMCRYPT_XMSS_MAX_PREFIX_SIZE
const SYMCRYPT_XMSS_PARAMETER_PREDEFINED * PCSYMCRYPT_XMSS_PARAMETER_PREDEFINED
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeyVerifyRoot(_In_ PCSYMCRYPT_XMSS_KEY pKey)
VOID SYMCRYPT_CALL SymCryptXmssDeriveParams(_Inout_ PSYMCRYPT_XMSS_PARAMS pParams)
VOID SYMCRYPT_CALL SymCryptXmssCreateWotspPublickey(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, UINT32 uLeaf, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSkXmss, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssGetWotspParams(SYMCRYPT_XMSS_WOTSP_ALGID id, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssVerifyInternal(_Inout_ PSYMCRYPT_XMSS_KEY pKey, _In_reads_bytes_(cbMessage) PCBYTE pbMessage, SIZE_T cbMessage, UINT32 flags, _In_reads_bytes_(cbSignature) PCBYTE pbSignature, SIZE_T cbSignature)
SIZE_T SYMCRYPT_CALL SymCryptXmssSizeofWotspSignature(_In_ PCSYMCRYPT_XMSS_PARAMS pParams)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssVerify(_Inout_ PSYMCRYPT_XMSS_KEY pKey, _In_reads_bytes_(cbMessage) PCBYTE pbMessage, SIZE_T cbMessage, UINT32 flags, _In_reads_bytes_(cbSignature) PCBYTE pbSignature, SIZE_T cbSignature)
static const SYMCRYPT_XMSS_PARAMETER_PREDEFINED XmssParametersPredefined[]
VOID SYMCRYPT_CALL SymCryptXmssRandomizedHash(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, UINT64 Idx, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbRandomizer, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbRoot, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbMsg, SIZE_T cbMsg, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
VOID SYMCRYPT_CALL SymCryptXmssCreateWotspSecret(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSkXmss, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _Inout_ XMSS_ADRS *adrs, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
VOID SYMCRYPT_CALL SymCryptXmssPrfKey(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_reads_bytes_(cbKey) PCBYTE pbKey, SIZE_T cbKey, _Out_ SYMCRYPT_HASH_STATE *pState)
static const PCSYMCRYPT_HASH * XmssHashArray[]
enum _SYMCRYPT_XMSS_WOTSP_ALGID SYMCRYPT_XMSS_WOTSP_ALGID
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetNode(_In_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, SIZE_T index)
VOID SYMCRYPT_CALL SymCryptXmssWotspSign(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbInput, UINT32 uLeaf, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSkXmss, _Out_writes_bytes_(pParams->cbHashOutput *pParams->len) PBYTE pbOutput)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssParamsFromAlgIdCommon(UINT32 id, BOOLEAN isMultiTree, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcessCommon(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, BOOLEAN fFinal)
VOID SYMCRYPT_CALL SymCryptXmssSetAdrsType(_Out_ PXMSS_ADRS adrs, UINT32 type)
PSYMCRYPT_INCREMENTAL_TREEHASH SYMCRYPT_CALL SymCryptHbsIncrementalTreehashInit(UINT32 nLeaves, PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 cbHashResult, PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC funcCompressNodes, PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext)
VOID SYMCRYPT_CALL SymCryptXmssRandHash(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbLeft, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbRight, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetWotspSig(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig, UINT32 uLayer)
VOID SYMCRYPT_CALL SymCryptXmssComputeRandomness(_In_ PCSYMCRYPT_XMSS_KEY pKey, UINT64 Idx, _Out_writes_bytes_(pKey->params.cbHashOutput) PBYTE pbRandomness)
VOID SYMCRYPT_CALL SymCryptXmssPrfInit(_In_ PCSYMCRYPT_HASH hash, BYTE PrfType, SIZE_T prefixLength, _Out_ PSYMCRYPT_HASH_STATE state)
SIZE_T SYMCRYPT_CALL SymCryptXmssSizeofAuthNodes(_In_ PCSYMCRYPT_XMSS_PARAMS pParams)
_SYMCRYPT_XMSS_WOTSP_ALGID
@ SYMCRYPT_XMSS_WOTSP_SHA2_192
@ SYMCRYPT_XMSS_WOTSP_SHAKE256_192
@ SYMCRYPT_XMSS_WOTSP_SHAKE256_256
@ SYMCRYPT_XMSS_WOTSP_SHAKE_256
@ SYMCRYPT_XMSS_WOTSP_SHAKE_512
@ SYMCRYPT_XMSS_WOTSP_SHA2_512
@ SYMCRYPT_XMSS_WOTSP_SHA2_256
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcess(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash)
PSYMCRYPT_XMSS_KEY SYMCRYPT_CALL SymCryptXmsskeyAllocate(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, UINT32 flags)
struct _SYMCRYPT_XMSS_PARAMETER_PREDEFINED SYMCRYPT_XMSS_PARAMETER_PREDEFINED
SYMCRYPT_XMSS_PARAMETER_PREDEFINED * PSYMCRYPT_XMSS_PARAMETER_PREDEFINED
VOID SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetTopNodes(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeLeft, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeRight)
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashAllocNode(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, UINT32 nLeafIndex)
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetAuthNodes(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig, UINT32 uLayer)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssSizeofKeyBlobFromParams(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, SYMCRYPT_XMSSKEY_TYPE keyType, _Out_ SIZE_T *pcbKey)
VOID SYMCRYPT_CALL SymCryptXmssTreeSignHash(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _Inout_ XMSS_ADRS *adrs, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSkXmss, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbSeed, _In_reads_bytes_(pParams->cbHashOutput) PCBYTE pbHash, UINT32 Idx, _Out_writes_bytes_(pParams->cbHashOutput *pParams->len) PBYTE pbWotspSig, _Out_writes_bytes_(pParams->cbHashOutput *pParams->nLayerHeight) PBYTE pbAuthNodes, _Out_writes_bytes_opt_(pParams->cbHashOutput) PBYTE pbRoot, _Out_writes_bytes_opt_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptXmssTreeNodeCompress(_In_ PSYMCRYPT_TREEHASH_NODE pNodeLeft, _In_ PSYMCRYPT_TREEHASH_NODE pNodeRight, _Out_ PSYMCRYPT_TREEHASH_NODE pNodeOut, _Inout_ PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pCtxIncHash)
SIZE_T SYMCRYPT_CALL SymCryptHbsSizeofScratchBytesForIncrementalTreehash(UINT32 cbNode, UINT32 nLeaves)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssMtParamsFromAlgId(SYMCRYPT_XMSSMT_ALGID id, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
SIZE_T SYMCRYPT_CALL SymCryptXmssSizeofSignatureFromParams(_In_ PCSYMCRYPT_XMSS_PARAMS pParams)
VOID SYMCRYPT_CALL SymCryptXmssPrf(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, BYTE PrfType, _In_reads_bytes_(cbKey) PCBYTE pbKey, SIZE_T cbKey, _In_reads_bytes_(cbMsg) PCBYTE pbMsg, SIZE_T cbMsg, _Out_writes_bytes_(pParams->cbHashOutput) PBYTE pbOutput)
struct _SYMCRYPT_XMSS_WOTSP_PARAMS SYMCRYPT_XMSS_WOTSP_PARAMS
UINT32 SYMCRYPT_CALL SymCryptHbsGetDigit(UINT32 width, _In_ PCBYTE pbBuffer, SIZE_T cbBuffer, UINT32 index)