68 pkRes->fAlgorithmInfo = 0;
70 pkRes->fHasPrivateKey =
FALSE;
71 pkRes->fPrivateModQ =
FALSE;
72 pkRes->nBitsPriv =
pDlgroup->nDefaultBitsPriv;
78 if (pkRes->pePublicKey ==
NULL)
90 pkRes->pbPrivate = pbBuffer;
91 pkRes->piPrivateKey =
NULL;
120 pkDst->fAlgorithmInfo = pkSrc->fAlgorithmInfo;
121 pkDst->fHasPrivateKey = pkSrc->fHasPrivateKey;
122 pkDst->fPrivateModQ = pkSrc->fPrivateModQ;
123 pkDst->nBitsPriv = pkSrc->nBitsPriv;
140 if(
nBitsPriv > pkDlkey->pDlgroup->nBitsOfQ ||
141 nBitsPriv < pkDlkey->
pDlgroup->nMinBitsPriv ||
144 return SYMCRYPT_INVALID_ARGUMENT;
148 return SYMCRYPT_NO_ERROR;
155 return pkDlkey->pDlgroup;
162 return pkDlkey->pDlgroup->cbPrimeP;
171 if (pkDlkey->fPrivateModQ)
175 if (pkDlkey->nBitsPriv !=
pDlgroup->nBitsOfQ)
177 return (pkDlkey->nBitsPriv + 7) / 8;
199 return pkDlkey->fHasPrivateKey;
202#define SYMCRYPT_FLAG_DLKEY_PUBLIC_KEY_ORDER_VALIDATION (0x1)
224 return SYMCRYPT_INVALID_ARGUMENT;
235 return SYMCRYPT_INVALID_ARGUMENT;
242 return SYMCRYPT_INVALID_ARGUMENT;
255 return SYMCRYPT_INVALID_ARGUMENT;
261 pkDlkey->pePublicKey,
272 return SYMCRYPT_INVALID_ARGUMENT;
276 return SYMCRYPT_NO_ERROR;
279#define DLKEY_GEN_RANDOM_GENERIC_LIMIT (1000)
291 SIZE_T cbScratchInternal = 0;
301 UINT32 fFlagsForModSetRandom = 0;
317 if ( ( (
flags & ~allowedFlags ) != 0 ) ||
318 ( (
flags & algorithmFlags ) == 0 ) )
320 scError = SYMCRYPT_INVALID_ARGUMENT;
331 scError = SYMCRYPT_INVALID_ARGUMENT;
337 if (pkDlkey->fPrivateModQ)
344 if (
pDlgroup->isSafePrimeGroup && (pkDlkey->nBitsPriv !=
pDlgroup->nBitsOfQ) )
346 useModSetRandom =
FALSE;
350 nBytesPriv = (pkDlkey->nBitsPriv + 7) / 8;
359 scError = SYMCRYPT_INVALID_ARGUMENT;
380 if (pbScratch ==
NULL)
382 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
393 pbScratchInternal = pbScratch + cbPrivateKey;
394 cbScratchInternal =
cbScratch - cbPrivateKey;
400 fFlagsForModSetRandom,
408 pkDlkey->piPrivateKey,
419 privMask = (
BYTE)(0xff >> dwShiftBits);
426 pbScratch[nBytesPriv-1] &= privMask;
441 if ( scError != SYMCRYPT_NO_ERROR )
451 pkDlkey->piPrivateKey,
454 pkDlkey->pePublicKey,
468 if ( scError != SYMCRYPT_NO_ERROR )
475 pkDlkey->fHasPrivateKey =
TRUE;
477 pkDlkey->fAlgorithmInfo =
flags;
509 pbScratchInternal = pbScratch;
519 pkDlkey->piPrivateKey,
554 UINT32 cbScratchInternal = 0;
565 if ( ((pbPrivateKey==
NULL) && (cbPrivateKey!=0)) ||
566 ((pbPublicKey==
NULL) && (cbPublicKey!=0)) ||
567 ((pbPrivateKey==
NULL) && (pbPublicKey==
NULL)) )
569 scError = SYMCRYPT_INVALID_ARGUMENT;
578 if ( ( (
flags & ~allowedFlags ) != 0 ) ||
579 ( (
flags & algorithmFlags ) == 0 ) )
581 scError = SYMCRYPT_INVALID_ARGUMENT;
592 scError = SYMCRYPT_INVALID_ARGUMENT;
600 scError = SYMCRYPT_INVALID_ARGUMENT;
606 fValidatePublicKeyOrder = 0;
618 if (pbScratch ==
NULL)
620 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
624 if ( pbPrivateKey !=
NULL )
634 pkDlkey->fPrivateModQ = ( (
pDlgroup->fHasPrimeQ) &&
635 ((cbPrivateKey < pDlgroup->
cbPrimeQ) ||
637 (pkDlkey->nBitsPriv !=
pDlgroup->nDefaultBitsPriv)) );
639 if ( pkDlkey->fPrivateModQ )
661 pkDlkey->piPrivateKey );
662 if ( scError != SYMCRYPT_NO_ERROR )
672 scError = SYMCRYPT_INVALID_ARGUMENT;
682 scError = SYMCRYPT_INVALID_ARGUMENT;
688 if ( ( ( (nBitsPriv < pDlgroup->
nBitsOfQ) &&
693 scError = SYMCRYPT_INVALID_ARGUMENT;
698 pkDlkey->fHasPrivateKey =
TRUE;
701 if ( pbPublicKey !=
NULL )
708 pkDlkey->pePublicKey,
711 if ( scError != SYMCRYPT_NO_ERROR )
724 fValidatePublicKeyOrder,
727 if ( scError != SYMCRYPT_NO_ERROR )
736 if ( (pbPublicKey==
NULL) ||
738 (pbPrivateKey!=
NULL) && (pbPublicKey!=
NULL) ) )
741 pbScratchInternal = pbScratch;
745 peTmp = pkDlkey->pePublicKey;
747 if ( pbPublicKey !=
NULL )
758 pkDlkey->piPrivateKey,
765 if ( pbPublicKey !=
NULL )
769 scError = SYMCRYPT_AUTHENTICATION_FAILURE;
780 fValidatePublicKeyOrder,
783 if ( scError != SYMCRYPT_NO_ERROR )
790 pkDlkey->fAlgorithmInfo =
flags;
844 if ( ((pbPrivateKey==
NULL) && (cbPrivateKey!=0)) ||
845 ((pbPublicKey==
NULL) && (cbPublicKey!=0)) ||
846 ((pbPrivateKey==
NULL) && (pbPublicKey==
NULL)) ||
847 ((pbPrivateKey!=
NULL) && !pkDlkey->fHasPrivateKey) )
849 scError = SYMCRYPT_INVALID_ARGUMENT;
853 if (pbPrivateKey !=
NULL)
856 pkDlkey->piPrivateKey,
860 if (scError!=SYMCRYPT_NO_ERROR)
866 if (pbPublicKey !=
NULL)
870 if (pbScratch ==
NULL)
872 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
878 pkDlkey->pePublicKey,
884 if (scError!=SYMCRYPT_NO_ERROR)
910 if ( ( (
flags & ~algorithmFlags ) != 0 ) ||
911 ( (
flags & algorithmFlags ) == 0) )
913 scError = SYMCRYPT_INVALID_ARGUMENT;
917 pkDlkey->fAlgorithmInfo |=
flags;
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDlkeySetValue(_In_reads_bytes_(cbPrivateKey) PCBYTE pbPrivateKey, SIZE_T cbPrivateKey, _In_reads_bytes_(cbPublicKey) PCBYTE pbPublicKey, SIZE_T cbPublicKey, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Inout_ PSYMCRYPT_DLKEY pkDlkey)
UINT32 SYMCRYPT_CALL SymCryptDlkeySizeofPublicKey(_In_ PCSYMCRYPT_DLKEY pkDlkey)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDlkeyPerformPublicKeyValidation(_In_ PCSYMCRYPT_DLKEY pkDlkey, _In_ UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 SYMCRYPT_CALL SymCryptSizeofDlkeyFromDlgroup(_In_ PCSYMCRYPT_DLGROUP pDlgroup)
UINT32 SYMCRYPT_CALL SymCryptDlkeySizeofPrivateKey(_In_ PCSYMCRYPT_DLKEY pkDlkey)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDlkeyExtendKeyUsage(_Inout_ PSYMCRYPT_DLKEY pkDlkey, UINT32 flags)
PCSYMCRYPT_DLGROUP SYMCRYPT_CALL SymCryptDlkeyGetGroup(_In_ PCSYMCRYPT_DLKEY pkDlkey)
VOID SYMCRYPT_CALL SymCryptDlkeyCopy(_In_ PCSYMCRYPT_DLKEY pkSrc, _Out_ PSYMCRYPT_DLKEY pkDst)
PSYMCRYPT_DLKEY SYMCRYPT_CALL SymCryptDlkeyAllocate(_In_ PCSYMCRYPT_DLGROUP pDlgroup)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDlkeySetPrivateKeyLength(_Inout_ PSYMCRYPT_DLKEY pkDlkey, UINT32 nBitsPriv, UINT32 flags)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDlkeyGenerate(_In_ UINT32 flags, _Inout_ PSYMCRYPT_DLKEY pkDlkey)
VOID SYMCRYPT_CALL SymCryptDlkeyFree(_Out_ PSYMCRYPT_DLKEY pkObj)
#define DLKEY_GEN_RANDOM_GENERIC_LIMIT
VOID SYMCRYPT_CALL SymCryptDlkeyWipe(_Out_ PSYMCRYPT_DLKEY pkDst)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptDlkeyGetValue(_In_ PCSYMCRYPT_DLKEY pkDlkey, _Out_writes_bytes_(cbPrivateKey) PBYTE pbPrivateKey, SIZE_T cbPrivateKey, _Out_writes_bytes_(cbPublicKey) PBYTE pbPublicKey, SIZE_T cbPublicKey, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags)
PSYMCRYPT_DLKEY SYMCRYPT_CALL SymCryptDlkeyCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_DLGROUP pDlgroup)
BOOLEAN SYMCRYPT_CALL SymCryptDlkeyHasPrivateKey(_In_ PCSYMCRYPT_DLKEY pkDlkey)
#define SYMCRYPT_FLAG_DLKEY_PUBLIC_KEY_ORDER_VALIDATION
static void cleanup(void)
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
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCallbackRandom(BYTE *buf, SIZE_T size)
#define _In_reads_bytes_(s)
#define _Out_writes_bytes_(s)
#define UNREFERENCED_PARAMETER(P)
#define SYMCRYPT_ASSERT_ASYM_ALIGNED(_p)
#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
#define SYMCRYPT_ASSERT(_x)
#define SYMCRYPT_FLAG_DLKEY_DSA
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)
enum _SYMCRYPT_NUMBER_FORMAT SYMCRYPT_NUMBER_FORMAT
VOID SYMCRYPT_CALL SymCryptDhSecretAgreementSelftest(void)
#define SYMCRYPT_FLAG_DLKEY_DH
#define SYMCRYPT_FLAG_KEY_NO_FIPS
#define SYMCRYPT_FLAG_DLKEY_GEN_MODP
@ SYMCRYPT_NUMBER_FORMAT_LSB_FIRST
#define SYMCRYPT_FLAG_KEY_MINIMAL_VALIDATION
PCSYMCRYPT_DLGROUP pDlgroup
@ SYMCRYPT_SELFTEST_ALGORITHM_DSA
@ SYMCRYPT_SELFTEST_ALGORITHM_DH
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
#define SYMCRYPT_FDEF_DIGIT_SIZE
#define SYMCRYPT_FIPS_ASSERT(x)
SYMCRYPT_DLKEY * PSYMCRYPT_DLKEY
#define SYMCRYPT_MAX(_a, _b)
#define SYMCRYPT_SET_MAGIC(p)
const SYMCRYPT_DLKEY * PCSYMCRYPT_DLKEY
SYMCRYPT_MODULUS * PSYMCRYPT_MODULUS
SYMCRYPT_MAGIC_FIELD SYMCRYPT_DLKEY
#define SYMCRYPT_CHECK_MAGIC(p)
const SYMCRYPT_DLGROUP * PCSYMCRYPT_DLGROUP
UINT32 SYMCRYPT_CALL SymCryptIntIsLessThan(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
VOID SYMCRYPT_CALL SymCryptIntCopy(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
UINT32 SYMCRYPT_CALL SymCryptModElementIsZero(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc)
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)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptModElementSetValue(_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_ONE
VOID SymCryptModElementCopy(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)
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)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptIntSetValue(_In_reads_bytes_(cbSrc) PCBYTE pbSrc, SIZE_T cbSrc, SYMCRYPT_NUMBER_FORMAT format, _Out_ PSYMCRYPT_INT piDst)
PSYMCRYPT_MODELEMENT SYMCRYPT_CALL SymCryptModElementCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_MODULUS pmMod)
VOID SYMCRYPT_CALL SymCryptModElementSetValueUint32(UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#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)
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
#define SYMCRYPT_FLAG_MODRANDOM_ALLOW_MINUSONE
UINT32 SYMCRYPT_CALL SymCryptIntIsEqualUint32(_In_ PCSYMCRYPT_INT piSrc1, _In_ UINT32 u32Src2)
UINT32 SYMCRYPT_CALL SymCryptIntBitsizeOfValue(_In_ PCSYMCRYPT_INT piSrc)
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 SymCryptModElementSetValueNegUint32(UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptIntGetValue(_In_ PCSYMCRYPT_INT piSrc, _Out_writes_bytes_(cbDst) PBYTE pbDst, SIZE_T cbDst, SYMCRYPT_NUMBER_FORMAT format)
#define SYMCRYPT_FLAG_DATA_PUBLIC
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP(_nDigits)