/* */ #include "MessageDigestImpl.h" #include #include "Adler32MessageDigestImpl.h" namespace aria2 { namespace { template class MessageDigestBase : public MessageDigestImpl { public: MessageDigestBase() : ctx_(make_unique(hash->context_size)) { reset(); } virtual ~MessageDigestBase() {} static size_t length() { return hash->digest_size; } virtual size_t getDigestLength() const CXX11_OVERRIDE { return hash->digest_size; } virtual void reset() CXX11_OVERRIDE { hash->init(ctx_.get()); } 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()); hash->update(ctx_.get(), l, bytes); length -= l; bytes += l; } } virtual void digest(unsigned char* md) CXX11_OVERRIDE { hash->digest(ctx_.get(), getDigestLength(), md); } private: std::unique_ptr ctx_; size_t len_; }; typedef MessageDigestBase<&nettle_md5> MessageDigestMD5; typedef MessageDigestBase<&nettle_sha1> MessageDigestSHA1; typedef MessageDigestBase<&nettle_sha224> MessageDigestSHA224; typedef MessageDigestBase<&nettle_sha256> MessageDigestSHA256; typedef MessageDigestBase<&nettle_sha384> MessageDigestSHA384; typedef MessageDigestBase<&nettle_sha512> MessageDigestSHA512; } // namespace 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()}, ADLER32_MESSAGE_DIGEST}; } // namespace aria2