From 9af3be81c75b44415a6e7efe19f8f89d55091f84 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Tue, 20 Dec 2016 19:51:02 +0900 Subject: [PATCH] Added support for openssl 1.1. Downloaded from upstream commit https://github.com/rakshasa/libtorrent/commit/7b29b6bd2547e72e22b9b7981df27092842d2a10 Signed-off-by: Bernd Kuhls --- configure.ac | 4 ++++ src/utils/diffie_hellman.cc | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 5b1ea237..b885714d 100644 --- a/configure.ac +++ b/configure.ac @@ -71,12 +71,15 @@ AC_ARG_ENABLE(openssl, [ --disable-openssl Don't use OpenSSL's SHA1 implementation.], [ if test "$enableval" = "yes"; then +dnl move to scripts. PKG_CHECK_MODULES(OPENSSL, libcrypto, CXXFLAGS="$CXXFLAGS $OPENSSL_CFLAGS"; LIBS="$LIBS $OPENSSL_LIBS") AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) + AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) + else AC_DEFINE(USE_NSS_SHA, 1, Using Mozilla's SHA1 implementation.) fi @@ -87,6 +90,7 @@ AC_ARG_ENABLE(openssl, AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) + AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) ] ) diff --git a/src/utils/diffie_hellman.cc b/src/utils/diffie_hellman.cc index aa653d45..7ec13165 100644 --- a/src/utils/diffie_hellman.cc +++ b/src/utils/diffie_hellman.cc @@ -54,11 +54,23 @@ DiffieHellman::DiffieHellman(const unsigned char *prime, int primeLength, m_secret(NULL), m_size(0) { #ifdef USE_OPENSSL + m_dh = DH_new(); + +#ifdef USE_OPENSSL_1_1 + BIGNUM * const dh_p = BN_bin2bn(prime, primeLength, NULL); + BIGNUM * const dh_g = BN_bin2bn(generator, generatorLength, NULL); + + if (dh_p == NULL || dh_g == NULL || + !DH_set0_pqg(m_dh, dh_p, NULL, dh_g)) + throw internal_error("Could not generate Diffie-Hellman parameters"); +#else m_dh->p = BN_bin2bn(prime, primeLength, NULL); m_dh->g = BN_bin2bn(generator, generatorLength, NULL); +#endif DH_generate_key(m_dh); + #else throw internal_error("Compiled without encryption support."); #endif @@ -74,7 +86,19 @@ DiffieHellman::~DiffieHellman() { bool DiffieHellman::is_valid() const { #ifdef USE_OPENSSL + if (m_dh == NULL) + return false; + +#ifdef USE_OPENSSL_1_1 + const BIGNUM *pub_key; + + DH_get0_key(m_dh, &pub_key, NULL); + + return pub_key != NULL; +#else return m_dh != NULL && m_dh->pub_key != NULL; +#endif + #else return false; #endif @@ -103,8 +127,16 @@ DiffieHellman::store_pub_key(unsigned char* dest, unsigned int length) { #ifdef USE_OPENSSL std::memset(dest, 0, length); - if ((int)length >= BN_num_bytes(m_dh->pub_key)) - BN_bn2bin(m_dh->pub_key, dest + length - BN_num_bytes(m_dh->pub_key)); + const BIGNUM *pub_key; + +#ifdef USE_OPENSSL_1_1 + DH_get0_key(m_dh, &pub_key, NULL); +#else + pub_key = m_dh->pub_key; +#endif + + if ((int)length >= BN_num_bytes(pub_key)) + BN_bn2bin(pub_key, dest + length - BN_num_bytes(pub_key)); #endif } -- 2.14.4