summaryrefslogtreecommitdiff
path: root/src/InternalMessageDigestImpl.cc
diff options
context:
space:
mode:
authorNils Maier <maierman@web.de>2014-06-10 13:09:08 +0200
committerNils Maier <maierman@web.de>2014-06-24 20:45:05 +0200
commit85876699954e64e2a19b137d71d9434caa9d6514 (patch)
treeff0381e32161e30cfeee850226f325125fc2d50f /src/InternalMessageDigestImpl.cc
parent60032bf0abc7a8cbb83e649d5cb5cebe803f7f94 (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.cc84
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>() },
};