/* */ #include "AppleMessageDigestImpl.h" #include #include "array_fun.h" #include "HashFuncEntry.h" namespace aria2 { template class MessageDigestBase : public MessageDigestImpl { public: MessageDigestBase() { reset(); } virtual ~MessageDigestBase() {} virtual size_t getDigestLength() const { return dlen; } virtual void reset() { init_fn(&ctx_); } virtual void update(const void* data, size_t length) { while (length) { CC_LONG l = std::min(length, (size_t)std::numeric_limits::max()); update_fn(&ctx_, data, l); length -= l; } } virtual void digest(unsigned char* md) { final_fn(md, &ctx_); } private: ctx_t ctx_; }; typedef MessageDigestBase MessageDigestMD5; typedef MessageDigestBase MessageDigestSHA1; typedef MessageDigestBase MessageDigestSHA224; typedef MessageDigestBase MessageDigestSHA256; typedef MessageDigestBase MessageDigestSHA384; typedef MessageDigestBase MessageDigestSHA512; SharedHandle MessageDigestImpl::sha1() { return SharedHandle(new MessageDigestSHA1()); } SharedHandle MessageDigestImpl::create (const std::string& hashType) { if (hashType == "sha-1") { return SharedHandle(new MessageDigestSHA1()); } if (hashType == "sha-224") { return SharedHandle(new MessageDigestSHA224()); } if (hashType == "sha-256") { return SharedHandle(new MessageDigestSHA256()); } if (hashType == "sha-384") { return SharedHandle(new MessageDigestSHA384()); } if (hashType == "sha-512") { return SharedHandle(new MessageDigestSHA512()); } if (hashType == "md5") { return SharedHandle(new MessageDigestMD5()); } return SharedHandle(); } bool MessageDigestImpl::supports(const std::string& hashType) { return hashType == "sha-1" || hashType == "sha-224" || hashType == "sha-256" || hashType == "sha-384" || hashType == "sha-512" || hashType == "md5"; } size_t MessageDigestImpl::getDigestLength(const std::string& hashType) { SharedHandle impl = create(hashType); if (!impl) { return 0; } return impl->getDigestLength(); } } // namespace aria2