@@ -2517,20 +2517,28 @@ ArithImp<ImpXxx, AlgDeveloperTest>::~ArithImp()
25172517// Table with the RSA keys' sizes and pointers to keys
25182518struct {
25192519 SIZE_T keySize;
2520+ UINT32 generateFlags;
25202521 PSYMCRYPT_RSAKEY pkRsakey;
25212522} CONCAT2(g_precomputedRsaKeys, ImpXxx)[] = {
2522- { 32 , NULL },
2523- { 64 , NULL },
2524- { 128 , NULL },
2525- { 256 , NULL },
2526- { 384 , NULL },
2527- { 512 , NULL },
2528- {1024 , NULL },
2523+ { 32 , SYMCRYPT_FLAG_RSAKEY_SIGN, NULL },
2524+ { 64 , SYMCRYPT_FLAG_RSAKEY_SIGN, NULL },
2525+ { 128 , SYMCRYPT_FLAG_RSAKEY_SIGN, NULL },
2526+ { 256 , SYMCRYPT_FLAG_RSAKEY_SIGN, NULL },
2527+ { 384 , SYMCRYPT_FLAG_RSAKEY_SIGN, NULL },
2528+ { 512 , SYMCRYPT_FLAG_RSAKEY_SIGN, NULL },
2529+ {1024 , SYMCRYPT_FLAG_RSAKEY_SIGN, NULL },
2530+ { 32 , SYMCRYPT_FLAG_RSAKEY_ENCRYPT, NULL },
2531+ { 64 , SYMCRYPT_FLAG_RSAKEY_ENCRYPT, NULL },
2532+ { 128 , SYMCRYPT_FLAG_RSAKEY_ENCRYPT, NULL },
2533+ { 256 , SYMCRYPT_FLAG_RSAKEY_ENCRYPT, NULL },
2534+ { 384 , SYMCRYPT_FLAG_RSAKEY_ENCRYPT, NULL },
2535+ { 512 , SYMCRYPT_FLAG_RSAKEY_ENCRYPT, NULL },
2536+ {1024 , SYMCRYPT_FLAG_RSAKEY_ENCRYPT, NULL },
25292537};
25302538
25312539template <>
25322540void
2533- SetupRsaKey <ImpXxx>( PBYTE buf1, SIZE_T keySize )
2541+ SetupSymCryptRsaKey <ImpXxx>( PBYTE buf1, SIZE_T keySize, UINT32 generateFlags )
25342542{
25352543 int i = 0 ;
25362544 BOOLEAN bFound = FALSE ;
@@ -2539,7 +2547,8 @@ SetupRsaKey<ImpXxx>( PBYTE buf1, SIZE_T keySize )
25392547
25402548 for ( i=0 ; i < ARRAY_SIZE (CONCAT2 (g_precomputedRsaKeys, ImpXxx)); i++ )
25412549 {
2542- if ( keySize == CONCAT2 (g_precomputedRsaKeys, ImpXxx)[i].keySize )
2550+ if ( keySize == CONCAT2 (g_precomputedRsaKeys, ImpXxx)[i].keySize &&
2551+ generateFlags == CONCAT2 (g_precomputedRsaKeys, ImpXxx)[i].generateFlags )
25432552 {
25442553 bFound = TRUE ;
25452554
@@ -2557,8 +2566,13 @@ SetupRsaKey<ImpXxx>( PBYTE buf1, SIZE_T keySize )
25572566 pkRsakey = ScShimSymCryptRsakeyAllocate ( &rsaParams, 0 );
25582567 CHECK ( pkRsakey != NULL , " ?" );
25592568
2569+ if ( rsaParams.nBitsOfModulus < SYMCRYPT_RSAKEY_FIPS_MIN_BITSIZE_MODULUS )
2570+ {
2571+ generateFlags |= SYMCRYPT_FLAG_KEY_NO_FIPS;
2572+ }
2573+
25602574 // Use default exponent
2561- scError = ScShimSymCryptRsakeyGenerate ( pkRsakey, nullptr , 0 , SYMCRYPT_FLAG_RSAKEY_SIGN | SYMCRYPT_FLAG_RSAKEY_ENCRYPT );
2575+ scError = ScShimSymCryptRsakeyGenerate ( pkRsakey, nullptr , 0 , generateFlags );
25622576 CHECK ( scError == SYMCRYPT_NO_ERROR, " ?" );
25632577
25642578 CONCAT2 (g_precomputedRsaKeys, ImpXxx)[i].pkRsakey = pkRsakey;
@@ -2575,11 +2589,11 @@ SetupRsaKey<ImpXxx>( PBYTE buf1, SIZE_T keySize )
25752589
25762590template <>
25772591void
2578- sc_RsaKeyPerf<ImpXxx>( PBYTE buf1, PBYTE buf2, SIZE_T keySize )
2592+ sc_RsaKeyPerf<ImpXxx>( PBYTE buf1, PBYTE buf2, SIZE_T keySize, UINT32 generateFlags )
25792593{
25802594 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
25812595
2582- SetupRsaKey <ImpXxx>( buf1, keySize );
2596+ SetupSymCryptRsaKey <ImpXxx>( buf1, keySize, generateFlags );
25832597
25842598 buf2[0 ] = 0 ;
25852599 // Don't fill it up so that it is smaller than the modulus
@@ -2627,7 +2641,7 @@ algImpKeyPerfFunction<ImpXxx, AlgRsaSignPkcs1>( PBYTE buf1, PBYTE buf2, PBYTE bu
26272641 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
26282642 SIZE_T cbDst = 0 ;
26292643
2630- sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize );
2644+ sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize, SYMCRYPT_FLAG_RSAKEY_SIGN );
26312645
26322646 scError = ScShimSymCryptRsaPkcs1Sign (
26332647 *((PSYMCRYPT_RSAKEY *) buf1),
@@ -2856,7 +2870,7 @@ algImpKeyPerfFunction<ImpXxx, AlgRsaSignPss>( PBYTE buf1, PBYTE buf2, PBYTE buf3
28562870 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
28572871 SIZE_T cbDst = 0 ;
28582872
2859- sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize );
2873+ sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize, SYMCRYPT_FLAG_RSAKEY_SIGN );
28602874
28612875 scError = ScShimSymCryptRsaPssSign (
28622876 *((PSYMCRYPT_RSAKEY *) buf1),
@@ -3086,7 +3100,7 @@ algImpKeyPerfFunction<ImpXxx, AlgRsaEncRaw>( PBYTE buf1, PBYTE buf2, PBYTE buf3,
30863100{
30873101 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
30883102
3089- sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize );
3103+ sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize, SYMCRYPT_FLAG_RSAKEY_ENCRYPT );
30903104
30913105 scError = ScShimSymCryptRsaRawEncrypt (
30923106 *((PSYMCRYPT_RSAKEY *) buf1),
@@ -3289,7 +3303,7 @@ algImpKeyPerfFunction<ImpXxx, AlgRsaEncPkcs1>( PBYTE buf1, PBYTE buf2, PBYTE buf
32893303 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
32903304 SIZE_T cbDst = 0 ;
32913305
3292- sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize );
3306+ sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize, SYMCRYPT_FLAG_RSAKEY_ENCRYPT );
32933307
32943308 scError = ScShimSymCryptRsaPkcs1Encrypt (
32953309 *((PSYMCRYPT_RSAKEY *) buf1),
@@ -3505,7 +3519,7 @@ algImpKeyPerfFunction<ImpXxx, AlgRsaEncOaep>( PBYTE buf1, PBYTE buf2, PBYTE buf3
35053519 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
35063520 SIZE_T cbDst = 0 ;
35073521
3508- sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize );
3522+ sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize, SYMCRYPT_FLAG_RSAKEY_ENCRYPT );
35093523
35103524 scError = ScShimSymCryptRsaOaepEncrypt (
35113525 *((PSYMCRYPT_RSAKEY *) buf1),
@@ -3796,7 +3810,7 @@ algImpKeyPerfFunction<ImpXxx, AlgRsaEncOaep>( PBYTE buf1, PBYTE buf2, PBYTE buf3
37963810 BYTE rbResult[1024] = { 0 };
37973811 SIZE_T cbDst = 0;
37983812
3799- sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize );
3813+ sc_RsaKeyPerf<ImpXxx>( buf1, buf2, keySize, SYMCRYPT_FLAG_RSAKEY_ENCRYPT );
38003814
38013815 scError = ScShimSymCryptRsaOaepEncrypt(
38023816 *((PSYMCRYPT_RSAKEY *) buf1),
@@ -4088,7 +4102,7 @@ SetupDlGroup<ImpXxx>( PBYTE buf1, SIZE_T keySize )
40884102
40894103template <>
40904104void
4091- SetupSymCryptDsaAndDh <ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3 )
4105+ SetupSymCryptDsa <ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3 )
40924106{
40934107 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
40944108
@@ -4104,7 +4118,7 @@ SetupSymCryptDsaAndDh<ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3 )
41044118 PUINT32 puiSignatureSize = NULL ;
41054119 UINT32 cbAgreedSecret, cbHashValue;
41064120
4107- UINT32 generateFlags = SYMCRYPT_FLAG_DLKEY_DH | SYMCRYPT_FLAG_DLKEY_DSA | SYMCRYPT_FLAG_KEY_NO_FIPS ;
4121+ UINT32 generateFlags = SYMCRYPT_FLAG_DLKEY_DSA;
41084122
41094123 pPtrs[0 ] = ScShimSymCryptDlkeyCreate ( buf2 + buff2Offset, dlkeysize, pDlgroup );
41104124 scError = ScShimSymCryptDlkeyGenerate ( generateFlags, pPtrs[0 ] );
@@ -4123,17 +4137,7 @@ SetupSymCryptDsaAndDh<ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3 )
41234137
41244138 *puiSignatureSize = signatureSize;
41254139
4126- // Verify that DH can work
4127- scError = ScShimSymCryptDhSecretAgreement (
4128- ((PSYMCRYPT_DLKEY *) buf2)[0 ],
4129- ((PSYMCRYPT_DLKEY *) buf2)[1 ],
4130- SYMCRYPT_NUMBER_FORMAT_MSB_FIRST,
4131- 0 ,
4132- buf3 + sizeof (UINT32),
4133- cbAgreedSecret );
4134- CHECK ( scError == SYMCRYPT_NO_ERROR, " SymCryptDhSecretAgreement failed" );
4135-
4136- // Same for DSA
4140+ // Verify that DSA can work
41374141 cbHashValue = ScShimSymCryptDlkeySizeofPrivateKey ( ((PSYMCRYPT_DLKEY *)buf2)[0 ] );
41384142 scError = ScShimSymCryptDsaSign (
41394143 ((PSYMCRYPT_DLKEY *) buf2)[0 ],
@@ -4167,7 +4171,7 @@ algImpKeyPerfFunction<ImpXxx, AlgDsaSign>( PBYTE buf1, PBYTE buf2, PBYTE buf3, S
41674171 UNREFERENCED_PARAMETER ( buf3 );
41684172
41694173 SetupDlGroup<ImpXxx>( buf1, keySize );
4170- SetupSymCryptDsaAndDh <ImpXxx>( buf1, buf2, buf3 );
4174+ SetupSymCryptDsa <ImpXxx>( buf1, buf2, buf3 );
41714175}
41724176
41734177template <>
@@ -4222,7 +4226,7 @@ algImpKeyPerfFunction<ImpXxx, AlgDsaVerify>( PBYTE buf1, PBYTE buf2, PBYTE buf3,
42224226 UNREFERENCED_PARAMETER ( buf3 );
42234227
42244228 SetupDlGroup<ImpXxx>( buf1, keySize );
4225- SetupSymCryptDsaAndDh <ImpXxx>( buf1, buf2, buf3 );
4229+ SetupSymCryptDsa <ImpXxx>( buf1, buf2, buf3 );
42264230}
42274231
42284232template <>
@@ -4768,7 +4772,7 @@ SetupSymCryptCurves<ImpXxx>( PBYTE buf1, SIZE_T keySize )
47684772
47694773template <>
47704774void
4771- SetupSymCryptEcdsaAndEcdh <ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3 )
4775+ SetupSymCryptEckey <ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3, UINT32 setRandomFlags )
47724776{
47734777 SYMCRYPT_ERROR scError = SYMCRYPT_NO_ERROR;
47744778
@@ -4780,7 +4784,7 @@ SetupSymCryptEcdsaAndEcdh<ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3 )
47804784 PSYMCRYPT_ECKEY * pPtrs = ((PSYMCRYPT_ECKEY *) buf2);
47814785 pPtrs[0 ] = ScShimSymCryptEckeyCreate ( buf2 + 32 , eckeySize, pCurve );
47824786
4783- scError = ScShimSymCryptEckeySetRandom ( SYMCRYPT_FLAG_ECKEY_ECDSA | SYMCRYPT_FLAG_ECKEY_ECDH , pPtrs[0 ] );
4787+ scError = ScShimSymCryptEckeySetRandom ( setRandomFlags , pPtrs[0 ] );
47844788 CHECK ( scError == SYMCRYPT_NO_ERROR, " ?" );
47854789
47864790 pPtrs[1 ] = (PSYMCRYPT_ECKEY) ((PBYTE)buf2 + 32 + eckeySize); // This will hold the hash of the message
@@ -4795,20 +4799,23 @@ SetupSymCryptEcdsaAndEcdh<ImpXxx>( PBYTE buf1, PBYTE buf2, PBYTE buf3 )
47954799 *puiSignatureSize = signatureSize;
47964800
47974801 // Verify that ECDH can work
4798- UINT32 cbAgreedSecret = ScShimSymCryptEcurveSizeofFieldElement ( *(PSYMCRYPT_ECURVE *) buf1 );
4799- CHECK ( cbAgreedSecret <= *((PUINT32)buf3), " Buffer 3 too small for ECDH" );
4800- scError = ScShimSymCryptEcDhSecretAgreement (
4801- ((PSYMCRYPT_ECKEY *) buf2)[0 ],
4802- ((PSYMCRYPT_ECKEY *) buf2)[0 ], // Same private and public key
4803- SYMCRYPT_NUMBER_FORMAT_MSB_FIRST,
4804- 0 ,
4805- buf3 + sizeof (UINT32),
4806- cbAgreedSecret);
4807- CHECK ( scError == SYMCRYPT_NO_ERROR, " SymCryptEcDhSecretAgreement failed" );
4802+ if ( setRandomFlags & SYMCRYPT_FLAG_ECKEY_ECDH )
4803+ {
4804+ UINT32 cbAgreedSecret = ScShimSymCryptEcurveSizeofFieldElement ( *(PSYMCRYPT_ECURVE *) buf1 );
4805+ CHECK ( cbAgreedSecret <= *((PUINT32)buf3), " Buffer 3 too small for ECDH" );
4806+ scError = ScShimSymCryptEcDhSecretAgreement (
4807+ ((PSYMCRYPT_ECKEY *) buf2)[0 ],
4808+ ((PSYMCRYPT_ECKEY *) buf2)[0 ], // Same private and public key
4809+ SYMCRYPT_NUMBER_FORMAT_MSB_FIRST,
4810+ 0 ,
4811+ buf3 + sizeof (UINT32),
4812+ cbAgreedSecret);
4813+ CHECK ( scError == SYMCRYPT_NO_ERROR, " SymCryptEcDhSecretAgreement failed" );
4814+ }
48084815
4809- if (pCurve->type != SYMCRYPT_ECURVE_TYPE_MONTGOMERY)
4816+ // Verify that ECDSA can work
4817+ if ( (setRandomFlags & SYMCRYPT_FLAG_ECKEY_ECDSA) != 0 )
48104818 {
4811- // Same for ECDSA
48124819 scError = ScShimSymCryptEcDsaSign (
48134820 pPtrs[0 ],
48144821 (PBYTE) pPtrs[1 ],
@@ -4901,7 +4908,7 @@ VOID
49014908algImpKeyPerfFunction<ImpXxx, AlgEcdsaSign>( PBYTE buf1, PBYTE buf2, PBYTE buf3, SIZE_T keySize )
49024909{
49034910 SetupSymCryptCurves<ImpXxx>( buf1, keySize );
4904- SetupSymCryptEcdsaAndEcdh <ImpXxx>( buf1, buf2, buf3 );
4911+ SetupSymCryptEckey <ImpXxx>( buf1, buf2, buf3, SYMCRYPT_FLAG_ECKEY_ECDSA );
49054912}
49064913
49074914template <>
@@ -4952,7 +4959,7 @@ VOID
49524959algImpKeyPerfFunction<ImpXxx, AlgEcdsaVerify>( PBYTE buf1, PBYTE buf2, PBYTE buf3, SIZE_T keySize )
49534960{
49544961 SetupSymCryptCurves<ImpXxx>( buf1, keySize );
4955- SetupSymCryptEcdsaAndEcdh <ImpXxx>( buf1, buf2, buf3 );
4962+ SetupSymCryptEckey <ImpXxx>( buf1, buf2, buf3, SYMCRYPT_FLAG_ECKEY_ECDSA );
49564963}
49574964
49584965template <>
@@ -5003,7 +5010,7 @@ VOID
50035010algImpKeyPerfFunction<ImpXxx, AlgEcdh>( PBYTE buf1, PBYTE buf2, PBYTE buf3, SIZE_T keySize )
50045011{
50055012 SetupSymCryptCurves<ImpXxx>( buf1, keySize );
5006- SetupSymCryptEcdsaAndEcdh <ImpXxx>( buf1, buf2, buf3 );
5013+ SetupSymCryptEckey <ImpXxx>( buf1, buf2, buf3, SYMCRYPT_FLAG_ECKEY_ECDH );
50075014}
50085015
50095016template <>
0 commit comments