@@ -11,8 +11,9 @@ mod client {
1111 } ;
1212
1313 use rustls:: {
14- client:: ResolvesClientCert , sign:: CertifiedKey , ClientConfig , ClientConnection ,
15- RootCertStore , SignatureScheme , Stream ,
14+ ClientConfig , ClientConnection , RootCertStore , SignatureScheme , Stream ,
15+ client:: ResolvesClientCert ,
16+ sign:: { CertifiedKey , CertifiedSigner } ,
1617 } ;
1718 use rustls_pki_types:: CertificateDer ;
1819
@@ -44,17 +45,11 @@ mod client {
4445 & self ,
4546 _acceptable_issuers : & [ & [ u8 ] ] ,
4647 sigschemes : & [ SignatureScheme ] ,
47- ) -> Option < Arc < CertifiedKey > > {
48+ ) -> Option < CertifiedSigner > {
4849 let ( chain, signing_key) = get_chain ( & self . 0 , & self . 1 ) . ok ( ) ?;
49- for scheme in signing_key. supported_schemes ( ) {
50- if sigschemes. contains ( scheme) {
51- return Some ( Arc :: new ( CertifiedKey :: new_unchecked (
52- chain,
53- Arc :: new ( signing_key) ,
54- ) ) ) ;
55- }
56- }
57- None
50+ CertifiedKey :: new ( chain. into ( ) , Box :: new ( signing_key) )
51+ . ok ( ) ?
52+ . signer ( sigschemes)
5853 }
5954
6055 fn has_certs ( & self ) -> bool {
@@ -101,35 +96,46 @@ mod server {
10196 use std:: {
10297 io:: { Read , Write } ,
10398 net:: { Shutdown , TcpListener , TcpStream } ,
104- sync:: { mpsc:: Sender , Arc } ,
99+ sync:: { Arc , mpsc:: Sender } ,
105100 } ;
106101
107102 use rustls:: {
108- server:: { ClientHello , ResolvesServerCert , WebPkiClientVerifier } ,
109- sign:: CertifiedKey ,
110103 RootCertStore , ServerConfig , ServerConnection , Stream ,
104+ server:: { ClientHello , ResolvesServerCert , WebPkiClientVerifier } ,
105+ sign:: { CertifiedKey , CertifiedSigner } ,
111106 } ;
112-
113107 use rustls_cng:: { signer:: CngSigningKey , store:: CertStore } ;
114108
115109 #[ derive( Debug ) ]
116110 pub struct ServerCertResolver ( CertStore ) ;
117111
118112 impl ResolvesServerCert for ServerCertResolver {
119- fn resolve ( & self , client_hello : & ClientHello ) -> Option < Arc < CertifiedKey > > {
120- let name = client_hello. server_name ( ) ?;
121-
122- let contexts = self . 0 . find_by_subject_str ( name) . ok ( ) ?;
123-
124- let ( context, key) = contexts. into_iter ( ) . find_map ( |ctx| {
125- let key = ctx. acquire_key ( true ) . ok ( ) ?;
126- CngSigningKey :: new ( key) . ok ( ) . map ( |key| ( ctx, key) )
127- } ) ?;
128-
129- let chain = context. as_chain_der ( ) . ok ( ) ?;
113+ fn resolve ( & self , client_hello : & ClientHello ) -> Result < CertifiedSigner , rustls:: Error > {
114+ let name = client_hello
115+ . server_name ( )
116+ . ok_or_else ( || rustls:: Error :: NoSuitableCertificate ) ?;
117+
118+ let contexts = self
119+ . 0
120+ . find_by_subject_str ( name)
121+ . map_err ( |_| rustls:: Error :: NoSuitableCertificate ) ?;
122+
123+ let ( context, key) = contexts
124+ . into_iter ( )
125+ . find_map ( |ctx| {
126+ let key = ctx. acquire_key ( true ) . ok ( ) ?;
127+ CngSigningKey :: new ( key) . ok ( ) . map ( |key| ( ctx, key) )
128+ } )
129+ . ok_or_else ( || rustls:: Error :: NoSuitableCertificate ) ?;
130+
131+ let chain = context
132+ . as_chain_der ( )
133+ . map_err ( |_| rustls:: Error :: NoSuitableCertificate ) ?;
130134 let certs = chain. into_iter ( ) . map ( Into :: into) . collect ( ) ;
131135
132- Some ( Arc :: new ( CertifiedKey :: new_unchecked ( certs, Arc :: new ( key) ) ) )
136+ CertifiedKey :: new ( certs, Box :: new ( key) ) ?
137+ . signer ( client_hello. signature_schemes ( ) )
138+ . ok_or_else ( || rustls:: Error :: General ( "No common schemes" . to_owned ( ) ) )
133139 }
134140 }
135141
0 commit comments