From 85876699954e64e2a19b137d71d9434caa9d6514 Mon Sep 17 00:00:00 2001 From: Nils Maier Date: Tue, 10 Jun 2014 13:09:08 +0200 Subject: Fix big endianess support in InternalMessageDigest and PBKDF2 - Replace sha1/md5 implementation by ones from https://github.com/nmaier/crypto - Add endianess functionality fro https://github.com/nmaier/crypto Closes GH-239 --- src/InternalMessageDigestImpl.cc | 84 ++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 47 deletions(-) (limited to 'src/InternalMessageDigestImpl.cc') diff --git a/src/InternalMessageDigestImpl.cc b/src/InternalMessageDigestImpl.cc index b74fe053..c9ad99a7 100644 --- a/src/InternalMessageDigestImpl.cc +++ b/src/InternalMessageDigestImpl.cc @@ -35,81 +35,71 @@ #include "MessageDigestImpl.h" -#include "md5.h" -#include "sha1.h" +#include "crypto_hash.h" -namespace aria2 { namespace { +using namespace aria2; +using namespace crypto; -template -class MessageDigestBase : public MessageDigestImpl { +template +class MessageDigestBase : public MessageDigestImpl +{ public: - MessageDigestBase() : ctx_(nullptr) { reset(); } - virtual ~MessageDigestBase() - { - free_fn(&ctx_); - } + MessageDigestBase() : ctx_{hash::create(algo)} {} + virtual ~MessageDigestBase() {} - static size_t length() + static size_t length() { - return dlen; + auto ctx = hash::create(algo); + return ctx->length(); } + virtual size_t getDigestLength() const CXX11_OVERRIDE { - return dlen; + return ctx_->length(); } + virtual void reset() CXX11_OVERRIDE { - free_fn(&ctx_); - init_fn(&ctx_); + ctx_->reset(); } - virtual void update(const void* data, size_t length) CXX11_OVERRIDE + + virtual void update(const void *data, size_t length) CXX11_OVERRIDE { - auto bytes = reinterpret_cast(data); - while (length) { - size_t l = std::min(length, (size_t)std::numeric_limits::max()); - update_fn(ctx_, bytes, l); - length -= l; - bytes += l; - } + ctx_->update(data, length); } - virtual void digest(unsigned char* md) CXX11_OVERRIDE + + virtual void digest(unsigned char *md) CXX11_OVERRIDE { - final_fn(ctx_, md); + auto rv = ctx_->finalize(); + memcpy(md, rv.data(), rv.length()); } + private: - ctx_t* ctx_; + std::unique_ptr ctx_; }; -typedef MessageDigestBase -MessageDigestMD5; -typedef MessageDigestBase -MessageDigestSHA1; +typedef MessageDigestBase MessageDigestMD5; +typedef MessageDigestBase MessageDigestSHA1; +typedef MessageDigestBase MessageDigestSHA224; +typedef MessageDigestBase MessageDigestSHA256; +typedef MessageDigestBase MessageDigestSHA384; +typedef MessageDigestBase MessageDigestSHA512; } // namespace -std::unique_ptr MessageDigestImpl::sha1() -{ +namespace aria2 { + +std::unique_ptr MessageDigestImpl::sha1() { return make_unique(); } MessageDigestImpl::hashes_t MessageDigestImpl::hashes = { { "sha-1", make_hi() }, + { "sha-224", make_hi() }, + { "sha-256", make_hi() }, + { "sha-384", make_hi() }, + { "sha-512", make_hi() }, { "md5", make_hi() }, }; -- cgit