@@ -2046,6 +2046,12 @@ def psk_server_callback(*args, _=ctx, **kwargs): ...
20462046
20472047
20482048class ECHTests (unittest .TestCase ):
2049+ requires_ech_x25519 = unittest .skipUnless (
2050+ ssl .HAS_ECH
2051+ and 'x25519' in ssl .SSLContext (ssl .PROTOCOL_TLS_CLIENT ).get_groups (),
2052+ 'requires ECH with X25519' ,
2053+ )
2054+
20492055 # An ECHConfigList for localhost using X25519, HKDF-SHA256 and AES-128-GCM.
20502056 ECH_CONFIG = bytes .fromhex (
20512057 '003c fe0d 0038 db 0020 0020'
@@ -2097,7 +2103,7 @@ def test_socket_without_ssl_object(self):
20972103 self .assertIsNone (sock .get_ech_status ())
20982104 self .assertIsNone (sock .get_ech_retry_config ())
20992105
2100- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2106+ @requires_ech_x25519
21012107 def test_set_ech_config (self ):
21022108 ctx = make_test_context ()
21032109 for config in (self .ECH_CONFIG , bytearray (self .ECH_CONFIG ),
@@ -2116,7 +2122,7 @@ def test_set_ech_config(self):
21162122 self .assertRaises (ssl .SSLError , ctx .set_ech_config , config )
21172123 self .assertIsNone (ctx .set_ech_config (self .ECH_CONFIG ))
21182124
2119- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2125+ @requires_ech_x25519
21202126 def test_mixed_ech_config_versions (self ):
21212127 ctx = make_test_context ()
21222128 supported = self .ECH_CONFIG [2 :]
@@ -2133,7 +2139,7 @@ def read_ech_key_and_config(self):
21332139 config = base64 .b64decode (config .split (b'-----END ECHCONFIG-----' )[0 ])
21342140 return key , config
21352141
2136- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2142+ @requires_ech_x25519
21372143 def test_load_ech_keys (self ):
21382144 client_ctx , ctx , hostname = testing_context ()
21392145 filename = data_file ('ech.pem' )
@@ -2171,7 +2177,7 @@ def test_load_ech_keys(self):
21712177 self .assertEqual (client .get_ech_status (),
21722178 ssl .ECHStatus .ECH_STATUS_SUCCESS )
21732179
2174- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2180+ @requires_ech_x25519
21752181 def test_ech_handshake (self ):
21762182 key , config = self .read_ech_key_and_config ()
21772183 other_config = bytearray (config )
@@ -2214,7 +2220,7 @@ def sni_callback(obj, name, ctx):
22142220 client , server , * _ = connected_bio_pair (client_ctx , server_ctx , hostname )
22152221 self .assertEqual (client .get_ech_retry_config (), bytes (other_config ))
22162222
2217- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2223+ @requires_ech_x25519
22182224 def test_status_before_handshake (self ):
22192225 ctx = make_test_context ()
22202226 for configured in (False , True ):
@@ -2233,7 +2239,7 @@ def test_status_before_handshake(self):
22332239 self .assertIsNone (obj .outer_server_hostname )
22342240 self .assertEqual (obj .get_ech_retry_config (), b'' )
22352241
2236- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2242+ @requires_ech_x25519
22372243 def test_set_outer_server_name (self ):
22382244 ctx = make_test_context ()
22392245 ctx .set_ech_config (self .ECH_CONFIG )
@@ -2310,7 +2316,7 @@ def make_rejected_client(self):
23102316 c_in .write (s_out .read ())
23112317 return client
23122318
2313- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2319+ @requires_ech_x25519
23142320 def test_rejected_ech (self ):
23152321 client = self .make_rejected_client ()
23162322 self .assertEqual (client .get_ech_status (), ssl .ECHStatus .ECH_STATUS_FAILED )
@@ -2320,7 +2326,7 @@ def test_rejected_ech(self):
23202326 self .assertEqual (client .outer_server_hostname , 'localhost' )
23212327 self .assertEqual (client .get_ech_retry_config (), b'' )
23222328
2323- @unittest . skipUnless ( ssl . HAS_ECH , 'requires ECH' )
2329+ @requires_ech_x25519
23242330 @support .nomemtest
23252331 def test_status_allocation_failure (self ):
23262332 import _testcapi
0 commit comments