Skip to content

Commit 7a33bae

Browse files
Antoine LochetMatthiasValvekens
authored andcommitted
Added verifying for ECDSA with hashing
1 parent a5d8b93 commit 7a33bae

File tree

4 files changed

+320
-17
lines changed

4 files changed

+320
-17
lines changed

src/lib/SoftHSM.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,6 +1247,11 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_
12471247
pInfo->flags = CKF_GENERATE_KEY_PAIR | CKF_EC_COMMOM;
12481248
break;
12491249
case CKM_ECDSA:
1250+
case CKM_ECDSA_SHA1:
1251+
case CKM_ECDSA_SHA224:
1252+
case CKM_ECDSA_SHA256:
1253+
case CKM_ECDSA_SHA384:
1254+
case CKM_ECDSA_SHA512:
12501255
pInfo->ulMinKeySize = ecdsaMinSize;
12511256
pInfo->ulMaxKeySize = ecdsaMaxSize;
12521257
pInfo->flags = CKF_SIGN | CKF_VERIFY | CKF_EC_COMMOM;
@@ -5366,6 +5371,31 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech
53665371
bAllowMultiPartOp = false;
53675372
isECDSA = true;
53685373
break;
5374+
case CKM_ECDSA_SHA1:
5375+
mechanism = AsymMech::ECDSA_SHA1;
5376+
bAllowMultiPartOp = false;
5377+
isECDSA = true;
5378+
break;
5379+
case CKM_ECDSA_SHA224:
5380+
mechanism = AsymMech::ECDSA_SHA224;
5381+
bAllowMultiPartOp = false;
5382+
isECDSA = true;
5383+
break;
5384+
case CKM_ECDSA_SHA256:
5385+
mechanism = AsymMech::ECDSA_SHA256;
5386+
bAllowMultiPartOp = false;
5387+
isECDSA = true;
5388+
break;
5389+
case CKM_ECDSA_SHA384:
5390+
mechanism = AsymMech::ECDSA_SHA384;
5391+
bAllowMultiPartOp = false;
5392+
isECDSA = true;
5393+
break;
5394+
case CKM_ECDSA_SHA512:
5395+
mechanism = AsymMech::ECDSA_SHA512;
5396+
bAllowMultiPartOp = false;
5397+
isECDSA = true;
5398+
break;
53695399
#endif
53705400
#ifdef WITH_GOST
53715401
case CKM_GOSTR3410:

src/lib/crypto/BotanECDSA.cpp

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -196,18 +196,33 @@ bool BotanECDSA::verify(PublicKey* publicKey, const ByteString& originalData,
196196
const ByteString& signature, const AsymMech::Type mechanism,
197197
const void* /* param = NULL */, const size_t /* paramLen = 0 */)
198198
{
199-
std::string emsa;
199+
std::string emsa = "Raw";
200200

201-
if (mechanism == AsymMech::ECDSA)
202-
{
203-
emsa = "Raw";
204-
}
205-
else
201+
HashAlgo::Type hash = HashAlgo::Unknown;
202+
if (mechanism != AsymMech::ECDSA)
203+
{
204+
switch (mechanism)
206205
{
207-
ERROR_MSG("Invalid mechanism supplied (%i)", mechanism);
208-
209-
return false;
210-
}
206+
case AsymMech::ECDSA_SHA1:
207+
hash = HashAlgo::SHA1;
208+
break;
209+
case AsymMech::ECDSA_SHA224:
210+
hash = HashAlgo::SHA224;
211+
break;
212+
case AsymMech::ECDSA_SHA256:
213+
hash = HashAlgo::SHA256;
214+
break;
215+
case AsymMech::ECDSA_SHA384:
216+
hash = HashAlgo::SHA384;
217+
break;
218+
case AsymMech::ECDSA_SHA512:
219+
hash = HashAlgo::SHA512;
220+
break;
221+
default:
222+
ERROR_MSG("Invalid mechanism supplied (%i)", mechanism);
223+
return false;
224+
}
225+
}
211226

212227
// Check if the public key is the right type
213228
if (!publicKey->isOfType(BotanECDSAPublicKey::type))
@@ -238,12 +253,30 @@ bool BotanECDSA::verify(PublicKey* publicKey, const ByteString& originalData,
238253
return false;
239254
}
240255

256+
// Pre-hash the data if necessary
257+
ByteString prepDataToSign;
258+
259+
if (hash == HashAlgo::Unknown) {
260+
prepDataToSign = originalData;
261+
} else {
262+
HashAlgorithm* digest = BotanCryptoFactory::i()->getHashAlgorithm(hash);
263+
264+
if (!digest->hashInit()
265+
|| !digest->hashUpdate(originalData)
266+
|| !digest->hashFinal(prepDataToSign))
267+
{
268+
delete digest;
269+
return false;
270+
}
271+
delete digest;
272+
}
273+
241274
// Perform the verify operation
242275
bool verResult;
243276
try
244277
{
245-
verResult = verifier->verify_message(originalData.const_byte_str(),
246-
originalData.size(),
278+
verResult = verifier->verify_message(prepDataToSign.const_byte_str(),
279+
prepDataToSign.size(),
247280
signature.const_byte_str(),
248281
signature.size());
249282
}

src/lib/crypto/OSSLECDSA.cpp

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,33 @@ bool OSSLECDSA::verify(PublicKey* publicKey, const ByteString& originalData,
185185
const ByteString& signature, const AsymMech::Type mechanism,
186186
const void* /* param = NULL */, const size_t /* paramLen = 0 */)
187187
{
188+
189+
HashAlgo::Type hash = HashAlgo::Unknown;
190+
188191
if (mechanism != AsymMech::ECDSA)
189-
{
190-
ERROR_MSG("Invalid mechanism supplied (%i)", mechanism);
191-
return false;
192-
}
192+
{
193+
switch (mechanism)
194+
{
195+
case AsymMech::ECDSA_SHA1:
196+
hash = HashAlgo::SHA1;
197+
break;
198+
case AsymMech::ECDSA_SHA224:
199+
hash = HashAlgo::SHA224;
200+
break;
201+
case AsymMech::ECDSA_SHA256:
202+
hash = HashAlgo::SHA256;
203+
break;
204+
case AsymMech::ECDSA_SHA384:
205+
hash = HashAlgo::SHA384;
206+
break;
207+
case AsymMech::ECDSA_SHA512:
208+
hash = HashAlgo::SHA512;
209+
break;
210+
default:
211+
ERROR_MSG("Invalid mechanism supplied (%i)", mechanism);
212+
return false;
213+
}
214+
}
193215

194216
// Check if the private key is the right type
195217
if (!publicKey->isOfType(OSSLECPublicKey::type))
@@ -253,7 +275,25 @@ bool OSSLECDSA::verify(PublicKey* publicKey, const ByteString& originalData,
253275
ECDSA_SIG_free(sig);
254276
return false;
255277
}
256-
int ret = ECDSA_do_verify(originalData.const_byte_str(), originalData.size(), sig, eckey);
278+
279+
// Pre-hash the data if necessary
280+
ByteString prepDataToSign;
281+
if (hash == HashAlgo::Unknown) {
282+
prepDataToSign = originalData;
283+
} else {
284+
HashAlgorithm* digest = CryptoFactory::i()->getHashAlgorithm(hash);
285+
286+
if (!digest->hashInit()
287+
|| !digest->hashUpdate(originalData)
288+
|| !digest->hashFinal(prepDataToSign))
289+
{
290+
delete digest;
291+
return false;
292+
}
293+
delete digest;
294+
}
295+
296+
int ret = ECDSA_do_verify(prepDataToSign.const_byte_str(), prepDataToSign.size(), sig, eckey);
257297
if (ret != 1)
258298
{
259299
if (ret < 0)

0 commit comments

Comments
 (0)