| From 9af3be81c75b44415a6e7efe19f8f89d55091f84 Mon Sep 17 00:00:00 2001 |
| From: rakshasa <sundell.software@gmail.com> |
| 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 <bernd.kuhls@t-online.de> |
| --- |
| 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 |
| |