@@ -77,6 +77,12 @@ def data_file(*name):
7777DHFILE = data_file ("ffdh3072.pem" )
7878BYTES_DHFILE = DHFILE .encode (sys .getfilesystemencoding ())
7979
80+ # Not defined in all versions of OpenSSL
81+ OP_NO_COMPRESSION = getattr (ssl , "OP_NO_COMPRESSION" , 0 )
82+ OP_SINGLE_DH_USE = getattr (ssl , "OP_SINGLE_DH_USE" , 0 )
83+ OP_SINGLE_ECDH_USE = getattr (ssl , "OP_SINGLE_ECDH_USE" , 0 )
84+ OP_CIPHER_SERVER_PREFERENCE = getattr (ssl , "OP_CIPHER_SERVER_PREFERENCE" , 0 )
85+
8086
8187def handle_error (prefix ):
8288 exc_format = ' ' .join (traceback .format_exception (* sys .exc_info ()))
@@ -798,8 +804,9 @@ def test_options(self):
798804 ctx = ssl .SSLContext (ssl .PROTOCOL_TLSv1 )
799805 # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
800806 default = (ssl .OP_ALL | ssl .OP_NO_SSLv2 | ssl .OP_NO_SSLv3 )
801- if not IS_LIBRESSL and ssl .OPENSSL_VERSION_INFO >= (1 , 1 , 0 ):
802- default |= ssl .OP_NO_COMPRESSION
807+ # SSLContext also enables these by default
808+ default |= (OP_NO_COMPRESSION | OP_CIPHER_SERVER_PREFERENCE |
809+ OP_SINGLE_DH_USE | OP_SINGLE_ECDH_USE )
803810 self .assertEqual (default , ctx .options )
804811 ctx .options |= ssl .OP_NO_TLSv1
805812 self .assertEqual (default | ssl .OP_NO_TLSv1 , ctx .options )
@@ -1178,70 +1185,67 @@ def test_load_default_certs_env_windows(self):
11781185 stats ["x509" ] += 1
11791186 self .assertEqual (ctx .cert_store_stats (), stats )
11801187
1188+ def _assert_context_options (self , ctx ):
1189+ self .assertEqual (ctx .options & ssl .OP_NO_SSLv2 , ssl .OP_NO_SSLv2 )
1190+ if OP_NO_COMPRESSION != 0 :
1191+ self .assertEqual (ctx .options & OP_NO_COMPRESSION ,
1192+ OP_NO_COMPRESSION )
1193+ if OP_SINGLE_DH_USE != 0 :
1194+ self .assertEqual (ctx .options & OP_SINGLE_DH_USE ,
1195+ OP_SINGLE_DH_USE )
1196+ if OP_SINGLE_ECDH_USE != 0 :
1197+ self .assertEqual (ctx .options & OP_SINGLE_ECDH_USE ,
1198+ OP_SINGLE_ECDH_USE )
1199+ if OP_CIPHER_SERVER_PREFERENCE != 0 :
1200+ self .assertEqual (ctx .options & OP_CIPHER_SERVER_PREFERENCE ,
1201+ OP_CIPHER_SERVER_PREFERENCE )
1202+
11811203 def test_create_default_context (self ):
11821204 ctx = ssl .create_default_context ()
1205+
11831206 self .assertEqual (ctx .protocol , ssl .PROTOCOL_SSLv23 )
11841207 self .assertEqual (ctx .verify_mode , ssl .CERT_REQUIRED )
11851208 self .assertTrue (ctx .check_hostname )
1186- self .assertEqual (ctx .options & ssl .OP_NO_SSLv2 , ssl .OP_NO_SSLv2 )
1187- self .assertEqual (
1188- ctx .options & getattr (ssl , "OP_NO_COMPRESSION" , 0 ),
1189- getattr (ssl , "OP_NO_COMPRESSION" , 0 ),
1190- )
1209+ self ._assert_context_options (ctx )
1210+
11911211
11921212 with open (SIGNING_CA ) as f :
11931213 cadata = f .read ().decode ("ascii" )
11941214 ctx = ssl .create_default_context (cafile = SIGNING_CA , capath = CAPATH ,
11951215 cadata = cadata )
11961216 self .assertEqual (ctx .protocol , ssl .PROTOCOL_SSLv23 )
11971217 self .assertEqual (ctx .verify_mode , ssl .CERT_REQUIRED )
1198- self .assertEqual (ctx .options & ssl .OP_NO_SSLv2 , ssl .OP_NO_SSLv2 )
1199- self .assertEqual (
1200- ctx .options & getattr (ssl , "OP_NO_COMPRESSION" , 0 ),
1201- getattr (ssl , "OP_NO_COMPRESSION" , 0 ),
1202- )
1218+ self ._assert_context_options (ctx )
12031219
12041220 ctx = ssl .create_default_context (ssl .Purpose .CLIENT_AUTH )
12051221 self .assertEqual (ctx .protocol , ssl .PROTOCOL_SSLv23 )
12061222 self .assertEqual (ctx .verify_mode , ssl .CERT_NONE )
1207- self .assertEqual (ctx .options & ssl .OP_NO_SSLv2 , ssl .OP_NO_SSLv2 )
1208- self .assertEqual (
1209- ctx .options & getattr (ssl , "OP_NO_COMPRESSION" , 0 ),
1210- getattr (ssl , "OP_NO_COMPRESSION" , 0 ),
1211- )
1212- self .assertEqual (
1213- ctx .options & getattr (ssl , "OP_SINGLE_DH_USE" , 0 ),
1214- getattr (ssl , "OP_SINGLE_DH_USE" , 0 ),
1215- )
1216- self .assertEqual (
1217- ctx .options & getattr (ssl , "OP_SINGLE_ECDH_USE" , 0 ),
1218- getattr (ssl , "OP_SINGLE_ECDH_USE" , 0 ),
1219- )
1223+ self ._assert_context_options (ctx )
12201224
12211225 def test__create_stdlib_context (self ):
12221226 ctx = ssl ._create_stdlib_context ()
12231227 self .assertEqual (ctx .protocol , ssl .PROTOCOL_SSLv23 )
12241228 self .assertEqual (ctx .verify_mode , ssl .CERT_NONE )
12251229 self .assertFalse (ctx .check_hostname )
1226- self .assertEqual (ctx . options & ssl . OP_NO_SSLv2 , ssl . OP_NO_SSLv2 )
1230+ self ._assert_context_options (ctx )
12271231
12281232 ctx = ssl ._create_stdlib_context (ssl .PROTOCOL_TLSv1 )
12291233 self .assertEqual (ctx .protocol , ssl .PROTOCOL_TLSv1 )
12301234 self .assertEqual (ctx .verify_mode , ssl .CERT_NONE )
1231- self .assertEqual (ctx . options & ssl . OP_NO_SSLv2 , ssl . OP_NO_SSLv2 )
1235+ self ._assert_context_options (ctx )
12321236
12331237 ctx = ssl ._create_stdlib_context (ssl .PROTOCOL_TLSv1 ,
12341238 cert_reqs = ssl .CERT_REQUIRED ,
12351239 check_hostname = True )
12361240 self .assertEqual (ctx .protocol , ssl .PROTOCOL_TLSv1 )
12371241 self .assertEqual (ctx .verify_mode , ssl .CERT_REQUIRED )
12381242 self .assertTrue (ctx .check_hostname )
1239- self .assertEqual (ctx . options & ssl . OP_NO_SSLv2 , ssl . OP_NO_SSLv2 )
1243+ self ._assert_context_options (ctx )
12401244
12411245 ctx = ssl ._create_stdlib_context (purpose = ssl .Purpose .CLIENT_AUTH )
12421246 self .assertEqual (ctx .protocol , ssl .PROTOCOL_SSLv23 )
12431247 self .assertEqual (ctx .verify_mode , ssl .CERT_NONE )
1244- self .assertEqual (ctx . options & ssl . OP_NO_SSLv2 , ssl . OP_NO_SSLv2 )
1248+ self ._assert_context_options (ctx )
12451249
12461250 def test__https_verify_certificates (self ):
12471251 # Unit test to check the contect factory mapping
@@ -2841,7 +2845,8 @@ def test_tls1_3(self):
28412845 ssl .OP_NO_TLSv1 | ssl .OP_NO_TLSv1_1 | ssl .OP_NO_TLSv1_2
28422846 )
28432847 with ThreadedEchoServer (context = context ) as server :
2844- with context .wrap_socket (socket .socket ()) as s :
2848+ s = context .wrap_socket (socket .socket ())
2849+ with closing (s ):
28452850 s .connect ((HOST , server .port ))
28462851 self .assertIn (s .cipher ()[0 ], [
28472852 'TLS_AES_256_GCM_SHA384' ,
0 commit comments