@@ -10,8 +10,18 @@ use crate::errors::*;
10
10
use tokio:: net:: UdpSocket ;
11
11
12
12
use std:: time:: SystemTime ;
13
+
13
14
//use std::io::Write;
14
15
16
+ lazy_static ! {
17
+ pub static ref ERR_TEST_PSK_INVALID_IDENTITY : Error =
18
+ Error :: new( "TestPSK: Server got invalid identity" . to_owned( ) ) ;
19
+ pub static ref ERR_PSK_REJECTED : Error = Error :: new( "PSK Rejected" . to_owned( ) ) ;
20
+ pub static ref ERR_NOT_EXPECTED_CHAIN : Error = Error :: new( "not expected chain" . to_owned( ) ) ;
21
+ pub static ref ERR_EXPECTED_CHAIN : Error = Error :: new( "expected chain" . to_owned( ) ) ;
22
+ pub static ref ERR_WRONG_CERT : Error = Error :: new( "wrong cert" . to_owned( ) ) ;
23
+ }
24
+
15
25
async fn build_pipe ( ) -> Result < ( Conn , Conn ) , Error > {
16
26
let ( ua, ub) = pipe ( ) . await ?;
17
27
@@ -39,10 +49,13 @@ async fn pipe_conn(ca: UdpSocket, cb: UdpSocket) -> Result<(Conn, Conn), Error>
39
49
ca,
40
50
Config {
41
51
srtp_protection_profiles : vec ! [ SRTPProtectionProfile :: SRTP_AES128_CM_HMAC_SHA1_80 ] ,
52
+ //TODO: change PSK to cert
42
53
cipher_suites : vec ! [ CipherSuiteID :: TLS_PSK_WITH_AES_128_GCM_SHA256 ] ,
54
+ psk : Some ( psk_callback_client) ,
55
+ psk_identity_hint : Some ( "WebRTC.rs DTLS Server" . as_bytes ( ) . to_vec ( ) ) ,
43
56
..Default :: default ( )
44
57
} ,
45
- false ,
58
+ false , //TODO: use ceritificate
46
59
)
47
60
. await ;
48
61
@@ -54,10 +67,13 @@ async fn pipe_conn(ca: UdpSocket, cb: UdpSocket) -> Result<(Conn, Conn), Error>
54
67
cb,
55
68
Config {
56
69
srtp_protection_profiles : vec ! [ SRTPProtectionProfile :: SRTP_AES128_CM_HMAC_SHA1_80 ] ,
70
+ //TODO: change PSK to cert
57
71
cipher_suites : vec ! [ CipherSuiteID :: TLS_PSK_WITH_AES_128_GCM_SHA256 ] ,
72
+ psk : Some ( psk_callback_server) ,
73
+ psk_identity_hint : Some ( "WebRTC.rs DTLS Client" . as_bytes ( ) . to_vec ( ) ) ,
58
74
..Default :: default ( )
59
75
} ,
60
- false ,
76
+ false , //TODO: use ceritificate
61
77
)
62
78
. await ?;
63
79
@@ -86,16 +102,17 @@ fn psk_callback_server(hint: &[u8]) -> Result<Vec<u8>, Error> {
86
102
Ok ( vec ! [ 0xAB , 0xC1 , 0x23 ] )
87
103
}
88
104
105
+ fn psk_callback_hint_fail ( _hint : & [ u8 ] ) -> Result < Vec < u8 > , Error > {
106
+ Err ( ERR_PSK_REJECTED . clone ( ) )
107
+ }
108
+
89
109
async fn create_test_client (
90
110
ca : UdpSocket ,
91
111
mut cfg : Config ,
92
112
generate_certificate : bool ,
93
113
) -> Result < Conn , Error > {
94
114
if generate_certificate {
95
115
//TODO:
96
- } else {
97
- cfg. psk = Some ( psk_callback_client) ;
98
- cfg. psk_identity_hint = "WebRTC.rs DTLS Server" . as_bytes ( ) . to_vec ( ) ;
99
116
}
100
117
101
118
cfg. insecure_skip_verify = true ;
@@ -104,15 +121,13 @@ async fn create_test_client(
104
121
105
122
async fn create_test_server (
106
123
cb : UdpSocket ,
107
- mut cfg : Config ,
124
+ cfg : Config ,
108
125
generate_certificate : bool ,
109
126
) -> Result < Conn , Error > {
110
127
if generate_certificate {
111
128
//TODO:
112
- } else {
113
- cfg. psk = Some ( psk_callback_server) ;
114
- cfg. psk_identity_hint = "WebRTC.rs DTLS Client" . as_bytes ( ) . to_vec ( ) ;
115
129
}
130
+
116
131
Conn :: new ( cb, cfg, false , None ) . await
117
132
}
118
133
@@ -340,11 +355,11 @@ async fn test_handshake_with_alert() -> Result<(), Error> {
340
355
341
356
let (ca, cb) = pipe().await?;
342
357
tokio::spawn(async move {
343
- let result = create_test_client(ca, config_client, false).await;
358
+ let result = create_test_client(ca, config_client, false).await; //TODO: use certificate
344
359
let _ = client_err_tx.send(result).await;
345
360
});
346
361
347
- let result_server = create_test_server(cb, config_server, false).await;
362
+ let result_server = create_test_server(cb, config_server, false).await; //TODO: use certificate
348
363
if let Err(err) = result_server {
349
364
assert_eq!(
350
365
err, err_server,
@@ -495,3 +510,141 @@ async fn test_export_keying_material() -> Result<(), Error> {
495
510
496
511
Ok ( ( ) )
497
512
}
513
+
514
+ #[ tokio:: test]
515
+ async fn test_psk ( ) -> Result < ( ) , Error > {
516
+ /*env_logger::Builder::new()
517
+ .format(|buf, record| {
518
+ writeln!(
519
+ buf,
520
+ "{}:{} [{}] {} - {}",
521
+ record.file().unwrap_or("unknown"),
522
+ record.line().unwrap_or(0),
523
+ record.level(),
524
+ chrono::Local::now().format("%H:%M:%S.%6f"),
525
+ record.args()
526
+ )
527
+ })
528
+ .filter(None, LevelFilter::Trace)
529
+ .init();*/
530
+
531
+ let tests = vec ! [
532
+ (
533
+ "Server identity specified" ,
534
+ Some ( "Test Identity" . as_bytes( ) . to_vec( ) ) ,
535
+ ) ,
536
+ ( "Server identity nil" , None ) ,
537
+ ] ;
538
+
539
+ for ( name, server_identity) in tests {
540
+ let client_identity = "Client Identity" . as_bytes ( ) ;
541
+ let ( client_res_tx, mut client_res_rx) = mpsc:: channel ( 1 ) ;
542
+
543
+ let ( ca, cb) = pipe ( ) . await ?;
544
+ tokio:: spawn ( async move {
545
+ let conf = Config {
546
+ psk : Some ( psk_callback_client) ,
547
+ psk_identity_hint : Some ( client_identity. to_vec ( ) ) ,
548
+ cipher_suites : vec ! [ CipherSuiteID :: TLS_PSK_WITH_AES_128_GCM_SHA256 ] , //TODO: change it to TLS_PSK_WITH_AES_128_CCM_8
549
+ ..Default :: default ( )
550
+ } ;
551
+
552
+ let result = create_test_client ( ca, conf, false ) . await ;
553
+ let _ = client_res_tx. send ( result) . await ;
554
+ } ) ;
555
+
556
+ let config = Config {
557
+ psk : Some ( psk_callback_server) ,
558
+ psk_identity_hint : server_identity,
559
+ cipher_suites : vec ! [ CipherSuiteID :: TLS_PSK_WITH_AES_128_GCM_SHA256 ] , //TODO: change it to TLS_PSK_WITH_AES_128_CCM_8
560
+ ..Default :: default ( )
561
+ } ;
562
+
563
+ let mut server = create_test_server ( cb, config, false ) . await ?;
564
+
565
+ if let Some ( result) = client_res_rx. recv ( ) . await {
566
+ if let Ok ( mut client) = result {
567
+ client. close ( ) . await ?;
568
+ } else {
569
+ assert ! (
570
+ false ,
571
+ "{}: Expected create_test_client successfully, but got error" ,
572
+ name,
573
+ ) ;
574
+ }
575
+ }
576
+
577
+ server. close ( ) . await ?;
578
+ }
579
+
580
+ Ok ( ( ) )
581
+ }
582
+
583
+ #[ tokio:: test]
584
+ async fn test_psk_hint_fail ( ) -> Result < ( ) , Error > {
585
+ /*env_logger::Builder::new()
586
+ .format(|buf, record| {
587
+ writeln!(
588
+ buf,
589
+ "{}:{} [{}] {} - {}",
590
+ record.file().unwrap_or("unknown"),
591
+ record.line().unwrap_or(0),
592
+ record.level(),
593
+ chrono::Local::now().format("%H:%M:%S.%6f"),
594
+ record.args()
595
+ )
596
+ })
597
+ .filter(None, LevelFilter::Trace)
598
+ .init();*/
599
+
600
+ let ( client_res_tx, mut client_res_rx) = mpsc:: channel ( 1 ) ;
601
+
602
+ let ( ca, cb) = pipe ( ) . await ?;
603
+ tokio:: spawn ( async move {
604
+ let conf = Config {
605
+ psk : Some ( psk_callback_hint_fail) ,
606
+ psk_identity_hint : Some ( vec ! [ ] ) ,
607
+ cipher_suites : vec ! [ CipherSuiteID :: TLS_PSK_WITH_AES_128_GCM_SHA256 ] , //TODO: change it to TLS_PSK_WITH_AES_128_CCM_8
608
+ ..Default :: default ( )
609
+ } ;
610
+
611
+ let result = create_test_client ( ca, conf, false ) . await ;
612
+ let _ = client_res_tx. send ( result) . await ;
613
+ } ) ;
614
+
615
+ let config = Config {
616
+ psk : Some ( psk_callback_hint_fail) ,
617
+ psk_identity_hint : Some ( vec ! [ ] ) ,
618
+ cipher_suites : vec ! [ CipherSuiteID :: TLS_PSK_WITH_AES_128_GCM_SHA256 ] , //TODO: change it to TLS_PSK_WITH_AES_128_CCM_8
619
+ ..Default :: default ( )
620
+ } ;
621
+
622
+ if let Err ( server_err) = create_test_server ( cb, config, false ) . await {
623
+ assert_eq ! (
624
+ server_err,
625
+ ERR_ALERT_FATAL_OR_CLOSE . clone( ) ,
626
+ "TestPSK: Server error exp({}) failed({})" ,
627
+ ERR_ALERT_FATAL_OR_CLOSE . clone( ) ,
628
+ server_err,
629
+ ) ;
630
+ } else {
631
+ assert ! ( false , "Expected server error, but got OK" ) ;
632
+ }
633
+
634
+ let result = client_res_rx. recv ( ) . await ;
635
+ if let Some ( client) = result {
636
+ if let Err ( client_err) = client {
637
+ assert_eq ! (
638
+ client_err,
639
+ ERR_PSK_REJECTED . clone( ) ,
640
+ "TestPSK: Client error exp({}) failed({})" ,
641
+ ERR_PSK_REJECTED . clone( ) ,
642
+ client_err,
643
+ ) ;
644
+ } else {
645
+ assert ! ( false , "Expected client error, but got OK" ) ;
646
+ }
647
+ }
648
+
649
+ Ok ( ( ) )
650
+ }
0 commit comments