diff options
| author | Nils Maier <maierman@web.de> | 2014-06-10 13:09:08 +0200 |
|---|---|---|
| committer | Nils Maier <maierman@web.de> | 2014-06-24 20:45:05 +0200 |
| commit | 85876699954e64e2a19b137d71d9434caa9d6514 (patch) | |
| tree | ff0381e32161e30cfeee850226f325125fc2d50f /src/InternalMessageDigestImpl.cc | |
| parent | 60032bf0abc7a8cbb83e649d5cb5cebe803f7f94 (diff) | |
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
Diffstat (limited to 'src/InternalMessageDigestImpl.cc')
| -rw-r--r-- | src/InternalMessageDigestImpl.cc | 84 |
1 files changed, 37 insertions, 47 deletions
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<size_t dlen, - typename ctx_t, - int (*init_fn)(ctx_t**), - void (*update_fn)(ctx_t*, const void*, size_t), - void (*final_fn)(ctx_t*, uint8_t*), - void (*free_fn)(ctx_t**)> -class MessageDigestBase : public MessageDigestImpl { +template<hash::Algorithms algo> +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<const char*>(data); - while (length) { - size_t l = std::min(length, (size_t)std::numeric_limits<uint32_t>::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<hash::Algorithm> ctx_; }; -typedef MessageDigestBase<MD5_LENGTH, - struct MD5_CTX, - MD5_Init, - MD5_Update, - MD5_Final, - MD5_Free> -MessageDigestMD5; -typedef MessageDigestBase<SHA1_LENGTH, - SHA1_CTX, - SHA1_Init, - SHA1_Update, - SHA1_Final, - SHA1_Free> -MessageDigestSHA1; +typedef MessageDigestBase<hash::algoMD5> MessageDigestMD5; +typedef MessageDigestBase<hash::algoSHA1> MessageDigestSHA1; +typedef MessageDigestBase<hash::algoSHA224> MessageDigestSHA224; +typedef MessageDigestBase<hash::algoSHA256> MessageDigestSHA256; +typedef MessageDigestBase<hash::algoSHA384> MessageDigestSHA384; +typedef MessageDigestBase<hash::algoSHA512> MessageDigestSHA512; } // namespace -std::unique_ptr<MessageDigestImpl> MessageDigestImpl::sha1() -{ +namespace aria2 { + +std::unique_ptr<MessageDigestImpl> MessageDigestImpl::sha1() { return make_unique<MessageDigestSHA1>(); } MessageDigestImpl::hashes_t MessageDigestImpl::hashes = { { "sha-1", make_hi<MessageDigestSHA1>() }, + { "sha-224", make_hi<MessageDigestSHA224>() }, + { "sha-256", make_hi<MessageDigestSHA256>() }, + { "sha-384", make_hi<MessageDigestSHA384>() }, + { "sha-512", make_hi<MessageDigestSHA512>() }, { "md5", make_hi<MessageDigestMD5>() }, }; |
