/* */ #include "LibgcryptMessageDigestImpl.h" #include #include "array_fun.h" #include "HashFuncEntry.h" #include "a2functional.h" namespace aria2 { MessageDigestImpl::MessageDigestImpl(int hashFunc) : hashFunc_{hashFunc} { gcry_md_open(&ctx_, hashFunc_, 0); } MessageDigestImpl::~MessageDigestImpl() { gcry_md_close(ctx_); } std::unique_ptr MessageDigestImpl::sha1() { return make_unique(GCRY_MD_SHA1); } typedef HashFuncEntry CHashFuncEntry; typedef FindHashFunc CFindHashFunc; namespace { CHashFuncEntry hashFuncs[] = { CHashFuncEntry("sha-1", GCRY_MD_SHA1), CHashFuncEntry("sha-224", GCRY_MD_SHA224), CHashFuncEntry("sha-256", GCRY_MD_SHA256), CHashFuncEntry("sha-384", GCRY_MD_SHA384), CHashFuncEntry("sha-512", GCRY_MD_SHA512), CHashFuncEntry("md5", GCRY_MD_MD5) }; } // namespace std::unique_ptr MessageDigestImpl::create (const std::string& hashType) { int hashFunc = getHashFunc(std::begin(hashFuncs), std::end(hashFuncs), hashType); return make_unique(hashFunc); } 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) { int hashFunc = getHashFunc(std::begin(hashFuncs), std::end(hashFuncs), hashType); return gcry_md_get_algo_dlen(hashFunc); } size_t MessageDigestImpl::getDigestLength() const { return gcry_md_get_algo_dlen(hashFunc_); } void MessageDigestImpl::reset() { gcry_md_reset(ctx_); } void MessageDigestImpl::update(const void* data, size_t length) { gcry_md_write(ctx_, data, length); } void MessageDigestImpl::digest(unsigned char* md) { memcpy(md, gcry_md_read(ctx_, 0), gcry_md_get_algo_dlen(hashFunc_)); } } // namespace aria2