ReactOS 0.4.17-dev-1005-g171e1de
xmss.c
Go to the documentation of this file.
1//
2// xmss.c XMSS and XMSS^MT implementation
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6
7#include "precomp.h"
8
9//
10// See the symcrypt.h file for documentation on what the various functions do.
11//
12
13
14// Maximum size of the domain separator prefix used in PRFs
15#define SYMCRYPT_XMSS_MAX_PREFIX_SIZE SYMCRYPT_HASH_MAX_RESULT_SIZE
16
17// PRF domain separators
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
23
24
25static const PCSYMCRYPT_HASH* XmssHashArray[] = {
30};
31
32
34{
35 // Hash Fn. RFC-8391 SP800-208
36 SYMCRYPT_XMSS_WOTSP_SHA2_256 = 0x00000001, // SHA-256 X X
37 SYMCRYPT_XMSS_WOTSP_SHA2_512 = 0x00000002, // SHA-512 X
38 SYMCRYPT_XMSS_WOTSP_SHAKE_256 = 0x00000003, // SHAKE128 X
39 SYMCRYPT_XMSS_WOTSP_SHAKE_512 = 0x00000004, // SHAKE256 X
40 SYMCRYPT_XMSS_WOTSP_SHA2_192 = 0x00000005, // SHA-256 X
41 SYMCRYPT_XMSS_WOTSP_SHAKE256_256 = 0x00000006, // SHAKE256 X
42 SYMCRYPT_XMSS_WOTSP_SHAKE256_192 = 0x00000007, // SHAKE256 X
43
45
46
48{
54
56
57
59{
60 // wotspId hashIndex n w cbPrefix
61 { SYMCRYPT_XMSS_WOTSP_SHA2_256, 0, 32, 4, 32 }, // SHA-256
62 { SYMCRYPT_XMSS_WOTSP_SHA2_512, 1, 64, 4, 64 }, // SHA-512
63 { SYMCRYPT_XMSS_WOTSP_SHAKE_256, 2, 32, 4, 32 }, // SHAKE128
64 { SYMCRYPT_XMSS_WOTSP_SHAKE_512, 3, 64, 4, 64 }, // SHAKE256
65 { SYMCRYPT_XMSS_WOTSP_SHA2_192, 0, 24, 4, 4 }, // SHA-256
66 { SYMCRYPT_XMSS_WOTSP_SHAKE256_256, 3, 32, 4, 32 }, // SHAKE256
67 { SYMCRYPT_XMSS_WOTSP_SHAKE256_192, 3, 24, 4, 4 }, // SHAKE256
68};
69
71{
73
75
76 // total tree height (each level has height h/d)
78
79 // number of layers (for single tree, d=1)
81
83
86
87
89
90 // algId wotspId/wotspIndex h d
112};
113
114
116
117 // algId wotspId/wotspIndex h d
126
135
144
153
162
171
180};
181
182//
183// Compute the number of chains for an n-byte input and its checksum
184// for Winternitz parameter w (i.e., using w-bit blocks) in an OTS scheme
185//
186VOID
189 UINT32 n,
190 UINT32 w,
191 _Out_ PUINT32 puLen1,
192 _Out_ PUINT32 puLen2
193 )
194{
195 UINT32 len1;
196 UINT32 len2;
197 UINT32 maxChecksum;
198 UINT32 msb;
199
200 SYMCRYPT_ASSERT(n > 0);
201 SYMCRYPT_ASSERT(w >= 1 && w <= 8);
202
203 // number of w-bit digits in an n-byte input
204 len1 = (8 * n + (w - 1)) / w;
205
206 // maximum value the checksum can take (each w-bit digit can have value at most 2^w-1)
207 maxChecksum = len1 * ((1 << w) - 1);
208
209 msb = 31 - SymCryptCountLeadingZeros32(maxChecksum);
210
211 // msb + 1 bits are required to store the maxChecksum,
212 // calculate the number of w-bit blocks to represent that
213 len2 = (msb + 1 + (w - 1)) / w;
214
215 *puLen1 = len1;
216 *puLen2 = len2;
217}
218
224{
225 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
226
228 {
229 if (XmssWotspParams[i].wotspId == id)
230 {
232 pParams->hash = *XmssHashArray[XmssWotspParams[i].hashIndex];
233 pParams->cbHashOutput = XmssWotspParams[i].n;
234 pParams->nWinternitzWidth = XmssWotspParams[i].w;
235 pParams->cbPrefix = XmssWotspParams[i].cbPrefix;
236 goto cleanup;
237 }
238 }
239
240 scError = SYMCRYPT_INVALID_ARGUMENT;
241
242cleanup:
243
244 return scError;
245}
246
247//
248// Derive XMSS parameters that can be computed from others
249//
250// SYMCRYPT_XMSS_PARAMS structure must be initialized with either predefined
251// or user defined parameters before this function is called.
252//
253VOID
257{
259 pParams->cbHashOutput,
260 pParams->nWinternitzWidth,
261 &pParams->len1,
262 &pParams->len2);
263
264 pParams->len = pParams->len1 + pParams->len2;
265
266 UINT32 nChecksumBits = pParams->len2 * pParams->nWinternitzWidth;
267 SYMCRYPT_ASSERT(nChecksumBits <= 32);
268 pParams->nLeftShift32 = (UINT8)(32 - nChecksumBits);
269
270 if (pParams->nLayers == 1)
271 {
272 // single trees have a 32-bit Idx value
273 pParams->cbIdx = 4;
274 }
275 else
276 {
277 // number of bytes to store h-bits for Idx
278 pParams->cbIdx = (pParams->nTotalTreeHeight + 7) / 8;
279 }
280
281 pParams->nLayerHeight = pParams->nTotalTreeHeight / pParams->nLayers;
282}
283
284
285//
286// Fill a SYMCRYPT_XMSS_PARAMS structure from either an XMSS algorithm ID or
287// XMSS^MT algorithm ID from predefined parameter sets.
288//
292 UINT32 id,
293 BOOLEAN isMultiTree,
295{
296 SYMCRYPT_ERROR scError = SYMCRYPT_INVALID_ARGUMENT;
298 SIZE_T uParameterCount;
299
300 SymCryptWipeKnownSize(pParams, sizeof(*pParams));
301
302 if (isMultiTree)
303 {
304 pParameters = XmssMtParametersPredefined;
306 }
307 else
308 {
309 pParameters = XmssParametersPredefined;
311 }
312
313 for (UINT32 i = 0; i < uParameterCount; i++)
314 {
315 if (pParameters[i].idAlg == id)
316 {
317 scError = SymCryptXmssGetWotspParams(pParameters[i].idWotsp, pParams);
318
319 if (scError == SYMCRYPT_NO_ERROR)
320 {
321 SYMCRYPT_ASSERT(pParams->cbHashOutput <= SYMCRYPT_HASH_MAX_RESULT_SIZE);
322
323 pParams->id = id;
324 pParams->nTotalTreeHeight = pParameters[i].h;
325 pParams->nLayers = pParameters[i].d;
327 }
328
329 break;
330 }
331 }
332
333 return scError;
334}
335
336
342{
343 return SymCryptXmssParamsFromAlgIdCommon(id, FALSE, pParams);
344}
345
346
352{
353 return SymCryptXmssParamsFromAlgIdCommon(id, TRUE, pParams);
354}
355
356
357//
358// Set custom XMSS/XMSS^MT parameters
359//
360// This function can be used to initialize SYMCRYPT_XMSS_PARAMS with
361// custom parameters that are not defined by the standards.
362//
367 UINT32 id,
368 _In_ PCSYMCRYPT_HASH pHash, // hash algorithm
369 UINT32 cbHashOutput, // hash output size
370 UINT32 nWinternitzWidth, // Winternitz parameter
371 UINT32 nTotalTreeHeight, // total tree height
372 UINT32 nLayers, // number of layers
373 UINT32 cbPrefix // domain separator prefix length
374 )
375{
376 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
377
378 if (pParams == NULL)
379 {
380 scError = SYMCRYPT_INVALID_ARGUMENT;
381 goto cleanup;
382 }
383
384 SymCryptWipeKnownSize(pParams, sizeof(*pParams));
385
386 if (pHash == NULL)
387 {
388 scError = SYMCRYPT_INVALID_ARGUMENT;
389 goto cleanup;
390 }
391
392 // Output size n can at most be equal to the hash output size
393 if (cbHashOutput == 0 ||
394 cbHashOutput > pHash->resultSize ||
396 {
397 scError = SYMCRYPT_INVALID_ARGUMENT;
398 goto cleanup;
399 }
400
401 // Winternitz parameter must be one of 1, 2, 4, or 8
402 if (nWinternitzWidth == 0 ||
403 nWinternitzWidth > 8 ||
404 (nWinternitzWidth & (nWinternitzWidth - 1)) != 0)
405 {
406 scError = SYMCRYPT_INVALID_ARGUMENT;
407 goto cleanup;
408 }
409
410 // nTotalTreeHeight and nLayers must both be positive and
411 // nLayers must divide nTotalTreeHeight
412 if (nTotalTreeHeight == 0 ||
413 nLayers == 0 ||
414 (nTotalTreeHeight % nLayers) != 0)
415 {
416 scError = SYMCRYPT_INVALID_ARGUMENT;
417 goto cleanup;
418 }
419
420 // Layer height (tree height of one layer) can be at most 31
421 if ((nTotalTreeHeight / nLayers) > 31)
422 {
423 scError = SYMCRYPT_INVALID_ARGUMENT;
424 goto cleanup;
425 }
426
427 // Total tree height can be at most 63
428 if (nTotalTreeHeight > 63)
429 {
430 scError = SYMCRYPT_INVALID_ARGUMENT;
431 goto cleanup;
432 }
433
434 if (cbPrefix == 0)
435 {
436 scError = SYMCRYPT_INVALID_ARGUMENT;
437 goto cleanup;
438 }
439
440 pParams->id = id;
441 pParams->hash = pHash;
442 pParams->cbHashOutput = cbHashOutput;
443 pParams->nWinternitzWidth = nWinternitzWidth;
444 pParams->nTotalTreeHeight = nTotalTreeHeight;
445 pParams->nLayers = nLayers;
447
448 pParams->cbPrefix = cbPrefix;
449
450cleanup:
451
452 return scError;
453}
454
455
456//
457// Updates the type field in ADRS structure and clears the
458// subsequent fields.
459//
460// Does not modify the first two fields (Layer and Tree) of
461// the ADRS structure.
462//
463VOID
466 _Out_ PXMSS_ADRS adrs,
467 UINT32 type )
468{
469 SYMCRYPT_STORE_MSBFIRST32(adrs->en32Type, type);
470 SymCryptWipeKnownSize(&adrs->u, sizeof(adrs->u));
471 SYMCRYPT_STORE_MSBFIRST32(adrs->en32KeyAndMask, 0);
472}
473
474
475SIZE_T
479{
480 SYMCRYPT_ASSERT(pParams->nLayers != 0);
481 SYMCRYPT_ASSERT((pParams->nTotalTreeHeight % pParams->nLayers) == 0);
482 SYMCRYPT_ASSERT(pParams->nLayerHeight > 0);
483
484 SIZE_T size = 0;
485 size += pParams->cbIdx; // idx
486 size += pParams->cbHashOutput; // randomness
487
488 // WOTSP signature + authentication path for each layer
489 size += pParams->nLayers * ( pParams->cbHashOutput * (pParams->len + pParams->nLayerHeight) );
490
491 return size;
492}
493
494
500 _Out_ SIZE_T* pcbKey )
501{
502 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
503 SIZE_T cbPublicKey = 0;
504 SIZE_T cbPrivateKey = 0;
505
506 // Public Key
507 cbPublicKey += sizeof(UINT32); // Alg ID
508 cbPublicKey += 2 * pParams->cbHashOutput; // Root and Seed
509
510 // Private Key (on top of the public key)
511 cbPrivateKey = cbPublicKey;
512 cbPrivateKey += sizeof(UINT64); // Idx
513 cbPrivateKey += 2 * pParams->cbHashOutput; // SK_XMSS and SK_PRF
514
515 switch (keyType)
516 {
518 *pcbKey = cbPublicKey;
519 break;
520
522 *pcbKey = cbPrivateKey;
523 break;
524
525 default:
526 scError = SYMCRYPT_INVALID_ARGUMENT;
527 break;
528 }
529
530 return scError;
531}
532
537 UINT32 flags )
538{
540
541 // No flags allowed
542 if (flags != 0)
543 {
544 goto cleanup;
545 }
546
548
550
551 if (pKey == NULL)
552 {
553 goto cleanup;
554 }
555
557 pKey->version = 1;
559 pKey->params = *pParams;
560
562
563 cleanup:
564
565 return pKey;
566}
567
568
569VOID
573{
577}
578
579
583 UINT32 nLeaves,
584 PBYTE pbBuffer,
586 UINT32 cbHashResult,
587 PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC funcCompressNodes,
589{
591
593
595
596 pIncHash->cbNode = 2 * sizeof(UINT32) + cbHashResult;
597 pIncHash->nSize = 0;
599 pIncHash->nLastLeafIndex = 0;
600 pIncHash->funcCompressNodes = funcCompressNodes;
601 pIncHash->pContext = pContext;
602
603 return pIncHash;
604}
605
606
611 SIZE_T index )
612{
613 PBYTE pNode = (PBYTE)pIncHash->arrNodes;
614
615 pNode += index * pIncHash->cbNode;
616
618}
619
620
625 UINT32 nLeafIndex )
626{
627 SYMCRYPT_ASSERT(pIncHash->nSize < pIncHash->nCapacity);
628
629 PSYMCRYPT_TREEHASH_NODE pNode = SymCryptHbsIncrementalTreehashGetNode(pIncHash, pIncHash->nSize);
630
631 pNode->height = 0;
632 pNode->index = nLeafIndex;
633
634 pIncHash->nSize++;
635
636 return pNode;
637}
638
639
640VOID
644 _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeLeft,
645 _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeRight )
646{
647 *ppNodeRight = (pIncHash->nSize < 1) ? NULL : SymCryptHbsIncrementalTreehashGetNode(pIncHash, pIncHash->nSize - 1);
648
649 *ppNodeLeft = (pIncHash->nSize < 2) ? NULL : SymCryptHbsIncrementalTreehashGetNode(pIncHash, pIncHash->nSize - 2);
650}
651
652
657 BOOLEAN fFinal )
658{
659 PSYMCRYPT_TREEHASH_NODE pNodeLeft = NULL;
660 PSYMCRYPT_TREEHASH_NODE pNodeRight = NULL;
661
662 SYMCRYPT_ASSERT(pIncHash->nSize > 0);
663
664 SymCryptHbsIncrementalTreehashGetTopNodes(pIncHash, &pNodeLeft, &pNodeRight);
665
666 while ( pNodeLeft &&
667 (fFinal || (pNodeLeft->height == pNodeRight->height)) )
668 {
669 pIncHash->funcCompressNodes(
670 pNodeLeft,
671 pNodeRight,
672 pNodeLeft,
673 pIncHash->pContext);
674
675 pIncHash->nSize--;
676
677 SymCryptHbsIncrementalTreehashGetTopNodes(pIncHash, &pNodeLeft, &pNodeRight);
678 }
679
680 return pNodeRight;
681}
682
683
688{
690}
691
692
697{
699}
700
701
702UINT32
705 UINT32 nLeaves)
706{
707 UINT32 h;
708
709 // Minimum height binary tree that contains nLeaves many leaves is h+1
710 h = 31 - SymCryptCountLeadingZeros32(nLeaves);
711
712 // Tree root computation will require a stack of depth equal to tree height plus 1
713 return (h + 2);
714}
715
716
717SIZE_T
720 UINT32 cbNode,
721 UINT32 nLeaves)
722{
723 SIZE_T nodeSize = cbNode + 2 * sizeof(UINT32);
725
727 return result;
728}
729
730
731VOID
735 BYTE PrfType,
736 SIZE_T prefixLength,
738{
740
742
743 SymCryptWipe(prefix, prefixLength);
744 prefix[prefixLength - 1] = PrfType;
745
747 SymCryptHashAppend(hash, state, prefix, prefixLength);
748}
749
750
751VOID
758{
759 SymCryptXmssPrfInit(pParams->hash, SYMCRYPT_XMSS_PRF, pParams->cbPrefix, pState);
760 SymCryptHashAppend(pParams->hash, pState, pbKey, cbKey);
761}
762
763VOID
767 BYTE PrfType,
770 _In_reads_bytes_( cbMsg ) PCBYTE pbMsg,
771 SIZE_T cbMsg,
772 _Out_writes_bytes_( pParams->cbHashOutput ) PBYTE pbOutput )
773{
775
776 SymCryptXmssPrfInit(pParams->hash, PrfType, pParams->cbPrefix, &state);
777 SymCryptHashAppend(pParams->hash, &state, pbKey, cbKey);
778 SymCryptHashAppend(pParams->hash, &state, pbMsg, cbMsg);
779 SymCryptHashResult(pParams->hash, &state, pbOutput, pParams->cbHashOutput);
780}
781
782
783VOID
787 _Inout_ XMSS_ADRS *adrs,
788 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSeed,
789 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbLeft,
790 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbRight,
791 _Out_writes_bytes_( pParams->cbHashOutput ) PBYTE pbOutput )
792{
795 SYMCRYPT_HASH_STATE stateKeyed;
796 SYMCRYPT_HASH_STATE stateMask;
797
798 SYMCRYPT_ASSERT(pParams->cbHashOutput <= SYMCRYPT_HASH_MAX_RESULT_SIZE);
799
800 SymCryptXmssPrfKey(pParams, pbSeed, pParams->cbHashOutput, &stateKeyed);
801
802 SYMCRYPT_STORE_MSBFIRST32(adrs->en32KeyAndMask, 1);
803 SymCryptHashStateCopy(pParams->hash, &stateKeyed, &stateMask);
804 SymCryptHashAppend(pParams->hash, &stateMask, (PCBYTE)adrs, sizeof(*adrs));
805 SymCryptHashResult(pParams->hash, &stateMask, &bitmask[0], pParams->cbHashOutput);
806
807 SYMCRYPT_STORE_MSBFIRST32(adrs->en32KeyAndMask, 2);
808 SymCryptHashStateCopy(pParams->hash, &stateKeyed, &stateMask);
809 SymCryptHashAppend(pParams->hash, &stateMask, (PCBYTE)adrs, sizeof(*adrs));
810 SymCryptHashResult(pParams->hash, &stateMask, &bitmask[pParams->cbHashOutput], pParams->cbHashOutput);
811
812 SYMCRYPT_STORE_MSBFIRST32(adrs->en32KeyAndMask, 0);
813 SymCryptHashAppend(pParams->hash, &stateKeyed, (PCBYTE)adrs, sizeof(*adrs));
814 SymCryptHashResult(pParams->hash, &stateKeyed, key, pParams->cbHashOutput);
815
816 SymCryptXorBytes(&bitmask[0], pbLeft, &bitmask[0], pParams->cbHashOutput);
817 SymCryptXorBytes(&bitmask[pParams->cbHashOutput], pbRight, &bitmask[pParams->cbHashOutput], pParams->cbHashOutput);
818
819 SymCryptXmssPrf(pParams, SYMCRYPT_XMSS_H, key, pParams->cbHashOutput, bitmask, 2 * pParams->cbHashOutput, pbOutput);
820}
821
822
823VOID
827 _In_ PSYMCRYPT_TREEHASH_NODE pNodeRight,
830{
831 SYMCRYPT_STORE_MSBFIRST32(pCtxIncHash->adrs.u.hashtree.en32Height, pNodeLeft->height);
832 SYMCRYPT_STORE_MSBFIRST32(pCtxIncHash->adrs.u.hashtree.en32Index, pNodeLeft->index / 2);
833
835 pCtxIncHash->pParams,
836 &pCtxIncHash->adrs,
837 pCtxIncHash->pbSeed,
838 pNodeLeft->value,
839 pNodeRight->value,
840 pNodeOut->value);
841
842 pNodeOut->index = pNodeLeft->index / 2;
843 pNodeOut->height = pNodeLeft->height + 1;
844}
845
846VOID
850 _In_ PSYMCRYPT_TREEHASH_NODE pNodeRight,
853{
854 SYMCRYPT_STORE_MSBFIRST32(pCtxIncHash->adrs.u.ltree.en32Height, pNodeLeft->height);
855 SYMCRYPT_STORE_MSBFIRST32(pCtxIncHash->adrs.u.ltree.en32Index, pNodeLeft->index / 2);
856
858 pCtxIncHash->pParams,
859 &pCtxIncHash->adrs,
860 pCtxIncHash->pbSeed,
861 pNodeLeft->value,
862 pNodeRight->value,
863 pNodeOut->value);
864
865 pNodeOut->index = pNodeLeft->index / 2;
866 pNodeOut->height = pNodeLeft->height + 1;
867}
868
869VOID
873 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSkXmss,
874 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSeed,
875 _Inout_ XMSS_ADRS *adrs,
876 _Out_writes_bytes_( pParams->cbHashOutput ) PBYTE pbOutput )
877{
879
880 SymCryptXmssPrfInit(pParams->hash, SYMCRYPT_XMSS_PRF_KEYGEN, pParams->cbPrefix, &state);
881 SymCryptHashAppend(pParams->hash, &state, pbSkXmss, pParams->cbHashOutput);
882 SymCryptHashAppend(pParams->hash, &state, pbSeed, pParams->cbHashOutput);
883 SymCryptHashAppend(pParams->hash, &state, (PCBYTE)adrs, sizeof(*adrs));
884 SymCryptHashResult(pParams->hash, &state, pbOutput, pParams->cbHashOutput);
885}
886
887VOID
891 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbInput,
892 UINT32 startIndex,
894 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSeed,
895 _Inout_ XMSS_ADRS *adrs,
896 _Out_writes_bytes_( pParams->cbHashOutput ) PBYTE pbOutput )
897{
901 SYMCRYPT_HASH_STATE stateKey;
902 SYMCRYPT_HASH_STATE stateMask;
903
904 memcpy(tmp, pbInput, pParams->cbHashOutput);
905
906 for (UINT32 i = startIndex; i < startIndex + steps; i++)
907 {
908 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Hash, i);
909
910 SymCryptXmssPrfKey(pParams, pbSeed, pParams->cbHashOutput, &stateKey);
911 SymCryptHashStateCopy(pParams->hash, &stateKey, &stateMask);
912
913 SYMCRYPT_STORE_MSBFIRST32(adrs->en32KeyAndMask, 0);
914 SymCryptHashAppend(pParams->hash, &stateKey, (PCBYTE)adrs, sizeof(*adrs));
915 SymCryptHashResult(pParams->hash, &stateKey, key, pParams->cbHashOutput);
916
917 SYMCRYPT_STORE_MSBFIRST32(adrs->en32KeyAndMask, 1);
918 SymCryptHashAppend(pParams->hash, &stateMask, (PCBYTE)adrs, sizeof(*adrs));
919 SymCryptHashResult(pParams->hash, &stateMask, bm, pParams->cbHashOutput);
920
921 SymCryptXorBytes(tmp, bm, tmp, pParams->cbHashOutput);
922
923 SymCryptXmssPrf(pParams, SYMCRYPT_XMSS_F, key, pParams->cbHashOutput, tmp, pParams->cbHashOutput, tmp);
924 }
925
926 // reset used ADRS fields
927 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Hash, 0);
928 SYMCRYPT_STORE_MSBFIRST32(adrs->en32KeyAndMask, 0);
929
930 memcpy(pbOutput, tmp, pParams->cbHashOutput);
931}
932
933
934VOID
938 _Inout_ XMSS_ADRS *adrs,
939 UINT32 uLeaf,
940 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSkXmss,
941 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSeed,
944 _Out_writes_bytes_( pParams->cbHashOutput ) PBYTE pbOutput )
945{
949
951
953 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ltree.en32Leaf, uLeaf);
954
955 ctxIncHash.adrs = *adrs;
956 ctxIncHash.pParams = pParams;
957 ctxIncHash.pbSeed = pbSeed;
958
960 pParams->len,
961 pbScratch,
962 cbScratch,
963 pParams->cbHashOutput,
965 &ctxIncHash);
966
967 for (UINT32 i = 0; i < pParams->len; i++)
968 {
970
972 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Leaf, uLeaf);
973 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Chain, i);
974
976 pParams,
977 pbSkXmss,
978 pbSeed,
979 adrs,
980 pNode->value);
981
983 pParams,
984 pNode->value,
985 0,
986 (1 << pParams->nWinternitzWidth) - 1,
987 pbSeed,
988 adrs,
989 pNode->value);
990
992
993 }
994
996
997 memcpy(pbOutput, pNode->value, pParams->cbHashOutput);
998}
999
1000
1001VOID
1005 _In_ XMSS_ADRS *adrs,
1006 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSkXmss,
1007 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSeed,
1008 UINT32 uLeaf,
1009 UINT32 uHeight,
1012 _Out_writes_bytes_( pParams->cbHashOutput ) PBYTE pbRoot )
1013{
1015
1019
1020 SYMCRYPT_ASSERT((uLeaf & ((1UL << uHeight) - 1)) == 0); // uLeaf must be a multiple of 2^uHeight
1021 SYMCRYPT_ASSERT(pParams->nLayerHeight < 32); // Ensure nLeaves fits in 32 bits
1022
1023 SIZE_T cbScratchTree = SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, 1ULL << pParams->nLayerHeight);
1024 SIZE_T cbScratchLtree = SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, pParams->len);
1025
1026 SYMCRYPT_ASSERT(cbScratch >= (cbScratchTree + cbScratchLtree));
1027
1028 PBYTE pbScratchTree = pbScratch;
1029 PBYTE pbScratchLtree = pbScratch + cbScratchTree;
1030
1032
1033 ctxIncHash.adrs = *adrs;
1034 ctxIncHash.pParams = pParams;
1035 ctxIncHash.pbSeed = pbSeed;
1036
1038 1ULL << uHeight,
1039 pbScratchTree,
1040 cbScratchTree,
1041 pParams->cbHashOutput,
1043 &ctxIncHash);
1044
1045 for (UINT32 nLeafIndex = uLeaf; nLeafIndex < uLeaf + (1UL << uHeight); nLeafIndex++)
1046 {
1047 pNode = SymCryptHbsIncrementalTreehashAllocNode(pIncHash, nLeafIndex);
1048
1050 adrs,
1051 nLeafIndex,
1052 pbSkXmss,
1053 pbSeed,
1054 pbScratchLtree,
1055 cbScratchLtree,
1056 pNode->value );
1057
1059 }
1060
1062
1063 memcpy(pbRoot, pNode->value, pParams->cbHashOutput);
1064}
1065
1066
1072 SIZE_T cbSeed,
1073 _In_reads_bytes_( cbSkXmss ) PCBYTE pbSkXmss,
1074 SIZE_T cbSkXmss,
1075 _Out_writes_bytes_( cbRoot ) PBYTE pbRoot,
1076 SIZE_T cbRoot )
1077{
1078 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1079 PBYTE pbScratch = NULL;
1080 SIZE_T cbScratch = 0;
1081 XMSS_ADRS adrs;
1082
1083 SYMCRYPT_ASSERT(pParams->nLayerHeight < 32); // Ensure nLeaves fits in 32 bits
1084
1085 if (pbRoot == NULL || cbRoot != pParams->cbHashOutput ||
1086 pbSeed == NULL || cbSeed != pParams->cbHashOutput ||
1087 pbSkXmss == NULL || cbSkXmss != pParams->cbHashOutput)
1088 {
1089 scError = SYMCRYPT_INVALID_ARGUMENT;
1090 goto cleanup;
1091 }
1092
1093 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, 1ULL << pParams->nLayerHeight);
1094 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, pParams->len);
1095
1097 pbScratch = SymCryptCallbackAlloc(cbScratch);
1098
1099 if (pbScratch == NULL)
1100 {
1101 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1102 goto cleanup;
1103 }
1104
1105 SymCryptWipeKnownSize(&adrs, sizeof(XMSS_ADRS));
1106 SYMCRYPT_STORE_MSBFIRST32(adrs.en32Layer, pParams->nLayers - 1);
1107
1109 pParams,
1110 &adrs,
1111 pbSkXmss,
1112 pbSeed,
1113 0,
1114 pParams->nLayerHeight,
1115 pbScratch,
1116 cbScratch,
1117 pbRoot );
1118
1119cleanup:
1120
1121 if (pbScratch != NULL)
1122 {
1123 SymCryptWipe(pbScratch, cbScratch);
1124 SymCryptCallbackFree(pbScratch);
1125 }
1126
1127 return scError;
1128}
1129
1130
1135{
1137 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1138
1140
1141 // key to be verified has to be a private key
1142 if (pKey->keyType != SYMCRYPT_XMSSKEY_TYPE_PRIVATE)
1143 {
1144 scError = SYMCRYPT_INVALID_ARGUMENT;
1145 goto cleanup;
1146 }
1147
1149
1151 &pKey->params,
1152 pKey->Seed,
1153 pKey->params.cbHashOutput,
1154 pKey->SkXmss,
1155 pKey->params.cbHashOutput,
1156 Root,
1157 pKey->params.cbHashOutput);
1158
1159 if (scError != SYMCRYPT_NO_ERROR)
1160 {
1161 goto cleanup;
1162 }
1163
1164 if (!SymCryptEqual(Root, pKey->Root, pKey->params.cbHashOutput))
1165 {
1166 scError = SYMCRYPT_HBS_PUBLIC_ROOT_MISMATCH;
1167 }
1168
1169cleanup:
1170
1171 return scError;
1172}
1173
1174
1179 UINT32 flags)
1180{
1181 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1182
1184
1185 if (flags != 0)
1186 {
1187 scError = SYMCRYPT_INVALID_ARGUMENT;
1188 goto cleanup;
1189 }
1190
1191 // Wipe key material
1192 SymCryptWipeKnownSize(pKey->Root, sizeof(pKey->Root));
1193 SymCryptWipeKnownSize(pKey->Seed, sizeof(pKey->Seed));
1194 SymCryptWipeKnownSize(pKey->SkPrf, sizeof(pKey->SkPrf));
1195 SymCryptWipeKnownSize(pKey->SkXmss, sizeof(pKey->SkXmss));
1196 pKey->Idx = 0;
1197
1198 scError = SymCryptCallbackRandom(pKey->SkPrf, pKey->params.cbHashOutput);
1199
1200 if (scError != SYMCRYPT_NO_ERROR)
1201 {
1202 goto cleanup;
1203 }
1204
1205 scError = SymCryptCallbackRandom(pKey->SkXmss, pKey->params.cbHashOutput);
1206
1207 if (scError != SYMCRYPT_NO_ERROR)
1208 {
1209 goto cleanup;
1210 }
1211
1212 scError = SymCryptCallbackRandom(pKey->Seed, pKey->params.cbHashOutput);
1213
1214 if (scError != SYMCRYPT_NO_ERROR)
1215 {
1216 goto cleanup;
1217 }
1218
1219 // Compute public root from the private key
1221 &pKey->params,
1222 pKey->Seed,
1223 pKey->params.cbHashOutput,
1224 pKey->SkXmss,
1225 pKey->params.cbHashOutput,
1226 pKey->Root,
1227 pKey->params.cbHashOutput);
1228
1229 if (scError != SYMCRYPT_NO_ERROR)
1230 {
1231 goto cleanup;
1232 }
1233
1235
1236cleanup:
1237
1238 if (scError != SYMCRYPT_NO_ERROR)
1239 {
1240 SymCryptWipeKnownSize(pKey->SkPrf, sizeof(pKey->SkPrf));
1241 SymCryptWipeKnownSize(pKey->SkXmss, sizeof(pKey->SkXmss));
1243 }
1244
1245 return scError;
1246}
1247
1248
1252 _In_reads_bytes_( cbInput ) PCBYTE pbInput,
1253 SIZE_T cbInput,
1255 UINT32 flags,
1257{
1258 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1259 UINT32 uAlgId;
1260 SIZE_T cbKey;
1261
1263
1265
1266 if ((flags & (~SYMCRYPT_FLAG_XMSSKEY_VERIFY_ROOT)) != 0 ||
1268 {
1269 scError = SYMCRYPT_INVALID_ARGUMENT;
1270 goto cleanup;
1271 }
1272
1273 // Public root validation can only be performed for private keys
1276 {
1277 scError = SYMCRYPT_INVALID_ARGUMENT;
1278 goto cleanup;
1279 }
1280
1282
1283 if (cbInput != cbKey)
1284 {
1285 scError = SYMCRYPT_INVALID_ARGUMENT;
1286 goto cleanup;
1287 }
1288
1289 uAlgId = SYMCRYPT_LOAD_MSBFIRST32(pbInput);
1290 pbInput += sizeof(UINT32);
1291
1292 if (uAlgId != pKey->params.id)
1293 {
1294 scError = SYMCRYPT_INVALID_BLOB;
1295 goto cleanup;
1296 }
1297
1298 // Wipe private key material
1299 pKey->Idx = 0;
1300 SymCryptWipeKnownSize(pKey->SkPrf, sizeof(pKey->SkPrf));
1301 SymCryptWipeKnownSize(pKey->SkXmss, sizeof(pKey->SkXmss));
1302
1303 pKey->keyType = keyType;
1304
1305 memcpy(pKey->Root, pbInput, pKey->params.cbHashOutput);
1306 pbInput += pKey->params.cbHashOutput;
1307
1308 memcpy(pKey->Seed, pbInput, pKey->params.cbHashOutput);
1309 pbInput += pKey->params.cbHashOutput;
1310
1312 {
1313 pKey->Idx = SYMCRYPT_LOAD_MSBFIRST64(pbInput);
1314 pbInput += sizeof(UINT64);
1315
1316 memcpy(pKey->SkXmss, pbInput, pKey->params.cbHashOutput);
1317 pbInput += pKey->params.cbHashOutput;
1318
1319 memcpy(pKey->SkPrf, pbInput, pKey->params.cbHashOutput);
1320 pbInput += pKey->params.cbHashOutput;
1321
1323 {
1324 // pKey has been initialized by now
1326
1327 if (scError != SYMCRYPT_NO_ERROR)
1328 {
1329 goto cleanup;
1330 }
1331 }
1332 }
1333
1334cleanup:
1335
1336 if (scError != SYMCRYPT_NO_ERROR)
1337 {
1338 SymCryptWipeKnownSize(pKey->SkPrf, sizeof(pKey->SkPrf));
1339 SymCryptWipeKnownSize(pKey->SkXmss, sizeof(pKey->SkXmss));
1341 }
1342
1343 return scError;
1344}
1345
1346
1352 UINT32 flags,
1353 _Out_writes_bytes_( cbOutput ) PBYTE pbOutput,
1354 SIZE_T cbOutput)
1355{
1356 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1357 SIZE_T cbKey;
1358
1360
1362
1363 if (flags != 0 ||
1365 pKey->keyType == SYMCRYPT_XMSSKEY_TYPE_NONE)
1366 {
1367 scError = SYMCRYPT_INVALID_ARGUMENT;
1368 goto cleanup;
1369 }
1370
1371 // Cannot export private key from a public key object
1373 {
1374 scError = SYMCRYPT_INVALID_ARGUMENT;
1375 goto cleanup;
1376 }
1377
1379
1380 if (cbOutput != cbKey)
1381 {
1382 scError = SYMCRYPT_INVALID_ARGUMENT;
1383 goto cleanup;
1384 }
1385
1386 //
1387 // Public Key
1388 //
1389
1390 // Alg Id
1391 SYMCRYPT_STORE_MSBFIRST32(pbOutput, pKey->params.id);
1392 pbOutput += sizeof(UINT32);
1393
1394 // Root
1395 memcpy(pbOutput, pKey->Root, pKey->params.cbHashOutput);
1396 pbOutput += pKey->params.cbHashOutput;
1397
1398 // Seed
1399 memcpy(pbOutput, pKey->Seed, pKey->params.cbHashOutput);
1400 pbOutput += pKey->params.cbHashOutput;
1401
1403 {
1404 //
1405 // Private Key
1406 //
1407
1408 // Idx
1409 SYMCRYPT_STORE_MSBFIRST64(pbOutput, pKey->Idx);
1410 pbOutput += sizeof(pKey->Idx);
1411
1412 // SK_XMSS
1413 memcpy(pbOutput, pKey->SkXmss, pKey->params.cbHashOutput);
1414 pbOutput += pKey->params.cbHashOutput;
1415
1416 // SK_PRF
1417 memcpy(pbOutput, pKey->SkPrf, pKey->params.cbHashOutput);
1418 pbOutput += pKey->params.cbHashOutput;
1419 }
1420
1421cleanup:
1422
1423 return scError;
1424}
1425
1426
1427UINT32
1430 UINT32 width,
1431 _In_ PCBYTE pbBuffer,
1433 UINT32 index )
1434{
1436
1437 SYMCRYPT_ASSERT(width == 1 || width == 2 || width == 4 || width == 8);
1438 SYMCRYPT_ASSERT(index < ((cbBuffer * 8) / width));
1439
1440 UINT32 digitsPerByte = 8 / width;
1441
1442 BYTE value = pbBuffer[index / digitsPerByte];
1443
1444 value >>= width * (digitsPerByte - 1 - (index % digitsPerByte));
1445
1446 value &= (1 << width) - 1;
1447
1448 return value;
1449}
1450
1451
1452VOID
1456 _Inout_ XMSS_ADRS *adrs,
1457 UINT32 uLeaf,
1458 _In_reads_bytes_( pParams->cbHashOutput )
1459 PCBYTE pbStartingNode,
1460 _In_reads_bytes_( pParams->cbHashOutput * pParams->nLayerHeight )
1461 PCBYTE pbAuthNodes,
1462 _In_reads_bytes_( pParams->cbHashOutput )
1463 PCBYTE pbSeed,
1464 _Out_writes_bytes_( pParams->cbHashOutput )
1465 PBYTE pbOutput )
1466{
1469 UINT32 uNodeIndex = uLeaf;
1470
1471 memcpy(node, pbStartingNode, pParams->cbHashOutput);
1472
1474 SYMCRYPT_STORE_MSBFIRST32(adrs->u.hashtree.en32Index, uNodeIndex);
1475
1476 for (UINT32 i = 0; i < pParams->nLayerHeight; i++)
1477 {
1478 SYMCRYPT_STORE_MSBFIRST32(adrs->u.hashtree.en32Height, i);
1479
1480 if ( ((uLeaf >> i) & 1) == 0 )
1481 {
1482 uNodeIndex = uNodeIndex / 2;
1483 SYMCRYPT_STORE_MSBFIRST32(adrs->u.hashtree.en32Index, uNodeIndex);
1484 SymCryptXmssRandHash(pParams, adrs, pbSeed, node, &pbAuthNodes[pParams->cbHashOutput * i], tmp);
1485 }
1486 else
1487 {
1488 uNodeIndex = (uNodeIndex - 1) / 2;
1489 SYMCRYPT_STORE_MSBFIRST32(adrs->u.hashtree.en32Index, uNodeIndex);
1490 SymCryptXmssRandHash(pParams, adrs, pbSeed, &pbAuthNodes[pParams->cbHashOutput * i], node, tmp);
1491 }
1492
1493 memcpy(node, tmp, pParams->cbHashOutput);
1494 }
1495
1496 memcpy(pbOutput, node, pParams->cbHashOutput);
1497}
1498
1499VOID
1503 UINT64 Idx,
1504 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbRandomizer,
1505 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbRoot,
1506 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbMsg,
1507 SIZE_T cbMsg,
1508 _Out_writes_bytes_( pParams->cbHashOutput ) PBYTE pbOutput )
1509{
1512
1513 SymCryptWipe(idxBuf, pParams->cbHashOutput);
1514 SYMCRYPT_STORE_MSBFIRST64(&idxBuf[pParams->cbHashOutput - sizeof(Idx)], Idx);
1515
1516 SymCryptXmssPrfInit(pParams->hash, SYMCRYPT_XMSS_H_MSG, pParams->cbPrefix, &state);
1517 SymCryptHashAppend(pParams->hash, &state, pbRandomizer, pParams->cbHashOutput);
1518 SymCryptHashAppend(pParams->hash, &state, pbRoot, pParams->cbHashOutput);
1519 SymCryptHashAppend(pParams->hash, &state, idxBuf, pParams->cbHashOutput);
1520 SymCryptHashAppend(pParams->hash, &state, pbMsg, cbMsg);
1521 SymCryptHashResult(pParams->hash, &state, pbOutput, pParams->cbHashOutput);
1522}
1523
1524
1525VOID
1529 _Inout_ XMSS_ADRS *adrs,
1530 UINT32 idx,
1531 _In_reads_bytes_( pParams->cbHashOutput )
1532 PCBYTE pbMsg,
1533 _In_reads_bytes_( pParams->cbHashOutput )
1534 PCBYTE pbSeed,
1535 _In_reads_bytes_( pParams->cbHashOutput * pParams->len )
1536 PCBYTE pbSignature,
1538 PBYTE pbScratch,
1540 _Out_writes_bytes_( pParams->cbHashOutput )
1541 PBYTE pbOutput )
1542{
1543
1544 UINT32 digit;
1545 UINT32 checksum = 0;
1546 BYTE en32Checksum[4];
1547 const UINT32 maxChainIndex = (1 << pParams->nWinternitzWidth) - 1;
1551
1553 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ltree.en32Leaf, idx);
1554
1555 ctxIncHash.adrs = *adrs;
1556 ctxIncHash.pParams = pParams;
1557 ctxIncHash.pbSeed = pbSeed;
1558
1560 pParams->len,
1561 pbScratch,
1562 cbScratch,
1563 pParams->cbHashOutput,
1565 &ctxIncHash);
1566
1567 for (UINT32 i = 0; i < pParams->len; i++)
1568 {
1569 if (i < pParams->len1)
1570 {
1571 digit = SymCryptHbsGetDigit(pParams->nWinternitzWidth, pbMsg, pParams->cbHashOutput, i);
1572
1573 checksum += maxChainIndex - digit;
1574 }
1575 else
1576 {
1577 if (i == pParams->len1)
1578 {
1579 checksum <<= pParams->nLeftShift32;
1580 SYMCRYPT_STORE_MSBFIRST32(en32Checksum, checksum);
1581 }
1582
1583 digit = SymCryptHbsGetDigit(pParams->nWinternitzWidth, en32Checksum, sizeof(en32Checksum), i - pParams->len1);
1584 }
1585
1586 pNode = SymCryptHbsIncrementalTreehashAllocNode(pIncHash, i);
1587
1589 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Leaf, idx);
1590 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Chain, i);
1591
1593 pParams,
1594 &pbSignature[pParams->cbHashOutput * i],
1595 digit,
1596 maxChainIndex - digit,
1597 pbSeed,
1598 adrs,
1599 pNode->value);
1600
1602 }
1603
1605
1606 memcpy(pbOutput, pNode->value, pParams->cbHashOutput);
1607}
1608
1609
1610VOID
1614 _Inout_ XMSS_ADRS *adrs,
1615 _In_reads_bytes_( pParams->cbHashOutput )
1616 PCBYTE pbSeed,
1617 _In_reads_bytes_( pParams->cbHashOutput )
1618 PCBYTE pbHash,
1619 UINT32 uLeaf,
1620 _In_reads_bytes_( pParams->cbHashOutput * pParams->len )
1621 PCBYTE pbWotspSig,
1622 _In_reads_bytes_( pParams->cbHashOutput* pParams->nLayerHeight )
1623 PCBYTE pbAuthNodes,
1624 _Out_writes_bytes_( pParams->cbHashOutput )
1625 PBYTE pbOutput,
1627 PBYTE pbScratch,
1629{
1630 BYTE WotspPublickey[SYMCRYPT_HASH_MAX_RESULT_SIZE];
1631
1633 pParams,
1634 adrs,
1635 uLeaf,
1636 pbHash,
1637 pbSeed,
1638 pbWotspSig,
1639 pbScratch,
1640 cbScratch,
1641 WotspPublickey);
1642
1644 pParams,
1645 adrs,
1646 uLeaf,
1647 WotspPublickey,
1648 pbAuthNodes,
1649 pbSeed,
1650 pbOutput);
1651}
1652
1653SIZE_T
1656{
1657 // WOTSP signature size is len = len1 + len2 many hash outputs
1658 return pParams->cbHashOutput * pParams->len;
1659}
1660
1661SIZE_T
1665{
1666 // size of authentication nodes for single tree
1667 return pParams->cbHashOutput * pParams->nLayerHeight;
1668}
1669
1670UINT64
1674 _In_ PCBYTE pbSig )
1675{
1676 UINT64 Idx = 0;
1677
1678 for (UINT8 i = 0; i < pParams->cbIdx; i++)
1679 {
1680 Idx <<= 8;
1681 Idx |= (UINT64)pbSig[i];
1682 }
1683
1684 return Idx;
1685}
1686
1687PBYTE
1691 _In_ PCBYTE pbSig )
1692{
1693 PBYTE pb = (PBYTE)pbSig;
1694
1695 // randomness comes after idx
1696 pb += pParams->cbIdx;
1697
1698 return pb;
1699}
1700
1701PBYTE
1705 _In_ PCBYTE pbSig,
1706 UINT32 uLayer )
1707{
1708 PBYTE pb = SymCryptXmssSignatureGetRandomness(pParams, pbSig);
1709
1710 // skip randomness
1711 pb += pParams->cbHashOutput;
1712
1713 // each layer contains WOTSP signature and AuthNodes
1714 pb += uLayer * (SymCryptXmssSizeofWotspSignature(pParams) + SymCryptXmssSizeofAuthNodes(pParams));
1715
1716 return pb;
1717}
1718
1719PBYTE
1723 _In_ PCBYTE pbSig,
1724 UINT32 uLayer )
1725{
1726 PBYTE pb = SymCryptXmssSignatureGetWotspSig(pParams, pbSig, uLayer);
1727
1728 // AuthNodes follow WOTSP signature
1729 pb += SymCryptXmssSizeofWotspSignature(pParams);
1730
1731 return pb;
1732}
1733
1738 _In_reads_bytes_( cbMessage ) PCBYTE pbMessage,
1739 SIZE_T cbMessage,
1740 UINT32 flags,
1741 _In_reads_bytes_( cbSignature ) PCBYTE pbSignature,
1742 SIZE_T cbSignature )
1743{
1744 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1745 PBYTE pbScratch = NULL;
1746 SIZE_T cbScratch = 0;
1747 PCSYMCRYPT_XMSS_PARAMS pParams = &pKey->params;
1748 BYTE RandomizedHash[SYMCRYPT_HASH_MAX_RESULT_SIZE];
1749 BYTE ComputedRoot[SYMCRYPT_HASH_MAX_RESULT_SIZE];
1750 XMSS_ADRS adrs;
1751 UINT32 uLayer;
1752 UINT64 uTree;
1753 UINT32 uLeaf;
1754 const UINT64 LeafMask = (1ULL << pParams->nLayerHeight) - 1;
1755
1757
1758 SYMCRYPT_ASSERT(pParams->nLayerHeight < 32); // Ensure nLeaves fits in 32 bits
1759
1760 if (flags != 0 ||
1761 pbSignature == NULL ||
1762 cbSignature != SymCryptXmssSizeofSignatureFromParams(pParams) ||
1763 pKey->keyType == SYMCRYPT_XMSSKEY_TYPE_NONE )
1764 {
1765 scError = SYMCRYPT_INVALID_ARGUMENT;
1766 goto cleanup;
1767 }
1768
1769 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, pParams->len);
1770 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, 1ULL << pParams->nLayerHeight);
1771
1773
1774 if (pbScratch == NULL)
1775 {
1776 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1777 goto cleanup;
1778 }
1779
1780 PBYTE pbRandomness = SymCryptXmssSignatureGetRandomness(pParams, pbSignature);
1781 UINT64 Idx = SymCryptXmssSignatureGetIdx(pParams, pbSignature);
1782
1784 pParams,
1785 Idx,
1786 pbRandomness,
1787 pKey->Root,
1788 pbMessage,
1789 cbMessage,
1790 RandomizedHash);
1791
1792 SymCryptWipeKnownSize(&adrs, sizeof(XMSS_ADRS));
1793
1794 for (uLayer = 0; uLayer < pParams->nLayers; uLayer++)
1795 {
1796 uTree = Idx >> pParams->nLayerHeight;
1797 uLeaf = (UINT32)(Idx & LeafMask);
1798
1802 pParams,
1803 &adrs,
1804 pKey->Seed,
1805 uLayer == 0 ? RandomizedHash : ComputedRoot,
1806 uLeaf,
1807 SymCryptXmssSignatureGetWotspSig(pParams, pbSignature, uLayer),
1808 SymCryptXmssSignatureGetAuthNodes(pParams, pbSignature, uLayer),
1809 ComputedRoot,
1810 pbScratch,
1811 cbScratch);
1812
1813 Idx >>= pParams->nLayerHeight;
1814 }
1815
1816 if (!SymCryptEqual(ComputedRoot, pKey->Root, pParams->cbHashOutput))
1817 {
1818 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
1819 goto cleanup;
1820 }
1821
1822cleanup:
1823
1824 if (pbScratch)
1825 {
1826 SymCryptWipe(pbScratch, cbScratch);
1827 SymCryptCallbackFree(pbScratch);
1828 }
1829
1830 return scError;
1831}
1832
1837 _In_reads_bytes_( cbMessage ) PCBYTE pbMessage,
1838 SIZE_T cbMessage,
1839 UINT32 flags,
1840 _In_reads_bytes_( cbSignature ) PCBYTE pbSignature,
1841 SIZE_T cbSignature )
1842{
1846
1848 pKey,
1849 pbMessage,
1850 cbMessage,
1851 flags,
1852 pbSignature,
1853 cbSignature);
1854}
1855
1856VOID
1860 _Inout_ XMSS_ADRS* adrs,
1861 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbInput,
1862 UINT32 uLeaf,
1863 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSeed,
1864 _In_reads_bytes_( pParams->cbHashOutput ) PCBYTE pbSkXmss,
1865 _Out_writes_bytes_( pParams->cbHashOutput * pParams->len ) PBYTE pbOutput )
1866{
1868 UINT32 nChecksum = 0;
1869 BYTE en32Checksum[sizeof(UINT32)];
1870 UINT32 digit;
1871 const UINT32 maxChainIndex = (1UL << pParams->nWinternitzWidth) - 1;
1872
1873
1875 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Leaf, uLeaf);
1876
1877 for (UINT32 i = 0; i < pParams->len; i++)
1878 {
1879 SYMCRYPT_STORE_MSBFIRST32(adrs->u.ots.en32Chain, i);
1881 pParams,
1882 pbSkXmss,
1883 pbSeed,
1884 adrs,
1885 node);
1886
1887 if (i < pParams->len1)
1888 {
1889 digit = SymCryptHbsGetDigit(pParams->nWinternitzWidth, pbInput, pParams->cbHashOutput, i);
1890
1891 nChecksum += maxChainIndex - digit;
1892 }
1893 else
1894 {
1895 if (i == pParams->len1)
1896 {
1897 nChecksum <<= pParams->nLeftShift32;
1898 SYMCRYPT_STORE_MSBFIRST32(en32Checksum, nChecksum);
1899 }
1900
1901 digit = SymCryptHbsGetDigit(pParams->nWinternitzWidth, en32Checksum, sizeof(en32Checksum), i - pParams->len1);
1902 }
1903
1905 pParams,
1906 node,
1907 0,
1908 digit,
1909 pbSeed,
1910 adrs,
1911 &pbOutput[i * pParams->cbHashOutput]);
1912 }
1913
1915}
1916
1917
1918VOID
1922 _Inout_ XMSS_ADRS *adrs,
1923 _In_reads_bytes_( pParams->cbHashOutput )
1924 PCBYTE pbSkXmss,
1925 _In_reads_bytes_( pParams->cbHashOutput )
1926 PCBYTE pbSeed,
1927 _In_reads_bytes_( pParams->cbHashOutput )
1928 PCBYTE pbHash,
1929 UINT32 Idx,
1930 _Out_writes_bytes_( pParams->cbHashOutput * pParams->len )
1931 PBYTE pbWotspSig,
1932 _Out_writes_bytes_( pParams->cbHashOutput * pParams->nLayerHeight )
1933 PBYTE pbAuthNodes,
1934 _Out_writes_bytes_opt_( pParams->cbHashOutput )
1935 PBYTE pbRoot,
1937 PBYTE pbScratch,
1939{
1940 BYTE WotspPublicKey[SYMCRYPT_HASH_MAX_RESULT_SIZE];
1941
1943 pParams,
1944 adrs,
1945 pbHash,
1946 Idx,
1947 pbSeed,
1948 pbSkXmss,
1949 pbWotspSig );
1950
1951 // Generate authentication path
1952 for (UINT32 h = 0; h < pParams->nLayerHeight; h++)
1953 {
1954 UINT32 uLeaf = ((Idx >> h) ^ 1UL) << h;
1956 pParams,
1957 adrs,
1958 pbSkXmss,
1959 pbSeed,
1960 uLeaf,
1961 h,
1962 pbScratch,
1963 cbScratch,
1964 &pbAuthNodes[h * pParams->cbHashOutput]);
1965 }
1966
1967 //
1968 // Calculate tree root if requested by the caller
1969 //
1970 // This is used to return the tree root to be signed with the upper
1971 // layer in XMSS^MT.
1972 if (pbRoot)
1973 {
1975 pParams,
1976 adrs,
1977 Idx,
1978 pbSkXmss,
1979 pbSeed,
1980 pbScratch,
1981 cbScratch,
1982 WotspPublicKey);
1983
1985 pParams,
1986 adrs,
1987 Idx,
1988 WotspPublicKey,
1989 pbAuthNodes,
1990 pbSeed,
1991 pbRoot);
1992 }
1993}
1994
1995//
1996// Compute randomness for randomized hashing
1997//
1998VOID
2002 UINT64 Idx,
2003 _Out_writes_bytes_( pKey->params.cbHashOutput ) PBYTE pbRandomness )
2004{
2005 BYTE IdxBuffer[32];
2006
2007 SymCryptWipeKnownSize(IdxBuffer, sizeof(IdxBuffer));
2008 SYMCRYPT_STORE_MSBFIRST64(IdxBuffer + sizeof(IdxBuffer) - sizeof(Idx), Idx);
2009
2011 &pKey->params,
2013 pKey->SkPrf,
2014 pKey->params.cbHashOutput,
2015 IdxBuffer,
2016 sizeof(IdxBuffer),
2017 pbRandomness);
2018}
2019
2020
2025 _In_reads_bytes_( cbMessage ) PCBYTE pbMessage,
2026 SIZE_T cbMessage,
2027 UINT32 flags,
2028 _Out_writes_bytes_( cbSignature ) PBYTE pbSignature,
2029 SIZE_T cbSignature )
2030{
2031 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
2032 PBYTE pbScratch = NULL;
2033 SIZE_T cbScratch = 0;
2034 PSYMCRYPT_XMSS_PARAMS pParams = &pKey->params;
2035 UINT64 Idx;
2036 BYTE en64Idx[sizeof(UINT64)];
2038 BYTE RandomizedHash[SYMCRYPT_HASH_MAX_RESULT_SIZE];
2040 XMSS_ADRS adrs;
2041 UINT32 uLayer;
2042 UINT64 uTree;
2043 UINT32 uLeaf;
2044 const UINT64 LeafMask = (1ULL << pParams->nLayerHeight) - 1;
2045
2047
2048 SYMCRYPT_ASSERT(pParams->nLayerHeight < 32); // Ensure nLeaves fits in 32 bits
2049
2050 if (flags != 0 ||
2051 pbSignature == NULL ||
2052 cbSignature != SymCryptXmssSizeofSignatureFromParams(pParams) ||
2054 {
2055 scError = SYMCRYPT_INVALID_ARGUMENT;
2056 goto cleanup;
2057 }
2058
2059 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, pParams->len); // Ltree hashing
2060 cbScratch += SymCryptHbsSizeofScratchBytesForIncrementalTreehash(pParams->cbHashOutput, 1ULL << pParams->nLayerHeight); // Merkle-tree hashing
2061
2063
2064 if (pbScratch == NULL)
2065 {
2066 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
2067 goto cleanup;
2068 }
2069
2070 Idx = SYMCRYPT_ATOMIC_ADD64_POST_RELAXED(&pKey->Idx, 1) - 1;
2071 if (Idx >= (1ULL << pParams->nTotalTreeHeight))
2072 {
2073 // Set Idx to first unusable value
2074 pKey->Idx = (1ULL << pParams->nTotalTreeHeight);
2075
2076 scError = SYMCRYPT_HBS_NO_OTS_KEYS_LEFT;
2077 goto cleanup;
2078 }
2079
2080 SYMCRYPT_STORE_MSBFIRST64(en64Idx, Idx);
2081 memcpy(pbSignature, &en64Idx[sizeof(en64Idx) - pParams->cbIdx], pParams->cbIdx);
2082
2083 SymCryptXmssComputeRandomness(pKey, Idx, Randomness);
2084 memcpy(SymCryptXmssSignatureGetRandomness(pParams, pbSignature), Randomness, pKey->params.cbHashOutput);
2085
2086 SymCryptXmssRandomizedHash(&pKey->params, Idx, Randomness, pKey->Root, pbMessage, cbMessage, RandomizedHash);
2087
2088 SymCryptWipeKnownSize(&adrs, sizeof(XMSS_ADRS));
2089
2090 for (uLayer = 0; uLayer < pParams->nLayers; uLayer++)
2091 {
2092 uTree = Idx >> pParams->nLayerHeight;
2093 uLeaf = (UINT32)(Idx & LeafMask);
2094
2097
2099 &pKey->params,
2100 &adrs,
2101 pKey->SkXmss,
2102 pKey->Seed,
2103 uLayer == 0 ? RandomizedHash : TreeRoot,
2104 uLeaf,
2105 SymCryptXmssSignatureGetWotspSig(pParams, pbSignature, uLayer),
2106 SymCryptXmssSignatureGetAuthNodes(pParams, pbSignature, uLayer),
2107 uLayer == (UINT32)(pParams->nLayers - 1) ? NULL : TreeRoot, // No need to compute the root for the top layer tree
2108 pbScratch,
2109 cbScratch);
2110
2111 Idx >>= pParams->nLayerHeight;
2112 }
2113
2114 if (scError != SYMCRYPT_NO_ERROR)
2115 {
2116 SymCryptWipe(pbSignature, cbSignature);
2117 goto cleanup;
2118 }
2119
2120cleanup:
2121
2122 if (pbScratch)
2123 {
2124 SymCryptWipe(pbScratch, cbScratch);
2125 SymCryptCallbackFree(pbScratch);
2126 }
2127
2128 return scError;
2129}
unsigned char BOOLEAN
Definition: actypes.h:127
unsigned char UINT8
Definition: actypes.h:128
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
static int state
Definition: maze.c:121
unsigned int * PUINT32
Definition: basetsd.h:119
return
Definition: dirsup.c:529
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:40
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
Definition: fdi.c:353
static void cleanup(void)
Definition: main.c:1335
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLsizei width
Definition: gl.h:1546
GLdouble n
Definition: glext.h:7729
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
GLuint id
Definition: glext.h:5910
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
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
Definition: glfuncs.h:248
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCallbackRandom(BYTE *buf, SIZE_T size)
Definition: implglue.c:56
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static DWORD DWORD DWORD DWORD * steps
Definition: cursoricon.c:1804
@ Root
Definition: cmtypes.h:261
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_bytes_opt_(s)
Definition: no_sal2.h:228
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
BYTE * PBYTE
Definition: pedump.c:66
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)
Definition: sc_lib.h:4613
struct _SYMCRYPT_INCREMENTAL_TREEHASH * PSYMCRYPT_INCREMENTAL_TREEHASH
SYMCRYPT_XMSSKEY_TYPE keyType
Definition: sc_lib.h:4525
@ XMSS_ADRS_TYPE_HASH_TREE
Definition: sc_lib.h:4478
@ XMSS_ADRS_TYPE_LTREE
Definition: sc_lib.h:4477
@ XMSS_ADRS_TYPE_OTS
Definition: sc_lib.h:4476
FORCEINLINE UINT32 SymCryptCountLeadingZeros32(UINT32 value)
Definition: sc_lib.h:5079
struct _SYMCRYPT_INCREMENTAL_TREEHASH SYMCRYPT_INCREMENTAL_TREEHASH
#define SYMCRYPT_RUN_SELFTEST_ONCE(AlgorithmSelftestFunction, AlgorithmSelftestFlag)
Definition: sc_lib.h:3686
#define SYMCRYPT_ARRAY_SIZE(_x)
Definition: sc_lib.h:342
UINT32 UINT32 UINT32 UINT32 cbScratch
SIZE_T cbBuffer
Definition: sc_lib_mldsa.h:405
static const BYTE pbHash[]
PSYMCRYPT_INCREMENTAL_TREEHASH_FUNC funcCompressNodes
Definition: sc_lib.h:4626
PSYMCRYPT_XMSS_INCREMENTAL_TREEHASH_CONTEXT pContext
Definition: sc_lib.h:4627
BYTE value[SYMCRYPT_ANYSIZE_ARRAY]
Definition: sc_lib.h:4594
SYMCRYPT_XMSS_WOTSP_ALGID idWotsp
Definition: xmss.c:74
SYMCRYPT_XMSS_WOTSP_ALGID wotspId
Definition: xmss.c:49
BYTE en32Layer[4]
Definition: sc_lib.h:4504
BYTE en64Tree[8]
Definition: sc_lib.h:4505
Definition: copy.c:22
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
const PCSYMCRYPT_HASH SymCryptShake256HashAlgorithm
Definition: shake.c:93
VOID SYMCRYPT_CALL SymCryptHashAppend(_In_ PCSYMCRYPT_HASH pHash, _Inout_updates_bytes_(pHash->stateSize) PVOID pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
Definition: hash.c:182
#define SYMCRYPT_LOAD_MSBFIRST32(p)
Definition: symcrypt.h:303
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)
Definition: libmain.c:137
const PCSYMCRYPT_HASH SymCryptSha256Algorithm
Definition: sha256.c:46
VOID SYMCRYPT_CALL SymCryptHashInit(_In_ PCSYMCRYPT_HASH pHash, _Out_writes_bytes_(pHash->stateSize) PVOID pState)
Definition: hash.c:173
@ SYMCRYPT_XMSSMT_SHAKE256_40_4_256
Definition: symcrypt.h:9131
@ SYMCRYPT_XMSSMT_SHA2_20_2_256
Definition: symcrypt.h:9078
@ SYMCRYPT_XMSSMT_SHAKE_40_8_256
Definition: symcrypt.h:9102
@ SYMCRYPT_XMSSMT_SHA2_60_3_512
Definition: symcrypt.h:9093
@ SYMCRYPT_XMSSMT_SHAKE_60_6_512
Definition: symcrypt.h:9114
@ SYMCRYPT_XMSSMT_SHAKE_60_12_256
Definition: symcrypt.h:9105
@ SYMCRYPT_XMSSMT_SHAKE256_40_4_192
Definition: symcrypt.h:9141
@ SYMCRYPT_XMSSMT_SHA2_40_2_512
Definition: symcrypt.h:9090
@ SYMCRYPT_XMSSMT_SHA2_20_2_192
Definition: symcrypt.h:9118
@ SYMCRYPT_XMSSMT_SHAKE_20_4_512
Definition: symcrypt.h:9109
@ SYMCRYPT_XMSSMT_SHAKE256_20_4_192
Definition: symcrypt.h:9139
@ SYMCRYPT_XMSSMT_SHA2_60_12_512
Definition: symcrypt.h:9095
@ SYMCRYPT_XMSSMT_SHA2_60_12_192
Definition: symcrypt.h:9125
@ SYMCRYPT_XMSSMT_SHAKE_60_6_256
Definition: symcrypt.h:9104
@ SYMCRYPT_XMSSMT_SHAKE_20_2_512
Definition: symcrypt.h:9108
@ SYMCRYPT_XMSSMT_SHA2_60_6_512
Definition: symcrypt.h:9094
@ SYMCRYPT_XMSSMT_SHA2_20_4_192
Definition: symcrypt.h:9119
@ SYMCRYPT_XMSSMT_SHAKE256_60_3_256
Definition: symcrypt.h:9133
@ SYMCRYPT_XMSSMT_SHA2_40_4_256
Definition: symcrypt.h:9081
@ SYMCRYPT_XMSSMT_SHA2_60_3_256
Definition: symcrypt.h:9083
@ SYMCRYPT_XMSSMT_SHAKE256_20_2_256
Definition: symcrypt.h:9128
@ SYMCRYPT_XMSSMT_SHAKE256_60_6_256
Definition: symcrypt.h:9134
@ SYMCRYPT_XMSSMT_SHA2_40_8_192
Definition: symcrypt.h:9122
@ SYMCRYPT_XMSSMT_SHAKE_40_2_256
Definition: symcrypt.h:9100
@ SYMCRYPT_XMSSMT_SHA2_40_4_192
Definition: symcrypt.h:9121
@ SYMCRYPT_XMSSMT_SHA2_40_8_512
Definition: symcrypt.h:9092
@ SYMCRYPT_XMSSMT_SHAKE256_60_12_256
Definition: symcrypt.h:9135
@ SYMCRYPT_XMSSMT_SHA2_40_2_256
Definition: symcrypt.h:9080
@ SYMCRYPT_XMSSMT_SHAKE256_60_3_192
Definition: symcrypt.h:9143
@ SYMCRYPT_XMSSMT_SHAKE_20_4_256
Definition: symcrypt.h:9099
@ SYMCRYPT_XMSSMT_SHA2_60_6_256
Definition: symcrypt.h:9084
@ SYMCRYPT_XMSSMT_SHAKE256_40_2_192
Definition: symcrypt.h:9140
@ SYMCRYPT_XMSSMT_SHAKE_40_2_512
Definition: symcrypt.h:9110
@ SYMCRYPT_XMSSMT_SHA2_20_2_512
Definition: symcrypt.h:9088
@ SYMCRYPT_XMSSMT_SHA2_40_2_192
Definition: symcrypt.h:9120
@ SYMCRYPT_XMSSMT_SHAKE256_40_8_192
Definition: symcrypt.h:9142
@ SYMCRYPT_XMSSMT_SHAKE256_60_6_192
Definition: symcrypt.h:9144
@ SYMCRYPT_XMSSMT_SHAKE256_40_2_256
Definition: symcrypt.h:9130
@ SYMCRYPT_XMSSMT_SHA2_20_4_256
Definition: symcrypt.h:9079
@ SYMCRYPT_XMSSMT_SHAKE_20_2_256
Definition: symcrypt.h:9098
@ SYMCRYPT_XMSSMT_SHAKE_60_3_512
Definition: symcrypt.h:9113
@ SYMCRYPT_XMSSMT_SHA2_60_6_192
Definition: symcrypt.h:9124
@ SYMCRYPT_XMSSMT_SHA2_20_4_512
Definition: symcrypt.h:9089
@ SYMCRYPT_XMSSMT_SHAKE_60_12_512
Definition: symcrypt.h:9115
@ SYMCRYPT_XMSSMT_SHAKE256_20_4_256
Definition: symcrypt.h:9129
@ SYMCRYPT_XMSSMT_SHA2_40_4_512
Definition: symcrypt.h:9091
@ SYMCRYPT_XMSSMT_SHA2_40_8_256
Definition: symcrypt.h:9082
@ SYMCRYPT_XMSSMT_SHAKE256_20_2_192
Definition: symcrypt.h:9138
@ SYMCRYPT_XMSSMT_SHA2_60_12_256
Definition: symcrypt.h:9085
@ SYMCRYPT_XMSSMT_SHAKE_40_4_512
Definition: symcrypt.h:9111
@ SYMCRYPT_XMSSMT_SHA2_60_3_192
Definition: symcrypt.h:9123
@ SYMCRYPT_XMSSMT_SHAKE_40_4_256
Definition: symcrypt.h:9101
@ SYMCRYPT_XMSSMT_SHAKE_60_3_256
Definition: symcrypt.h:9103
@ SYMCRYPT_XMSSMT_SHAKE256_40_8_256
Definition: symcrypt.h:9132
@ SYMCRYPT_XMSSMT_SHAKE_40_8_512
Definition: symcrypt.h:9112
@ SYMCRYPT_XMSSMT_SHAKE256_60_12_192
Definition: symcrypt.h:9145
#define SYMCRYPT_LOAD_MSBFIRST64(p)
Definition: symcrypt.h:304
VOID SYMCRYPT_CALL SymCryptHashStateCopy(_In_ PCSYMCRYPT_HASH pHash, _In_reads_(pHash->stateSize) PCVOID pSrc, _Out_writes_(pHash->stateSize) PVOID pDst)
Definition: hash.c:210
VOID SYMCRYPT_CALL SymCryptXmssSelftest(void)
#define SYMCRYPT_FLAG_XMSSKEY_VERIFY_ROOT
Definition: symcrypt.h:9243
VOID SYMCRYPT_CALL SymCryptXorBytes(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, _Out_writes_(cbBytes) PBYTE pbResult, SIZE_T cbBytes)
Definition: libmain.c:236
enum _SYMCRYPT_XMSS_ALGID SYMCRYPT_XMSS_ALGID
const PCSYMCRYPT_HASH SymCryptShake128HashAlgorithm
Definition: shake.c:41
#define SYMCRYPT_STORE_MSBFIRST32(p, v)
Definition: symcrypt.h:311
const PCSYMCRYPT_HASH SymCryptSha512Algorithm
Definition: sha512.c:170
BOOLEAN SYMCRYPT_CALL SymCryptEqual(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, SIZE_T cbBytes)
Definition: equal.c:11
#define SYMCRYPT_STORE_MSBFIRST64(p, v)
Definition: symcrypt.h:312
enum _SYMCRYPT_XMSSKEY_TYPE SYMCRYPT_XMSSKEY_TYPE
@ SYMCRYPT_XMSSKEY_TYPE_PUBLIC
Definition: symcrypt.h:9153
@ SYMCRYPT_XMSSKEY_TYPE_PRIVATE
Definition: symcrypt.h:9154
@ SYMCRYPT_XMSSKEY_TYPE_NONE
Definition: symcrypt.h:9152
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)
Definition: hash.c:193
enum _SYMCRYPT_XMSSMT_ALGID SYMCRYPT_XMSSMT_ALGID
@ SYMCRYPT_XMSS_SHAKE256_16_192
Definition: symcrypt.h:9069
@ SYMCRYPT_XMSS_SHA2_16_512
Definition: symcrypt.h:9054
@ SYMCRYPT_XMSS_SHA2_20_256
Definition: symcrypt.h:9052
@ SYMCRYPT_XMSS_SHAKE256_16_256
Definition: symcrypt.h:9066
@ SYMCRYPT_XMSS_SHA2_16_256
Definition: symcrypt.h:9051
@ SYMCRYPT_XMSS_SHA2_10_512
Definition: symcrypt.h:9053
@ SYMCRYPT_XMSS_SHAKE_16_512
Definition: symcrypt.h:9060
@ SYMCRYPT_XMSS_SHAKE_10_256
Definition: symcrypt.h:9056
@ SYMCRYPT_XMSS_SHAKE256_20_192
Definition: symcrypt.h:9070
@ SYMCRYPT_XMSS_SHAKE256_10_256
Definition: symcrypt.h:9065
@ SYMCRYPT_XMSS_SHA2_10_192
Definition: symcrypt.h:9062
@ SYMCRYPT_XMSS_SHA2_10_256
Definition: symcrypt.h:9050
@ SYMCRYPT_XMSS_SHAKE_16_256
Definition: symcrypt.h:9057
@ SYMCRYPT_XMSS_SHA2_20_512
Definition: symcrypt.h:9055
@ SYMCRYPT_XMSS_SHAKE_10_512
Definition: symcrypt.h:9059
@ SYMCRYPT_XMSS_SHAKE_20_256
Definition: symcrypt.h:9058
@ SYMCRYPT_XMSS_SHA2_20_192
Definition: symcrypt.h:9064
@ SYMCRYPT_XMSS_SHA2_16_192
Definition: symcrypt.h:9063
@ SYMCRYPT_XMSS_SHAKE256_20_256
Definition: symcrypt.h:9067
@ SYMCRYPT_XMSS_SHAKE256_10_192
Definition: symcrypt.h:9068
@ SYMCRYPT_XMSS_SHAKE_20_512
Definition: symcrypt.h:9061
SYMCRYPT_ERROR
Definition: symcrypt.h:227
struct _SYMCRYPT_XMSS_KEY SYMCRYPT_XMSS_KEY
const SYMCRYPT_XMSS_PARAMS * PCSYMCRYPT_XMSS_PARAMS
@ SYMCRYPT_SELFTEST_ALGORITHM_XMSS
#define SYMCRYPT_CALL
UINT32 cbHashOutput
PCBYTE pbKey
UINT32 len2
UINT32 cbPrefix
#define SYMCRYPT_HASH_MAX_RESULT_SIZE
PCBYTE SIZE_T cbKey
SYMCRYPT_XMSS_KEY * PSYMCRYPT_XMSS_KEY
const SYMCRYPT_HASH * PCSYMCRYPT_HASH
UINT32 len1
SYMCRYPT_XMSS_PARAMS * PSYMCRYPT_XMSS_PARAMS
#define SYMCRYPT_SET_MAGIC(p)
UINT32 nTotalTreeHeight
UINT32 nLayers
const SYMCRYPT_XMSS_KEY * PCSYMCRYPT_XMSS_KEY
PCSYMCRYPT_HMAC_MD5_EXPANDED_KEY pKey
UINT32 cbSize
UINT32 cbSeed
PSYMCRYPT_COMMON_HASH_STATE pState
const BYTE * PCBYTE
UINT32 nWinternitzWidth
#define SYMCRYPT_CHECK_MAGIC(p)
PBYTE pbSeed
Character const *const prefix
Definition: tempnam.cpp:195
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59
Definition: dlist.c:348
Definition: pdh_main.c:64
struct _SYMCRYPT_XMSS_WOTSP_PARAMS * PSYMCRYPT_XMSS_WOTSP_PARAMS
#define SYMCRYPT_XMSS_PRF_KEYGEN
Definition: xmss.c:22
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)
Definition: xmss.c:1003
static const SYMCRYPT_XMSS_PARAMETER_PREDEFINED XmssMtParametersPredefined[]
Definition: xmss.c:115
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)
Definition: xmss.c:1349
#define SYMCRYPT_XMSS_H
Definition: xmss.c:19
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetRandomness(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig)
Definition: xmss.c:1689
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)
Definition: xmss.c:1612
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)
Definition: xmss.c:1069
VOID SYMCRYPT_CALL SymCryptHbsGetWinternitzLengths(UINT32 n, UINT32 w, _Out_ PUINT32 puLen1, _Out_ PUINT32 puLen2)
Definition: xmss.c:188
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)
Definition: xmss.c:1454
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashFinalize(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash)
Definition: xmss.c:695
UINT64 SYMCRYPT_CALL SymCryptXmssSignatureGetIdx(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig)
Definition: xmss.c:1672
#define SYMCRYPT_XMSS_H_MSG
Definition: xmss.c:20
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssParamsFromAlgId(SYMCRYPT_XMSS_ALGID id, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:339
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)
Definition: xmss.c:365
static const SYMCRYPT_XMSS_WOTSP_PARAMS XmssWotspParams[]
Definition: xmss.c:58
VOID SYMCRYPT_CALL SymCryptXmsskeyFree(_Inout_ PSYMCRYPT_XMSS_KEY pKey)
Definition: xmss.c:571
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)
Definition: xmss.c:889
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)
Definition: xmss.c:1527
#define SYMCRYPT_XMSS_PRF
Definition: xmss.c:21
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)
Definition: xmss.c:1251
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)
Definition: xmss.c:2023
UINT32 SYMCRYPT_CALL SymCryptHbsIncrementalTreehashStackDepth(UINT32 nLeaves)
Definition: xmss.c:704
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)
Definition: xmss.c:848
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeyGenerate(_Inout_ PSYMCRYPT_XMSS_KEY pKey, UINT32 flags)
Definition: xmss.c:1177
#define SYMCRYPT_XMSS_MAX_PREFIX_SIZE
Definition: xmss.c:15
const SYMCRYPT_XMSS_PARAMETER_PREDEFINED * PCSYMCRYPT_XMSS_PARAMETER_PREDEFINED
Definition: xmss.c:85
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmsskeyVerifyRoot(_In_ PCSYMCRYPT_XMSS_KEY pKey)
Definition: xmss.c:1133
VOID SYMCRYPT_CALL SymCryptXmssDeriveParams(_Inout_ PSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:255
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)
Definition: xmss.c:936
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssGetWotspParams(SYMCRYPT_XMSS_WOTSP_ALGID id, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:221
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)
Definition: xmss.c:1736
SIZE_T SYMCRYPT_CALL SymCryptXmssSizeofWotspSignature(_In_ PCSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:1655
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)
Definition: xmss.c:1835
static const SYMCRYPT_XMSS_PARAMETER_PREDEFINED XmssParametersPredefined[]
Definition: xmss.c:88
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)
Definition: xmss.c:1501
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)
Definition: xmss.c:871
VOID SYMCRYPT_CALL SymCryptXmssPrfKey(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_reads_bytes_(cbKey) PCBYTE pbKey, SIZE_T cbKey, _Out_ SYMCRYPT_HASH_STATE *pState)
Definition: xmss.c:753
static const PCSYMCRYPT_HASH * XmssHashArray[]
Definition: xmss.c:25
enum _SYMCRYPT_XMSS_WOTSP_ALGID SYMCRYPT_XMSS_WOTSP_ALGID
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetNode(_In_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, SIZE_T index)
Definition: xmss.c:609
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)
Definition: xmss.c:1858
#define SYMCRYPT_XMSS_F
Definition: xmss.c:18
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssParamsFromAlgIdCommon(UINT32 id, BOOLEAN isMultiTree, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:291
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcessCommon(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, BOOLEAN fFinal)
Definition: xmss.c:655
VOID SYMCRYPT_CALL SymCryptXmssSetAdrsType(_Out_ PXMSS_ADRS adrs, UINT32 type)
Definition: xmss.c:465
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)
Definition: xmss.c:582
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)
Definition: xmss.c:785
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetWotspSig(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig, UINT32 uLayer)
Definition: xmss.c:1703
VOID SYMCRYPT_CALL SymCryptXmssComputeRandomness(_In_ PCSYMCRYPT_XMSS_KEY pKey, UINT64 Idx, _Out_writes_bytes_(pKey->params.cbHashOutput) PBYTE pbRandomness)
Definition: xmss.c:2000
VOID SYMCRYPT_CALL SymCryptXmssPrfInit(_In_ PCSYMCRYPT_HASH hash, BYTE PrfType, SIZE_T prefixLength, _Out_ PSYMCRYPT_HASH_STATE state)
Definition: xmss.c:733
SIZE_T SYMCRYPT_CALL SymCryptXmssSizeofAuthNodes(_In_ PCSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:1663
_SYMCRYPT_XMSS_WOTSP_ALGID
Definition: xmss.c:34
@ SYMCRYPT_XMSS_WOTSP_SHA2_192
Definition: xmss.c:40
@ SYMCRYPT_XMSS_WOTSP_SHAKE256_192
Definition: xmss.c:42
@ SYMCRYPT_XMSS_WOTSP_SHAKE256_256
Definition: xmss.c:41
@ SYMCRYPT_XMSS_WOTSP_SHAKE_256
Definition: xmss.c:38
@ SYMCRYPT_XMSS_WOTSP_SHAKE_512
Definition: xmss.c:39
@ SYMCRYPT_XMSS_WOTSP_SHA2_512
Definition: xmss.c:37
@ SYMCRYPT_XMSS_WOTSP_SHA2_256
Definition: xmss.c:36
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashProcess(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash)
Definition: xmss.c:686
PSYMCRYPT_XMSS_KEY SYMCRYPT_CALL SymCryptXmsskeyAllocate(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, UINT32 flags)
Definition: xmss.c:535
struct _SYMCRYPT_XMSS_PARAMETER_PREDEFINED SYMCRYPT_XMSS_PARAMETER_PREDEFINED
SYMCRYPT_XMSS_PARAMETER_PREDEFINED * PSYMCRYPT_XMSS_PARAMETER_PREDEFINED
Definition: xmss.c:84
VOID SYMCRYPT_CALL SymCryptHbsIncrementalTreehashGetTopNodes(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeLeft, _Out_ PSYMCRYPT_TREEHASH_NODE *ppNodeRight)
Definition: xmss.c:642
PSYMCRYPT_TREEHASH_NODE SYMCRYPT_CALL SymCryptHbsIncrementalTreehashAllocNode(_Inout_ PSYMCRYPT_INCREMENTAL_TREEHASH pIncHash, UINT32 nLeafIndex)
Definition: xmss.c:623
PBYTE SYMCRYPT_CALL SymCryptXmssSignatureGetAuthNodes(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, _In_ PCBYTE pbSig, UINT32 uLayer)
Definition: xmss.c:1721
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssSizeofKeyBlobFromParams(_In_ PCSYMCRYPT_XMSS_PARAMS pParams, SYMCRYPT_XMSSKEY_TYPE keyType, _Out_ SIZE_T *pcbKey)
Definition: xmss.c:497
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)
Definition: xmss.c:1920
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)
Definition: xmss.c:825
SIZE_T SYMCRYPT_CALL SymCryptHbsSizeofScratchBytesForIncrementalTreehash(UINT32 cbNode, UINT32 nLeaves)
Definition: xmss.c:719
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptXmssMtParamsFromAlgId(SYMCRYPT_XMSSMT_ALGID id, _Out_ PSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:349
SIZE_T SYMCRYPT_CALL SymCryptXmssSizeofSignatureFromParams(_In_ PCSYMCRYPT_XMSS_PARAMS pParams)
Definition: xmss.c:477
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)
Definition: xmss.c:765
struct _SYMCRYPT_XMSS_WOTSP_PARAMS SYMCRYPT_XMSS_WOTSP_PARAMS
UINT32 SYMCRYPT_CALL SymCryptHbsGetDigit(UINT32 width, _In_ PCBYTE pbBuffer, SIZE_T cbBuffer, UINT32 index)
Definition: xmss.c:1429
unsigned char BYTE
Definition: xxhash.c:193