// // ECDSADigestEngine.cpp // // // Library: Crypto // Package: ECDSA // Module: ECDSADigestEngine // // Copyright (c) 2008, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #include "Poco/Crypto/ECDSADigestEngine.h" #include namespace Poco { namespace Crypto { ECDSADigestEngine::ECDSADigestEngine(const ECKey& key, const std::string &name): _key(key), _engine(name) { } ECDSADigestEngine::~ECDSADigestEngine() { } std::size_t ECDSADigestEngine::digestLength() const { return _engine.digestLength(); } void ECDSADigestEngine::reset() { _engine.reset(); _digest.clear(); _signature.clear(); } const DigestEngine::Digest& ECDSADigestEngine::digest() { if (_digest.empty()) { _digest = _engine.digest(); } return _digest; } const DigestEngine::Digest& ECDSADigestEngine::signature() { if (_signature.empty()) { digest(); _signature.resize(_key.size()); unsigned sigLen = static_cast(_signature.size()); if (!ECDSA_sign(0, &_digest[0], static_cast(_digest.size()), &_signature[0], &sigLen, _key.impl()->getECKey())) { throw OpenSSLException(); } if (sigLen < _signature.size()) _signature.resize(sigLen); } return _signature; } bool ECDSADigestEngine::verify(const DigestEngine::Digest& sig) { digest(); EC_KEY* pKey = _key.impl()->getECKey(); if (pKey) { int ret = ECDSA_verify(0, &_digest[0], static_cast(_digest.size()), &sig[0], static_cast(sig.size()), pKey); if (1 == ret) return true; else if (0 == ret) return false; } throw OpenSSLException(); } void ECDSADigestEngine::updateImpl(const void* data, std::size_t length) { _engine.update(data, length); } } } // namespace Poco::Crypto