@@ -4,7 +4,8 @@ extern crate openssl_probe;
4
4
use self :: openssl:: error:: ErrorStack ;
5
5
use self :: openssl:: hash:: MessageDigest ;
6
6
use self :: openssl:: nid:: Nid ;
7
- use self :: openssl:: pkcs12:: { ParsedPkcs12 , Pkcs12 } ;
7
+ use self :: openssl:: pkcs12:: Pkcs12 ;
8
+ use self :: openssl:: pkey:: PKey ;
8
9
use self :: openssl:: ssl:: {
9
10
self , MidHandshakeSslStream , SslAcceptor , SslConnector , SslContextBuilder , SslMethod ,
10
11
SslVerifyMode ,
@@ -16,6 +17,7 @@ use std::io;
16
17
use std:: sync:: { Once , ONCE_INIT } ;
17
18
18
19
use { Protocol , TlsAcceptorBuilder , TlsConnectorBuilder } ;
20
+ use self :: openssl:: pkey:: Private ;
19
21
20
22
#[ cfg( have_min_max_version) ]
21
23
fn supported_protocols (
@@ -149,13 +151,22 @@ impl From<ErrorStack> for Error {
149
151
}
150
152
}
151
153
152
- pub struct Identity ( ParsedPkcs12 ) ;
154
+ #[ derive( Clone ) ]
155
+ pub struct Identity {
156
+ pkey : PKey < Private > ,
157
+ cert : X509 ,
158
+ chain : Vec < X509 > ,
159
+ }
153
160
154
161
impl Identity {
155
162
pub fn from_pkcs12 ( buf : & [ u8 ] , pass : & str ) -> Result < Identity , Error > {
156
163
let pkcs12 = Pkcs12 :: from_der ( buf) ?;
157
164
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
+ } )
159
170
}
160
171
}
161
172
@@ -252,12 +263,10 @@ impl TlsConnector {
252
263
253
264
let mut connector = SslConnector :: builder ( SslMethod :: tls ( ) ) ?;
254
265
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 ( ) ) ?;
261
270
}
262
271
}
263
272
supported_protocols ( builder. min_protocol , builder. max_protocol , & mut connector) ?;
@@ -303,12 +312,10 @@ pub struct TlsAcceptor(SslAcceptor);
303
312
impl TlsAcceptor {
304
313
pub fn new ( builder : & TlsAcceptorBuilder ) -> Result < TlsAcceptor , Error > {
305
314
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 ( ) ) ?;
312
319
}
313
320
supported_protocols ( builder. min_protocol , builder. max_protocol , & mut acceptor) ?;
314
321
0 commit comments