68{
70
74 SIZE_T cbScratchInternal = 0;
75
76 SIZE_T cbScratchInputK = 0;
77
81
83
87
90
91
95
96
98
99
104
105 UINT32 signatureCount = 0;
106
108
109
111 {
112 scError = SYMCRYPT_INVALID_ARGUMENT;
114 }
115
116
117
118
119
121 (!
pKey->fHasPrivateKey) ||
122 (!
pKey->fPrivateModQ) ||
124 {
125 scError = SYMCRYPT_INVALID_ARGUMENT;
127 }
128
129
131
132
136
139
140
142
143
144
145
146
147
148
149 cbScratch = cbIntLarge + cbIntQ + cbIntP + cbModelementP + 4*cbModelementQ +
157 {
158 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
160 }
161
162
163 pbScratchInternal = pbScratch;
165
166 piIntLarge =
SymCryptIntCreate(pbScratchInternal, cbIntLarge, ndIntLarge); pbScratchInternal += cbIntLarge; cbScratchInternal -= cbIntLarge;
169
170 peRmodP =
SymCryptModElementCreate(pbScratchInternal, cbModelementP,
pDlgroup->pmP); pbScratchInternal += cbModelementP; cbScratchInternal -= cbModelementP;
171
172 peMsghash =
SymCryptModElementCreate(pbScratchInternal, cbModelementQ,
pDlgroup->pmQ); pbScratchInternal += cbModelementQ; cbScratchInternal -= cbModelementQ;
173 peRmodQ =
SymCryptModElementCreate(pbScratchInternal, cbModelementQ,
pDlgroup->pmQ); pbScratchInternal += cbModelementQ; cbScratchInternal -= cbModelementQ;
176
177
180 pbHashValue,
181 cbHashValue,
183 peMsghash,
184 piIntLarge,
185 piIntQ,
186 pbScratchInternal,
187 cbScratchInternal );
188 if (scError!=SYMCRYPT_NO_ERROR)
189 {
191 }
192
193
194
195
197 {
199 {
202 peK,
204 pbScratchInternal,
205 cbScratchInternal );
206
209 peK,
210 piIntQ,
211 pbScratchInternal,
212 cbScratchInternal );
213 }
214 else
215 {
217 piK,
220 piIntQ,
221 pbScratchInternal,
222 cbScratchInternal );
223
225 piIntQ,
227 peK,
228 pbScratchInternal,
229 cbScratchInternal );
230
231
233 {
234 scError = SYMCRYPT_INVALID_ARGUMENT;
236 }
237 }
238
239
240
241
245 piIntQ,
247 0,
248 peRmodP,
249 pbScratchInternal,
250 cbScratchInternal );
251
252
255 peRmodP,
256 piIntP,
257 pbScratchInternal,
258 cbScratchInternal );
259
260
262 piIntP,
265 piIntQ,
266 pbScratchInternal,
267 cbScratchInternal );
268
269
271 piIntQ,
273 peRmodQ,
274 pbScratchInternal,
275 cbScratchInternal );
276
277
280 peK,
281 peK,
282 0,
283 pbScratchInternal,
284 cbScratchInternal );
285 if( scError != SYMCRYPT_NO_ERROR )
286 {
288 }
289
290
291
292
296 peS,
297 pbScratchInternal,
298 cbScratchInternal );
299
300
303 peS,
304 peRmodQ,
305 peS,
306 pbScratchInternal,
307 cbScratchInternal );
308
309
312 peS,
313 peMsghash,
314 peS,
315 pbScratchInternal,
316 cbScratchInternal );
317
318
321 peK,
322 peS,
323 peS,
324 pbScratchInternal,
325 cbScratchInternal );
326
329 {
330 break;
331 }
332
334 {
335
336 scError = SYMCRYPT_INVALID_ARGUMENT;
338 }
339
340 signatureCount++;
342 {
343
344
345 scError = SYMCRYPT_INVALID_ARGUMENT;
347 }
348 }
349
350
353 peRmodQ,
354 pbSignature,
355 cbSignature / 2,
357 pbScratchInternal,
358 cbScratchInternal );
359 if ( scError != SYMCRYPT_NO_ERROR )
360 {
362 }
363
364
367 peS,
368 pbSignature + cbSignature / 2,
369 cbSignature / 2,
371 pbScratchInternal,
372 cbScratchInternal );
373 if ( scError != SYMCRYPT_NO_ERROR )
374 {
376 }
377
379 if ( pbScratch !=
NULL )
380 {
383 }
384
385 if (scError != SYMCRYPT_NO_ERROR)
386 {
388 }
389
390 return scError;
391}
static void cleanup(void)
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
#define UNREFERENCED_PARAMETER(P)
UINT32 UINT32 UINT32 UINT32 cbScratch
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDsaTruncateHash(_In_ PCSYMCRYPT_DLGROUP pDlgroup, _In_reads_bytes_(cbHashValue) PCBYTE pbHashValue, SIZE_T cbHashValue, UINT32 flags, _Out_ PSYMCRYPT_MODELEMENT peMsghash, _Out_ PSYMCRYPT_INT piIntLarge, _Out_ PSYMCRYPT_INT piIntQ, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_MAX_DSA_SIGNATURE_COUNT
#define SYMCRYPT_FLAG_DLKEY_DSA
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
PCSYMCRYPT_DLGROUP pDlgroup
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_MAX(_a, _b)
SYMCRYPT_INT * PSYMCRYPT_INT
const SYMCRYPT_DLGROUP * PCSYMCRYPT_DLGROUP
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
VOID SYMCRYPT_CALL SymCryptIntToModElement(_In_ PCSYMCRYPT_INT piSrc, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptDivisorFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
UINT32 SYMCRYPT_CALL SymCryptModElementIsZero(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
UINT32 SymCryptDigitsFromBits(UINT32 nBits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_INT_DIVMOD(_nSrcDigits, _nDivisorDigits)
VOID SYMCRYPT_CALL SymCryptModSetRandom(_In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 SYMCRYPT_CALL SymCryptIntDigitsizeOfObject(_In_ PCSYMCRYPT_INT piSrc)
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_ONE
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModElementGetValue(PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptModElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_MODULUS pmMod)
VOID SYMCRYPT_CALL SymCryptModMul(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModInv(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)
VOID SYMCRYPT_CALL SymCryptModAdd(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptModElementToInt(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_MINUSONE
UINT32 SYMCRYPT_CALL SymCryptSizeofIntFromDigits(UINT32 nDigits)
VOID SYMCRYPT_CALL SymCryptModExp(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peBase, _In_ PCSYMCRYPT_INT piExp, UINT32 nBitsExp, UINT32 flags, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptIntDivMod(_In_ PCSYMCRYPT_INT piSrc, _In_ PCSYMCRYPT_DIVISOR pdDivisor, _Out_opt_ PSYMCRYPT_INT piQuotient, _Out_opt_ PSYMCRYPT_INT piRemainder, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODINV(_nDigits)
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)