/* */ #include "MessageDigestImpl.h" #include "md5.h" #include "sha1.h" namespace aria2 { namespace { template class MessageDigestBase : public MessageDigestImpl { public: MessageDigestBase() : ctx_(nullptr) { reset(); } virtual ~MessageDigestBase() { free_fn(&ctx_); } static size_t length() { return dlen; } virtual size_t getDigestLength() const CXX11_OVERRIDE { return dlen; } virtual void reset() CXX11_OVERRIDE { free_fn(&ctx_); init_fn(&ctx_); } 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; } } virtual void digest(unsigned char* md) CXX11_OVERRIDE { final_fn(ctx_, md); } private: ctx_t* ctx_; }; typedef MessageDigestBase MessageDigestMD5; typedef MessageDigestBase MessageDigestSHA1; } // namespace std::unique_ptr MessageDigestImpl::sha1() { return make_unique(); } MessageDigestImpl::hashes_t MessageDigestImpl::hashes = { { "sha-1", make_hi() }, { "md5", make_hi() }, }; } // namespace aria2