@@ -734,7 +734,9 @@ def _clientSendClientHello(self, settings, session, srpUsername,
734734 create (bytearray (b'' )))
735735 self ._client_keypair = certParams
736736
737+ # fake session_id for middlebox compatibility mode
737738 session_id = getRandomBytes (32 )
739+
738740 extensions .append (SupportedVersionsExtension ().
739741 create (settings .versions ))
740742
@@ -964,6 +966,13 @@ def _clientGetServerHello(self, settings, session, clientHello):
964966 "update to Client Hello" ):
965967 yield result
966968
969+ if clientHello .session_id != hello_retry .session_id :
970+ for result in self ._sendError (
971+ AlertDescription .illegal_parameter ,
972+ "Received HRR session_id does not match the one in "
973+ "ClientHello" ):
974+ yield result
975+
967976 ext = clientHello .getExtension (ExtensionType .pre_shared_key )
968977 if ext :
969978 # move the extension to end (in case extension like cookie was
@@ -979,8 +988,12 @@ def _clientGetServerHello(self, settings, session, clientHello):
979988 if session else None )
980989
981990 # resend the client hello with performed changes
982- ccs = ChangeCipherSpec ().create ()
983- for result in self ._sendMsgs ([ccs , clientHello ]):
991+ msgs = []
992+ if clientHello .session_id :
993+ ccs = ChangeCipherSpec ().create ()
994+ msgs .append (ccs )
995+ msgs .append (clientHello )
996+ for result in self ._sendMsgs (msgs ):
984997 yield result
985998 self ._ccs_sent = True
986999
@@ -1023,6 +1036,13 @@ def _clientGetServerHello(self, settings, session, clientHello):
10231036 "Too new version: {0} (max: {1})"
10241037 .format (real_version , settings .maxVersion )):
10251038 yield result
1039+ if real_version > (3 , 3 ) and \
1040+ serverHello .session_id != clientHello .session_id :
1041+ for result in self ._sendError (
1042+ AlertDescription .illegal_parameter ,
1043+ "Received ServerHello session_id does not match the one "
1044+ "in ClientHello" ):
1045+ yield result
10261046 cipherSuites = CipherSuite .filterForVersion (clientHello .cipher_suites ,
10271047 minVersion = real_version ,
10281048 maxVersion = real_version )
@@ -1460,7 +1480,7 @@ def _clientTLS13Handshake(self, settings, session, clientHello,
14601480 cl_finished = Finished (self .version , prf_size )
14611481 cl_finished .create (cl_verify_data )
14621482
1463- if not self ._ccs_sent :
1483+ if not self ._ccs_sent and clientHello . session_id :
14641484 ccs = ChangeCipherSpec ().create ()
14651485 msgs = [ccs , cl_finished ]
14661486 else :
@@ -1469,6 +1489,8 @@ def _clientTLS13Handshake(self, settings, session, clientHello,
14691489 for result in self ._sendMsgs (msgs ):
14701490 yield result
14711491
1492+ # CCS messages are not allowed in post handshake authentication
1493+ self ._middlebox_compat_mode = False
14721494
14731495 # fully switch to application data
14741496 self ._changeWriteState ()
@@ -2637,7 +2659,7 @@ def _serverTLS13Handshake(self, settings, clientHello, cipherSuite,
26372659
26382660 msgs = []
26392661 msgs .append (serverHello )
2640- if not self ._ccs_sent :
2662+ if not self ._ccs_sent and clientHello . session_id :
26412663 ccs = ChangeCipherSpec ().create ()
26422664 msgs .append (ccs )
26432665 for result in self ._sendMsgs (msgs ):
@@ -2714,7 +2736,10 @@ def _serverTLS13Handshake(self, settings, clientHello, cipherSuite,
27142736 ctx = b''
27152737
27162738 # Get list of valid Signing Algorithms
2717- valid_sig_algs = self ._sigHashesToList (settings )
2739+ # we don't support DSA for client certificates yet
2740+ cr_settings = settings .validate ()
2741+ cr_settings .dsaSigHashes = []
2742+ valid_sig_algs = self ._sigHashesToList (cr_settings )
27182743 assert valid_sig_algs
27192744
27202745 certificate_request = CertificateRequest (self .version )
@@ -2885,6 +2910,9 @@ def _serverTLS13Handshake(self, settings, clientHello, cipherSuite,
28852910 "Finished value is not valid" ):
28862911 yield result
28872912
2913+ # disallow CCS messages after handshake
2914+ self ._middlebox_compat_mode = False
2915+
28882916 resumption_master_secret = derive_secret (secret ,
28892917 bytearray (b'res master' ),
28902918 self ._handshake_hash ,
@@ -3644,8 +3672,11 @@ def _serverGetClientHello(self, settings, private_key, cert_chain,
36443672 hrr .create ((3 , 3 ), TLS_1_3_HRR , clientHello .session_id ,
36453673 cipherSuite , extensions = hrr_ext )
36463674
3647- ccs = ChangeCipherSpec ().create ()
3648- for result in self ._sendMsgs ([hrr , ccs ]):
3675+ msgs = [hrr ]
3676+ if clientHello .session_id :
3677+ ccs = ChangeCipherSpec ().create ()
3678+ msgs .append (ccs )
3679+ for result in self ._sendMsgs (msgs ):
36493680 yield result
36503681 self ._ccs_sent = True
36513682
@@ -4009,7 +4040,10 @@ def _serverCertKeyExchange(self, clientHello, serverHello, sigHashAlg,
40094040 certificateRequest = CertificateRequest (self .version )
40104041 if not reqCAs :
40114042 reqCAs = []
4012- valid_sig_algs = self ._sigHashesToList (settings )
4043+ cr_settings = settings .validate ()
4044+ # we don't support DSA in client certificates yet
4045+ cr_settings .dsaSigHashes = []
4046+ valid_sig_algs = self ._sigHashesToList (cr_settings )
40134047 certificateRequest .create ([ClientCertificateType .rsa_sign ,
40144048 ClientCertificateType .ecdsa_sign ],
40154049 reqCAs ,
0 commit comments