1313 SslClient ,
1414 OpenSSLError ,
1515 OpenSslEarlyDataStatusEnum ,
16+ OpenSslDigestNidEnum ,
1617)
1718from nassl .ephemeral_key_info import (
1819 OpenSslEvpPkeyEnum ,
@@ -218,6 +219,7 @@ def test_get_verified_chain(self) -> None:
218219
219220 # And when requesting the verified certificate chain, it returns it
220221 assert ssl_client .get_verified_chain ()
222+
221223 finally :
222224 ssl_client .shutdown ()
223225
@@ -361,16 +363,20 @@ def test_set_groups_curve_x448(self) -> None:
361363 assert len (dh_info .public_bytes ) == 56
362364
363365 def test_get_extended_master_secret_not_used (self ) -> None :
366+ # Given a TLS server that does NOT support the Extended Master Secret extension
364367 with LegacyOpenSslServer () as server :
365368 sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
366369 sock .settimeout (5 )
367370 sock .connect ((server .hostname , server .port ))
368371
372+ # When a client connects to it
369373 ssl_client = SslClient (
370374 ssl_version = OpenSslVersionEnum .TLSV1_2 ,
371375 underlying_socket = sock ,
372376 ssl_verify = OpenSslVerifyEnum .NONE ,
373377 )
378+
379+ # Then, before the handshake, the client cannot tell if Extended Master Secret was used
374380 exms_support_before_handshake = ssl_client .get_extended_master_secret_support ()
375381 assert exms_support_before_handshake == ExtendedMasterSecretSupportEnum .UNKNOWN
376382
@@ -379,29 +385,83 @@ def test_get_extended_master_secret_not_used(self) -> None:
379385 finally :
380386 ssl_client .shutdown ()
381387
388+ # And after the handshake, the client can tell that Extended Master Secret was NOT used
382389 exms_support = ssl_client .get_extended_master_secret_support ()
383390 assert exms_support == ExtendedMasterSecretSupportEnum .NOT_USED_IN_CURRENT_SESSION
384391
385392 def test_get_extended_master_secret_used (self ) -> None :
393+ # Given a TLS server that DOES support the Extended Master Secret extension
386394 with ModernOpenSslServer () as server :
387395 sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
388396 sock .settimeout (5 )
389397 sock .connect ((server .hostname , server .port ))
390398
399+ # When a client connects to it
391400 ssl_client = SslClient (
392401 ssl_version = OpenSslVersionEnum .TLSV1_2 ,
393402 underlying_socket = sock ,
394403 ssl_verify = OpenSslVerifyEnum .NONE ,
395404 )
396405
406+ # Then, before the handshake, the client cannot tell if Extended Master Secret was used
407+ exms_support_before_handshake = ssl_client .get_extended_master_secret_support ()
408+ assert exms_support_before_handshake == ExtendedMasterSecretSupportEnum .UNKNOWN
409+
397410 try :
398411 ssl_client .do_handshake ()
399412 finally :
400413 ssl_client .shutdown ()
401414
415+ # And after the handshake, the client can tell that Extended Master Secret was used
402416 exms_support = ssl_client .get_extended_master_secret_support ()
403417 assert exms_support == ExtendedMasterSecretSupportEnum .USED_IN_CURRENT_SESSION
404418
419+ def test_set_signature_algorithms (self ) -> None :
420+ # Given a TLS server
421+ with ModernOpenSslServer () as server :
422+ sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
423+ sock .settimeout (5 )
424+ sock .connect ((server .hostname , server .port ))
425+
426+ # And a client
427+ ssl_client = SslClient (
428+ ssl_version = OpenSslVersionEnum .TLSV1_2 ,
429+ underlying_socket = sock ,
430+ ssl_verify = OpenSslVerifyEnum .NONE ,
431+ )
432+ # That's configured to use a specific signature algorithm
433+ ssl_client .set_signature_algorithms ([(OpenSslDigestNidEnum .SHA256 , OpenSslEvpPkeyEnum .RSA )])
434+
435+ # When the client connects to the server, it succeeds
436+ try :
437+ ssl_client .do_handshake ()
438+ finally :
439+ ssl_client .shutdown ()
440+
441+ # And the configured signature algorithm was used
442+ assert ssl_client .get_peer_signature_nid () == OpenSslDigestNidEnum .SHA256
443+
444+ def test_set_signature_algorithms_but_not_supported (self ) -> None :
445+ # Given a TLS server
446+ with ModernOpenSslServer () as server :
447+ sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
448+ sock .settimeout (5 )
449+ sock .connect ((server .hostname , server .port ))
450+
451+ # And a client
452+ ssl_client = SslClient (
453+ ssl_version = OpenSslVersionEnum .TLSV1_3 ,
454+ underlying_socket = sock ,
455+ ssl_verify = OpenSslVerifyEnum .NONE ,
456+ )
457+ # That's configured to use signature algorithms that are NOT supported
458+ ssl_client .set_signature_algorithms ([(OpenSslDigestNidEnum .SHA512 , OpenSslEvpPkeyEnum .EC )])
459+
460+ # Then, when the client connects to the server, the handshake fails
461+ with pytest .raises (OpenSSLError , match = "handshake failure" ):
462+ ssl_client .do_handshake ()
463+ ssl_client .shutdown ()
464+
405465
406466class TestLegacySslClientOnline :
407467 def test_ssl_2 (self ) -> None :
0 commit comments