diff --git a/configure.ac b/configure.ac index ab3d2888..951b5ab3 100644 --- a/configure.ac +++ b/configure.ac @@ -493,25 +493,20 @@ if test "x$have_appletls" = "xyes"; then use_md="apple" AC_DEFINE([USE_APPLE_MD], [1], [What message digest implementation to use]) else - if test "x$have_wintls" = "xyes"; then - use_md="windows" - AC_DEFINE([USE_WINDOWS_MD], [1], [What message digest implementation to use]) + if test "x$have_libnettle" = "xyes"; then + AC_DEFINE([USE_LIBNETTLE_MD], [1], [What message digest implementation to use]) + use_md="libnettle" else - if test "x$have_libnettle" = "xyes"; then - AC_DEFINE([USE_LIBNETTLE_MD], [1], [What message digest implementation to use]) - use_md="libnettle" + if test "x$have_libgcrypt" = "xyes"; then + AC_DEFINE([USE_LIBGCRYPT_MD], [1], [What message digest implementation to use]) + use_md="libgcrypt" else - if test "x$have_libgcrypt" = "xyes"; then - AC_DEFINE([USE_LIBGCRYPT_MD], [1], [What message digest implementation to use]) - use_md="libgcrypt" + if test "x$have_openssl" = "xyes"; then + AC_DEFINE([USE_OPENSSL_MD], [1], [What message digest implementation to use]) + use_md="openssl" else - if test "x$have_openssl" = "xyes"; then - AC_DEFINE([USE_OPENSSL_MD], [1], [What message digest implementation to use]) - use_md="openssl" - else - AC_DEFINE([USE_INTERNAL_MD], [1], [What message digest implementation to use]) - use_md="internal" - fi + AC_DEFINE([USE_INTERNAL_MD], [1], [What message digest implementation to use]) + use_md="internal" fi fi fi diff --git a/src/Makefile.am b/src/Makefile.am index aa4abca7..89e442e7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -348,10 +348,6 @@ SRCS += \ AppleTLSSession.cc AppleTLSSession.h endif # HAVE_APPLETLS -if USE_WINDOWS_MD -SRCS += WinMessageDigestImpl.cc -endif # USE_WINDOWS_MD - if HAVE_WINTLS SRCS += \ WinTLSContext.cc WinTLSContext.h \ diff --git a/src/WinMessageDigestImpl.cc b/src/WinMessageDigestImpl.cc deleted file mode 100644 index 28407f4c..00000000 --- a/src/WinMessageDigestImpl.cc +++ /dev/null @@ -1,193 +0,0 @@ -/* */ - -#include "MessageDigestImpl.h" - -#include - -#include "fmt.h" -#include "DlAbortEx.h" -#include "LogFactory.h" - -namespace { -using namespace aria2; - -class Context { -private: - HCRYPTPROV provider_; -public: - Context() { - if (!::CryptAcquireContext(&provider_, nullptr, nullptr, - PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { - if (!::CryptAcquireContext(&provider_, nullptr, nullptr, PROV_RSA_AES, - CRYPT_VERIFYCONTEXT)) { - throw DL_ABORT_EX("Failed to get cryptographic provider"); - } - } - } - ~Context() { - ::CryptReleaseContext(provider_, 0); - } - - HCRYPTPROV get() { - return provider_; - } -}; - -// XXX static OK? -static Context context_; - -inline size_t getAlgLength(ALG_ID id) -{ - Context context; - HCRYPTHASH hash; - if (!::CryptCreateHash(context.get(), id, 0, 0, &hash)) { - throw DL_ABORT_EX(fmt("Failed to initialize hash %d", id)); - } - - DWORD rv = 0; - DWORD len = sizeof(rv); - if (!::CryptGetHashParam(hash, HP_HASHSIZE, reinterpret_cast(&rv), - &len, 0)) { - throw DL_ABORT_EX("Failed to initialize hash(2)"); - } - ::CryptDestroyHash(hash); - - return rv; -} - -} // namespace - -namespace aria2 { - - -template -class MessageDigestBase : public MessageDigestImpl { -private: - HCRYPTHASH hash_; - DWORD len_; - - void destroy() { - if (hash_) { - ::CryptDestroyHash(hash_); - hash_ = 0; - } - } - -public: - MessageDigestBase() : hash_(0), len_(0) { reset(); } - virtual ~MessageDigestBase() { destroy(); } - - static size_t length() { - MessageDigestBase rv; - return rv.getDigestLength(); - } - virtual size_t getDigestLength() const CXX11_OVERRIDE { - return len_; - } - virtual void reset() CXX11_OVERRIDE { - destroy(); - if (!::CryptCreateHash(context_.get(), id, 0, 0, &hash_)) { - throw DL_ABORT_EX("Failed to create hash"); - } - DWORD len = sizeof(len_); - if (!::CryptGetHashParam(hash_, HP_HASHSIZE, reinterpret_cast(&len_), - &len, 0)) { - throw DL_ABORT_EX("Failed to initialize hash"); - } - } - virtual void update(const void* data, size_t length) CXX11_OVERRIDE { - auto bytes = reinterpret_cast(data); - while (length) { - DWORD l = std::min(length, (size_t)std::numeric_limits::max()); - if (!::CryptHashData(hash_, bytes, l, 0)) { - throw DL_ABORT_EX("Failed to update hash"); - } - length -= l; - bytes += l; - } - } - virtual void digest(unsigned char* md) CXX11_OVERRIDE { - DWORD len = len_; - if (!::CryptGetHashParam(hash_, HP_HASHVAL, md, &len, 0)) { - throw DL_ABORT_EX("Failed to create hash digest"); - } - } -}; - -typedef MessageDigestBase MessageDigestMD5; -typedef MessageDigestBase MessageDigestSHA1; -typedef MessageDigestBase MessageDigestSHA256; -typedef MessageDigestBase MessageDigestSHA384; -typedef MessageDigestBase MessageDigestSHA512; - -std::unique_ptr MessageDigestImpl::sha1() -{ - return std::unique_ptr(new MessageDigestSHA1()); -} - -namespace { -MessageDigestImpl::hashes_t initialize() { - MessageDigestImpl::hashes_t rv = { - { "sha-1", MessageDigestImpl::make_hi() }, - { "md5", MessageDigestImpl::make_hi() }, - }; - - try { - rv.insert({ "sha-256", MessageDigestImpl::make_hi() }); - } - catch (RecoverableException &ex) { - printf("SHA-256 is not supported on this machine"); - } - try { - rv.insert({ "sha-384", MessageDigestImpl::make_hi() }); - } - catch (RecoverableException &ex) { - printf("SHA-384 is not supported on this machine"); - } - try { - rv.insert({ "sha-512", MessageDigestImpl::make_hi() }); - } - catch (RecoverableException &ex) { - printf("SHA-512 is not supported on this machine"); - } - - return rv; -}; -} // namespace - -MessageDigestImpl::hashes_t MessageDigestImpl::hashes = initialize(); - -} // namespace aria2