@@ -4,61 +4,65 @@ use async_std::net::{TcpListener, TcpStream};
4
4
use async_std:: prelude:: * ;
5
5
use async_std:: task;
6
6
use async_tls:: { TlsAcceptor , TlsConnector } ;
7
- use lazy_static :: lazy_static ;
8
- use rustls:: { Certificate , ClientConfig , PrivateKey , RootCertStore , ServerConfig } ;
7
+ use rustls :: pki_types :: { CertificateDer , PrivateKeyDer } ;
8
+ use rustls:: { ClientConfig , RootCertStore , ServerConfig } ;
9
9
use rustls_pemfile:: { certs, pkcs8_private_keys} ;
10
10
use std:: io:: { BufReader , Cursor } ;
11
11
use std:: net:: SocketAddr ;
12
12
use std:: sync:: Arc ;
13
+ use std:: sync:: LazyLock ;
13
14
14
15
const CERT : & str = include_str ! ( "end.cert" ) ;
15
16
const CHAIN : & str = include_str ! ( "end.chain" ) ;
16
17
const RSA : & str = include_str ! ( "end.rsa" ) ;
17
18
18
- lazy_static ! {
19
- static ref TEST_SERVER : ( SocketAddr , & ' static str , Vec <Vec <u8 >>) = {
20
- let cert = certs( & mut BufReader :: new( Cursor :: new( CERT ) ) ) . unwrap( ) ;
21
- let cert = cert. into_iter( ) . map( Certificate ) . collect( ) ;
22
- let chain = certs( & mut BufReader :: new( Cursor :: new( CHAIN ) ) ) . unwrap( ) ;
23
- let mut keys = pkcs8_private_keys( & mut BufReader :: new( Cursor :: new( RSA ) ) ) . unwrap( ) ;
24
- let key = PrivateKey ( keys. pop( ) . unwrap( ) ) ;
25
- let sconfig = ServerConfig :: builder( )
26
- . with_safe_defaults( )
27
- . with_no_client_auth( )
28
- . with_single_cert( cert, key)
29
- . unwrap( ) ;
30
- let acceptor = TlsAcceptor :: from( Arc :: new( sconfig) ) ;
31
-
32
- let ( send, recv) = bounded( 1 ) ;
33
-
34
- task:: spawn( async move {
35
- let addr = SocketAddr :: from( ( [ 127 , 0 , 0 , 1 ] , 0 ) ) ;
36
- let listener = TcpListener :: bind( & addr) . await ?;
37
-
38
- send. send( listener. local_addr( ) ?) . await . unwrap( ) ;
39
-
40
- let mut incoming = listener. incoming( ) ;
41
- while let Some ( stream) = incoming. next( ) . await {
42
- let acceptor = acceptor. clone( ) ;
43
- task:: spawn( async move {
44
- use futures_util:: io:: AsyncReadExt ;
45
- let stream = acceptor. accept( stream?) . await ?;
46
- let ( mut reader, mut writer) = stream. split( ) ;
47
- io:: copy( & mut reader, & mut writer) . await ?;
48
- Ok ( ( ) ) as io:: Result <( ) >
49
- } ) ;
50
- }
51
-
52
- Ok ( ( ) ) as io:: Result <( ) >
53
- } ) ;
54
-
55
- let addr = task:: block_on( async move { recv. recv( ) . await . unwrap( ) } ) ;
56
- ( addr, "localhost" , chain)
57
- } ;
58
- }
59
-
60
- fn start_server ( ) -> & ' static ( SocketAddr , & ' static str , Vec < Vec < u8 > > ) {
61
- & * TEST_SERVER
19
+ static TEST_SERVER : LazyLock < ( SocketAddr , & ' static str , Vec < CertificateDer < ' _ > > ) > = LazyLock :: new ( || {
20
+ let cert = certs ( & mut BufReader :: new ( Cursor :: new ( CERT ) ) )
21
+ . collect :: < Result < Vec < _ > , _ > > ( )
22
+ . unwrap ( ) ;
23
+ let chain = certs ( & mut BufReader :: new ( Cursor :: new ( CHAIN ) ) )
24
+ . collect :: < Result < Vec < _ > , _ > > ( )
25
+ . unwrap ( ) ;
26
+ let mut keys = pkcs8_private_keys ( & mut BufReader :: new ( Cursor :: new ( RSA ) ) )
27
+ . map ( |res| res. map ( PrivateKeyDer :: Pkcs8 ) )
28
+ . collect :: < Result < Vec < _ > , _ > > ( )
29
+ . unwrap ( ) ;
30
+ let key = keys. pop ( ) . unwrap ( ) ;
31
+ let sconfig = ServerConfig :: builder ( )
32
+ . with_no_client_auth ( )
33
+ . with_single_cert ( cert, key)
34
+ . unwrap ( ) ;
35
+ let acceptor = TlsAcceptor :: from ( Arc :: new ( sconfig) ) ;
36
+
37
+ let ( send, recv) = bounded ( 1 ) ;
38
+
39
+ task:: spawn ( async move {
40
+ let addr = SocketAddr :: from ( ( [ 127 , 0 , 0 , 1 ] , 0 ) ) ;
41
+ let listener = TcpListener :: bind ( & addr) . await ?;
42
+
43
+ send. send ( listener. local_addr ( ) ?) . await . unwrap ( ) ;
44
+
45
+ let mut incoming = listener. incoming ( ) ;
46
+ while let Some ( stream) = incoming. next ( ) . await {
47
+ let acceptor = acceptor. clone ( ) ;
48
+ task:: spawn ( async move {
49
+ use futures_util:: io:: AsyncReadExt ;
50
+ let stream = acceptor. accept ( stream?) . await ?;
51
+ let ( mut reader, mut writer) = stream. split ( ) ;
52
+ io:: copy ( & mut reader, & mut writer) . await ?;
53
+ Ok ( ( ) ) as io:: Result < ( ) >
54
+ } ) ;
55
+ }
56
+
57
+ Ok ( ( ) ) as io:: Result < ( ) >
58
+ } ) ;
59
+
60
+ let addr = task:: block_on ( async { recv. recv ( ) . await . unwrap ( ) } ) ;
61
+ ( addr, "localhost" , chain)
62
+ } ) ;
63
+
64
+ fn start_server ( ) -> & ' static ( SocketAddr , & ' static str , Vec < CertificateDer < ' static > > ) {
65
+ & TEST_SERVER
62
66
}
63
67
64
68
async fn start_client ( addr : SocketAddr , domain : & str , config : Arc < ClientConfig > ) -> io:: Result < ( ) > {
@@ -82,10 +86,9 @@ async fn start_client(addr: SocketAddr, domain: &str, config: Arc<ClientConfig>)
82
86
fn pass ( ) {
83
87
let ( addr, domain, chain) = start_server ( ) ;
84
88
let mut root_store = RootCertStore :: empty ( ) ;
85
- let ( added, ignored) = root_store. add_parsable_certificates ( & chain) ;
89
+ let ( added, ignored) = root_store. add_parsable_certificates ( chain. clone ( ) ) ;
86
90
assert ! ( added >= 1 && ignored == 0 ) ;
87
91
let config = ClientConfig :: builder ( )
88
- . with_safe_defaults ( )
89
92
. with_root_certificates ( root_store)
90
93
. with_no_client_auth ( ) ;
91
94
task:: block_on ( start_client ( * addr, domain, Arc :: new ( config) ) ) . unwrap ( ) ;
@@ -95,10 +98,9 @@ fn pass() {
95
98
fn fail ( ) {
96
99
let ( addr, domain, chain) = start_server ( ) ;
97
100
let mut root_store = RootCertStore :: empty ( ) ;
98
- let ( added, ignored) = root_store. add_parsable_certificates ( & chain) ;
101
+ let ( added, ignored) = root_store. add_parsable_certificates ( chain. clone ( ) ) ;
99
102
assert ! ( added >= 1 && ignored == 0 ) ;
100
103
let config = ClientConfig :: builder ( )
101
- . with_safe_defaults ( )
102
104
. with_root_certificates ( root_store)
103
105
. with_no_client_auth ( ) ;
104
106
let config = Arc :: new ( config) ;
0 commit comments