/* */ #include "LibnettleMessageDigestImpl.h" #include #include "array_fun.h" #include "HashFuncEntry.h" #include "a2functional.h" namespace aria2 { MessageDigestImpl::MessageDigestImpl(const nettle_hash* hashInfo) : hashInfo_{hashInfo}, ctx_{new char[hashInfo->context_size]} { reset(); } MessageDigestImpl::~MessageDigestImpl() { delete [] ctx_; } std::unique_ptr MessageDigestImpl::sha1() { return make_unique(&nettle_sha1); } typedef HashFuncEntry CHashFuncEntry; typedef FindHashFunc CFindHashFunc; namespace { CHashFuncEntry hashFuncs[] = { CHashFuncEntry("sha-1", &nettle_sha1), CHashFuncEntry("sha-224", &nettle_sha224), CHashFuncEntry("sha-256", &nettle_sha256), CHashFuncEntry("sha-384", &nettle_sha384), CHashFuncEntry("sha-512", &nettle_sha512), CHashFuncEntry("md5", &nettle_md5) }; } // namespace std::unique_ptr MessageDigestImpl::create (const std::string& hashType) { auto hashInfo = getHashFunc(std::begin(hashFuncs), std::end(hashFuncs), hashType); return make_unique(hashInfo); } bool MessageDigestImpl::supports(const std::string& hashType) { return std::end(hashFuncs) != std::find_if(std::begin(hashFuncs), std::end(hashFuncs), CFindHashFunc(hashType)); } size_t MessageDigestImpl::getDigestLength(const std::string& hashType) { auto hashInfo = getHashFunc(std::begin(hashFuncs), std::end(hashFuncs), hashType); return hashInfo->digest_size; } size_t MessageDigestImpl::getDigestLength() const { return hashInfo_->digest_size; } void MessageDigestImpl::reset() { hashInfo_->init(ctx_); } void MessageDigestImpl::update(const void* data, size_t length) { hashInfo_->update(ctx_, length, static_cast(data)); } void MessageDigestImpl::digest(unsigned char* md) { hashInfo_->digest(ctx_, getDigestLength(), md); } } // namespace aria2