... я должен попытаться поймать исключение? Как лучше всего справиться с этим?
Это зависит от того, как вы хотите это сделать. Я думаю, что есть три варианта.
Информация ниже взята из Алгоритм цифровой подписи эллиптической кривой и SignatureVerificationFilter на вики Crypto ++.
Во-первых,вы можете перехватить исключение SignatureVerificationFailed
, если хотите:
try
{
DSA::Verifier verifier(publicKey);
StringSource ss2(message+signature, true,
new SignatureVerificationFilter(
verifier, NULL, THROW_EXCEPTION
/* SIGNATURE_AT_END */
)
);
std::cout << "Verified signature on message" << std::endl;
}
catch (SignatureVerificationFailed& ex)
{
std::cerr << "Failed to verify signature on message" << std::endl;
}
Во-вторых, вы можете получить результат в виде логического значения. Обратите внимание на отсутствие THROW_EXCEPTION
:
bool result = false;
StringSource ss(message+signature, true,
new SignatureVerificationFilter(
verifier,
new ArraySink(
(byte*)&result, sizeof(result)),
PUT_RESULT | SIGNATURE_AT_END
)
);
if(result)
std::cout << "Verified signature on message" << std::endl;
else
std::cerr << "Failed to verify signature on message" << std::endl;
В-третьих, вы можете отказаться от конвейеров и просто вызвать VerifyMessage
для объекта Verifier
:
bool result = verifier.VerifyMessage(ConstBytePtr(message), BytePtrSize(message), ConstBytePtr(signature), BytePtrSize(signature));
if(result)
std::cout << "Verified signature on message" << std::endl;
else
std::cerr << "Failed to verify signature on message" << std::endl;