@@ -53,6 +53,7 @@ SYMCRYPT_ECC_CURVES rgbInternalCurves[] = {
5353// //////////////////////////////////////////////////////////////////
5454
5555#define SYMCRYPT_ECC_SHA1 " SHA1"
56+ #define SYMCRYPT_ECC_SHA224 " SHA224"
5657#define SYMCRYPT_ECC_SHA256 " SHA256"
5758#define SYMCRYPT_ECC_SHA384 " SHA384"
5859#define SYMCRYPT_ECC_SHA512 " SHA512"
@@ -65,6 +66,7 @@ typedef struct _SYMCRYPT_ECC_HASH_ALGORITHMS {
6566
6667SYMCRYPT_ECC_HASH_ALGORITHMS rgbHashAlgorithms[] = {
6768 { SYMCRYPT_ECC_SHA1, SymCryptSha1Algorithm },
69+ { SYMCRYPT_ECC_SHA224, NULL },
6870 { SYMCRYPT_ECC_SHA256, SymCryptSha256Algorithm },
6971 { SYMCRYPT_ECC_SHA384, SymCryptSha384Algorithm },
7072 { SYMCRYPT_ECC_SHA512, SymCryptSha512Algorithm },
@@ -866,6 +868,8 @@ testEcdsaVerify(
866868 PSYMCRYPT_ECKEY pkPublic = NULL ;
867869
868870 BYTE pbHashValue[SYMCRYPT_SHA512_RESULT_SIZE] = { 0 };
871+ PCBYTE pbDigest = NULL ;
872+ UINT32 cbDigest = 0 ;
869873 BYTE pbSignature[2 * ((SYMCRYPT_BITSIZE_P521 + 7 )/8 )] = { 0 }; // big enough to hold any signature
870874 BYTE pbPublicKey[2 * ((SYMCRYPT_BITSIZE_P521 + 7 )/8 )] = { 0 }; // or the X,Y coordinates of a public key
871875
@@ -874,8 +878,16 @@ testEcdsaVerify(
874878 CHECK3 ( pkPublic!=NULL , " Failure to allocate public key for ECDSA record at line %lld" , line );
875879
876880 // Hash the message
877- CHECK3 ( SYMCRYPT_SHA512_RESULT_SIZE >= pHash->resultSize , " Hash result too big for ECDSA record at line %lld" , line );
878- SymCryptHash ( pHash, pbMsg, cbMsg, pbHashValue, pHash->resultSize );
881+ if ( pHash != NULL )
882+ {
883+ CHECK3 ( SYMCRYPT_SHA512_RESULT_SIZE >= pHash->resultSize , " Hash result too big for ECDSA record at line %lld" , line );
884+ SymCryptHash ( pHash, pbMsg, cbMsg, pbHashValue, pHash->resultSize );
885+ pbDigest = &pbHashValue[0 ];
886+ cbDigest = pHash->resultSize ;
887+ } else {
888+ pbDigest = pbMsg;
889+ cbDigest = (UINT32) cbMsg;
890+ }
879891
880892 // Set the public key
881893 memcpy (pbPublicKey, pbQx, cbQx);
@@ -899,8 +911,8 @@ testEcdsaVerify(
899911 // Verify
900912 scError = SymCryptEcDsaVerify (
901913 pkPublic,
902- pbHashValue ,
903- pHash-> resultSize ,
914+ pbDigest ,
915+ cbDigest ,
904916 pbSignature,
905917 cbR + cbS,
906918 SYMCRYPT_NUMBER_FORMAT_MSB_FIRST,
@@ -915,6 +927,10 @@ testEcdsaVerify(
915927 {
916928 CHECK3 ( scError == SYMCRYPT_SIGNATURE_VERIFICATION_FAILURE, " Wrong EcDsaVerify result for ECDSA record at line %lld" , line );
917929 }
930+ else
931+ {
932+ CHECK3 ( scError == SYMCRYPT_NO_ERROR, " Wrong EcDsaVerify result for ECDSA record at line %lld" , line );
933+ }
918934
919935 SymCryptEckeyFree ( pkPublic );
920936
@@ -954,6 +970,8 @@ testEcdsaSign(
954970 PSYMCRYPT_INT piK = NULL ;
955971
956972 BYTE pbHashValue[SYMCRYPT_SHA512_RESULT_SIZE] = { 0 };
973+ PCBYTE pbDigest = NULL ;
974+ UINT32 cbDigest = 0 ;
957975 BYTE pbSignature[2 * ((SYMCRYPT_BITSIZE_P521 + 7 )/8 )] = { 0 }; // big enough to hold any signature
958976
959977 // Allocate the private key and the random exponent K
@@ -963,6 +981,17 @@ testEcdsaSign(
963981 CHECK3 ( piK!=NULL , " Failure to allocate random exponent K for ECDSA record at line %lld" , line );
964982
965983 // Hash the message
984+ if ( pHash != NULL )
985+ {
986+ CHECK3 ( SYMCRYPT_SHA512_RESULT_SIZE >= pHash->resultSize , " Hash result too big for ECDSA record at line %lld" , line );
987+ SymCryptHash ( pHash, pbMsg, cbMsg, pbHashValue, pHash->resultSize );
988+ pbDigest = &pbHashValue[0 ];
989+ cbDigest = pHash->resultSize ;
990+ } else {
991+ pbDigest = pbMsg;
992+ cbDigest = (UINT32) cbMsg;
993+ }
994+ CHECK ( pHash != NULL , " Unsupported " )
966995 CHECK3 ( SYMCRYPT_SHA512_RESULT_SIZE >= pHash->resultSize , " Hash result too big for ECDSA record at line %lld" , line );
967996 SymCryptHash ( pHash, pbMsg, cbMsg, pbHashValue, pHash->resultSize );
968997
@@ -1000,8 +1029,8 @@ testEcdsaSign(
10001029 // Sign
10011030 scError = SymCryptEcDsaSignEx (
10021031 pkPrivate,
1003- pbHashValue ,
1004- pHash-> resultSize ,
1032+ pbDigest ,
1033+ cbDigest ,
10051034 piK,
10061035 SYMCRYPT_NUMBER_FORMAT_MSB_FIRST,
10071036 0 ,
@@ -1248,14 +1277,21 @@ testEccEcdsaKats()
12481277 break ;
12491278 }
12501279 }
1251- if (!bHashFound)
1280+
1281+ if (bHashFound)
12521282 {
1253- dprint ( " Ecdsa record at line %lld is skipped due to unknown hash function.\n " , line);
1254- continue ; // Skip this record if the hash algorithm is not in SymCrypt (e.g. SHA224)
1283+ pHash = rgbHashAlgorithms[i].pHash ;
1284+ if ( pHash == NULL )
1285+ {
1286+ dprint ( " Ecdsa record at line %lld is skipped due to unsupported hash function (%s).\n " , line, rgbHashAlgorithms[i].pszHashName );
1287+ continue ; // Skip this record
1288+ }
1289+ }
1290+ else
1291+ {
1292+ dprint ( " Assuming no hash function for unknown hash function.\n " , line);
1293+ pHash = NULL ;
12551294 }
1256-
1257- pHash = rgbHashAlgorithms[i].pHash ;
1258- CHECK3 ( pHash != NULL , " NULL hash for ECDSA record at line %lld" , line );
12591295
12601296 BString katMsg = katParseData ( katItem, " msg" );
12611297 BString katQx = katParseData ( katItem, " qx" );
@@ -1327,15 +1363,22 @@ testEccEcdsaKats()
13271363 break ;
13281364 }
13291365 }
1330- if (!bHashFound)
1366+
1367+ if (bHashFound)
1368+ {
1369+ pHash = rgbHashAlgorithms[i].pHash ;
1370+ if ( pHash == NULL )
1371+ {
1372+ dprint ( " Ecdsa record at line %lld is skipped due to unsupported hash function (%s).\n " , line, rgbHashAlgorithms[i].pszHashName );
1373+ continue ; // Skip this record
1374+ }
1375+ }
1376+ else
13311377 {
1332- dprint ( " Ecdsa record at line %lld is skipped due to unknown hash function.\n " , line);
1333- continue ; // Skip this record if the hash algorithm is not in SymCrypt (e.g. SHA224)
1378+ dprint ( " Assuming no hash function for unknown hash function.\n " , line);
1379+ pHash = NULL ;
13341380 }
13351381
1336- pHash = rgbHashAlgorithms[i].pHash ;
1337- CHECK3 ( pHash != NULL , " NULL hash for ECDSA record at line %lld" , line );
1338-
13391382 BString katMsg = katParseData ( katItem, " msg" );
13401383 BString katD = katParseData ( katItem, " d" );
13411384 BString katQx = katParseData ( katItem, " qx" );
0 commit comments