/* */ #include "LibnettleMessageDigestImpl.h" #include #include "array_fun.h" #include "HashFuncEntry.h" namespace aria2 { MessageDigestImpl::MessageDigestImpl(const nettle_hash* hashInfo) : hashInfo_(hashInfo), ctx_(new char[hashInfo->context_size]) { reset(); } MessageDigestImpl::~MessageDigestImpl() { delete [] ctx_; } SharedHandle MessageDigestImpl::sha1() { return SharedHandle(new MessageDigestImpl(&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 SharedHandle MessageDigestImpl::create (const std::string& hashType) { const nettle_hash* hashInfo = getHashFunc(vbegin(hashFuncs), vend(hashFuncs), hashType); return SharedHandle(new MessageDigestImpl(hashInfo)); } bool MessageDigestImpl::supports(const std::string& hashType) { return vend(hashFuncs) != std::find_if(vbegin(hashFuncs), vend(hashFuncs), CFindHashFunc(hashType)); } size_t MessageDigestImpl::getDigestLength(const std::string& hashType) { const nettle_hash* hashInfo = getHashFunc(vbegin(hashFuncs), vend(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