mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-11 08:52:06 +00:00
81 lines
1.5 KiB
C++
81 lines
1.5 KiB
C++
|
//
|
||
|
// DigestEngine.cpp
|
||
|
//
|
||
|
// Library: Crypto
|
||
|
// Package: Digest
|
||
|
// Module: DigestEngine
|
||
|
//
|
||
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
||
|
// and Contributors.
|
||
|
//
|
||
|
// SPDX-License-Identifier: BSL-1.0
|
||
|
//
|
||
|
|
||
|
|
||
|
#include "Poco/Crypto/DigestEngine.h"
|
||
|
#include "Poco/Exception.h"
|
||
|
|
||
|
|
||
|
namespace Poco {
|
||
|
namespace Crypto {
|
||
|
|
||
|
|
||
|
DigestEngine::DigestEngine(const std::string& name):
|
||
|
_name(name),
|
||
|
_pContext(EVP_MD_CTX_create())
|
||
|
{
|
||
|
const EVP_MD* md = EVP_get_digestbyname(_name.c_str());
|
||
|
if (!md) throw Poco::NotFoundException(_name);
|
||
|
EVP_DigestInit_ex(_pContext, md, NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
DigestEngine::~DigestEngine()
|
||
|
{
|
||
|
EVP_MD_CTX_destroy(_pContext);
|
||
|
}
|
||
|
|
||
|
int DigestEngine::nid() const
|
||
|
{
|
||
|
return EVP_MD_type(EVP_MD_CTX_md(_pContext));
|
||
|
}
|
||
|
|
||
|
std::size_t DigestEngine::digestLength() const
|
||
|
{
|
||
|
return EVP_MD_CTX_size(_pContext);
|
||
|
}
|
||
|
|
||
|
|
||
|
void DigestEngine::reset()
|
||
|
{
|
||
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
|
||
|
EVP_MD_CTX_free(_pContext);
|
||
|
_pContext = EVP_MD_CTX_create();
|
||
|
#else
|
||
|
EVP_MD_CTX_cleanup(_pContext);
|
||
|
#endif
|
||
|
const EVP_MD* md = EVP_get_digestbyname(_name.c_str());
|
||
|
if (!md) throw Poco::NotFoundException(_name);
|
||
|
EVP_DigestInit_ex(_pContext, md, NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
const Poco::DigestEngine::Digest& DigestEngine::digest()
|
||
|
{
|
||
|
_digest.clear();
|
||
|
unsigned len = EVP_MD_CTX_size(_pContext);
|
||
|
_digest.resize(len);
|
||
|
EVP_DigestFinal_ex(_pContext, &_digest[0], &len);
|
||
|
reset();
|
||
|
return _digest;
|
||
|
}
|
||
|
|
||
|
|
||
|
void DigestEngine::updateImpl(const void* data, std::size_t length)
|
||
|
{
|
||
|
EVP_DigestUpdate(_pContext, data, length);
|
||
|
}
|
||
|
|
||
|
|
||
|
} } // namespace Poco::Crypto
|