@@ -4,7 +4,8 @@ extern crate openssl_probe;
44use self :: openssl:: error:: ErrorStack ;
55use self :: openssl:: hash:: MessageDigest ;
66use self :: openssl:: nid:: Nid ;
7- use self :: openssl:: pkcs12:: { ParsedPkcs12 , Pkcs12 } ;
7+ use self :: openssl:: pkcs12:: Pkcs12 ;
8+ use self :: openssl:: pkey:: PKey ;
89use self :: openssl:: ssl:: {
910 self , MidHandshakeSslStream , SslAcceptor , SslConnector , SslContextBuilder , SslMethod ,
1011 SslVerifyMode ,
@@ -16,6 +17,7 @@ use std::io;
1617use std:: sync:: { Once , ONCE_INIT } ;
1718
1819use { Protocol , TlsAcceptorBuilder , TlsConnectorBuilder } ;
20+ use self :: openssl:: pkey:: Private ;
1921
2022#[ cfg( have_min_max_version) ]
2123fn supported_protocols (
@@ -149,13 +151,22 @@ impl From<ErrorStack> for Error {
149151 }
150152}
151153
152- pub struct Identity ( ParsedPkcs12 ) ;
154+ #[ derive( Clone ) ]
155+ pub struct Identity {
156+ pkey : PKey < Private > ,
157+ cert : X509 ,
158+ chain : Vec < X509 > ,
159+ }
153160
154161impl Identity {
155162 pub fn from_pkcs12 ( buf : & [ u8 ] , pass : & str ) -> Result < Identity , Error > {
156163 let pkcs12 = Pkcs12 :: from_der ( buf) ?;
157164 let parsed = pkcs12. parse ( pass) ?;
158- Ok ( Identity ( parsed) )
165+ Ok ( Identity {
166+ pkey : parsed. pkey ,
167+ cert : parsed. cert ,
168+ chain : parsed. chain . into_iter ( ) . flat_map ( |x| x) . collect ( ) ,
169+ } )
159170 }
160171}
161172
@@ -252,12 +263,10 @@ impl TlsConnector {
252263
253264 let mut connector = SslConnector :: builder ( SslMethod :: tls ( ) ) ?;
254265 if let Some ( ref identity) = builder. identity {
255- connector. set_certificate ( & ( identity. 0 ) . 0 . cert ) ?;
256- connector. set_private_key ( & ( identity. 0 ) . 0 . pkey ) ?;
257- if let Some ( ref chain) = ( identity. 0 ) . 0 . chain {
258- for cert in chain. iter ( ) . rev ( ) {
259- connector. add_extra_chain_cert ( cert. to_owned ( ) ) ?;
260- }
266+ connector. set_certificate ( & identity. 0 . cert ) ?;
267+ connector. set_private_key ( & identity. 0 . pkey ) ?;
268+ for cert in identity. 0 . chain . iter ( ) . rev ( ) {
269+ connector. add_extra_chain_cert ( cert. to_owned ( ) ) ?;
261270 }
262271 }
263272 supported_protocols ( builder. min_protocol , builder. max_protocol , & mut connector) ?;
@@ -303,12 +312,10 @@ pub struct TlsAcceptor(SslAcceptor);
303312impl TlsAcceptor {
304313 pub fn new ( builder : & TlsAcceptorBuilder ) -> Result < TlsAcceptor , Error > {
305314 let mut acceptor = SslAcceptor :: mozilla_intermediate ( SslMethod :: tls ( ) ) ?;
306- acceptor. set_private_key ( & ( builder. identity . 0 ) . 0 . pkey ) ?;
307- acceptor. set_certificate ( & ( builder. identity . 0 ) . 0 . cert ) ?;
308- if let Some ( ref chain) = ( builder. identity . 0 ) . 0 . chain {
309- for cert in chain. iter ( ) . rev ( ) {
310- acceptor. add_extra_chain_cert ( cert. to_owned ( ) ) ?;
311- }
315+ acceptor. set_private_key ( & builder. identity . 0 . pkey ) ?;
316+ acceptor. set_certificate ( & builder. identity . 0 . cert ) ?;
317+ for cert in builder. identity . 0 . chain . iter ( ) . rev ( ) {
318+ acceptor. add_extra_chain_cert ( cert. to_owned ( ) ) ?;
312319 }
313320 supported_protocols ( builder. min_protocol , builder. max_protocol , & mut acceptor) ?;
314321
0 commit comments