Skip to content

Commit

Permalink
Cleanup pdns/digests.hh
Browse files Browse the repository at this point in the history
  • Loading branch information
fredmorcos committed Jan 22, 2024
1 parent 99be55f commit f2e4e85
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 25 deletions.
1 change: 0 additions & 1 deletion .not-formatted
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
./pdns/dbdnsseckeeper.cc
./pdns/delaypipe.cc
./pdns/delaypipe.hh
./pdns/digests.hh
./pdns/distributor.hh
./pdns/dns.cc
./pdns/dns.hh
Expand Down
46 changes: 26 additions & 20 deletions pdns/digests.hh
Original file line number Diff line number Diff line change
Expand Up @@ -21,61 +21,67 @@
*/
#pragma once

#include "config.h"
#include <memory>
#include <stdexcept>
#include <string>

#include <openssl/evp.h>

inline std::string pdns_hash(const EVP_MD * md, const std::string& input)
namespace pdns
{
inline std::string hash(const EVP_MD* messageDigest, const std::string& input)
{
#if defined(HAVE_EVP_MD_CTX_NEW) && defined(HAVE_EVP_MD_CTX_FREE)
auto mdctx = std::unique_ptr<EVP_MD_CTX, void(*)(EVP_MD_CTX*)>(EVP_MD_CTX_new(), EVP_MD_CTX_free);
auto mdctx = std::unique_ptr<EVP_MD_CTX, void (*)(EVP_MD_CTX*)>(EVP_MD_CTX_new(), EVP_MD_CTX_free);
#else
auto mdctx = std::unique_ptr<EVP_MD_CTX, void(*)(EVP_MD_CTX*)>(EVP_MD_CTX_create(), EVP_MD_CTX_destroy);
auto mdctx = std::unique_ptr<EVP_MD_CTX, void (*)(EVP_MD_CTX*)>(EVP_MD_CTX_create(), EVP_MD_CTX_destroy);
#endif
if (!mdctx) {
throw std::runtime_error(std::string(EVP_MD_name(md)) + " context initialization failed");
throw std::runtime_error(std::string(EVP_MD_name(messageDigest)) + " context initialization failed");
}

if (EVP_DigestInit_ex(mdctx.get(), md, nullptr) != 1) {
throw std::runtime_error(std::string(EVP_MD_name(md)) + " EVP initialization failed");
if (EVP_DigestInit_ex(mdctx.get(), messageDigest, nullptr) != 1) {
throw std::runtime_error(std::string(EVP_MD_name(messageDigest)) + " EVP initialization failed");
}

if (EVP_DigestUpdate(mdctx.get(), input.data(), input.size()) != 1) {
throw std::runtime_error(std::string(EVP_MD_name(md)) + " EVP update failed");
throw std::runtime_error(std::string(EVP_MD_name(messageDigest)) + " EVP update failed");
}

unsigned int written;
unsigned int written = 0;
std::string result;
result.resize(EVP_MD_size(md));
result.resize(EVP_MD_size(messageDigest));

if (EVP_DigestFinal_ex(mdctx.get(), const_cast<unsigned char *>(reinterpret_cast<const unsigned char*>(result.c_str())), &written) != 1) {
throw std::runtime_error(std::string(EVP_MD_name(md)) + " EVP final failed");
// NOLINTNEXTLINE(*-cast): Using OpenSSL C APIs.
if (EVP_DigestFinal_ex(mdctx.get(), const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(result.c_str())), &written) != 1) {
throw std::runtime_error(std::string(EVP_MD_name(messageDigest)) + " EVP final failed");
}

if (written != result.size()) {
throw std::runtime_error(std::string(EVP_MD_name(md)) + " EVP final wrote " + std::to_string(written) + ", expected " + std::to_string(result.size()));
throw std::runtime_error(std::string(EVP_MD_name(messageDigest)) + " EVP final wrote " + std::to_string(written) + ", expected " + std::to_string(result.size()));
}

return result;
}

inline std::string pdns_md5(const std::string& input)
inline std::string md5(const std::string& input)
{
const auto md = EVP_md5();
if (md == nullptr) {
const auto* const messageDigest = EVP_md5();
if (messageDigest == nullptr) {
throw std::runtime_error("The MD5 digest is not available via the OpenSSL EVP interface");
}

return pdns_hash(md, input);
return pdns::hash(messageDigest, input);
}

inline std::string pdns_sha1(const std::string& input)
inline std::string sha1(const std::string& input)
{
const auto md = EVP_sha1();
if (md == nullptr) {
const auto* const messageDigest = EVP_sha1();
if (messageDigest == nullptr) {
throw std::runtime_error("The SHA1 digest is not available via the OpenSSL EVP interface");
}

return pdns_hash(md, input);
return pdns::hash(messageDigest, input);
}
}
4 changes: 2 additions & 2 deletions pdns/dnssecsigner.cc
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ AtomicCounter* g_signatureCount;
static std::string getLookupKeyFromMessage(const std::string& msg)
{
try {
return pdns_md5(msg);
return pdns::md5(msg);
}
catch(const std::runtime_error& e) {
return pdns_sha1(msg);
return pdns::sha1(msg);
}
}

Expand Down
4 changes: 2 additions & 2 deletions pdns/test-digests_hh.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ BOOST_AUTO_TEST_SUITE(test_digests_hh)
BOOST_AUTO_TEST_CASE(test_pdns_md5sum)
{
std::string result = "a3 24 8c e3 1a 88 a6 40 e6 30 73 98 57 6d 06 9e ";
std::string sum = pdns_md5("a quick brown fox jumped over the lazy dog");
std::string sum = pdns::md5("a quick brown fox jumped over the lazy dog");

BOOST_CHECK_EQUAL(makeHexDump(sum), result);
}

BOOST_AUTO_TEST_CASE(test_pdns_sha1sum)
{
std::string result = "b9 37 10 0d c9 57 b3 86 d9 cb 77 fc 90 c0 18 22 fd eb 6e 7f ";
std::string sum = pdns_sha1("a quick brown fox jumped over the lazy dog");
std::string sum = pdns::sha1("a quick brown fox jumped over the lazy dog");

BOOST_CHECK_EQUAL(makeHexDump(sum), result);
}
Expand Down

0 comments on commit f2e4e85

Please sign in to comment.