// // RSADigestEngine.cpp // // Library: Crypto // Package: RSA // Module: RSADigestEngine // // Copyright (c) 2008, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #include "Poco/Crypto/RSADigestEngine.h" #include namespace Poco { namespace Crypto { RSADigestEngine::RSADigestEngine(const RSAKey& key, DigestType digestType): _key(key), _engine(digestType == DIGEST_MD5 ? "MD5" : "SHA1") { } RSADigestEngine::RSADigestEngine(const RSAKey& key, const std::string &name): _key(key), _engine(name) { } RSADigestEngine::~RSADigestEngine() { } std::size_t RSADigestEngine::digestLength() const { return _engine.digestLength(); } void RSADigestEngine::reset() { _engine.reset(); _digest.clear(); _signature.clear(); } const DigestEngine::Digest& RSADigestEngine::digest() { if (_digest.empty()) { _digest = _engine.digest(); } return _digest; } const DigestEngine::Digest& RSADigestEngine::signature() { if (_signature.empty()) { digest(); _signature.resize(_key.size()); unsigned sigLen = static_cast(_signature.size()); RSA_sign(_engine.nid(), &_digest[0], static_cast(_digest.size()), &_signature[0], &sigLen, _key.impl()->getRSA()); // truncate _sig to sigLen if (sigLen < _signature.size()) _signature.resize(sigLen); } return _signature; } bool RSADigestEngine::verify(const DigestEngine::Digest& sig) { digest(); DigestEngine::Digest sigCpy = sig; // copy becausse RSA_verify can modify sigCpy int ret = RSA_verify(_engine.nid(), &_digest[0], static_cast(_digest.size()), &sigCpy[0], static_cast(sigCpy.size()), _key.impl()->getRSA()); return ret != 0; } void RSADigestEngine::updateImpl(const void* data, std::size_t length) { _engine.update(data, length); } } } // namespace Poco::Crypto