bool BotanDSA::reconstructPublicKey(PublicKey** ppPublicKey, ByteString& serialisedData) { // Check input if ((ppPublicKey == NULL) || (serialisedData.size() == 0)) { return false; } BotanDSAPublicKey* pub = new BotanDSAPublicKey(); if (!pub->deserialise(serialisedData)) { delete pub; return false; } *ppPublicKey = pub; return true; }
bool BotanDSA::verifyInit(PublicKey* publicKey, const std::string mechanism) { if (!AsymmetricAlgorithm::verifyInit(publicKey, mechanism)) { return false; } // Check if the public key is the right type if (!publicKey->isOfType(BotanDSAPublicKey::type)) { ERROR_MSG("Invalid key type supplied"); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } std::string lowerMechanism; lowerMechanism.resize(mechanism.size()); std::transform(mechanism.begin(), mechanism.end(), lowerMechanism.begin(), tolower); std::string emsa; if (!lowerMechanism.compare("dsa-sha1")) { emsa = "EMSA1(SHA-160)"; } else if (!lowerMechanism.compare("dsa-sha224")) { emsa = "EMSA1(SHA-224)"; } else if (!lowerMechanism.compare("dsa-sha256")) { emsa = "EMSA1(SHA-256)"; } else if (!lowerMechanism.compare("dsa-sha384")) { emsa = "EMSA1(SHA-384)"; } else if (!lowerMechanism.compare("dsa-sha512")) { emsa = "EMSA1(SHA-512)"; } else { ERROR_MSG("Invalid mechanism supplied (%s)", mechanism.c_str()); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } BotanDSAPublicKey* pk = (BotanDSAPublicKey*) currentPublicKey; Botan::DSA_PublicKey* botanKey = pk->getBotanKey(); if (!botanKey) { ERROR_MSG("Could not get the Botan public key"); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } try { verifier = new Botan::PK_Verifier(*botanKey, emsa); } catch (...) { ERROR_MSG("Could not create the verifier token"); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } return true; }
bool BotanDSA::verifyInit(PublicKey* publicKey, const AsymMech::Type mechanism, const void* param /* = NULL */, const size_t paramLen /* = 0 */) { if (!AsymmetricAlgorithm::verifyInit(publicKey, mechanism, param, paramLen)) { return false; } // Check if the public key is the right type if (!publicKey->isOfType(BotanDSAPublicKey::type)) { ERROR_MSG("Invalid key type supplied"); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } std::string emsa; switch (mechanism) { case AsymMech::DSA_SHA1: emsa = "EMSA1(SHA-160)"; break; case AsymMech::DSA_SHA224: emsa = "EMSA1(SHA-224)"; break; case AsymMech::DSA_SHA256: emsa = "EMSA1(SHA-256)"; break; case AsymMech::DSA_SHA384: emsa = "EMSA1(SHA-384)"; break; case AsymMech::DSA_SHA512: emsa = "EMSA1(SHA-512)"; break; default: ERROR_MSG("Invalid mechanism supplied (%i)", mechanism); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } BotanDSAPublicKey* pk = (BotanDSAPublicKey*) currentPublicKey; Botan::DSA_PublicKey* botanKey = pk->getBotanKey(); if (!botanKey) { ERROR_MSG("Could not get the Botan public key"); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } try { verifier = new Botan::PK_Verifier(*botanKey, emsa); } catch (...) { ERROR_MSG("Could not create the verifier token"); ByteString dummy; AsymmetricAlgorithm::verifyFinal(dummy); return false; } return true; }
// Verification functions bool BotanDSA::verify(PublicKey* publicKey, const ByteString& originalData, const ByteString& signature, const std::string mechanism) { std::string lowerMechanism; lowerMechanism.resize(mechanism.size()); std::transform(mechanism.begin(), mechanism.end(), lowerMechanism.begin(), tolower); std::string emsa; if (!lowerMechanism.compare("dsa")) { emsa = "Raw"; } else { // Call the generic function return AsymmetricAlgorithm::verify(publicKey, originalData, signature, mechanism); } // Check if the public key is the right type if (!publicKey->isOfType(BotanDSAPublicKey::type)) { ERROR_MSG("Invalid key type supplied"); return false; } BotanDSAPublicKey* pk = (BotanDSAPublicKey*) publicKey; Botan::DSA_PublicKey* botanKey = pk->getBotanKey(); if (!botanKey) { ERROR_MSG("Could not get the Botan public key"); return false; } try { verifier = new Botan::PK_Verifier(*botanKey, emsa); } catch (...) { ERROR_MSG("Could not create the verifier token"); return false; } // Perform the verify operation bool verResult; try { verResult = verifier->verify_message(originalData.const_byte_str(), originalData.size(), signature.const_byte_str(), signature.size()); } catch (...) { ERROR_MSG("Could not check the signature"); delete verifier; verifier = NULL; return false; } delete verifier; verifier = NULL; return verResult; }
// Verification functions bool BotanDSA::verify(PublicKey* publicKey, const ByteString& originalData, const ByteString& signature, const AsymMech::Type mechanism, const void* param /* = NULL */, const size_t paramLen /* = 0 */) { std::string emsa; if (mechanism == AsymMech::DSA) { emsa = "Raw"; } else { // Call the generic function return AsymmetricAlgorithm::verify(publicKey, originalData, signature, mechanism, param, paramLen); } // Check if the public key is the right type if (!publicKey->isOfType(BotanDSAPublicKey::type)) { ERROR_MSG("Invalid key type supplied"); return false; } BotanDSAPublicKey* pk = (BotanDSAPublicKey*) publicKey; Botan::DSA_PublicKey* botanKey = pk->getBotanKey(); if (!botanKey) { ERROR_MSG("Could not get the Botan public key"); return false; } try { verifier = new Botan::PK_Verifier(*botanKey, emsa); } catch (...) { ERROR_MSG("Could not create the verifier token"); return false; } // Perform the verify operation bool verResult; try { verResult = verifier->verify_message(originalData.const_byte_str(), originalData.size(), signature.const_byte_str(), signature.size()); } catch (...) { ERROR_MSG("Could not check the signature"); delete verifier; verifier = NULL; return false; } delete verifier; verifier = NULL; return verResult; }