Skip to content

Commit 7d34900

Browse files
authored
Merge pull request #139 from sfackler/identity-clone
Implement Clone for Identity
2 parents 5b29d0b + 1705b4f commit 7d34900

File tree

4 files changed

+25
-16
lines changed

4 files changed

+25
-16
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ schannel = "0.1.16"
2222

2323
[target.'cfg(not(any(target_os = "windows", target_os = "macos", target_os = "ios")))'.dependencies]
2424
log = "0.4.5"
25-
openssl = "0.10.15"
25+
openssl = "0.10.25"
2626
openssl-sys = "0.9.30"
2727
openssl-probe = "0.1"
2828

src/imp/openssl.rs

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ extern crate openssl_probe;
44
use self::openssl::error::ErrorStack;
55
use self::openssl::hash::MessageDigest;
66
use self::openssl::nid::Nid;
7-
use self::openssl::pkcs12::{ParsedPkcs12, Pkcs12};
7+
use self::openssl::pkcs12::Pkcs12;
8+
use self::openssl::pkey::PKey;
89
use self::openssl::ssl::{
910
self, MidHandshakeSslStream, SslAcceptor, SslConnector, SslContextBuilder, SslMethod,
1011
SslVerifyMode,
@@ -16,6 +17,7 @@ use std::io;
1617
use std::sync::{Once, ONCE_INIT};
1718

1819
use {Protocol, TlsAcceptorBuilder, TlsConnectorBuilder};
20+
use self::openssl::pkey::Private;
1921

2022
#[cfg(have_min_max_version)]
2123
fn 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

154161
impl 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);
303312
impl 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

src/imp/schannel.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ impl From<io::Error> for Error {
6161
}
6262
}
6363

64+
#[derive(Clone)]
6465
pub struct Identity {
6566
cert: CertContext,
6667
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ impl From<imp::Error> for Error {
163163
///
164164
/// An identity is an X509 certificate along with its corresponding private key and chain of certificates to a trusted
165165
/// root.
166+
#[derive(Clone)]
166167
pub struct Identity(imp::Identity);
167168

168169
impl Identity {

0 commit comments

Comments
 (0)