286{
291 SIZE_T cbScratchInternal = 0;
292
294
297
301 UINT32 fFlagsForModSetRandom = 0;
302
308
311
312
314
316
317 if ( ( (
flags & ~allowedFlags ) != 0 ) ||
318 ( (
flags & algorithmFlags ) == 0 ) )
319 {
320 scError = SYMCRYPT_INVALID_ARGUMENT;
322 }
323
324
325
326
330 {
331 scError = SYMCRYPT_INVALID_ARGUMENT;
333 }
334
336
337 if (pkDlkey->fPrivateModQ)
338 {
343
344 if (
pDlgroup->isSafePrimeGroup && (pkDlkey->nBitsPriv !=
pDlgroup->nBitsOfQ) )
345 {
346 useModSetRandom =
FALSE;
348
350 nBytesPriv = (pkDlkey->nBitsPriv + 7) / 8;
351 }
352 }
353 else
354 {
355
356
358 {
359 scError = SYMCRYPT_INVALID_ARGUMENT;
361 }
362
367 }
368
370
371
372
373
374
375
376
380 if (pbScratch ==
NULL)
381 {
382 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
384 }
385
386
388
389 if (useModSetRandom)
390 {
391
393 pbScratchInternal = pbScratch + cbPrivateKey;
394 cbScratchInternal =
cbScratch - cbPrivateKey;
395
396
398 pmPriv,
399 pePrivateKey,
400 fFlagsForModSetRandom,
401 pbScratchInternal,
402 cbScratchInternal );
403
404
406 pmPriv,
407 pePrivateKey,
408 pkDlkey->piPrivateKey,
409 pbScratchInternal,
410 cbScratchInternal );
411 }
412 else
413 {
414
415
417
419 privMask = (
BYTE)(0xff >> dwShiftBits);
420
422 {
423
425
426 pbScratch[nBytesPriv-1] &= privMask;
427
428
430 {
431 break;
432 }
433 }
434
436 {
438 }
439
441 if ( scError != SYMCRYPT_NO_ERROR )
442 {
444 }
445 }
446
447
451 pkDlkey->piPrivateKey,
453 0,
454 pkDlkey->pePublicKey,
455 pbScratch,
457
458
460 {
461
462
464 pkDlkey,
466 pbScratch,
468 if ( scError != SYMCRYPT_NO_ERROR )
469 {
471 }
472 }
473
474
475 pkDlkey->fHasPrivateKey =
TRUE;
476
477 pkDlkey->fAlgorithmInfo =
flags;
478
480 {
482 {
483
487
488
491 pkDlkey,
493 }
494
496 {
497
501
502
503
504
505
506
507
508
509 pbScratchInternal = pbScratch;
511
515
519 pkDlkey->piPrivateKey,
521 0,
522 peTmp,
523 pbScratchInternal,
524 cbScratchInternal );
525
527 }
528 }
529
532 {
535 }
536 return scError;
537}
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDlkeyPerformPublicKeyValidation(_In_ PCSYMCRYPT_DLKEY pkDlkey, _In_ UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define DLKEY_GEN_RANDOM_GENERIC_LIMIT
#define SYMCRYPT_FLAG_DLKEY_PUBLIC_KEY_ORDER_VALIDATION
UINT32 SYMCRYPT_CALL SymCryptFdefRawIsEqualUint32(_In_reads_(nDigits *SYMCRYPT_FDEF_DIGIT_NUINT32) PCUINT32 pSrc1, UINT32 nDigits, _In_ UINT32 u32Src2)
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 * u
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCallbackRandom(BYTE *buf, SIZE_T size)
#define SYMCRYPT_RUN_KEY_GEN_PCT(KeySelftestFunction, Key, KeySelftestFlag)
#define SYMCRYPT_RUN_SELFTEST_ONCE(AlgorithmSelftestFunction, AlgorithmSelftestFlag)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDsaPct(PCSYMCRYPT_DLKEY pkDlkey)
UINT32 UINT32 UINT32 UINT32 cbScratch
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
VOID SYMCRYPT_CALL SymCryptDsaSelftest(void)
VOID SYMCRYPT_CALL SymCryptDhSecretAgreementSelftest(void)
#define SYMCRYPT_FLAG_KEY_NO_FIPS
#define SYMCRYPT_FLAG_DLKEY_GEN_MODP
@ SYMCRYPT_NUMBER_FORMAT_LSB_FIRST
@ SYMCRYPT_SELFTEST_ALGORITHM_DSA
@ SYMCRYPT_SELFTEST_ALGORITHM_DH
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_FDEF_DIGIT_SIZE
#define SYMCRYPT_FIPS_ASSERT(x)
#define SYMCRYPT_MAX(_a, _b)
SYMCRYPT_MODULUS * PSYMCRYPT_MODULUS
UINT32 SYMCRYPT_CALL SymCryptModElementIsEqual(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2)
VOID SYMCRYPT_CALL SymCryptModSetRandom(_In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_ONE
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptIntSetValue(_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, _Out_ PSYMCRYPT_INT piDst)
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)
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)
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)