@@ -99,6 +99,15 @@ const TLS_CHACHA20_POLY1305_SHA256_X25519: Algorithms = Algorithms::new(
99
99
false ,
100
100
) ;
101
101
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
+
102
111
#[ test]
103
112
fn test_full_round_trip ( ) {
104
113
let cr = random_bytes ( 32 ) ;
@@ -187,3 +196,100 @@ fn test_full_round_trip() {
187
196
}
188
197
assert ! ( b) ;
189
198
}
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