9#define RSA_DEFAULT_PUBLIC_EXPONENT (65537)
90 PBYTE pbCurr = pbBuffer;
103 ( pParams->nPubExp < 1 ) ||
105 ( pParams->nPrimes == 1 ) ||
120 pkObj->cbTotalSize = (
UINT32) cbNeeded;
124 pkObj->hasPrivateKey =
FALSE;
126 pkObj->nSetBitsOfModulus = pParams->nBitsOfModulus;
129 pkObj->nPrimes = pParams->nPrimes;
130 pkObj->nPubExp = pParams->nPubExp;
144 pkObj->nDigitsOfModulus );
155 pkObj->pbPrimes[
i] = pbCurr;
162 pkObj->pbCrtInverses[
i] = pbCurr;
169 pkObj->pbPrivExps[
i] = pbCurr;
174 for (
UINT32 i=0;
i<pkObj->nPubExp*pkObj->nPrimes;
i++)
176 pkObj->pbCrtPrivExps[
i] = pbCurr;
212 pkDst->fAlgorithmInfo = pkSrc->fAlgorithmInfo;
213 pkDst->cbTotalSize = pkSrc->cbTotalSize;
214 pkDst->hasPrivateKey = pkSrc->hasPrivateKey;
215 pkDst->nSetBitsOfModulus = pkSrc->nSetBitsOfModulus;
217 pkDst->nBitsOfModulus = pkSrc->nBitsOfModulus;
218 pkDst->nDigitsOfModulus = pkSrc->nDigitsOfModulus;
220 pkDst->nPubExp = pkSrc->nPubExp;
223 pkDst->au64PubExp[
i] = pkSrc->au64PubExp[
i];
226 pkDst->nPrimes = pkSrc->nPrimes;
229 pkDst->nBitsOfPrimes[
i] = pkSrc->nBitsOfPrimes[
i];
230 pkDst->nDigitsOfPrimes[
i] = pkSrc->nDigitsOfPrimes[
i];
247 for (
UINT32 i=0;
i< pkSrc->nPubExp*pkSrc->nPrimes;
i++)
259 return pkRsakey->hasPrivateKey;
266 return (pkRsakey->nBitsOfModulus + 7)/8;
273 return pkRsakey->nBitsOfModulus;
293 return (pkRsakey->nBitsOfPrimes[
index] + 7)/8;
300 return pkRsakey->nPubExp;
307 return pkRsakey->nPrimes;
315 for (
UINT32 i=0;
i<pkRsakey->nPrimes;
i++)
318 pkRsakey->pbPrimes[
i],
320 pkRsakey->nDigitsOfPrimes[
i] );
325 for (
UINT32 i=0;
i<pkRsakey->nPrimes;
i++)
328 pkRsakey->pbCrtInverses[
i],
330 pkRsakey->pmPrimes[
i] );
335 for(
UINT32 i=0;
i<pkRsakey->nPubExp;
i++ )
338 pkRsakey->pbPrivExps[
i],
340 pkRsakey->nDigitsOfModulus );
345 for (
UINT32 i=0;
i<pkRsakey->nPubExp*pkRsakey->nPrimes;
i++)
348 pkRsakey->pbCrtPrivExps[
i],
350 pkRsakey->nDigitsOfPrimes[
i] );
377 if ( (
flags & ~allowedFlags ) != 0 )
379 scError = SYMCRYPT_INVALID_ARGUMENT;
389 if (scError!=SYMCRYPT_NO_ERROR)
396 for (
UINT32 i=0;
i<pkRsakey->nPrimes;
i++)
400 if (scError!=SYMCRYPT_NO_ERROR)
407 if (scError!=SYMCRYPT_NO_ERROR)
414 for (
UINT32 i=0;
i<pkRsakey->nPubExp;
i++)
420 if( (pkRsakey->au64PubExp[
i] & 1) != 1)
422 scError = SYMCRYPT_INVALID_ARGUMENT;
437 pkRsakey->piPrivExps[
i],
443 scError = SYMCRYPT_INVALID_ARGUMENT;
449 for (
UINT32 i=0;
i<pkRsakey->nPrimes;
i++)
452 if (scError!=SYMCRYPT_NO_ERROR)
468 for (
UINT32 j=0;
j<pkRsakey->nPubExp;
j++)
471 pkRsakey->piPrivExps[
j],
479 if (scError!=SYMCRYPT_NO_ERROR)
489 if( pkRsakey->nPrimes != 2 )
491 scError = SYMCRYPT_INVALID_ARGUMENT;
503 scError = SYMCRYPT_INVALID_ARGUMENT;
536 UINT32 ndMod = pkRsakey->nDigitsOfModulus;
559 if ( ( (
flags & ~allowedFlags ) != 0 ) ||
560 ( (
flags & algorithmFlags ) == 0) )
562 scError = SYMCRYPT_INVALID_ARGUMENT;
572 scError = SYMCRYPT_INVALID_ARGUMENT;
579 pu64PubExp = &defaultExponent;
587 if (pkRsakey->nPrimes != 2 ||
nPubExp != pkRsakey->nPubExp ||
nPubExp != 1 )
589 scError = SYMCRYPT_INVALID_ARGUMENT;
594 pkRsakey->au64PubExp[0] = pu64PubExp[0];
598 pkRsakey->nBitsOfModulus = pkRsakey->nSetBitsOfModulus;
600 pkRsakey->nBitsOfPrimes[0] = (pkRsakey->nBitsOfModulus + 1)/2;
601 pkRsakey->nBitsOfPrimes[1] = pkRsakey->nBitsOfModulus/2;
606 pkRsakey->nMaxDigitsOfPrimes =
SYMCRYPT_MAX(pkRsakey->nDigitsOfPrimes[0], pkRsakey->nDigitsOfPrimes[1]);
608 ndPrimes = pkRsakey->nMaxDigitsOfPrimes;
609 ndLarge = ndPrimes + ndMod;
611 primeBits =
SYMCRYPT_MAX(pkRsakey->nBitsOfPrimes[0],pkRsakey->nBitsOfPrimes[1]);
612 maxTries = 100 * primeBits;
624 cbScratch = 2*cbPrimes + cbMod + cbLarge + cbDivisor +
635 if (pbScratch ==
NULL)
637 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
641 pbFnScratch = pbScratch;
646 piLow =
SymCryptIntCreate( pbFnScratch, cbPrimes, ndPrimes ); pbFnScratch += cbPrimes; cbFnScratch -= cbPrimes;
647 piHigh =
SymCryptIntCreate( pbFnScratch, cbPrimes, ndPrimes ); pbFnScratch += cbPrimes; cbFnScratch -= cbPrimes;
649 piPhi =
SymCryptIntCreate( pbFnScratch, cbMod, ndMod ); pbFnScratch += cbMod; cbFnScratch -= cbMod;
651 piAcc =
SymCryptIntCreate( pbFnScratch, cbLarge, ndLarge ); pbFnScratch += cbLarge; cbFnScratch -= cbLarge;
653 pdTmp =
SymCryptDivisorCreate( pbFnScratch, cbDivisor, ndPrimes ); pbFnScratch += cbDivisor; cbFnScratch -= cbDivisor;
685 for (
UINT32 i=0;
i<pkRsakey->nPrimes;
i++)
687 if ( ((pkRsakey->nBitsOfModulus % 2)==1) && (
i>0) )
706 if (scError!=SYMCRYPT_NO_ERROR)
715 pkRsakey->pmPrimes[
i],
716 pkRsakey->nBitsOfModulus,
723 if (scError!=SYMCRYPT_NO_ERROR)
735 pkRsakey->nBitsOfModulus,
742 scError = SYMCRYPT_EXTERNAL_FAILURE;
748 if ( scError != SYMCRYPT_NO_ERROR )
753 pkRsakey->hasPrivateKey =
TRUE;
755 pkRsakey->fAlgorithmInfo =
flags;
797#define SYMCRYPT_MAX_PRIME_RECOVERY_ITERATIONS (100)
799#define SYMCRYPT_SCRATCH_BYTES_FOR_PRIME_RECOVERY( _ndMod, _ndPubExp, _nBitsMod ) \
800 SymCryptSizeofIntFromDigits( _ndMod ) + \
801 SymCryptSizeofIntFromDigits( _ndPubExp ) + \
802 SymCryptSizeofIntFromDigits( _ndMod + _ndPubExp ) + \
803 (4*SYMCRYPT_SIZEOF_MODELEMENT_FROM_BITS( _nBitsMod )) + \
804 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_INT_MUL( _ndMod + _ndPubExp ), \
805 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS( _ndMod ), \
806 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_MODEXP( _ndMod ), \
807 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_EXTENDED_GCD( _ndMod ), \
808 SYMCRYPT_MAX( SYMCRYPT_SCRATCH_BYTES_FOR_INT_TO_MODULUS( _ndMod ), \
809 SYMCRYPT_SCRATCH_BYTES_FOR_INT_DIVMOD( _ndMod, _ndMod ) \
832 UINT32 ndMod = pkRsakey->nDigitsOfModulus;
839 UINT32 ndExpProd = ndMod + ndPubExp;
853 PBYTE pbFnScratch = pbScratch;
870 pbFnScratch += cbMod;
871 cbFnScratch -= cbMod;
874 pbFnScratch += cbPubExp;
875 cbFnScratch -= cbPubExp;
878 pbFnScratch += cbExpProd;
879 cbFnScratch -= cbExpProd;
901 scError = SYMCRYPT_INVALID_ARGUMENT;
907 if( scError != SYMCRYPT_NO_ERROR )
911 scError = SYMCRYPT_INVALID_ARGUMENT;
918 scError = SYMCRYPT_INVALID_ARGUMENT;
935 if( (low64ExpProd & 1) == 0 )
937 scError = SYMCRYPT_INVALID_ARGUMENT;
962 if( trailingZeros == 64 )
964 scError = SYMCRYPT_INVALID_ARGUMENT;
987 pbFnScratch, cbFnScratch );
999 SymCryptModSquare( pkRsakey->pmModulus, peTmpY, peTmpX, pbFnScratch, cbFnScratch );
1004 bFoundNonTrivialRoot =
TRUE;
1019 if( bFoundNonTrivialRoot )
1025 if( !bFoundNonTrivialRoot )
1029 scError = SYMCRYPT_INVALID_ARGUMENT;
1047 pbFnScratch, cbFnScratch );
1051 pkRsakey->nBitsOfPrimes[1] = pkRsakey->nBitsOfModulus - pkRsakey->nBitsOfPrimes[0];
1057 scError = SYMCRYPT_WRONG_KEY_SIZE;
1061 pkRsakey->nMaxDigitsOfPrimes =
SYMCRYPT_MAX(pkRsakey->nDigitsOfPrimes[0], pkRsakey->nDigitsOfPrimes[1]);
1067 if( scError != SYMCRYPT_NO_ERROR )
1070 scError = SYMCRYPT_HARDWARE_FAILURE;
1075 pkRsakey->pmPrimes[0],
1076 pkRsakey->nBitsOfModulus,
1078 pbFnScratch, cbFnScratch );
1084 pbFnScratch, cbFnScratch );
1091 scError = SYMCRYPT_HARDWARE_FAILURE;
1096 if( scError != SYMCRYPT_NO_ERROR )
1099 scError = SYMCRYPT_HARDWARE_FAILURE;
1104 pkRsakey->pmPrimes[1],
1105 pkRsakey->nBitsOfModulus,
1107 pbFnScratch, cbFnScratch );
1121 SIZE_T cbPrivateExponent,
1156 if ( ( (
flags & ~allowedFlags ) != 0 ) ||
1157 ( (
flags & algorithmFlags ) == 0) )
1159 scError = SYMCRYPT_INVALID_ARGUMENT;
1167 scError = SYMCRYPT_INVALID_ARGUMENT;
1177 if ( (pbModulus==
NULL) || (cbModulus==0) ||
1181 (ppPrimes[0]==
NULL) || (ppPrimes[1]==
NULL) ||
1182 (pcbPrimes[0]==0) || (pcbPrimes[1]==0))) )
1184 scError = SYMCRYPT_INVALID_ARGUMENT;
1188 ndMod = pkRsakey->nDigitsOfModulus;
1192 if ( (pbPrivateExponent !=
NULL) || (
nPrimes > 0) )
1194 if( pkRsakey->nPrimes != 2 )
1198 scError = SYMCRYPT_INVALID_ARGUMENT;
1206 cbScratch = cbMod + cbLarge + cbDivisor +
1214 if( pbPrivateExponent !=
NULL )
1229 if (pbScratch ==
NULL)
1231 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1237 if (scError != SYMCRYPT_NO_ERROR)
1244 if (pkRsakey->nBitsOfModulus > pkRsakey->nSetBitsOfModulus)
1246 scError = SYMCRYPT_INVALID_ARGUMENT;
1252 scError = SYMCRYPT_WRONG_KEY_SIZE;
1260 pkRsakey->pmModulus,
1261 pkRsakey->nBitsOfModulus,
1268 for (
UINT32 i = 0;
i<pkRsakey->nPubExp;
i++)
1270 pkRsakey->au64PubExp[
i] = pu64PubExp[
i];
1274 if ( (pbPrivateExponent !=
NULL) || (
nPrimes > 0) )
1276 if (pbPrivateExponent !=
NULL)
1281 pbPrivateExponent, cbPrivateExponent,
1284 if (scError != SYMCRYPT_NO_ERROR)
1289 pbFnScratch = pbScratch;
1293 piPhi =
SymCryptIntCreate( pbFnScratch, cbMod, ndMod ); pbFnScratch += cbMod; cbFnScratch -= cbMod;
1298 pbFnScratch = pbScratch;
1302 piPhi =
SymCryptIntCreate( pbFnScratch, cbMod, ndMod ); pbFnScratch += cbMod; cbFnScratch -= cbMod;
1305 pkRsakey->nMaxDigitsOfPrimes = 0;
1306 for (
UINT32 i=0;
i<pkRsakey->nPrimes;
i++)
1308#pragma warning(suppress: 26007)
1310 if (scError != SYMCRYPT_NO_ERROR )
1318 pkRsakey->nMaxDigitsOfPrimes =
SYMCRYPT_MAX(pkRsakey->nMaxDigitsOfPrimes, pkRsakey->nDigitsOfPrimes[
i]);
1322 scError = SYMCRYPT_WRONG_KEY_SIZE;
1331 for (
UINT32 i=0;
i<pkRsakey->nPrimes;
i++)
1333#pragma warning(suppress: 26007)
1335 if (scError != SYMCRYPT_NO_ERROR )
1343 scError = SYMCRYPT_INVALID_ARGUMENT;
1351 pkRsakey->pmPrimes[
i],
1352 pkRsakey->nBitsOfModulus,
1360 piAcc =
SymCryptIntCreate( pbFnScratch, cbLarge, 2 * ndMod ); pbFnScratch += cbLarge; cbFnScratch -= cbLarge;
1361 pdTmp =
SymCryptDivisorCreate( pbFnScratch, cbDivisor, ndMod ); pbFnScratch += cbDivisor; cbFnScratch -= cbDivisor;
1365 if (scError != SYMCRYPT_NO_ERROR )
1371 pkRsakey->hasPrivateKey =
TRUE;
1374 pkRsakey->fAlgorithmInfo =
flags;
1388 if (pbScratch!=
NULL)
1412 pbModulus, cbModulus,
1428 SIZE_T cbPrivateExponent,
1434 pbModulus, cbModulus,
1436 pbPrivateExponent, cbPrivateExponent,
1462 if ((
nPrimes!=0) && (pkRsakey->hasPrivateKey ==
FALSE))
1464 scError = SYMCRYPT_INVALID_ARGUMENT;
1469 if (pbModulus!=
NULL)
1473 if (scError != SYMCRYPT_NO_ERROR )
1480 if( pu64PubExp !=
NULL )
1484 scError = SYMCRYPT_INVALID_ARGUMENT;
1487 pu64PubExp[0] = pkRsakey->au64PubExp[0];
1495 scError = SYMCRYPT_INVALID_ARGUMENT;
1501 if (ppPrimes[
i]!=
NULL)
1504 if (scError != SYMCRYPT_NO_ERROR )
1526 SIZE_T cbPrivateExponent,
1537 if ( (ppCrtExponents==
NULL) && (nCrtExponents!=0) ||
1538 (nCrtExponents != 0 && nCrtExponents != 2 ))
1540 scError = SYMCRYPT_INVALID_ARGUMENT;
1545 if (pkRsakey->hasPrivateKey ==
FALSE)
1547 scError = SYMCRYPT_INVALID_ARGUMENT;
1554 if (ppCrtExponents[
i]!=
NULL)
1556 scError =
SymCryptIntGetValue( pkRsakey->piCrtPrivExps[
i], ppCrtExponents[
i], pcbCrtExponents[
i], numFormat );
1557 if (scError != SYMCRYPT_NO_ERROR )
1564 if (pbCrtCoefficient!=
NULL)
1569 if (pbScratch==
NULL)
1571 scError = SYMCRYPT_MEMORY_ALLOCATION_FAILURE;
1576 pkRsakey->pmPrimes[0],
1577 pkRsakey->peCrtInverses[0],
1583 if (scError != SYMCRYPT_NO_ERROR )
1589 if (pbPrivateExponent!=
NULL)
1591 scError =
SymCryptIntGetValue( pkRsakey->piPrivExps[0], pbPrivateExponent, cbPrivateExponent, numFormat );
1592 if (scError != SYMCRYPT_NO_ERROR )
1600 if (pbScratch!=
NULL)
1620 if ( ( (
flags & ~algorithmFlags ) != 0 ) ||
1621 ( (
flags & algorithmFlags ) == 0) )
1623 scError = SYMCRYPT_INVALID_ARGUMENT;
1627 pkRsakey->fAlgorithmInfo |=
flags;
COMPILER_DEPENDENT_UINT64 UINT64
unsigned __int64 * PUINT64
static void cleanup(void)
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
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
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsaSignVerifyPct(const SYMCRYPT_RSAKEY *key)
void SYMCRYPT_CALL SymCryptCallbackFree(void *ptr)
void *SYMCRYPT_CALL SymCryptCallbackAlloc(SIZE_T size)
void SYMCRYPT_CALL SymCryptRsaSelftest(void)
#define _In_reads_bytes_(s)
#define _Out_writes_opt_(s)
#define _Out_writes_bytes_opt_(s)
#define _In_reads_opt_(s)
#define _Out_writes_bytes_(s)
#define _In_reads_bytes_opt_(s)
#define UNREFERENCED_PARAMETER(P)
PSYMCRYPT_RSAKEY SYMCRYPT_CALL SymCryptRsakeyAllocate(_In_ PCSYMCRYPT_RSA_PARAMS pParams, _In_ UINT32 flags)
#define SYMCRYPT_MAX_PRIME_RECOVERY_ITERATIONS
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeySetValue(_In_reads_bytes_(cbModulus) PCBYTE pbModulus, SIZE_T cbModulus, _In_reads_(nPubExp) PCUINT64 pu64PubExp, UINT32 nPubExp, _In_reads_opt_(nPrimes) PCBYTE *ppPrimes, _In_reads_opt_(nPrimes) SIZE_T *pcbPrimes, UINT32 nPrimes, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Inout_ PSYMCRYPT_RSAKEY pkRsakey)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeyCalculatePrivateFields(_Inout_ PSYMCRYPT_RSAKEY pkRsakey, _Out_ PSYMCRYPT_DIVISOR pdTmp, _Out_ PSYMCRYPT_INT piPhi, _Out_ PSYMCRYPT_INT piAcc, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch, UINT32 flags)
UINT32 SYMCRYPT_CALL SymCryptRsakeySizeofPrime(_In_ PCSYMCRYPT_RSAKEY pkRsakey, UINT32 index)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeyGenerate(_Inout_ PSYMCRYPT_RSAKEY pkRsakey, _In_reads_opt_(nPubExp) PCUINT64 pu64PubExp, UINT32 nPubExp, _In_ UINT32 flags)
#define SYMCRYPT_SCRATCH_BYTES_FOR_PRIME_RECOVERY(_ndMod, _ndPubExp, _nBitsMod)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeyGetValue(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _Out_writes_bytes_(cbModulus) PBYTE pbModulus, SIZE_T cbModulus, _Out_writes_opt_(nPubExp) PUINT64 pu64PubExp, UINT32 nPubExp, _Out_writes_opt_(nPrimes) PBYTE *ppPrimes, _In_reads_opt_(nPrimes) SIZE_T *pcbPrimes, UINT32 nPrimes, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags)
VOID SYMCRYPT_CALL SymCryptRsakeyFree(_Out_ PSYMCRYPT_RSAKEY pkObj)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeyExtendKeyUsage(_Inout_ PSYMCRYPT_RSAKEY pkRsakey, UINT32 flags)
VOID SYMCRYPT_CALL SymCryptRsakeyWipe(_Out_ PSYMCRYPT_RSAKEY pkDst)
UINT32 SYMCRYPT_CALL SymCryptRsakeySizeofModulus(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
static SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeyCalculatePrimesFromPrivateExponent(_Inout_ PSYMCRYPT_RSAKEY pkRsakey, _In_reads_bytes_(cbPrivateExponent) PCBYTE pbPrivateExponent, SIZE_T cbPrivateExponent, SYMCRYPT_NUMBER_FORMAT numFormat, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, UINT32 cbScratch)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeySetValueFromPrivateExponent(_In_reads_bytes_(cbModulus) PCBYTE pbModulus, SIZE_T cbModulus, UINT64 u64PubExp, _In_reads_bytes_(cbPrivateExponent) PCBYTE pbPrivateExponent, SIZE_T cbPrivateExponent, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Inout_ PSYMCRYPT_RSAKEY pkRsakey)
VOID SYMCRYPT_CALL SymCryptRsakeyCreateAllObjects(_Inout_ PSYMCRYPT_RSAKEY pkRsakey)
#define RSA_DEFAULT_PUBLIC_EXPONENT
UINT32 SYMCRYPT_CALL SymCryptRsakeyGetNumberOfPrimes(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
UINT32 SYMCRYPT_CALL SymCryptRsakeySizeofPublicExponent(_In_ PCSYMCRYPT_RSAKEY pRsakey, UINT32 index)
PSYMCRYPT_RSAKEY SYMCRYPT_CALL SymCryptRsakeyCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, _In_ PCSYMCRYPT_RSA_PARAMS pParams)
UINT32 SYMCRYPT_CALL SymCryptRsakeyModulusBits(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeySetValueInternal(_In_reads_bytes_(cbModulus) PCBYTE pbModulus, SIZE_T cbModulus, _In_reads_(nPubExp) PCUINT64 pu64PubExp, UINT32 nPubExp, _In_reads_bytes_opt_(cbPrivateExponent) PCBYTE pbPrivateExponent, SIZE_T cbPrivateExponent, _In_reads_opt_(nPrimes) PCBYTE *ppPrimes, _In_reads_opt_(nPrimes) SIZE_T *pcbPrimes, UINT32 nPrimes, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags, _Inout_ PSYMCRYPT_RSAKEY pkRsakey)
BOOLEAN SYMCRYPT_CALL SymCryptRsakeyHasPrivateKey(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptRsakeyGetCrtValue(_In_ PCSYMCRYPT_RSAKEY pkRsakey, _Out_writes_opt_(nCrtExponents) PBYTE *ppCrtExponents, _In_reads_(nCrtExponents) SIZE_T *pcbCrtExponents, UINT32 nCrtExponents, _Out_writes_bytes_opt_(cbCrtCoefficient) PBYTE pbCrtCoefficient, SIZE_T cbCrtCoefficient, _Out_writes_bytes_opt_(cbPrivateExponent) PBYTE pbPrivateExponent, SIZE_T cbPrivateExponent, SYMCRYPT_NUMBER_FORMAT numFormat, UINT32 flags)
UINT32 SYMCRYPT_CALL SymCryptRsakeyGetNumberOfPublicExponents(_In_ PCSYMCRYPT_RSAKEY pkRsakey)
UINT32 SYMCRYPT_CALL SymCryptSizeofRsakeyFromParams(_In_ PCSYMCRYPT_RSA_PARAMS pParams)
#define SYMCRYPT_ASSERT_ASYM_ALIGNED(_p)
FORCEINLINE UINT32 SymCryptCountTrailingZeros64(UINT64 value)
#define SYMCRYPT_RUN_KEY_GEN_PCT(KeySelftestFunction, Key, KeySelftestFlag)
#define SYMCRYPT_RUN_SELFTEST_ONCE(AlgorithmSelftestFunction, AlgorithmSelftestFlag)
UINT32 UINT32 UINT32 UINT32 cbScratch
#define SYMCRYPT_ASSERT(_x)
UINT32 SymCryptUint64Bytesize(UINT64 value)
VOID SYMCRYPT_CALL SymCryptWipe(_Out_writes_bytes_(cbData) PVOID pbData, SIZE_T cbData)
_Analysis_noreturn_ VOID SYMCRYPT_CALL SymCryptFatal(UINT32 fatalCode)
enum _SYMCRYPT_NUMBER_FORMAT SYMCRYPT_NUMBER_FORMAT
#define SYMCRYPT_FLAG_RSAKEY_SIGN
#define SYMCRYPT_FLAG_RSAKEY_ENCRYPT
#define SYMCRYPT_FLAG_KEY_NO_FIPS
#define SYMCRYPT_FLAG_KEY_MINIMAL_VALIDATION
#define SYMCRYPT_SIZEOF_RSAKEY_FROM_PARAMS(modBits, nPrimes, nPubExps)
#define SYMCRYPT_RSAKEY_FIPS_MIN_BITSIZE_MODULUS
@ SYMCRYPT_SELFTEST_ALGORITHM_RSA
SYMCRYPT_MODELEMENT * PSYMCRYPT_MODELEMENT
SYMCRYPT_MAGIC_FIELD SYMCRYPT_RSAKEY
#define SYMCRYPT_RSAKEY_MAX_NUMOF_PRIMES
#define SYMCRYPT_RSAKEY_MIN_BITSIZE_PRIME
SYMCRYPT_RSAKEY * PSYMCRYPT_RSAKEY
#define SYMCRYPT_MAX(_a, _b)
#define SYMCRYPT_SET_MAGIC(p)
const SYMCRYPT_RSAKEY * PCSYMCRYPT_RSAKEY
#define SYMCRYPT_ASYM_ALIGN_VALUE
#define SYMCRYPT_RSAKEY_MAX_BITSIZE_MODULUS
#define SYMCRYPT_ASYM_ALIGN_UP(_p)
#define SYMCRYPT_RSAKEY_MAX_NUMOF_PUBEXPS
SYMCRYPT_DIVISOR * PSYMCRYPT_DIVISOR
SYMCRYPT_INT * PSYMCRYPT_INT
#define SYMCRYPT_RSAKEY_MIN_BITSIZE_MODULUS
#define SYMCRYPT_CHECK_MAGIC(p)
#define SYMCRYPT_PCT_RSA_SIGN
UINT32 SYMCRYPT_CALL SymCryptIntGetValueLsbits32(_In_ PCSYMCRYPT_INT piSrc)
#define SYMCRYPT_FLAG_GCD_INPUTS_NOT_BOTH_EVEN
UINT32 SYMCRYPT_CALL SymCryptSizeofDivisorFromDigits(UINT32 nDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_INT_MUL(_nResultDigits)
UINT32 SYMCRYPT_CALL SymCryptIntIsLessThan(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
UINT32 SYMCRYPT_CALL SymCryptSizeofModElementFromModulus(PCSYMCRYPT_MODULUS pmMod)
#define SYMCRYPT_SIZEOF_INT_FROM_BITS(_bitsize)
VOID SYMCRYPT_CALL SymCryptIntDivPow2(_In_ PCSYMCRYPT_INT piSrc, SIZE_T exp, _Out_ PSYMCRYPT_INT piDst)
VOID SYMCRYPT_CALL SymCryptIntSetValueUint64(UINT64 u64Src, _Out_ PSYMCRYPT_INT piDst)
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptDivisorFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
VOID SYMCRYPT_CALL SymCryptIntCopy(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptIntGenerateRandomPrime(_In_ PCSYMCRYPT_INT piLow, _In_ PCSYMCRYPT_INT piHigh, _In_reads_opt_(nPubExp) PCUINT64 pu64PubExp, UINT32 nPubExp, UINT32 nTries, UINT32 flags, _Inout_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 SymCryptDigitsFromBits(UINT32 nBits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_INT_DIVMOD(_nSrcDigits, _nDivisorDigits)
UINT32 SYMCRYPT_CALL SymCryptModElementIsEqual(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc1, _In_ PCSYMCRYPT_MODELEMENT peSrc2)
#define SYMCRYPT_SCRATCH_BYTES_FOR_INT_PRIME_GEN(_nDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_INT_TO_MODULUS(_nDigits)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptIntCopyMixedSize(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_INT piDst)
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_SCRATCH_BYTES_FOR_EXTENDED_GCD(_nDigits)
SYMCRYPT_ERROR SYMCRYPT_CALL SymCryptCrtGenerateInverses(UINT32 nCoprimes, _In_reads_(nCoprimes) PCSYMCRYPT_MODULUS *ppmCoprimes, UINT32 flags, _Out_writes_(nCoprimes) PSYMCRYPT_MODELEMENT *ppeCrtInverses, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SymCryptModElementCopy(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst)
#define SYMCRYPT_FLAG_MODULUS_PARITY_PUBLIC
#define SYMCRYPT_SIZEOF_MODELEMENT_FROM_BITS(_bitsize)
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)
UINT64 SYMCRYPT_CALL SymCryptIntGetValueLsbits64(_In_ PCSYMCRYPT_INT piSrc)
#define SYMCRYPT_FLAG_MODULUS_PRIME
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 SymCryptIntMulPow2(_In_ PCSYMCRYPT_INT piSrc, SIZE_T exp, _Out_ PSYMCRYPT_INT piDst)
VOID SYMCRYPT_CALL SymCryptModElementSetValueUint32(UINT32 value, _In_ PCSYMCRYPT_MODULUS pmMod, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
VOID SYMCRYPT_CALL SymCryptIntToDivisor(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_DIVISOR pdDst, UINT32 totalOperations, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
#define SYMCRYPT_SCRATCH_BYTES_FOR_INT_TO_DIVISOR(_nDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_COMMON_MOD_OPERATIONS(_nDigits)
#define SYMCRYPT_SCRATCH_BYTES_FOR_CRT_GENERATION(_nDigits)
PSYMCRYPT_MODULUS SYMCRYPT_CALL SymCryptModulusCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 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 SymCryptIntFromDivisor(_In_ PSYMCRYPT_DIVISOR pdSrc)
UINT32 SYMCRYPT_CALL SymCryptIntSubUint32(_In_ PCSYMCRYPT_INT piSrc1, UINT32 Src2, _Out_ PSYMCRYPT_INT piDst)
VOID SYMCRYPT_CALL SymCryptModSquare(_In_ PCSYMCRYPT_MODULUS pmMod, _In_ PCSYMCRYPT_MODELEMENT peSrc, _Out_ PSYMCRYPT_MODELEMENT peDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
PSYMCRYPT_DIVISOR SYMCRYPT_CALL SymCryptDivisorCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
VOID SymCryptModulusCopy(_In_ PCSYMCRYPT_MODULUS pmSrc, _Out_ PSYMCRYPT_MODULUS pmDst)
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntFromModulus(_In_ PSYMCRYPT_MODULUS pmSrc)
UINT32 SYMCRYPT_CALL SymCryptSizeofModulusFromDigits(UINT32 nDigits)
UINT32 SYMCRYPT_CALL SymCryptIntIsEqualUint32(_In_ PCSYMCRYPT_INT piSrc1, _In_ UINT32 u32Src2)
UINT32 SYMCRYPT_CALL SymCryptIntBitsizeOfValue(_In_ PCSYMCRYPT_INT piSrc)
VOID SYMCRYPT_CALL SymCryptIntMulMixedSize(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, _Out_ PSYMCRYPT_INT piDst, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
UINT32 SYMCRYPT_CALL SymCryptSizeofIntFromDigits(UINT32 nDigits)
VOID SYMCRYPT_CALL SymCryptIntSetValueUint32(UINT32 u32Src, _Out_ PSYMCRYPT_INT piDst)
VOID SYMCRYPT_CALL SymCryptIntToModulus(_In_ PCSYMCRYPT_INT piSrc, _Out_ PSYMCRYPT_MODULUS pmDst, UINT32 averageOperations, UINT32 flags, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)
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)
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)
UINT32 SYMCRYPT_CALL SymCryptIntIsEqual(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2)
#define SYMCRYPT_FLAG_DATA_PUBLIC
PSYMCRYPT_INT SYMCRYPT_CALL SymCryptIntCreate(_Out_writes_bytes_(cbBuffer) PBYTE pbBuffer, SIZE_T cbBuffer, UINT32 nDigits)
VOID SYMCRYPT_CALL SymCryptIntExtendedGcd(_In_ PCSYMCRYPT_INT piSrc1, _In_ PCSYMCRYPT_INT piSrc2, UINT32 flags, _Out_opt_ PSYMCRYPT_INT piGcd, _Out_opt_ PSYMCRYPT_INT piLcm, _Out_opt_ PSYMCRYPT_INT piInvSrc1ModSrc2, _Out_opt_ PSYMCRYPT_INT piInvSrc2ModSrc1, _Out_writes_bytes_(cbScratch) PBYTE pbScratch, SIZE_T cbScratch)