/* */ #include "LibsslMessageDigestImpl.h" #include #include "array_fun.h" #include "HashFuncEntry.h" namespace aria2 { MessageDigestImpl::MessageDigestImpl(const EVP_MD* hashFunc):hashFunc_(hashFunc) { EVP_MD_CTX_init(&ctx_); reset(); } MessageDigestImpl::~MessageDigestImpl() { EVP_MD_CTX_cleanup(&ctx_); } SharedHandle MessageDigestImpl::sha1() { return SharedHandle(new MessageDigestImpl(EVP_sha1())); } typedef HashFuncEntry CHashFuncEntry; typedef FindHashFunc CFindHashFunc; namespace { CHashFuncEntry hashFuncs[] = { CHashFuncEntry("sha-1", EVP_sha1()), #ifdef HAVE_EVP_SHA224 CHashFuncEntry("sha-224", EVP_sha224()), #endif // HAVE_EVP_SHA224 #ifdef HAVE_EVP_SHA256 CHashFuncEntry("sha-256", EVP_sha256()), #endif // HAVE_EVP_SHA256 #ifdef HAVE_EVP_SHA384 CHashFuncEntry("sha-384", EVP_sha384()), #endif // HAVE_EVP_SHA384 #ifdef HAVE_EVP_SHA512 CHashFuncEntry("sha-512", EVP_sha512()), #endif // HAVE_EVP_SHA512 CHashFuncEntry("md5", EVP_md5()) }; } // namespace SharedHandle MessageDigestImpl::create (const std::string& hashType) { const EVP_MD* hashFunc = getHashFunc(vbegin(hashFuncs), vend(hashFuncs), hashType); return SharedHandle(new MessageDigestImpl(hashFunc)); } 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 EVP_MD* hashFunc = getHashFunc(vbegin(hashFuncs), vend(hashFuncs), hashType); return EVP_MD_size(hashFunc); } size_t MessageDigestImpl::getDigestLength() const { return EVP_MD_size(hashFunc_); } void MessageDigestImpl::reset() { EVP_DigestInit_ex(&ctx_, hashFunc_, 0); } void MessageDigestImpl::update(const void* data, size_t length) { EVP_DigestUpdate(&ctx_, data, length); } void MessageDigestImpl::digest(unsigned char* md) { unsigned int len; EVP_DigestFinal_ex(&ctx_, md, &len); } } // namespace aria2