@@ -4,61 +4,65 @@ use async_std::net::{TcpListener, TcpStream};
44use async_std:: prelude:: * ;
55use async_std:: task;
66use 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 } ;
99use rustls_pemfile:: { certs, pkcs8_private_keys} ;
1010use std:: io:: { BufReader , Cursor } ;
1111use std:: net:: SocketAddr ;
1212use std:: sync:: Arc ;
13+ use std:: sync:: LazyLock ;
1314
1415const CERT : & str = include_str ! ( "end.cert" ) ;
1516const CHAIN : & str = include_str ! ( "end.chain" ) ;
1617const RSA : & str = include_str ! ( "end.rsa" ) ;
1718
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
6266}
6367
6468async 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>)
8286fn pass ( ) {
8387 let ( addr, domain, chain) = start_server ( ) ;
8488 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 ( ) ) ;
8690 assert ! ( added >= 1 && ignored == 0 ) ;
8791 let config = ClientConfig :: builder ( )
88- . with_safe_defaults ( )
8992 . with_root_certificates ( root_store)
9093 . with_no_client_auth ( ) ;
9194 task:: block_on ( start_client ( * addr, domain, Arc :: new ( config) ) ) . unwrap ( ) ;
@@ -95,10 +98,9 @@ fn pass() {
9598fn fail ( ) {
9699 let ( addr, domain, chain) = start_server ( ) ;
97100 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 ( ) ) ;
99102 assert ! ( added >= 1 && ignored == 0 ) ;
100103 let config = ClientConfig :: builder ( )
101- . with_safe_defaults ( )
102104 . with_root_certificates ( root_store)
103105 . with_no_client_auth ( ) ;
104106 let config = Arc :: new ( config) ;
0 commit comments