diff -up libjingle-0.6.14/talk/base/openssladapter.cc.openssl11 libjingle-0.6.14/talk/base/openssladapter.cc --- libjingle-0.6.14/talk/base/openssladapter.cc.openssl11 2017-02-20 15:00:27.678103635 -0500 +++ libjingle-0.6.14/talk/base/openssladapter.cc 2017-02-20 15:57:36.884341533 -0500 @@ -84,6 +84,7 @@ static long socket_ctrl(BIO* h, int cmd, static int socket_new(BIO* h); static int socket_free(BIO* data); +#if OPENSSL_VERSION_NUMBER < 0x10100000L static BIO_METHOD methods_socket = { BIO_TYPE_BIO, "socket", @@ -98,16 +99,36 @@ static BIO_METHOD methods_socket = { }; BIO_METHOD* BIO_s_socket2() { return(&methods_socket); } +#else +static BIO_METHOD *methods_socket = NULL; + +static const BIO_METHOD * BIO_s_socket2(void) { + if (methods_socket == NULL) { + methods_socket = BIO_meth_new (BIO_TYPE_BIO | BIO_get_new_index (), "socket"); + if (methods_socket == NULL || + BIO_meth_set_write (methods_socket, socket_write) || + BIO_meth_set_read (methods_socket, socket_read) || + BIO_meth_set_puts (methods_socket, socket_puts) || + BIO_meth_set_gets (methods_socket, 0) || + BIO_meth_set_ctrl (methods_socket, socket_ctrl) || + BIO_meth_set_create (methods_socket, socket_new) || + BIO_meth_set_destroy (methods_socket, socket_free)) + return NULL; + } + return methods_socket; +} +#endif BIO* BIO_new_socket(talk_base::AsyncSocket* socket) { BIO* ret = BIO_new(BIO_s_socket2()); if (ret == NULL) { return NULL; } - ret->ptr = socket; + BIO_set_data(ret, socket); return ret; } +#if OPENSSL_VERSION_NUMBER < 0x10100000L static int socket_new(BIO* b) { b->shutdown = 0; b->init = 1; @@ -115,6 +136,14 @@ static int socket_new(BIO* b) { b->ptr = 0; return 1; } +#else +static int socket_new(BIO* b) { + BIO_set_shutdown(b, 0); + BIO_set_init(b, 1); + BIO_set_data(b, 0); + return 1; +} +#endif static int socket_free(BIO* b) { if (b == NULL) @@ -125,13 +154,11 @@ static int socket_free(BIO* b) { static int socket_read(BIO* b, char* out, int outl) { if (!out) return -1; - talk_base::AsyncSocket* socket = static_cast(b->ptr); + talk_base::AsyncSocket* socket = static_cast(BIO_get_data(b)); BIO_clear_retry_flags(b); int result = socket->Recv(out, outl); if (result > 0) { return result; - } else if (result == 0) { - b->num = 1; } else if (socket->IsBlocking()) { BIO_set_retry_read(b); } @@ -141,7 +168,7 @@ static int socket_read(BIO* b, char* out static int socket_write(BIO* b, const char* in, int inl) { if (!in) return -1; - talk_base::AsyncSocket* socket = static_cast(b->ptr); + talk_base::AsyncSocket* socket = static_cast(BIO_get_data(b)); BIO_clear_retry_flags(b); int result = socket->Send(in, inl); if (result > 0) { @@ -164,7 +191,6 @@ static long socket_ctrl(BIO* b, int cmd, case BIO_CTRL_RESET: return 0; case BIO_CTRL_EOF: - return b->num; case BIO_CTRL_WPENDING: case BIO_CTRL_PENDING: return 0; @@ -696,7 +722,9 @@ bool OpenSSLAdapter::VerifyServerName(SS // We assign this to a local variable, instead of passing the address // directly to ASN1_item_d2i. // See http://readlist.com/lists/openssl.org/openssl-users/0/4761.html. - unsigned char* ext_value_data = extension->value->data; + ASN1_OCTET_STRING *extension_data = X509_EXTENSION_get_data(extension); + unsigned char* ext_value_data = extension_data->data; + long length = extension_data->length; #if OPENSSL_VERSION_NUMBER >= 0x0090800fL const unsigned char **ext_value_data_ptr = @@ -707,10 +735,10 @@ bool OpenSSLAdapter::VerifyServerName(SS if (meth->it) { ext_str = ASN1_item_d2i(NULL, ext_value_data_ptr, - extension->value->length, + length, ASN1_ITEM_ptr(meth->it)); } else { - ext_str = meth->d2i(NULL, ext_value_data_ptr, extension->value->length); + ext_str = meth->d2i(NULL, ext_value_data_ptr, length); } STACK_OF(CONF_VALUE)* value = meth->i2v(meth, ext_str, NULL); diff -up libjingle-0.6.14/talk/base/opensslidentity.cc.openssl11 libjingle-0.6.14/talk/base/opensslidentity.cc --- libjingle-0.6.14/talk/base/opensslidentity.cc.openssl11 2017-02-20 15:58:26.642105790 -0500 +++ libjingle-0.6.14/talk/base/opensslidentity.cc 2017-02-20 16:04:05.130707597 -0500 @@ -168,7 +168,12 @@ OpenSSLKeyPair::~OpenSSLKeyPair() { } void OpenSSLKeyPair::AddReference() { +#if OPENSSL_VERSION_NUMBER < 0x10100000L CRYPTO_add(&pkey_->references, 1, CRYPTO_LOCK_EVP_PKEY); +#else + EVP_PKEY_up_ref(pkey_); +#endif + } #ifdef _DEBUG @@ -314,7 +319,11 @@ std::string OpenSSLCertificate::ToPEMStr } void OpenSSLCertificate::AddReference() { +#if OPENSSL_VERSION_NUMBER < 0x10100000L CRYPTO_add(&x509_->references, 1, CRYPTO_LOCK_X509); +#else + X509_up_ref(x509_); +#endif } OpenSSLIdentity* OpenSSLIdentity::Generate(const std::string& common_name) { diff -up libjingle-0.6.14/talk/base/opensslstreamadapter.cc.openssl11 libjingle-0.6.14/talk/base/opensslstreamadapter.cc --- libjingle-0.6.14/talk/base/opensslstreamadapter.cc.openssl11 2017-02-20 16:05:03.402259071 -0500 +++ libjingle-0.6.14/talk/base/opensslstreamadapter.cc 2017-02-20 16:12:45.682795913 -0500 @@ -86,6 +86,7 @@ static long stream_ctrl(BIO* h, int cmd, static int stream_new(BIO* h); static int stream_free(BIO* data); +#if OPENSSL_VERSION_NUMBER < 0x10100000L static BIO_METHOD methods_stream = { BIO_TYPE_BIO, "stream", @@ -100,17 +101,37 @@ static BIO_METHOD methods_stream = { }; static BIO_METHOD* BIO_s_stream() { return(&methods_stream); } +#else +static BIO_METHOD *methods_stream = NULL; + +static const BIO_METHOD * BIO_s_stream(void) { + if (methods_stream == NULL) { + methods_stream = BIO_meth_new (BIO_TYPE_BIO | BIO_get_new_index (), "stream"); + if (methods_stream == NULL || + BIO_meth_set_write (methods_stream, stream_write) || + BIO_meth_set_read (methods_stream, stream_read) || + BIO_meth_set_puts (methods_stream, stream_puts) || + BIO_meth_set_gets (methods_stream, 0) || + BIO_meth_set_ctrl (methods_stream, stream_ctrl) || + BIO_meth_set_create (methods_stream, stream_new) || + BIO_meth_set_destroy (methods_stream, stream_free)) + return NULL; + } + return methods_stream; +} +#endif static BIO* BIO_new_stream(StreamInterface* stream) { BIO* ret = BIO_new(BIO_s_stream()); if (ret == NULL) return NULL; - ret->ptr = stream; + BIO_set_data(ret, stream); return ret; } // bio methods return 1 (or at least non-zero) on success and 0 on failure. +#if OPENSSL_VERSION_NUMBER < 0x10100000L static int stream_new(BIO* b) { b->shutdown = 0; b->init = 1; @@ -118,6 +139,14 @@ static int stream_new(BIO* b) { b->ptr = 0; return 1; } +#else +static int stream_new(BIO* b) { + BIO_set_shutdown(b, 0); + BIO_set_init(b, 1); + BIO_set_data(b, 0); + return 1; +} +#endif static int stream_free(BIO* b) { if (b == NULL) @@ -128,15 +157,13 @@ static int stream_free(BIO* b) { static int stream_read(BIO* b, char* out, int outl) { if (!out) return -1; - StreamInterface* stream = static_cast(b->ptr); + StreamInterface* stream = static_cast(BIO_get_data(b)); BIO_clear_retry_flags(b); size_t read; int error; StreamResult result = stream->Read(out, outl, &read, &error); if (result == SR_SUCCESS) { return read; - } else if (result == SR_EOS) { - b->num = 1; } else if (result == SR_BLOCK) { BIO_set_retry_read(b); } @@ -146,7 +173,7 @@ static int stream_read(BIO* b, char* out static int stream_write(BIO* b, const char* in, int inl) { if (!in) return -1; - StreamInterface* stream = static_cast(b->ptr); + StreamInterface* stream = static_cast(BIO_get_data(b)); BIO_clear_retry_flags(b); size_t written; int error; @@ -171,7 +198,6 @@ static long stream_ctrl(BIO* b, int cmd, case BIO_CTRL_RESET: return 0; case BIO_CTRL_EOF: - return b->num; case BIO_CTRL_WPENDING: case BIO_CTRL_PENDING: return 0; --- libjingle/talk/base/openssldigest.cc.orig 2017-05-11 15:33:00.221086766 +0000 +++ libjingle/talk/base/openssldigest.cc 2017-05-11 15:33:52.414339449 +0000 @@ -32,16 +32,16 @@ namespace talk_base { OpenSSLDigest::OpenSSLDigest(const std::string& algorithm) { - EVP_MD_CTX_init(&ctx_); + EVP_MD_CTX_init(ctx_); if (GetDigestEVP(algorithm, &md_)) { - EVP_DigestInit_ex(&ctx_, md_, NULL); + EVP_DigestInit_ex(ctx_, md_, NULL); } else { md_ = NULL; } } OpenSSLDigest::~OpenSSLDigest() { - EVP_MD_CTX_cleanup(&ctx_); + EVP_MD_CTX_destroy(ctx_); } size_t OpenSSLDigest::Size() const { @@ -55,16 +55,16 @@ if (!md_) { return; } - EVP_DigestUpdate(&ctx_, buf, len); + EVP_DigestUpdate(ctx_, buf, len); } size_t OpenSSLDigest::Finish(void* buf, size_t len) { if (!md_ || len < Size()) { return 0; } unsigned int md_len; - EVP_DigestFinal_ex(&ctx_, static_cast(buf), &md_len); - EVP_DigestInit_ex(&ctx_, md_, NULL); // prepare for future Update()s + EVP_DigestFinal_ex(ctx_, static_cast(buf), &md_len); + EVP_DigestInit_ex(ctx_, md_, NULL); // prepare for future Update()s ASSERT(md_len == Size()); return md_len; } --- libjingle/talk/base/openssldigest.h.orig 2017-05-11 15:31:56.341185527 +0000 +++ libjingle/talk/base/openssldigest.h 2017-05-11 15:32:49.631103132 +0000 @@ -55,7 +55,7 @@ size_t* len); private: - EVP_MD_CTX ctx_; + EVP_MD_CTX* ctx_ = EVP_MD_CTX_create(); const EVP_MD* md_; };