--- Python-3.6.3-orig/Modules/_ssl.c 2017-10-13 21:47:02.133444431 +1100 +++ Python-3.6.3/Modules/_ssl.c 2017-10-13 21:48:21.970581194 +1100 @@ -73,6 +73,7 @@ #include "openssl/err.h" #include "openssl/rand.h" #include "openssl/bio.h" +#include "openssl/dh.h" /* SSL error object */ static PyObject *PySSLErrorObject; @@ -139,9 +140,17 @@ #define HAVE_OPENSSL_CRYPTO_LOCK #endif +#ifndef OPENSSL_VERSION_1_1 #define TLS_method SSLv23_method #define TLS_client_method SSLv23_client_method #define TLS_server_method SSLv23_server_method +#define X509_get0_notBefore X509_get_notBefore +#define X509_get0_notAfter X509_get_notAfter +#define ASN1_STRING_get0_data ASN1_STRING_data +#define OpenSSL_version_num SSLeay +#define OpenSSL_version SSLeay_version +#define OPENSSL_VERSION SSLEAY_VERSION +#endif static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne) { @@ -1062,7 +1071,7 @@ goto fail; } PyTuple_SET_ITEM(t, 0, v); - v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_data(as), + v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_get0_data(as), ASN1_STRING_length(as)); if (v == NULL) { Py_DECREF(t); @@ -1365,7 +1374,7 @@ Py_DECREF(sn_obj); (void) BIO_reset(biobuf); - notBefore = X509_get_notBefore(certificate); + notBefore = X509_get0_notBefore(certificate); ASN1_TIME_print(biobuf, notBefore); len = BIO_gets(biobuf, buf, sizeof(buf)-1); if (len < 0) { @@ -1382,7 +1391,7 @@ Py_DECREF(pnotBefore); (void) BIO_reset(biobuf); - notAfter = X509_get_notAfter(certificate); + notAfter = X509_get0_notAfter(certificate); ASN1_TIME_print(biobuf, notAfter); len = BIO_gets(biobuf, buf, sizeof(buf)-1); if (len < 0) { @@ -2835,7 +2844,7 @@ conservative and assume it wasn't fixed until release. We do this check at runtime to avoid problems from the dynamic linker. See #25672 for more on this. */ - libver = SSLeay(); + libver = OpenSSL_version_num(); if (!(libver >= 0x10001000UL && libver < 0x1000108fUL) && !(libver >= 0x10000000UL && libver < 0x100000dfUL)) { SSL_CTX_set_mode(self->ctx, SSL_MODE_RELEASE_BUFFERS); @@ -4647,7 +4656,11 @@ if (bytes == NULL) return NULL; if (pseudo) { +#ifdef OPENSSL_VERSION_1_1 + ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len); +#else ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len); +#endif if (ok == 0 || ok == 1) return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False); } @@ -5287,7 +5300,9 @@ return NULL; PySocketModule = *socket_api; -#ifndef OPENSSL_VERSION_1_1 +#ifdef OPENSSL_VERSION_1_1 + OPENSSL_init_ssl(0, NULL); +#else /* Load all algorithms and initialize cpuid */ OPENSSL_add_all_algorithms_noconf(); /* Init OpenSSL */ @@ -5587,10 +5602,10 @@ return NULL; /* OpenSSL version */ - /* SSLeay() gives us the version of the library linked against, + /* OpenSSL_version_num() gives us the version of the library linked against, which could be different from the headers version. */ - libver = SSLeay(); + libver = OpenSSL_version_num(); r = PyLong_FromUnsignedLong(libver); if (r == NULL) return NULL; @@ -5600,7 +5615,7 @@ r = Py_BuildValue("IIIII", major, minor, fix, patch, status); if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r)) return NULL; - r = PyUnicode_FromString(SSLeay_version(SSLEAY_VERSION)); + r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION)); if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r)) return NULL; --- Python-3.6.3-orig/Modules/_hashopenssl.c 2017-10-03 16:52:02.000000000 +1100 +++ Python-3.6.3/Modules/_hashopenssl.c 2017-10-13 21:48:21.979581209 +1100 @@ -1022,7 +1022,7 @@ { PyObject *m, *openssl_md_meth_names; -#ifndef OPENSSL_VERSION_1_1 +#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER) /* Load all digest algorithms and initialize cpuid */ OPENSSL_add_all_algorithms_noconf(); ERR_load_crypto_strings();