@@ -50,10 +50,6 @@ public DTLSTransport accept(TlsServer server, DatagramTransport transport, DTLSR
5050
5151 TlsServerContextImpl serverContext = new TlsServerContextImpl (server .getCrypto ());
5252
53- ServerHandshakeState state = new ServerHandshakeState ();
54- state .server = server ;
55- state .serverContext = serverContext ;
56-
5753 server .init (serverContext );
5854 serverContext .handshakeBeginning (server );
5955
@@ -63,23 +59,34 @@ public DTLSTransport accept(TlsServer server, DatagramTransport transport, DTLSR
6359 DTLSRecordLayer recordLayer = new DTLSRecordLayer (serverContext , server , transport );
6460 server .notifyCloseHandle (recordLayer );
6561
62+ ServerHandshakeState state = new ServerHandshakeState ();
63+ state .server = server ;
64+ state .serverContext = serverContext ;
65+ state .recordLayer = recordLayer ;
66+
6667 try
6768 {
68- return serverHandshake (state , recordLayer , request );
69+ return serverHandshake (state , request );
70+ }
71+ catch (TlsFatalAlertReceived fatalAlertReceived )
72+ {
73+ // assert recordLayer.isFailed();
74+ invalidateSession (state );
75+ throw fatalAlertReceived ;
6976 }
7077 catch (TlsFatalAlert fatalAlert )
7178 {
72- abortServerHandshake (state , recordLayer , fatalAlert .getAlertDescription ());
79+ abortServerHandshake (state , fatalAlert .getAlertDescription ());
7380 throw fatalAlert ;
7481 }
7582 catch (IOException e )
7683 {
77- abortServerHandshake (state , recordLayer , AlertDescription .internal_error );
84+ abortServerHandshake (state , AlertDescription .internal_error );
7885 throw e ;
7986 }
8087 catch (RuntimeException e )
8188 {
82- abortServerHandshake (state , recordLayer , AlertDescription .internal_error );
89+ abortServerHandshake (state , AlertDescription .internal_error );
8390 throw new TlsFatalAlert (AlertDescription .internal_error , e );
8491 }
8592 finally
@@ -88,17 +95,17 @@ public DTLSTransport accept(TlsServer server, DatagramTransport transport, DTLSR
8895 }
8996 }
9097
91- protected void abortServerHandshake (ServerHandshakeState state , DTLSRecordLayer recordLayer , short alertDescription )
98+ protected void abortServerHandshake (ServerHandshakeState state , short alertDescription )
9299 {
93- recordLayer .fail (alertDescription );
100+ state . recordLayer .fail (alertDescription );
94101 invalidateSession (state );
95102 }
96103
97- protected DTLSTransport serverHandshake (ServerHandshakeState state , DTLSRecordLayer recordLayer ,
98- DTLSRequest request ) throws IOException
104+ protected DTLSTransport serverHandshake (ServerHandshakeState state , DTLSRequest request ) throws IOException
99105 {
100106 TlsServer server = state .server ;
101107 TlsServerContextImpl serverContext = state .serverContext ;
108+ DTLSRecordLayer recordLayer = state .recordLayer ;
102109 SecurityParameters securityParameters = serverContext .getSecurityParametersHandshake ();
103110
104111 DTLSReliableHandshake handshake = new DTLSReliableHandshake (serverContext , recordLayer ,
@@ -110,9 +117,6 @@ protected DTLSTransport serverHandshake(ServerHandshakeState state, DTLSRecordLa
110117 {
111118 clientMessage = handshake .receiveMessage ();
112119
113- // NOTE: DTLSRecordLayer requires any DTLS version, we don't otherwise constrain this
114- // ProtocolVersion recordLayerVersion = recordLayer.getReadVersion();
115-
116120 if (clientMessage .getType () == HandshakeType .client_hello )
117121 {
118122 processClientHello (state , clientMessage .getBody ());
@@ -132,14 +136,7 @@ protected DTLSTransport serverHandshake(ServerHandshakeState state, DTLSRecordLa
132136 }
133137
134138 {
135- byte [] serverHelloBody = generateServerHello (state , recordLayer );
136-
137- // TODO[dtls13] Ideally, move this into generateServerHello once legacy_record_version clarified
138- {
139- ProtocolVersion recordLayerVersion = serverContext .getServerVersion ();
140- recordLayer .setReadVersion (recordLayerVersion );
141- recordLayer .setWriteVersion (recordLayerVersion );
142- }
139+ byte [] serverHelloBody = generateServerHello (state );
143140
144141 handshake .sendMessage (HandshakeType .server_hello , serverHelloBody );
145142 }
@@ -446,15 +443,13 @@ protected byte[] generateNewSessionTicket(ServerHandshakeState state, NewSession
446443 return buf .toByteArray ();
447444 }
448445
449- protected byte [] generateServerHello (ServerHandshakeState state , DTLSRecordLayer recordLayer )
446+ protected byte [] generateServerHello (ServerHandshakeState state )
450447 throws IOException
451448 {
452449 TlsServer server = state .server ;
453450 TlsServerContextImpl serverContext = state .serverContext ;
454451 SecurityParameters securityParameters = serverContext .getSecurityParametersHandshake ();
455452
456- // TODO[dtls13] Negotiate cipher suite first?
457-
458453 ProtocolVersion serverVersion ;
459454
460455 // NOT renegotiating
@@ -470,22 +465,24 @@ protected byte[] generateServerHello(ServerHandshakeState state, DTLSRecordLayer
470465// ? ProtocolVersion.DTLSv12
471466// : server_version;
472467//
473- // recordLayer.setWriteVersion(legacy_record_version);
468+ // state. recordLayer.setWriteVersion(legacy_record_version);
474469 securityParameters .negotiatedVersion = serverVersion ;
475470 }
476471
477472 // TODO[dtls13]
478473// if (ProtocolVersion.DTLSv13.isEqualOrEarlierVersionOf(serverVersion))
479474// {
480475// // See RFC 8446 D.4.
481- // recordStream .setIgnoreChangeCipherSpec(true);
476+ // state.recordLayer .setIgnoreChangeCipherSpec(true);
482477//
483- // recordStream.setWriteVersion(ProtocolVersion.DTLSv12);
478+ // state.recordLayer.setReadVersion(ProtocolVersion.DTLSv12);
479+ // state.recordLayer.setWriteVersion(ProtocolVersion.DTLSv12);
484480//
485481// return generate13ServerHello(clientHello, clientHelloMessage, false);
486482// }
487- //
488- // recordStream.setWriteVersion(serverVersion);
483+
484+ state .recordLayer .setReadVersion (serverVersion );
485+ state .recordLayer .setWriteVersion (serverVersion );
489486
490487 {
491488 boolean useGMTUnixTime = server .shouldUseGMTUnixTime ();
@@ -704,7 +701,7 @@ else if (TlsUtils.hasExpectedEmptyExtensionData(state.serverExtensions,
704701
705702 state .clientHello = null ;
706703
707- applyMaxFragmentLengthExtension (recordLayer , securityParameters .getMaxFragmentLength ());
704+ applyMaxFragmentLengthExtension (state . recordLayer , securityParameters .getMaxFragmentLength ());
708705
709706 ByteArrayOutputStream buf = new ByteArrayOutputStream ();
710707 serverHello .encode (serverContext , buf );
@@ -838,6 +835,8 @@ protected void processClientHello(ServerHandshakeState state, byte[] body)
838835 protected void processClientHello (ServerHandshakeState state , ClientHello clientHello )
839836 throws IOException
840837 {
838+ state .recordLayer .setWriteVersion (ProtocolVersion .DTLSv10 );
839+
841840 state .clientHello = clientHello ;
842841
843842 // TODO Read RFCs for guidance on the expected record layer version number
@@ -1014,6 +1013,7 @@ protected static class ServerHandshakeState
10141013 {
10151014 TlsServer server = null ;
10161015 TlsServerContextImpl serverContext = null ;
1016+ DTLSRecordLayer recordLayer = null ;
10171017 TlsSession tlsSession = null ;
10181018 SessionParameters sessionParameters = null ;
10191019 TlsSecret sessionMasterSecret = null ;
0 commit comments