@ -147,15 +147,6 @@ static void _PySSLFixErrno(void) {
# define PY_OPENSSL_1_1_API 1
# endif
/* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
http : / / www . openssl . org / news / changelog . html
*/
# if OPENSSL_VERSION_NUMBER >= 0x10001000L
# define HAVE_TLSv1_2 1
# else
# define HAVE_TLSv1_2 0
# endif
/* SNI support (client- and server-side) appeared in OpenSSL 1.0.0 and 0.9.8f
* This includes the SSL_set_SSL_CTX ( ) function .
*/
@ -326,13 +317,9 @@ enum py_ssl_version {
PY_SSL_VERSION_SSL2 ,
PY_SSL_VERSION_SSL3 = 1 ,
PY_SSL_VERSION_TLS , /* SSLv23 */
# if HAVE_TLSv1_2
PY_SSL_VERSION_TLS1 ,
PY_SSL_VERSION_TLS1_1 ,
PY_SSL_VERSION_TLS1_2 ,
# else
PY_SSL_VERSION_TLS1 ,
# endif
PY_SSL_VERSION_TLS_CLIENT = 0x10 ,
PY_SSL_VERSION_TLS_SERVER ,
} ;
@ -3086,35 +3073,45 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
# endif
PySSL_BEGIN_ALLOW_THREADS
if ( proto_version = = PY_SSL_VERSION_TLS1 )
switch ( proto_version ) {
# 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 )
ctx = SSL_CTX_new ( TLSv1_1_method ( ) ) ;
else if ( proto_version = = 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 ( ) ) ;
# if defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
case PY_SSL_VERSION_TLS1_1 :
ctx = SSL_CTX_new ( TLSv1_1_method ( ) ) ;
break ;
# endif
# ifndef OPENSSL_NO_SSL2
else if ( proto_version = = PY_SSL_VERSION_SSL2 )
ctx = SSL_CTX_new ( SSLv2_method ( ) ) ;
# 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
else if ( proto_version = = PY_SSL_VERSION_TLS ) /* SSLv23 */
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
break ;
default :
proto_version = - 1 ;
}
PySSL_END_ALLOW_THREADS
if ( proto_version = = - 1 ) {
PyErr_SetString ( PyExc_ValueError ,
" invalid protocol version " ) ;
" invalid or unsupported protocol version " ) ;
return NULL ;
}
if ( ctx = = NULL ) {
@ -6185,12 +6182,10 @@ PyInit__ssl(void)
PY_SSL_VERSION_TLS_SERVER ) ;
PyModule_AddIntConstant ( m , " PROTOCOL_TLSv1 " ,
PY_SSL_VERSION_TLS1 ) ;
# if HAVE_TLSv1_2
PyModule_AddIntConstant ( m , " PROTOCOL_TLSv1_1 " ,
PY_SSL_VERSION_TLS1_1 ) ;
PyModule_AddIntConstant ( m , " PROTOCOL_TLSv1_2 " ,
PY_SSL_VERSION_TLS1_2 ) ;
# endif
/* protocol options */
PyModule_AddIntConstant ( m , " OP_ALL " ,
@ -6198,10 +6193,8 @@ PyInit__ssl(void)
PyModule_AddIntConstant ( m , " OP_NO_SSLv2 " , SSL_OP_NO_SSLv2 ) ;
PyModule_AddIntConstant ( m , " OP_NO_SSLv3 " , SSL_OP_NO_SSLv3 ) ;
PyModule_AddIntConstant ( m , " OP_NO_TLSv1 " , SSL_OP_NO_TLSv1 ) ;
# if HAVE_TLSv1_2
PyModule_AddIntConstant ( m , " OP_NO_TLSv1_1 " , SSL_OP_NO_TLSv1_1 ) ;
PyModule_AddIntConstant ( m , " OP_NO_TLSv1_2 " , SSL_OP_NO_TLSv1_2 ) ;
# endif
# ifdef SSL_OP_NO_TLSv1_3
PyModule_AddIntConstant ( m , " OP_NO_TLSv1_3 " , SSL_OP_NO_TLSv1_3 ) ;
# else