summaryrefslogtreecommitdiff
path: root/lang/python/python3/patches/020-ssl-module-emulate-tls-methods.patch
diff options
context:
space:
mode:
Diffstat (limited to 'lang/python/python3/patches/020-ssl-module-emulate-tls-methods.patch')
-rw-r--r--lang/python/python3/patches/020-ssl-module-emulate-tls-methods.patch218
1 files changed, 0 insertions, 218 deletions
diff --git a/lang/python/python3/patches/020-ssl-module-emulate-tls-methods.patch b/lang/python/python3/patches/020-ssl-module-emulate-tls-methods.patch
deleted file mode 100644
index 5cd1b94df..000000000
--- a/lang/python/python3/patches/020-ssl-module-emulate-tls-methods.patch
+++ /dev/null
@@ -1,218 +0,0 @@
-From 991f0176e188227647bf4c993d8da81cf794b3ae Mon Sep 17 00:00:00 2001
-From: Christian Heimes <christian@python.org>
-Date: Sun, 25 Feb 2018 20:03:07 +0100
-Subject: [PATCH] bpo-30008: SSL module: emulate tls methods
-
-OpenSSL 1.1 compatility: emulate version specific TLS methods with
-SSL_CTX_set_min/max_proto_version().
----
- .../2018-02-25-20-05-51.bpo-30008.6Bmyhr.rst | 4 +
- Modules/_ssl.c | 134 ++++++++++++++----
- 2 files changed, 108 insertions(+), 30 deletions(-)
- create mode 100644 Misc/NEWS.d/next/Library/2018-02-25-20-05-51.bpo-30008.6Bmyhr.rst
-
---- /dev/null
-+++ b/Misc/NEWS.d/next/Library/2018-02-25-20-05-51.bpo-30008.6Bmyhr.rst
-@@ -0,0 +1,4 @@
-+The ssl module no longer uses function that are deprecated since OpenSSL
-+1.1.0. The version specific TLS methods are emulated with TLS_method() plus
-+SSL_CTX_set_min/max_proto_version(). Pseudo random numbers are generated
-+with RAND_bytes().
---- a/Modules/_ssl.c
-+++ b/Modules/_ssl.c
-@@ -45,14 +45,6 @@ static PySocketModule_APIObject PySocket
- #include <sys/poll.h>
- #endif
-
--/* Don't warn about deprecated functions */
--#ifdef __GNUC__
--#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
--#endif
--#ifdef __clang__
--#pragma clang diagnostic ignored "-Wdeprecated-declarations"
--#endif
--
- /* Include OpenSSL header files */
- #include "openssl/rsa.h"
- #include "openssl/crypto.h"
-@@ -205,6 +197,7 @@ static void _PySSLFixErrno(void) {
- #ifndef PY_OPENSSL_1_1_API
- /* OpenSSL 1.1 API shims for OpenSSL < 1.1.0 and LibreSSL < 2.7.0 */
-
-+#define ASN1_STRING_get0_data ASN1_STRING_data
- #define TLS_method SSLv23_method
- #define TLS_client_method SSLv23_client_method
- #define TLS_server_method SSLv23_server_method
-@@ -896,7 +889,7 @@ _ssl_configure_hostname(PySSLSocket *sel
- goto error;
- }
- } else {
-- if (!X509_VERIFY_PARAM_set1_ip(param, ASN1_STRING_data(ip),
-+ if (!X509_VERIFY_PARAM_set1_ip(param, ASN1_STRING_get0_data(ip),
- ASN1_STRING_length(ip))) {
- _setSSLError(NULL, 0, __FILE__, __LINE__);
- goto error;
-@@ -1372,8 +1365,9 @@ _get_peer_alt_names (X509 *certificate)
- goto fail;
- }
- PyTuple_SET_ITEM(t, 0, v);
-- v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_data(as),
-- ASN1_STRING_length(as));
-+ v = PyUnicode_FromStringAndSize(
-+ (char *)ASN1_STRING_get0_data(as),
-+ ASN1_STRING_length(as));
- if (v == NULL) {
- Py_DECREF(t);
- goto fail;
-@@ -3078,44 +3072,124 @@ _ssl__SSLContext_impl(PyTypeObject *type
- long options;
- SSL_CTX *ctx = NULL;
- X509_VERIFY_PARAM *params;
-- int result;
-+ int result = 0;
- #if defined(SSL_MODE_RELEASE_BUFFERS)
- unsigned long libver;
- #endif
-
- PySSL_BEGIN_ALLOW_THREADS
-- if (proto_version == PY_SSL_VERSION_TLS1)
-+ switch (proto_version) {
-+#if OPENSSL_VERSION_NUMBER <= 0x10100000L
-+ /* OpenSSL < 1.1.0 or not LibreSSL
-+ * Use old-style methods for OpenSSL 1.0.2
-+ */
-+#if defined(SSL2_VERSION) && !defined(OPENSSL_NO_SSL2)
-+ case PY_SSL_VERSION_SSL2:
-+ ctx = SSL_CTX_new(SSLv2_method());
-+ break;
-+#endif
-+#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
-+ case PY_SSL_VERSION_SSL3:
-+ ctx = SSL_CTX_new(SSLv3_method());
-+ break;
-+#endif
-+#if defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
-+ case PY_SSL_VERSION_TLS1:
- ctx = SSL_CTX_new(TLSv1_method());
--#if HAVE_TLSv1_2
-- else if (proto_version == PY_SSL_VERSION_TLS1_1)
-+ break;
-+#endif
-+#if defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
-+ case PY_SSL_VERSION_TLS1_1:
- ctx = SSL_CTX_new(TLSv1_1_method());
-- else if (proto_version == PY_SSL_VERSION_TLS1_2)
-+ break;
-+#endif
-+#if defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
-+ case PY_SSL_VERSION_TLS1_2:
- ctx = SSL_CTX_new(TLSv1_2_method());
-+ break;
- #endif
--#ifndef OPENSSL_NO_SSL3
-- else if (proto_version == PY_SSL_VERSION_SSL3)
-- ctx = SSL_CTX_new(SSLv3_method());
-+#else
-+ /* OpenSSL >= 1.1 or LibreSSL
-+ * create context with TLS_method for all protocols
-+ * no SSLv2_method in OpenSSL 1.1.
-+ */
-+#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
-+ case PY_SSL_VERSION_SSL3:
-+ ctx = SSL_CTX_new(TLS_method());
-+ if (ctx != NULL) {
-+ /* OpenSSL 1.1.0 sets SSL_OP_NO_SSLv3 for TLS_method by default */
-+ SSL_CTX_clear_options(ctx, SSL_OP_NO_SSLv3);
-+ if (!SSL_CTX_set_min_proto_version(ctx, SSL3_VERSION))
-+ result = -2;
-+ if (!SSL_CTX_set_max_proto_version(ctx, SSL3_VERSION))
-+ result = -2;
-+ }
-+ break;
- #endif
--#ifndef OPENSSL_NO_SSL2
-- else if (proto_version == PY_SSL_VERSION_SSL2)
-- ctx = SSL_CTX_new(SSLv2_method());
-+#if defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
-+ case PY_SSL_VERSION_TLS1:
-+ ctx = SSL_CTX_new(TLS_method());
-+ if (ctx != NULL) {
-+ SSL_CTX_clear_options(ctx, SSL_OP_NO_TLSv1);
-+ if (!SSL_CTX_set_min_proto_version(ctx, TLS1_VERSION))
-+ result = -2;
-+ if (!SSL_CTX_set_max_proto_version(ctx, TLS1_VERSION))
-+ result = -2;
-+ }
-+ break;
-+#endif
-+#if defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
-+ case PY_SSL_VERSION_TLS1_1:
-+ ctx = SSL_CTX_new(TLS_method());
-+ if (ctx != NULL) {
-+ SSL_CTX_clear_options(ctx, SSL_OP_NO_TLSv1_1);
-+ if (!SSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION))
-+ result = -2;
-+ if (!SSL_CTX_set_max_proto_version(ctx, TLS1_1_VERSION))
-+ result = -2;
-+ }
-+ break;
-+#endif
-+#if defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
-+ case PY_SSL_VERSION_TLS1_2:
-+ ctx = SSL_CTX_new(TLS_method());
-+ if (ctx != NULL) {
-+ SSL_CTX_clear_options(ctx, SSL_OP_NO_TLSv1_2);
-+ if (!SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION))
-+ result = -2;
-+ if (!SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION))
-+ result = -2;
-+ }
-+ break;
- #endif
-- else if (proto_version == PY_SSL_VERSION_TLS) /* SSLv23 */
-+#endif /* OpenSSL >= 1.1 */
-+ case PY_SSL_VERSION_TLS:
-+ /* SSLv23 */
- ctx = SSL_CTX_new(TLS_method());
-- else if (proto_version == PY_SSL_VERSION_TLS_CLIENT)
-+ break;
-+ case PY_SSL_VERSION_TLS_CLIENT:
- ctx = SSL_CTX_new(TLS_client_method());
-- else if (proto_version == PY_SSL_VERSION_TLS_SERVER)
-+ break;
-+ case PY_SSL_VERSION_TLS_SERVER:
- ctx = SSL_CTX_new(TLS_server_method());
-- else
-- proto_version = -1;
-+ break;
-+ default:
-+ result = -1;
-+ break;
-+ }
- PySSL_END_ALLOW_THREADS
-
-- if (proto_version == -1) {
-+ if (result == -1) {
- PyErr_SetString(PyExc_ValueError,
- "invalid protocol version");
- return NULL;
- }
-- if (ctx == NULL) {
-+ else if (result == -2) {
-+ PyErr_SetString(PyExc_ValueError,
-+ "protocol configuration error");
-+ return NULL;
-+ }
-+ else if (ctx == NULL) {
- _setSSLError(NULL, 0, __FILE__, __LINE__);
- return NULL;
- }
-@@ -5288,7 +5362,7 @@ PySSL_RAND(int len, int pseudo)
- if (bytes == NULL)
- return NULL;
- if (pseudo) {
-- ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
-+ ok = (_PyOS_URandom((unsigned char*)PyBytes_AS_STRING(bytes), len) == 0 ? 1 : 0);
- if (ok == 0 || ok == 1)
- return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False);
- }