@@ -99,6 +99,15 @@ const TLS_CHACHA20_POLY1305_SHA256_X25519: Algorithms = Algorithms::new(
9999 false ,
100100) ;
101101
102+ const TLS_WITH_PSK_CHACHA20_POLY1305_SHA256_X25519 : Algorithms = Algorithms :: new (
103+ HashAlgorithm :: SHA256 ,
104+ AeadAlgorithm :: Chacha20Poly1305 ,
105+ SignatureScheme :: EcdsaSecp256r1Sha256 ,
106+ KemScheme :: X25519 ,
107+ true ,
108+ true ,
109+ ) ;
110+
102111#[ test]
103112fn test_full_round_trip ( ) {
104113 let cr = random_bytes ( 32 ) ;
@@ -187,3 +196,100 @@ fn test_full_round_trip() {
187196 }
188197 assert ! ( b) ;
189198}
199+
200+ #[ test]
201+ fn test_full_round_trip_with_psk ( ) {
202+ let cr = random_bytes ( 32 ) ;
203+ let x = cr. concat ( load_hex ( client_x25519_priv) ) ;
204+ let mut client_rng = TestRng :: new ( x. declassify ( ) ) ;
205+ let server_name = load_hex ( "6c 6f 63 61 6c 68 6f 73 74" ) ;
206+ let sr = random_bytes ( 64 ) ;
207+ let y = load_hex ( server_x25519_priv) ;
208+ let ent_s = sr. concat ( y) ;
209+ let mut server_rng = TestRng :: new ( ent_s. declassify ( ) ) ;
210+ let session_ticket = random_bytes ( 32 ) ;
211+ let psk = random_bytes ( 32 ) ;
212+
213+ let db = ServerDB :: new (
214+ server_name. clone ( ) ,
215+ Bytes :: from ( & ECDSA_P256_SHA256_CERT ) ,
216+ SignatureKey :: from ( & ECDSA_P256_SHA256_Key ) ,
217+ Some ( ( session_ticket. clone ( ) , psk. clone ( ) ) ) ,
218+ ) ;
219+
220+ let mut b = true ;
221+ const ciphersuite: Algorithms = TLS_WITH_PSK_CHACHA20_POLY1305_SHA256_X25519 ;
222+
223+ match Client :: connect (
224+ ciphersuite,
225+ & server_name,
226+ Some ( session_ticket) ,
227+ Some ( psk) ,
228+ & mut client_rng,
229+ ) {
230+ Err ( x) => {
231+ println ! ( "Client0 Error {}" , x) ;
232+ b = false ;
233+ }
234+ Ok ( ( client_hello, client) ) => {
235+ println ! ( "Client0 Complete {}" , server_rng. raw( ) . len( ) ) ;
236+ match Server :: accept ( ciphersuite, db, & client_hello, & mut server_rng) {
237+ Err ( x) => {
238+ println ! ( "ServerInit Error {}" , x) ;
239+ b = false ;
240+ }
241+ Ok ( ( sh, sf, server) ) => {
242+ println ! ( "Server0 Complete" ) ;
243+ match client. read_handshake ( & sh) {
244+ Err ( x) => {
245+ println ! ( "ServerHello Error {}" , x) ;
246+ b = false ;
247+ }
248+ Ok ( ( Some ( _) , _) ) => {
249+ println ! ( "ServerHello State Error" ) ;
250+ b = false ;
251+ }
252+ Ok ( ( None , client_state) ) => match client_state. read_handshake ( & sf) {
253+ Err ( x) => {
254+ println ! ( "ClientFinish Error {}" , x) ;
255+ b = false ;
256+ }
257+ Ok ( ( None , _) ) => {
258+ println ! ( "ClientFinish State Error" ) ;
259+ b = false ;
260+ }
261+ Ok ( ( Some ( cf) , client) ) => {
262+ println ! ( "Client Complete" ) ;
263+ match server. read_handshake ( & cf) {
264+ Err ( x) => {
265+ println ! ( "Server1 Error {}" , x) ;
266+ b = false ;
267+ }
268+ Ok ( server) => {
269+ println ! ( "Server Complete" ) ;
270+
271+ // Send data from client to server.
272+ let data = Bytes :: from ( b"Hello server, here is the client" ) ;
273+ let ( ap, client) =
274+ client. write ( AppData :: new ( data. clone ( ) ) ) . unwrap ( ) ;
275+ let ( apo, server) = server. read ( & ap) . unwrap ( ) ;
276+ assert ! ( eq( & data, apo. unwrap( ) . as_raw( ) ) ) ;
277+
278+ // Send data from server to client.
279+ let data =
280+ Bytes :: from ( b"Hello client, here is the server." ) ;
281+ let ( ap, _server) =
282+ server. write ( AppData :: new ( data. clone ( ) ) ) . unwrap ( ) ;
283+ let ( application_data, _cstate) = client. read ( & ap) . unwrap ( ) ;
284+ assert ! ( eq( & data, application_data. unwrap( ) . as_raw( ) ) ) ;
285+ }
286+ }
287+ }
288+ } ,
289+ }
290+ }
291+ }
292+ }
293+ }
294+ assert ! ( b) ;
295+ }
0 commit comments