ReactOS 0.4.17-dev-1005-g171e1de
mldsa.c
Go to the documentation of this file.
1//
2// mldsa.c ML-DSA related functionality
3//
4// Copyright (c) Microsoft Corporation. Licensed under the MIT license.
5//
6
7#include "precomp.h"
8
14{
15 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
16 PSYMCRYPT_MLDSAKEY pkMlDsakey = NULL;
17 PSYMCRYPT_MLDSA_INTERNAL_PARAMS pInternalParams = NULL;
19 UINT32 cbKey = 0;
20
21 scError = SymCryptMlDsaGetInternalParamsFromParams( params, &pInternalParams );
22 if( scError != SYMCRYPT_NO_ERROR )
23 {
24 goto cleanup;
25 }
26
27 cbKey = SYMCRYPT_INTERNAL_MLDSA_SIZEOF_KEY( pInternalParams->nRows, pInternalParams->nCols );
29 if( pbKey == NULL )
30 {
31 goto cleanup;
32 }
33
34 pkMlDsakey = SymCryptMlDsakeyInitialize( pInternalParams, pbKey, cbKey );
35 if( pkMlDsakey == NULL )
36 {
37 goto cleanup;
38 }
39
40 // On success, memory is owned by pkMlDsakey
41 pbKey = NULL;
42
44 if( pbKey != NULL )
45 {
47 }
48
49 return pkMlDsakey;
50}
51
53VOID
56 PSYMCRYPT_MLDSAKEY pkMlDsakey )
57{
58 SYMCRYPT_CHECK_MAGIC( pkMlDsakey );
59
60 SymCryptWipe( pkMlDsakey, pkMlDsakey->cbTotalSize );
61 SymCryptCallbackFree( pkMlDsakey );
62}
63
68 PSYMCRYPT_MLDSAKEY pkMlDsakey,
69 PCBYTE pbRootSeed,
70 SIZE_T cbRootSeed,
72{
74
76
77 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
78
79 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams = pkMlDsakey->pParams;
81
83
85 pParams,
86 1, // row vectors
87 0, // column vectors
88 1, // poly elements
89 pParams->cbEncodedPublicKey ); // scratch space
90 if( pTemps == NULL )
91 {
92 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
93 goto cleanup;
94 }
95
96 memcpy( pkMlDsakey->rootSeed, pbRootSeed, cbRootSeed );
97
98 {
99 PSYMCRYPT_SHAKE256_STATE pShakeState = &(pTemps->shake256State);
100 SymCryptShake256Init( pShakeState );
101 SymCryptShake256Append( pShakeState, pkMlDsakey->rootSeed, cbRootSeed );
102 SymCryptShake256Append( pShakeState, (PCBYTE) &pParams->nRows, sizeof(BYTE) );
103 SymCryptShake256Append( pShakeState, (PCBYTE) &pParams->nCols, sizeof(BYTE) );
104
105 SymCryptShake256Extract( pShakeState, pkMlDsakey->publicSeed, sizeof(pkMlDsakey->publicSeed), FALSE);
106 SymCryptShake256Extract( pShakeState, privateVectorSeed, sizeof(privateVectorSeed), FALSE );
107 SymCryptShake256Extract( pShakeState, pkMlDsakey->privateSigningSeed, sizeof(pkMlDsakey->privateSigningSeed), FALSE); // Wiped when pTemps is freed
108 }
109
110 SymCryptMlDsaExpandA( pkMlDsakey->publicSeed, sizeof(pkMlDsakey->publicSeed), pkMlDsakey->pmA );
111
113 pkMlDsakey->pParams,
114 privateVectorSeed,
115 sizeof(privateVectorSeed),
116 pkMlDsakey->pvs1,
117 pkMlDsakey->pvs2 );
118
119 // Convert s1 and s2 to NTT form
120 SymCryptMlDsaVectorNTT( pkMlDsakey->pvs1 );
121 SymCryptMlDsaVectorNTT( pkMlDsakey->pvs2 );
122
124 pkMlDsakey->pmA,
125 pkMlDsakey->pvs1,
126 pkMlDsakey->pvs2,
127 pkMlDsakey->pvt0,
128 pkMlDsakey->pvt1,
129 pTemps->pvRowVectors[0],
130 pTemps->pePolyElements[0] );
131
132 // Convert t0 and t1 to NTT form
133 SymCryptMlDsaVectorNTT( pkMlDsakey->pvt0 );
134 SymCryptMlDsaVectorNTT( pkMlDsakey->pvt1 );
135
136 scError = SymCryptMlDsaPkEncode( pkMlDsakey, pTemps->pbScratch, pParams->cbEncodedPublicKey );
137 if( scError != SYMCRYPT_NO_ERROR )
138 {
139 goto cleanup;
140 }
141
143 pTemps->pbScratch,
144 pParams->cbEncodedPublicKey,
145 pkMlDsakey->publicKeyHash,
146 sizeof(pkMlDsakey->publicKeyHash) );
147
148 pkMlDsakey->hasRootSeed = TRUE;
149 pkMlDsakey->hasPrivateKey = TRUE;
150
151cleanup:
152 if( pTemps != NULL )
153 {
155 }
156
157 SymCryptWipeKnownSize( privateVectorSeed, sizeof(privateVectorSeed) );
158
159 return scError;
160}
161
166 PSYMCRYPT_MLDSAKEY pkMlDsakey,
168{
169 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
171 PBYTE pbPctSignature = NULL;
172 SIZE_T cbPctSignature = 0;
173
174 // Ensure only allowed flags are specified
175 UINT32 allowedFlags = SYMCRYPT_FLAG_KEY_NO_FIPS;
176
177 if ( ( flags & ~allowedFlags ) != 0 )
178 {
179 scError = SYMCRYPT_INVALID_ARGUMENT;
180 goto cleanup;
181 }
182
183 scError = SymCryptCallbackRandom( random, sizeof(random) );
184 if( scError != SYMCRYPT_NO_ERROR )
185 {
186 goto cleanup;
187 }
188
190 if( scError != SYMCRYPT_NO_ERROR )
191 {
192 goto cleanup;
193 }
194
195 // SymCryptMlDsakeySetValue ensures the self-test is run before
196 // first operational use of MlDsa
197
198 if( ( flags & SYMCRYPT_FLAG_KEY_NO_FIPS ) == 0 )
199 {
200 // PCT on key generation, sign/verify the empty message with the generated key
201
202 cbPctSignature = pkMlDsakey->pParams->cbEncodedSignature;
203
204 pbPctSignature = SymCryptCallbackAlloc( cbPctSignature );
205 if( pbPctSignature == NULL )
206 {
207 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
208 goto cleanup;
209 }
210
211 scError = SymCryptMlDsaSign( pkMlDsakey,
212 NULL, 0,
213 NULL, 0,
214 0,
215 pbPctSignature, cbPctSignature );
216 if( scError != SYMCRYPT_NO_ERROR )
217 {
218 scError = SYMCRYPT_FIPS_FAILURE;
219 goto cleanup;
220 }
221
222 scError = SymCryptMlDsaVerify( pkMlDsakey,
223 NULL, 0,
224 NULL, 0,
225 pbPctSignature, cbPctSignature,
226 0 );
227 if( scError != SYMCRYPT_NO_ERROR )
228 {
229 scError = SYMCRYPT_FIPS_FAILURE;
230 goto cleanup;
231 }
232
233 // could track having run the PCT with a flag in pkMlDsakey->fAlgorithmInfo,
234 // but currently no need to do that given we don't ever defer the PCT
235 }
236
237cleanup:
238 if( pbPctSignature != NULL )
239 {
240 // Wiping is not required for security, but has low relative cost
241 // and better to be on the safe side for FIPS
242 SymCryptWipe( pbPctSignature, cbPctSignature );
243 SymCryptCallbackFree( pbPctSignature );
244 }
245
247
248 return scError;
249}
250
256 SIZE_T cbSrc,
257 SYMCRYPT_MLDSAKEY_FORMAT mlDsakeyFormat,
259 PSYMCRYPT_MLDSAKEY pkMlDsakey )
260{
261 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
262
263 // Ensure only allowed flags are specified
264 UINT32 allowedFlags = SYMCRYPT_FLAG_KEY_NO_FIPS;
265
266 if ( ( flags & ~allowedFlags ) != 0 )
267 {
268 scError = SYMCRYPT_INVALID_ARGUMENT;
269 goto cleanup;
270 }
271
272 if( ( flags & SYMCRYPT_FLAG_KEY_NO_FIPS ) == 0 )
273 {
274 // Ensure ML-DSA algorithm selftest is run before first use of ML-DSA algorithms;
275 // notably _before_ first full KeyGen
279 }
280
281 switch( mlDsakeyFormat )
282 {
284 if( cbSrc != SYMCRYPT_MLDSA_ROOT_SEED_SIZE )
285 {
286 scError = SYMCRYPT_WRONG_KEY_SIZE;
287 goto cleanup;
288 }
289
290 scError = SymCryptMlDsaKeyGenerateEx( pkMlDsakey, pbSrc, cbSrc, flags );
291 break;
293 scError = SymCryptMlDsaSkDecode( pbSrc, cbSrc, flags, pkMlDsakey );
294 break;
296 scError = SymCryptMlDsaPkDecode( pbSrc, cbSrc, flags, pkMlDsakey );
297 break;
298 default:
299 scError = SYMCRYPT_INVALID_ARGUMENT;
300 break;
301 }
302
303cleanup:
304 return scError;
305}
306
311 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
312 PBYTE pbDst,
313 SIZE_T cbDst,
314 SYMCRYPT_MLDSAKEY_FORMAT mlDsakeyFormat,
315 UINT32 flags )
316{
317 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
318
319 if( flags != 0 ) // No flags currently supported
320 {
321 scError = SYMCRYPT_INVALID_ARGUMENT;
322 goto cleanup;
323 }
324
325 switch( mlDsakeyFormat )
326 {
328 scError = SymCryptMlDsaSkEncode(
329 pkMlDsakey,
330 pbDst,
331 cbDst );
332 break;
334 scError = SymCryptMlDsaPkEncode(
335 pkMlDsakey,
336 pbDst,
337 cbDst );
338 break;
341 {
342 scError = SYMCRYPT_BUFFER_TOO_SMALL;
343 goto cleanup;
344 }
345
346 if( !pkMlDsakey->hasRootSeed )
347 {
348 scError = SYMCRYPT_INCOMPATIBLE_FORMAT;
349 goto cleanup;
350 }
351
352 memcpy( pbDst, pkMlDsakey->rootSeed, SYMCRYPT_MLDSA_ROOT_SEED_SIZE );
353
354 break;
355 default:
356 scError = SYMCRYPT_INVALID_ARGUMENT;
357 break;
358 }
359
360cleanup:
361 return scError;
362}
363
368 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
369 PCBYTE pbInput,
370 SIZE_T cbInput,
371 PCBYTE pbContext,
372 SIZE_T cbContext,
373 PCBYTE pbHashOid,
374 SIZE_T cbHashOid,
375 PCBYTE pbRandom,
376 SIZE_T cbRandom,
378 PBYTE pbSignature,
379 SIZE_T cbSignature )
380{
381 SYMCRYPT_ASSERT( pkMlDsakey->hasPrivateKey == TRUE );
384 SYMCRYPT_ASSERT( pbHashOid != NULL || cbHashOid == 0 );
385 SYMCRYPT_ASSERT( pbContext != NULL || cbContext == 0 );
386 SYMCRYPT_ASSERT( cbSignature == pkMlDsakey->pParams->cbEncodedSignature );
388 SYMCRYPT_ASSERT( ((flags & SYMCRYPT_FLAG_MLDSA_EXTERNALMU) == 0) || (pbContext == NULL && pbHashOid == NULL) );
389
390 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
391
392 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams = pkMlDsakey->pParams;
394
395 const UINT32 beta = (UINT32) pParams->nChallengeNonZeroCoeffs * pParams->privateKeyRange;
396
397 BOOL bExternalMu = (flags & SYMCRYPT_FLAG_MLDSA_EXTERNALMU) != 0;
398 UINT8 modeId = (pbHashOid == NULL) ? 0 : 1; // 0 for ML-DSA, 1 for HashML-DSA
399 UINT8 cbContextByte = (UINT8) cbContext;
400 BYTE messageRepresentative[SYMCRYPT_SHAKE256_RESULT_SIZE];
402 BYTE commitmentHash[64]; // Largest possible size for commitment hash
403
404 const UINT32 cbw1Encoded = pParams->nRows * pParams->w1EncodeCoefficientBitLength *
406
408 pParams,
409 2, // row vectors - W, W1, cs2, ct0, r0, hint (not all needed simultaneously)
410 3, // column vectors - mask, cs1, response
411 1, // poly element - challenge
412 cbw1Encoded ); // scratch space - w1 encoded
413 if( pTemps == NULL )
414 {
415 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
416 goto cleanup;
417 }
418
419 PSYMCRYPT_SHAKE256_STATE pShakeState = &(pTemps->shake256State);
420 SymCryptShake256Init( pShakeState );
421
422 if ( bExternalMu )
423 {
424 // Caller passes the externally-computed message representative mu
426 memcpy( messageRepresentative, pbInput, SYMCRYPT_SHAKE256_RESULT_SIZE );
427 }
428 else
429 {
430 // Line 6: calculate message representative mu
431 // = SHAKE256( public key hash || modeId || cbContextByte || context || OID? || message/hash, 64 )
432 // The OID is only included in the HashML-DSA mode
433 SymCryptShake256Append( pShakeState, pkMlDsakey->publicKeyHash, sizeof(pkMlDsakey->publicKeyHash) );
434 SymCryptShake256Append( pShakeState, &modeId, sizeof( modeId ) );
435 SymCryptShake256Append( pShakeState, &cbContextByte, sizeof( cbContextByte ) );
436
437 // These appends are no-ops if the length is zero
438 SymCryptShake256Append( pShakeState, pbContext, cbContext );
439 SymCryptShake256Append( pShakeState, pbHashOid, cbHashOid );
440
441 SymCryptShake256Append( pShakeState, pbInput, cbInput );
442 SymCryptShake256Result( pShakeState, messageRepresentative );
443 }
444
445 // Line 7: Calculate private random seed rho prime prime
446 // = SHAKE256( private signing seed K || pbRandom || message representative mu, 64 )
447 SymCryptShake256Append( pShakeState, pkMlDsakey->privateSigningSeed, sizeof(pkMlDsakey->privateSigningSeed) );
448 SymCryptShake256Append( pShakeState, pbRandom, cbRandom );
449 SymCryptShake256Append( pShakeState, messageRepresentative, sizeof(messageRepresentative) );
451
452 PSYMCRYPT_MLDSA_VECTOR pvW = pTemps->pvRowVectors[0];
454
455 PSYMCRYPT_MLDSA_VECTOR pvMask = pTemps->pvColVectors[0];
456 PSYMCRYPT_MLDSA_VECTOR pvResponse = pTemps->pvColVectors[1];
457 PSYMCRYPT_MLDSA_VECTOR pvcs1 = pTemps->pvColVectors[2];
458
459 PBYTE pbW1Encoded = pTemps->pbScratch;
460
461 UINT16 k = 0;
462 while( TRUE )
463 {
465 pParams,
466 pShakeState,
468 sizeof(privateRandom),
469 k,
470 pvMask );
471
472 // Increment k early so we can continue to the next loop iteration when validity checks fail
473 // It's okay to leak how many iterations this loop takes because the SHAKE inputs and
474 // outputs are still unpredictable; this does not leak information about the private key
475 k += (UINT16) pParams->nCols;
476
477 SymCryptMlDsaMatrixVectorMontMul( pkMlDsakey->pmA, pvMask, pvW, pTemps->pePolyElements[0] );
478
479 for(UINT8 i = 0; i < pvW->nElems; ++i)
480 {
482 }
483
485
486 {
487 // Scope for pvW1
488 PSYMCRYPT_MLDSA_VECTOR pvW1 = pTemps->pvRowVectors[1];
489 SymCryptMlDsaVectorHighBits( pParams, pvW, pvW1 );
490 SymCryptMlDsaVectorEncode( pvW1, pParams->w1EncodeCoefficientBitLength, 0, pbW1Encoded );
491 }
492
493 // Calculate commitment hash
494 SymCryptShake256Append( pShakeState, messageRepresentative, sizeof(messageRepresentative) );
495 SymCryptShake256Append( pShakeState, pbW1Encoded, cbw1Encoded );
496 SymCryptShake256Extract( pShakeState, commitmentHash, pParams->cbCommitmentHash, TRUE );
497
498 // Calculate challenge
499 // Reusing poly element 0 for challenge (previously temp space for multiplication)
500 PSYMCRYPT_MLDSA_POLYELEMENT peC = pTemps->pePolyElements[0];
501 SymCryptMlDsaSampleInBall( pParams, commitmentHash, pParams->cbCommitmentHash, peC );
502
505
506 {
507 // Scope for cs2 - reusing row vector 1, previously W1
508 PSYMCRYPT_MLDSA_VECTOR pvcs2 = pTemps->pvRowVectors[1];
509 SymCryptMlDsaVectorPolyElementMontMul( pkMlDsakey->pvs1, peC, pvcs1 );
510 SymCryptMlDsaVectorPolyElementMontMul( pkMlDsakey->pvs2, peC, pvcs2 );
511
514
515 SymCryptMlDsaVectorINTT( pvMask );
516 SymCryptMlDsaVectorAdd( pvMask, pvcs1, pvResponse );
517
518 // (w - cs2) is an input to both LowBits (for r0) and MakeHint
519 SymCryptMlDsaVectorSub( pvW, pvcs2, pvW );
520 }
521
522 {
523 // Scope for r0 - reusing row vector 1, previously cs2
524 PSYMCRYPT_MLDSA_VECTOR pvr0 = pTemps->pvRowVectors[1];
525 SymCryptMlDsaVectorLowBits( pParams, pvW, pvr0 );
526
527 UINT32 zInfinityNorm = SymCryptMlDsaVectorInfinityNorm( pvResponse );
528 UINT32 r0InfinityNorm = SymCryptMlDsaVectorInfinityNorm( pvr0 );
529
530 if( (zInfinityNorm >= (1 << pParams->maskCoefficientRangeLog2) - beta) ||
531 (r0InfinityNorm >= pParams->commitmentRoundingRange - beta) )
532 {
533 continue;
534 }
535 }
536
537 {
538 // Scope for ct0 - reusing row vector 1, previously r0
539 PSYMCRYPT_MLDSA_VECTOR pvct0 = pTemps->pvRowVectors[1];
540
541 SymCryptMlDsaVectorPolyElementMontMul( pkMlDsakey->pvt0, peC, pvct0 );
543
544 UINT32 ct0InfinityNorm = SymCryptMlDsaVectorInfinityNorm( pvct0 );
545 if( ct0InfinityNorm >= pParams->commitmentRoundingRange )
546 {
547 continue;
548 }
549
550 // MakeHint vectors
551 // w - cs2 = pvW
552 // w - cs2 + ct0 = pvct0 + pvW
553 SymCryptMlDsaVectorAdd( pvct0, pvW, pvct0 );
554
555 // Write hint in-place over ct0
556 UINT32 nHintBitsSet = 0;
557 SymCryptMlDsaMakeHint( pParams, pvW, pvct0, pvct0, &nHintBitsSet );
558
559 if( nHintBitsSet > pParams->nHintNonZeroCoeffs )
560 {
561 continue;
562 }
563 }
564
565 // Row vector 1, previously ct0, now contains the hint
566 pvHint = pTemps->pvRowVectors[1];
567
568 break;
569 }
570
571 SYMCRYPT_ASSERT( pvHint != NULL );
572
574 pParams,
575 commitmentHash,
576 pParams->cbCommitmentHash,
577 pvResponse,
578 pvHint,
579 pbSignature,
580 cbSignature );
581
582cleanup:
583 if( pTemps != NULL )
584 {
586 }
587
588 return scError;
589}
590
595 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
596 PCBYTE pbMessage,
597 SIZE_T cbMessage,
598 PCBYTE pbContext,
599 SIZE_T cbContext,
601 PBYTE pbSignature,
602 SIZE_T cbSignature )
603{
604 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
605
606 if( (flags != 0) || // No flags currently supported
607 (cbContext > SYMCRYPT_MLDSA_CONTEXT_MAX_LENGTH) ||
608 (pkMlDsakey->hasPrivateKey == FALSE) ||
609 (cbSignature != pkMlDsakey->pParams->cbEncodedSignature) )
610 {
611 scError = SYMCRYPT_INVALID_ARGUMENT;
612 goto cleanup;
613 }
614
616 scError = SymCryptCallbackRandom( random, sizeof(random) );
617 if( scError != SYMCRYPT_NO_ERROR )
618 {
619 goto cleanup;
620 }
621
622 scError = SymCryptMlDsaSignEx(
623 pkMlDsakey,
624 pbMessage,
625 cbMessage,
626 pbContext,
627 cbContext,
628 NULL, // pbHashOid
629 0, // cbHashOid
630 random,
631 sizeof(random),
632 flags,
633 pbSignature,
634 cbSignature );
635 if( scError != SYMCRYPT_NO_ERROR )
636 {
637 goto cleanup;
638 }
639
640cleanup:
642
643 return scError;
644}
645
650 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
651 PCBYTE pbMu,
652 SIZE_T cbMu,
654 PBYTE pbSignature,
655 SIZE_T cbSignature )
656{
657 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
658
659 if( (flags != 0) || // No flags currently supported
660 (pkMlDsakey->hasPrivateKey == FALSE) ||
662 (cbSignature != pkMlDsakey->pParams->cbEncodedSignature) )
663 {
664 scError = SYMCRYPT_INVALID_ARGUMENT;
665 goto cleanup;
666 }
667
669 scError = SymCryptCallbackRandom( random, sizeof(random) );
670 if( scError != SYMCRYPT_NO_ERROR )
671 {
672 goto cleanup;
673 }
674
675 scError = SymCryptMlDsaSignEx(
676 pkMlDsakey,
677 pbMu,
678 cbMu,
679 NULL, // pbContext
680 0, // cbContext
681 NULL, // pbHashOid
682 0, // cbHashOid
683 random,
684 sizeof(random),
686 pbSignature,
687 cbSignature );
688 if( scError != SYMCRYPT_NO_ERROR )
689 {
690 goto cleanup;
691 }
692
693cleanup:
695
696 return scError;
697}
698
703 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
706 SIZE_T cbHash,
707 PCBYTE pbContext,
708 SIZE_T cbContext,
710 PBYTE pbSignature,
711 SIZE_T cbSignature )
712{
713 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
714 PCSYMCRYPT_OID pHashOid = NULL;
715
716 if( (flags != 0) || // No flags currently supported
717 (cbContext > SYMCRYPT_MLDSA_CONTEXT_MAX_LENGTH) ||
718 (pkMlDsakey->hasPrivateKey == FALSE) ||
719 (cbSignature != pkMlDsakey->pParams->cbEncodedSignature) )
720 {
721 scError = SYMCRYPT_INVALID_ARGUMENT;
722 goto cleanup;
723 }
724
726 scError = SymCryptCallbackRandom( random, sizeof(random) );
727 if( scError != SYMCRYPT_NO_ERROR )
728 {
729 goto cleanup;
730 }
731
733 pkMlDsakey->pParams,
734 hashAlg,
735 cbHash,
736 &pHashOid );
737 if( scError != SYMCRYPT_NO_ERROR )
738 {
739 goto cleanup;
740 }
741
742 scError = SymCryptMlDsaSignEx(
743 pkMlDsakey,
744 pbHash,
745 cbHash,
746 pbContext,
747 cbContext,
748 pHashOid->pbOID,
749 pHashOid->cbOID,
750 random,
751 sizeof(random),
752 flags,
753 pbSignature,
754 cbSignature );
755 if( scError != SYMCRYPT_NO_ERROR )
756 {
757 goto cleanup;
758 }
759
760
761cleanup:
763
764 return scError;
765}
766
771 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
772 PCBYTE pbInput,
773 SIZE_T cbInput,
774 PCBYTE pbContext,
775 SIZE_T cbContext,
776 PCBYTE pbHashOid,
777 SIZE_T cbHashOid,
778 PCBYTE pbSignature,
779 SIZE_T cbSignature,
780 UINT32 flags )
781{
783
785 SYMCRYPT_ASSERT( pbHashOid != NULL || cbHashOid == 0 );
786 SYMCRYPT_ASSERT( pbContext != NULL || cbContext == 0 );
787 SYMCRYPT_ASSERT( cbSignature == pkMlDsakey->pParams->cbEncodedSignature );
789 SYMCRYPT_ASSERT( ((flags & SYMCRYPT_FLAG_MLDSA_EXTERNALMU) == 0) || (pbContext == NULL && pbHashOid == NULL) );
790
791 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
792 PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams = pkMlDsakey->pParams;
794
795 const UINT32 beta = (UINT32) pParams->nChallengeNonZeroCoeffs * pParams->privateKeyRange;
796
797 BOOL bExternalMu = (flags & SYMCRYPT_FLAG_MLDSA_EXTERNALMU) != 0;
798 UINT8 modeId = (pbHashOid == NULL) ? 0 : 1; // 0 for ML-DSA, 1 for HashML-DSA
799 UINT8 cbContextByte = (UINT8) cbContext;
800 BYTE messageRepresentative[SYMCRYPT_SHAKE256_RESULT_SIZE];
801 BYTE commitmentHash[64]; // Largest possible size for commitment hash
802 BYTE recalculatedCommitmentHash[64];
803 UINT32 responseInfinityNorm;
804
805 const UINT32 cbw1Encoded = pParams->nRows * pParams->w1EncodeCoefficientBitLength *
807
809 pParams,
810 4, // row vectors - hint, A*NTT(z), T1*(2^d), commitment
811 1, // column vectors - response
812 2, // poly elements - challenge, temp space for multiplication
813 cbw1Encoded ); // scratch space - w1 encoded
814 if( pTemps == NULL )
815 {
816 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
817 goto cleanup;
818 }
819
820 // Row vectors
821 PSYMCRYPT_MLDSA_VECTOR pvHint = pTemps->pvRowVectors[0];
822 PSYMCRYPT_MLDSA_VECTOR pvATimesNTTz = pTemps->pvRowVectors[1];
823 PSYMCRYPT_MLDSA_VECTOR pvT1Times2D = pTemps->pvRowVectors[2];
824 PSYMCRYPT_MLDSA_VECTOR pvCommitment = pTemps->pvRowVectors[3];
825
826 // Column vectors
827 PSYMCRYPT_MLDSA_VECTOR pvResponse = pTemps->pvColVectors[0];
828
829 // Poly elements
830 PSYMCRYPT_MLDSA_POLYELEMENT peC = pTemps->pePolyElements[0];
831 PSYMCRYPT_MLDSA_POLYELEMENT peTmp = pTemps->pePolyElements[1];
832
833 PBYTE pbw1Encoded = pTemps->pbScratch;
834
835 scError = SymCryptMlDsaSigDecode(
836 pParams,
837 pbSignature,
838 cbSignature,
839 commitmentHash,
840 pParams->cbCommitmentHash,
841 pvResponse,
842 pvHint );
843 if( scError != SYMCRYPT_NO_ERROR )
844 {
845 goto cleanup;
846 }
847
848 responseInfinityNorm = SymCryptMlDsaVectorInfinityNorm( pvResponse );
849
850 // For the signature to be valid, the response infinity norm must be <= (gamma_1 - beta)
851 // gamma_1 = (1 << maskCoefficientRangeLog2)
852 if( responseInfinityNorm >= (1 << pParams->maskCoefficientRangeLog2) - beta )
853 {
854 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
855 goto cleanup;
856 }
857
859 pParams,
860 commitmentHash,
861 pParams->cbCommitmentHash,
862 peC );
863
864 SymCryptMlDsaVectorNTT( pvResponse );
865
866 for(UINT8 i = 0; i < pvResponse->nElems; ++i)
867 {
869 }
870
872 pkMlDsakey->pmA,
873 pvResponse,
874 pvATimesNTTz,
875 peTmp );
876
877 // TODO osgvsowi/55435592 - Consider precomputing t1 * 2^d
878 const UINT32 pow2DTimesR = 4214781;
879 for(UINT8 i = 0; i < pkMlDsakey->pvt1->nElems; ++i)
880 {
884 {
885 peDst->coeffs[j] = SymCryptMlDsaMontMul( peSrc->coeffs[j], pow2DTimesR );
886 }
887 }
888
891
893 pvT1Times2D,
894 peC,
895 pvT1Times2D );
896
898 pvATimesNTTz,
899 pvT1Times2D,
900 pvCommitment );
901
902 SymCryptMlDsaVectorINTT( pvCommitment );
903
905 pParams,
906 pvHint,
907 pvCommitment );
908
910 pvCommitment,
912 0,
913 pbw1Encoded );
914
915 PSYMCRYPT_SHAKE256_STATE pShakeState = &(pTemps->shake256State);
916 SymCryptShake256Init( pShakeState );
917
918 if ( bExternalMu )
919 {
920 // Caller passes the externally-computed message representative mu
922 memcpy( messageRepresentative, pbInput, SYMCRYPT_SHAKE256_RESULT_SIZE );
923 }
924 else
925 {
926 // Line 7: calculate message representative mu
927 // = SHAKE256( public key hash || modeId || cbContextByte || context || OID? || message/hash, 64 )
928 // The OID is only included in the HashML-DSA mode
929 SymCryptShake256Append( pShakeState, pkMlDsakey->publicKeyHash, sizeof(pkMlDsakey->publicKeyHash) );
930 SymCryptShake256Append( pShakeState, &modeId, sizeof( modeId ) );
931 SymCryptShake256Append( pShakeState, &cbContextByte, sizeof( cbContextByte ) );
932
933 SymCryptShake256Append( pShakeState, pbContext, cbContext );
934 SymCryptShake256Append( pShakeState, pbHashOid, cbHashOid );
935
936 SymCryptShake256Append( pShakeState, pbInput, cbInput );
937 SymCryptShake256Result( pShakeState, messageRepresentative );
938 }
939
940 SymCryptShake256Append( pShakeState, messageRepresentative, sizeof(messageRepresentative) );
941 SymCryptShake256Append( pShakeState, pbw1Encoded, cbw1Encoded );
942 SymCryptShake256Extract( pShakeState, recalculatedCommitmentHash, pParams->cbCommitmentHash, TRUE );
943
944 if( !SymCryptEqual( recalculatedCommitmentHash, commitmentHash, pParams->cbCommitmentHash ) )
945 {
946 scError = SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE;
947 goto cleanup;
948 }
949
950cleanup:
951 if( pTemps != NULL )
952 {
954 }
955
956 return scError;
957}
958
963 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
964 PCBYTE pbMessage,
965 SIZE_T cbMessage,
966 PCBYTE pbContext,
967 SIZE_T cbContext,
968 PCBYTE pbSignature,
969 SIZE_T cbSignature,
970 UINT32 flags )
971{
972 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
973
974 if( (flags != 0) || // No flags currently supported
975 (cbContext > SYMCRYPT_MLDSA_CONTEXT_MAX_LENGTH) ||
976 (cbSignature != pkMlDsakey->pParams->cbEncodedSignature) )
977 {
978 scError = SYMCRYPT_INVALID_ARGUMENT;
979 goto cleanup;
980 }
981
982 scError = SymCryptMlDsaVerifyEx(
983 pkMlDsakey,
984 pbMessage,
985 cbMessage,
986 pbContext,
987 cbContext,
988 NULL, // pbHashOid
989 0, // cbHashOid
990 pbSignature,
991 cbSignature,
992 flags );
993 if( scError != SYMCRYPT_NO_ERROR )
994 {
995 goto cleanup;
996 }
997
998cleanup:
999 return scError;
1000}
1001
1006 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
1007 PCBYTE pbMu,
1008 SIZE_T cbMu,
1009 PCBYTE pbSignature,
1010 SIZE_T cbSignature,
1011 UINT32 flags )
1012{
1013 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1014
1015 if( (flags != 0) || // No flags currently supported
1017 (cbSignature != pkMlDsakey->pParams->cbEncodedSignature) )
1018 {
1019 scError = SYMCRYPT_INVALID_ARGUMENT;
1020 goto cleanup;
1021 }
1022
1023 scError = SymCryptMlDsaVerifyEx(
1024 pkMlDsakey,
1025 pbMu,
1026 cbMu,
1027 NULL, // pbContext
1028 0, // cbContext
1029 NULL, // pbHashOid
1030 0, // cbHashOid
1031 pbSignature,
1032 cbSignature,
1034 if( scError != SYMCRYPT_NO_ERROR )
1035 {
1036 goto cleanup;
1037 }
1038
1039cleanup:
1040 return scError;
1041}
1042
1047 PCSYMCRYPT_MLDSAKEY pkMlDsakey,
1048 SYMCRYPT_PQDSA_HASH_ID hashAlg,
1049 PCBYTE pbHash,
1050 SIZE_T cbHash,
1051 PCBYTE pbContext,
1052 SIZE_T cbContext,
1053 PCBYTE pbSignature,
1054 SIZE_T cbSignature,
1055 UINT32 flags )
1056{
1057 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
1058 PCSYMCRYPT_OID pHashOid = NULL;
1059
1060 if( (flags != 0) || // No flags currently supported
1061 (cbContext > SYMCRYPT_MLDSA_CONTEXT_MAX_LENGTH) ||
1062 (cbSignature != pkMlDsakey->pParams->cbEncodedSignature) )
1063 {
1064 scError = SYMCRYPT_INVALID_ARGUMENT;
1065 goto cleanup;
1066 }
1067
1069 pkMlDsakey->pParams,
1070 hashAlg,
1071 cbHash,
1072 &pHashOid );
1073 if( scError != SYMCRYPT_NO_ERROR )
1074 {
1075 goto cleanup;
1076 }
1077
1078 scError = SymCryptMlDsaVerifyEx(
1079 pkMlDsakey,
1080 pbHash,
1081 cbHash,
1082 pbContext,
1083 cbContext,
1084 pHashOid->pbOID,
1085 pHashOid->cbOID,
1086 pbSignature,
1087 cbSignature,
1088 flags );
1089 if( scError != SYMCRYPT_NO_ERROR )
1090 {
1091 goto cleanup;
1092 }
1093
1094cleanup:
1095 return scError;
1096}
unsigned short UINT16
Definition: actypes.h:129
unsigned char UINT8
Definition: actypes.h:128
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static void cleanup(void)
Definition: main.c:1335
static const uint32_t k[]
Definition: sha256.c:24
unsigned int BOOL
Definition: ntddk_ex.h:94
GLbitfield flags
Definition: glext.h:7161
GLenum const GLfloat * params
Definition: glext.h:5645
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
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 GLint GLint j
Definition: glfuncs.h:250
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
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptHashMlDsaSign(PCSYMCRYPT_MLDSAKEY pkMlDsakey, SYMCRYPT_PQDSA_HASH_ID hashAlg, PCBYTE pbHash, SIZE_T cbHash, PCBYTE pbContext, SIZE_T cbContext, UINT32 flags, PBYTE pbSignature, SIZE_T cbSignature)
Definition: mldsa.c:702
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptExternalMuMlDsaVerify(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbMu, SIZE_T cbMu, PCBYTE pbSignature, SIZE_T cbSignature, UINT32 flags)
Definition: mldsa.c:1005
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeyGetValue(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_MLDSAKEY_FORMAT mlDsakeyFormat, UINT32 flags)
Definition: mldsa.c:310
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeySetValue(PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_MLDSAKEY_FORMAT mlDsakeyFormat, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
Definition: mldsa.c:254
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptHashMlDsaVerify(PCSYMCRYPT_MLDSAKEY pkMlDsakey, SYMCRYPT_PQDSA_HASH_ID hashAlg, PCBYTE pbHash, SIZE_T cbHash, PCBYTE pbContext, SIZE_T cbContext, PCBYTE pbSignature, SIZE_T cbSignature, UINT32 flags)
Definition: mldsa.c:1046
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSignEx(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbInput, SIZE_T cbInput, PCBYTE pbContext, SIZE_T cbContext, PCBYTE pbHashOid, SIZE_T cbHashOid, PCBYTE pbRandom, SIZE_T cbRandom, UINT32 flags, PBYTE pbSignature, SIZE_T cbSignature)
Definition: mldsa.c:367
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSign(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbMessage, SIZE_T cbMessage, PCBYTE pbContext, SIZE_T cbContext, UINT32 flags, PBYTE pbSignature, SIZE_T cbSignature)
Definition: mldsa.c:594
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptExternalMuMlDsaSign(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbMu, SIZE_T cbMu, UINT32 flags, PBYTE pbSignature, SIZE_T cbSignature)
Definition: mldsa.c:649
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaVerifyEx(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbInput, SIZE_T cbInput, PCBYTE pbContext, SIZE_T cbContext, PCBYTE pbHashOid, SIZE_T cbHashOid, PCBYTE pbSignature, SIZE_T cbSignature, UINT32 flags)
Definition: mldsa.c:770
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeyGenerate(PSYMCRYPT_MLDSAKEY pkMlDsakey, UINT32 flags)
Definition: mldsa.c:165
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsakeyFree(PSYMCRYPT_MLDSAKEY pkMlDsakey)
Definition: mldsa.c:55
_Use_decl_annotations_ PSYMCRYPT_MLDSAKEY SYMCRYPT_CALL SymCryptMlDsakeyAllocate(SYMCRYPT_MLDSA_PARAMS params)
Definition: mldsa.c:12
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaKeyGenerateEx(PSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbRootSeed, SIZE_T cbRootSeed, UINT32 flags)
Definition: mldsa.c:67
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaVerify(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbMessage, SIZE_T cbMessage, PCBYTE pbContext, SIZE_T cbContext, PCBYTE pbSignature, SIZE_T cbSignature, UINT32 flags)
Definition: mldsa.c:962
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSkEncode(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaGetInternalParamsFromParams(SYMCRYPT_MLDSA_PARAMS params, PCSYMCRYPT_MLDSA_INTERNAL_PARAMS *pInternalParams)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorEncode(PCSYMCRYPT_MLDSA_VECTOR pvSrc, UINT32 nBitsPerCoefficient, UINT32 signedCoefficientBound, PBYTE pbDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaMatrixVectorMontMul(PCSYMCRYPT_MLDSA_MATRIX pmSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst, PSYMCRYPT_MLDSA_POLYELEMENT peTmp)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandS(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbPrivateVectorSeed, SIZE_T cbPrivateVectorSeed, PSYMCRYPT_MLDSA_VECTOR pvs1, PSYMCRYPT_MLDSA_VECTOR pvs2)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorAdd(PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSkDecode(PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
UINT32 SYMCRYPT_CALL SymCryptMlDsaMontMul(UINT32 a, UINT32 b)
_Use_decl_annotations_ PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES SYMCRYPT_CALL SymCryptMlDsaTemporariesAllocateAndInitialize(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, UINT32 nRowVectors, UINT32 nColVectors, UINT32 nPolyElements, UINT32 cbScratch)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorPolyElementMontMul(PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_POLYELEMENT peSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandMask(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PSYMCRYPT_SHAKE256_STATE pShakeState, PCBYTE pbPrivateRandom, SIZE_T cbPrivateRandom, UINT16 counter, PSYMCRYPT_MLDSA_VECTOR pvMask)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkDecode(PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaTemporariesFree(PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES pTemporaries)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsakeyComputeT(PCSYMCRYPT_MLDSA_MATRIX pmA, PCSYMCRYPT_MLDSA_VECTOR pvs1, PCSYMCRYPT_MLDSA_VECTOR pvs2, PSYMCRYPT_MLDSA_VECTOR pvt0, PSYMCRYPT_MLDSA_VECTOR pvt1, PSYMCRYPT_MLDSA_VECTOR pvTmp, PSYMCRYPT_MLDSA_POLYELEMENT peTmp)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSigDecode(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbSig, SIZE_T cbSig, PBYTE pbCommitmentHash, SIZE_T cbCommitmentHash, PSYMCRYPT_MLDSA_VECTOR pvResponse, PSYMCRYPT_MLDSA_VECTOR pvHint)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaUseHint(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvHint, PSYMCRYPT_MLDSA_VECTOR pvCommitment)
_Use_decl_annotations_ UINT32 SYMCRYPT_CALL SymCryptMlDsaVectorInfinityNorm(PCSYMCRYPT_MLDSA_VECTOR pvSrc)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementMulR(PSYMCRYPT_MLDSA_POLYELEMENT peSrc)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaSigEncode(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PBYTE pbCommitmentHash, SIZE_T cbCommitmentHash, PCSYMCRYPT_MLDSA_VECTOR pvResponse, PCSYMCRYPT_MLDSA_VECTOR pvHint, PBYTE pbDst, SIZE_T cbDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorSub(PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaSampleInBall(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCBYTE pbCommitmentHash, SIZE_T cbCommitmentHash, PSYMCRYPT_MLDSA_POLYELEMENT peChallenge)
_Use_decl_annotations_ PSYMCRYPT_MLDSAKEY SYMCRYPT_CALL SymCryptMlDsakeyInitialize(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pInternalParams, PBYTE pbKey, UINT32 cbKey)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandA(PCBYTE pbPublicSeed, SIZE_T cbPublicSeed, PSYMCRYPT_MLDSA_MATRIX pmA)
VOID SYMCRYPT_CALL SymCryptMlDsaVectorINTT(_Inout_ PSYMCRYPT_MLDSA_VECTOR pvSrc)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorHighBits(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkEncode(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorNTT(PSYMCRYPT_MLDSA_VECTOR pvSrc)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaMakeHint(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PSYMCRYPT_MLDSA_VECTOR pvWMinusCs2, PSYMCRYPT_MLDSA_VECTOR pvWMinusCs2PlusCt0, PSYMCRYPT_MLDSA_VECTOR pvDst, UINT32 *nBitsSet)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaPolyElementNTT(PSYMCRYPT_MLDSA_POLYELEMENT peSrc)
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsaVectorLowBits(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, PCSYMCRYPT_MLDSA_VECTOR pvSrc, PSYMCRYPT_MLDSA_VECTOR pvDst)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptHashMlDsaValidateHashAlgAndGetOid(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, SYMCRYPT_PQDSA_HASH_ID hashAlg, SIZE_T cbHash, PCSYMCRYPT_OID *ppOid)
#define _Use_decl_annotations_
Definition: no_sal2.h:92
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
BYTE * PBYTE
Definition: pedump.c:66
#define random
Definition: rosdhcp.h:94
#define SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS
Definition: sc_lib.h:4347
#define SYMCRYPT_RUN_SELFTEST_ONCE(AlgorithmSelftestFunction, AlgorithmSelftestFlag)
Definition: sc_lib.h:3686
#define SYMCRYPT_MLDSA_PRIVATE_VECTOR_SEED_SIZE
Definition: sc_lib_mldsa.h:43
#define SYMCRYPT_MLDSA_SIGNING_RANDOM_SIZE
Definition: sc_lib_mldsa.h:48
#define SYMCRYPT_FLAG_MLDSA_EXTERNALMU
Definition: sc_lib_mldsa.h:60
#define SYMCRYPT_MLDSA_ROOT_SEED_SIZE
Definition: sc_lib_mldsa.h:23
#define SYMCRYPT_INTERNAL_MLDSA_SIZEOF_KEY(_nRows, _nCols)
Definition: sc_lib_mldsa.h:211
* PSYMCRYPT_MLDSA_VECTOR
Definition: sc_lib_mldsa.h:80
#define SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT(_row, _pVector)
Definition: sc_lib_mldsa.h:217
* PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES
Definition: sc_lib_mldsa.h:206
BYTE privateRandom[32]
Definition: sc_lib_mlkem.h:97
static const BYTE pbHash[]
UINT32 coeffs[SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]
Definition: sc_lib_mldsa.h:64
#define SYMCRYPT_ASSERT(_x)
Definition: symcrypt.h:10807
VOID SYMCRYPT_CALL SymCryptShake256(_In_reads_(cbData) PCBYTE pbData, SIZE_T cbData, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult)
#define SYMCRYPT_SHAKE256_RESULT_SIZE
Definition: symcrypt.h:1964
@ SYMCRYPT_MLDSAKEY_FORMAT_PRIVATE_KEY
Definition: symcrypt.h:10407
@ SYMCRYPT_MLDSAKEY_FORMAT_PRIVATE_SEED
Definition: symcrypt.h:10403
@ SYMCRYPT_MLDSAKEY_FORMAT_PUBLIC_KEY
Definition: symcrypt.h:10410
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
#define SYMCRYPT_MLDSA_CONTEXT_MAX_LENGTH
Definition: symcrypt.h:10395
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
enum _SYMCRYPT_PQDSA_HASH_ID SYMCRYPT_PQDSA_HASH_ID
VOID SYMCRYPT_CALL SymCryptShake256Result(_Inout_ PSYMCRYPT_SHAKE256_STATE pState, _Out_writes_(SYMCRYPT_SHAKE256_RESULT_SIZE) PBYTE pbResult)
VOID SYMCRYPT_CALL SymCryptShake256Append(_Inout_ PSYMCRYPT_SHAKE256_STATE pState, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptShake256Extract(_Inout_ PSYMCRYPT_SHAKE256_STATE pState, _Out_writes_(cbResult) PBYTE pbResult, SIZE_T cbResult, BOOLEAN bWipe)
VOID SYMCRYPT_CALL SymCryptShake256Init(_Out_ PSYMCRYPT_SHAKE256_STATE pState)
VOID SYMCRYPT_CALL SymCryptMlDsaSelftest(void)
#define SYMCRYPT_FLAG_KEY_NO_FIPS
Definition: symcrypt.h:7579
enum _SYMCRYPT_MLDSA_PARAMS SYMCRYPT_MLDSA_PARAMS
BOOLEAN SYMCRYPT_CALL SymCryptEqual(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, SIZE_T cbBytes)
Definition: equal.c:11
enum _SYMCRYPT_MLDSAKEY_FORMAT SYMCRYPT_MLDSAKEY_FORMAT
SYMCRYPT_ERROR
Definition: symcrypt.h:227
PCBYTE pbSrc
@ SYMCRYPT_SELFTEST_ALGORITHM_MLDSA
#define SYMCRYPT_CALL
const SYMCRYPT_MLDSAKEY * PCSYMCRYPT_MLDSAKEY
PCBYTE pbKey
PCBYTE SIZE_T cbKey
PCBYTE PBYTE pbDst
const BYTE * PCBYTE
SYMCRYPT_MLDSAKEY * PSYMCRYPT_MLDSAKEY
#define SYMCRYPT_CHECK_MAGIC(p)
SYMCRYPT_MAGIC_FIELD * PSYMCRYPT_SHAKE256_STATE
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t UINT32
Definition: typedefs.h:59
unsigned char BYTE
Definition: xxhash.c:193