5252IS_OPENSSL_3_0_0 = ssl .OPENSSL_VERSION_INFO >= (3 , 0 , 0 )
5353PY_SSL_DEFAULT_CIPHERS = sysconfig .get_config_var ('PY_SSL_DEFAULT_CIPHERS' )
5454
55+ HAS_KEYLOG = hasattr (ssl .SSLContext , 'keylog_filename' )
56+ requires_keylog = unittest .skipUnless (
57+ HAS_KEYLOG , 'test requires OpenSSL 1.1.1 with keylog callback' )
58+ CAN_SET_KEYLOG = HAS_KEYLOG and os .name != "nt"
59+ requires_keylog_setter = unittest .skipUnless (
60+ CAN_SET_KEYLOG ,
61+ "cannot set 'keylog_filename' on Windows"
62+ )
63+
64+
5565PROTOCOL_TO_TLS_VERSION = {}
5666for proto , ver in (
5767 ("PROTOCOL_SSLv3" , "SSLv3" ),
@@ -295,24 +305,35 @@ def make_test_context(
295305 cert_reqs = ssl .CERT_NONE ,
296306 ca_certs = None , certfile = None , keyfile = None ,
297307 ciphers = None ,
308+ min_version = None , max_version = None ,
298309):
299310 if server_side :
300311 context = ssl .SSLContext (ssl .PROTOCOL_TLS_SERVER )
301312 else :
302313 context = ssl .SSLContext (ssl .PROTOCOL_TLS_CLIENT )
314+
303315 if check_hostname is None :
304316 if cert_reqs == ssl .CERT_NONE :
305317 context .check_hostname = False
306318 else :
307319 context .check_hostname = check_hostname
320+
308321 if cert_reqs is not None :
309322 context .verify_mode = cert_reqs
323+
310324 if ca_certs is not None :
311325 context .load_verify_locations (ca_certs )
312326 if certfile is not None or keyfile is not None :
313327 context .load_cert_chain (certfile , keyfile )
328+
314329 if ciphers is not None :
315330 context .set_ciphers (ciphers )
331+
332+ if min_version is not None :
333+ context .minimum_version = min_version
334+ if max_version is not None :
335+ context .maximum_version = max_version
336+
316337 return context
317338
318339
@@ -324,6 +345,7 @@ def test_wrap_socket(
324345 cert_reqs = ssl .CERT_NONE ,
325346 ca_certs = None , certfile = None , keyfile = None ,
326347 ciphers = None ,
348+ min_version = None , max_version = None ,
327349 ** kwargs ,
328350):
329351 context = make_test_context (
@@ -332,6 +354,7 @@ def test_wrap_socket(
332354 cert_reqs = cert_reqs ,
333355 ca_certs = ca_certs , certfile = certfile , keyfile = keyfile ,
334356 ciphers = ciphers ,
357+ min_version = min_version , max_version = max_version ,
335358 )
336359 if not server_side :
337360 kwargs .setdefault ("server_hostname" , SIGNED_CERTFILE_HOSTNAME )
@@ -1780,6 +1803,39 @@ def test_num_tickest(self):
17801803 with self .assertRaises (ValueError ):
17811804 ctx .num_tickets = 1
17821805
1806+ @support .cpython_only
1807+ def test_refcycle_msg_callback (self ):
1808+ # See https://github.com/python/cpython/issues/142516.
1809+ ctx = make_test_context ()
1810+ def msg_callback (* args , _ = ctx , ** kwargs ): ...
1811+ ctx ._msg_callback = msg_callback
1812+
1813+ @support .cpython_only
1814+ @requires_keylog_setter
1815+ def test_refcycle_keylog_filename (self ):
1816+ # See https://github.com/python/cpython/issues/142516.
1817+ self .addCleanup (os_helper .unlink , os_helper .TESTFN )
1818+ ctx = make_test_context ()
1819+ class KeylogFilename (str ): ...
1820+ ctx .keylog_filename = KeylogFilename (os_helper .TESTFN )
1821+ ctx .keylog_filename ._ = ctx
1822+
1823+ @support .cpython_only
1824+ @unittest .skipUnless (ssl .HAS_PSK , 'requires TLS-PSK' )
1825+ def test_refcycle_psk_client_callback (self ):
1826+ # See https://github.com/python/cpython/issues/142516.
1827+ ctx = make_test_context ()
1828+ def psk_client_callback (* args , _ = ctx , ** kwargs ): ...
1829+ ctx .set_psk_client_callback (psk_client_callback )
1830+
1831+ @support .cpython_only
1832+ @unittest .skipUnless (ssl .HAS_PSK , 'requires TLS-PSK' )
1833+ def test_refcycle_psk_server_callback (self ):
1834+ # See https://github.com/python/cpython/issues/142516.
1835+ ctx = make_test_context (server_side = True )
1836+ def psk_server_callback (* args , _ = ctx , ** kwargs ): ...
1837+ ctx .set_psk_server_callback (psk_server_callback )
1838+
17831839
17841840class SSLErrorTests (unittest .TestCase ):
17851841
@@ -5027,10 +5083,6 @@ def test_internal_chain_server(self):
50275083 self .assertEqual (res , b'\x02 \n ' )
50285084
50295085
5030- HAS_KEYLOG = hasattr (ssl .SSLContext , 'keylog_filename' )
5031- requires_keylog = unittest .skipUnless (
5032- HAS_KEYLOG , 'test requires OpenSSL 1.1.1 with keylog callback' )
5033-
50345086class TestSSLDebug (unittest .TestCase ):
50355087
50365088 def keylog_lines (self , fname = os_helper .TESTFN ):
0 commit comments