ReactOS 0.4.17-dev-1005-g171e1de
mldsa.c File Reference
#include "precomp.h"
Include dependency graph for mldsa.c:

Go to the source code of this file.

Functions

_Use_decl_annotations_ PSYMCRYPT_MLDSAKEY SYMCRYPT_CALL SymCryptMlDsakeyAllocate (SYMCRYPT_MLDSA_PARAMS params)
 
_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsakeyFree (PSYMCRYPT_MLDSAKEY pkMlDsakey)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaKeyGenerateEx (PSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbRootSeed, SIZE_T cbRootSeed, UINT32 flags)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeyGenerate (PSYMCRYPT_MLDSAKEY pkMlDsakey, UINT32 flags)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeySetValue (PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_MLDSAKEY_FORMAT mlDsakeyFormat, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeyGetValue (PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_MLDSAKEY_FORMAT mlDsakeyFormat, UINT32 flags)
 
_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)
 
_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)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptExternalMuMlDsaSign (PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbMu, SIZE_T cbMu, UINT32 flags, PBYTE pbSignature, SIZE_T cbSignature)
 
_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)
 
_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)
 
_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)
 
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptExternalMuMlDsaVerify (PCSYMCRYPT_MLDSAKEY pkMlDsakey, PCBYTE pbMu, SIZE_T cbMu, PCBYTE pbSignature, SIZE_T cbSignature, UINT32 flags)
 
_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)
 

Function Documentation

◆ SymCryptExternalMuMlDsaSign()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptExternalMuMlDsaSign ( PCSYMCRYPT_MLDSAKEY  pkMlDsakey,
PCBYTE  pbMu,
SIZE_T  cbMu,
UINT32  flags,
PBYTE  pbSignature,
SIZE_T  cbSignature 
)

Definition at line 649 of file mldsa.c.

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}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static void cleanup(void)
Definition: main.c:1335
GLbitfield flags
Definition: glext.h:7161
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCallbackRandom(BYTE *buf, SIZE_T size)
Definition: implglue.c:56
_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
#define random
Definition: rosdhcp.h:94
#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_SHAKE256_RESULT_SIZE
Definition: symcrypt.h:1964
FORCEINLINE VOID SYMCRYPT_CALL SymCryptWipeKnownSize(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
SYMCRYPT_ERROR
Definition: symcrypt.h:227
unsigned char BYTE
Definition: xxhash.c:193

◆ SymCryptExternalMuMlDsaVerify()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptExternalMuMlDsaVerify ( PCSYMCRYPT_MLDSAKEY  pkMlDsakey,
PCBYTE  pbMu,
SIZE_T  cbMu,
PCBYTE  pbSignature,
SIZE_T  cbSignature,
UINT32  flags 
)

Definition at line 1005 of file mldsa.c.

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}
_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

◆ SymCryptHashMlDsaSign()

_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 at line 702 of file mldsa.c.

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}
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptHashMlDsaValidateHashAlgAndGetOid(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pParams, SYMCRYPT_PQDSA_HASH_ID hashAlg, SIZE_T cbHash, PCSYMCRYPT_OID *ppOid)
static const BYTE pbHash[]
#define SYMCRYPT_MLDSA_CONTEXT_MAX_LENGTH
Definition: symcrypt.h:10395

◆ SymCryptHashMlDsaVerify()

_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 at line 1046 of file mldsa.c.

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}

◆ SymCryptMlDsakeyAllocate()

Definition at line 12 of file mldsa.c.

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}
GLenum const GLfloat * params
Definition: glext.h:5645
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
Definition: implglue.c:42
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
Definition: implglue.c:37
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaGetInternalParamsFromParams(SYMCRYPT_MLDSA_PARAMS params, PCSYMCRYPT_MLDSA_INTERNAL_PARAMS *pInternalParams)
_Use_decl_annotations_ PSYMCRYPT_MLDSAKEY SYMCRYPT_CALL SymCryptMlDsakeyInitialize(PCSYMCRYPT_MLDSA_INTERNAL_PARAMS pInternalParams, PBYTE pbKey, UINT32 cbKey)
BYTE * PBYTE
Definition: pedump.c:66
#define SYMCRYPT_INTERNAL_MLDSA_SIZEOF_KEY(_nRows, _nCols)
Definition: sc_lib_mldsa.h:211
PCBYTE pbKey
PCBYTE SIZE_T cbKey
SYMCRYPT_MLDSAKEY * PSYMCRYPT_MLDSAKEY
uint32_t UINT32
Definition: typedefs.h:59

◆ SymCryptMlDsakeyFree()

_Use_decl_annotations_ VOID SYMCRYPT_CALL SymCryptMlDsakeyFree ( PSYMCRYPT_MLDSAKEY  pkMlDsakey)

Definition at line 55 of file mldsa.c.

57{
58 SYMCRYPT_CHECK_MAGIC( pkMlDsakey );
59
60 SymCryptWipe( pkMlDsakey, pkMlDsakey->cbTotalSize );
61 SymCryptCallbackFree( pkMlDsakey );
62}
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
Definition: libmain.c:137
#define SYMCRYPT_CHECK_MAGIC(p)

◆ SymCryptMlDsakeyGenerate()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeyGenerate ( PSYMCRYPT_MLDSAKEY  pkMlDsakey,
UINT32  flags 
)

Definition at line 165 of file mldsa.c.

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}
_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 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 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
#define SYMCRYPT_MLDSA_ROOT_SEED_SIZE
Definition: sc_lib_mldsa.h:23
@ SYMCRYPT_MLDSAKEY_FORMAT_PRIVATE_SEED
Definition: symcrypt.h:10403
#define SYMCRYPT_FLAG_KEY_NO_FIPS
Definition: symcrypt.h:7579
ULONG_PTR SIZE_T
Definition: typedefs.h:80

◆ SymCryptMlDsaKeyGenerateEx()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaKeyGenerateEx ( PSYMCRYPT_MLDSAKEY  pkMlDsakey,
PCBYTE  pbRootSeed,
SIZE_T  cbRootSeed,
UINT32  flags 
)

Definition at line 67 of file mldsa.c.

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}
#define TRUE
Definition: types.h:120
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
_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_ 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 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_ VOID SYMCRYPT_CALL SymCryptMlDsaExpandA(PCBYTE pbPublicSeed, SIZE_T cbPublicSeed, PSYMCRYPT_MLDSA_MATRIX pmA)
_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)
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define SYMCRYPT_MLDSA_PRIVATE_VECTOR_SEED_SIZE
Definition: sc_lib_mldsa.h:43
* PSYMCRYPT_MLDSA_INTERNAL_COMPUTATION_TEMPORARIES
Definition: sc_lib_mldsa.h:206
#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)
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)
const BYTE * PCBYTE
SYMCRYPT_MAGIC_FIELD * PSYMCRYPT_SHAKE256_STATE

Referenced by SymCryptMlDsakeySetValue().

◆ SymCryptMlDsakeyGetValue()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeyGetValue ( PCSYMCRYPT_MLDSAKEY  pkMlDsakey,
PBYTE  pbDst,
SIZE_T  cbDst,
SYMCRYPT_MLDSAKEY_FORMAT  mlDsakeyFormat,
UINT32  flags 
)

Definition at line 310 of file mldsa.c.

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}
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaSkEncode(PCSYMCRYPT_MLDSAKEY pkMlDsakey, PBYTE pbDst, SIZE_T cbDst)
@ SYMCRYPT_MLDSAKEY_FORMAT_PRIVATE_KEY
Definition: symcrypt.h:10407
@ SYMCRYPT_MLDSAKEY_FORMAT_PUBLIC_KEY
Definition: symcrypt.h:10410
PCBYTE PBYTE pbDst

◆ SymCryptMlDsakeySetValue()

_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsakeySetValue ( PCBYTE  pbSrc,
SIZE_T  cbSrc,
SYMCRYPT_MLDSAKEY_FORMAT  mlDsakeyFormat,
UINT32  flags,
PSYMCRYPT_MLDSAKEY  pkMlDsakey 
)

Definition at line 254 of file mldsa.c.

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}
_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 SymCryptMlDsaSkDecode(PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
_Use_decl_annotations_ SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptMlDsaPkDecode(PCBYTE pbSrc, SIZE_T cbSrc, UINT32 flags, PSYMCRYPT_MLDSAKEY pkMlDsakey)
#define SYMCRYPT_RUN_SELFTEST_ONCE(AlgorithmSelftestFunction, AlgorithmSelftestFlag)
Definition: sc_lib.h:3686
VOID SYMCRYPT_CALL SymCryptMlDsaSelftest(void)
PCBYTE pbSrc
@ SYMCRYPT_SELFTEST_ALGORITHM_MLDSA

Referenced by SymCryptMlDsakeyGenerate().

◆ SymCryptMlDsaSign()

_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 at line 594 of file mldsa.c.

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}

Referenced by SymCryptMlDsakeyGenerate().

◆ SymCryptMlDsaSignEx()

_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 at line 367 of file mldsa.c.

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}
unsigned short UINT16
Definition: actypes.h:129
unsigned char UINT8
Definition: actypes.h:128
static const uint32_t k[]
Definition: sha256.c:24
unsigned int BOOL
Definition: ntddk_ex.h:94
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
_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 SymCryptMlDsaVectorAdd(PCSYMCRYPT_MLDSA_VECTOR pvSrc1, PCSYMCRYPT_MLDSA_VECTOR pvSrc2, PSYMCRYPT_MLDSA_VECTOR pvDst)
_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_ 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)
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_ 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)
#define SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS
Definition: sc_lib.h:4347
* PSYMCRYPT_MLDSA_VECTOR
Definition: sc_lib_mldsa.h:80
#define SYMCRYPT_INTERNAL_MLDSA_VECTOR_ELEMENT(_row, _pVector)
Definition: sc_lib_mldsa.h:217
BYTE privateRandom[32]
Definition: sc_lib_mlkem.h:97
VOID SYMCRYPT_CALL SymCryptShake256Result(_Inout_ PSYMCRYPT_SHAKE256_STATE pState, _Out_writes_(SYMCRYPT_SHAKE256_RESULT_SIZE) PBYTE pbResult)

Referenced by SymCryptExternalMuMlDsaSign(), SymCryptHashMlDsaSign(), and SymCryptMlDsaSign().

◆ SymCryptMlDsaVerify()

_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 at line 962 of file mldsa.c.

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}

Referenced by SymCryptMlDsakeyGenerate().

◆ SymCryptMlDsaVerifyEx()

_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 at line 770 of file mldsa.c.

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}
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
UINT32 SYMCRYPT_CALL SymCryptMlDsaMontMul(UINT32 a, UINT32 b)
_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)
UINT32 coeffs[SYMCRYPT_MLWE_POLYNOMIAL_COEFFICIENTS]
Definition: sc_lib_mldsa.h:64
BOOLEAN SYMCRYPT_CALL SymCryptEqual(_In_reads_(cbBytes) PCBYTE pbSrc1, _In_reads_(cbBytes) PCBYTE pbSrc2, SIZE_T cbBytes)
Definition: equal.c:11

Referenced by SymCryptExternalMuMlDsaVerify(), SymCryptHashMlDsaVerify(), and SymCryptMlDsaVerify().