From 98b7f2f9352e4d92b44245d0737f9a45adb4ae2b Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 22 Oct 2016 09:16:38 -0700 Subject: Flatten crypto module --- openssl/src/pkcs12.rs | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 openssl/src/pkcs12.rs (limited to 'openssl/src/pkcs12.rs') diff --git a/openssl/src/pkcs12.rs b/openssl/src/pkcs12.rs new file mode 100644 index 00000000..f143ec49 --- /dev/null +++ b/openssl/src/pkcs12.rs @@ -0,0 +1,119 @@ +//! PKCS #12 archives. + +use ffi; +use libc::{c_long, c_uchar}; +use std::cmp; +use std::ptr; +use std::ffi::CString; + +use {cvt, cvt_p}; +use pkey::PKey; +use error::ErrorStack; +use x509::X509; + +/// A PKCS #12 archive. +pub struct Pkcs12(*mut ffi::PKCS12); + +impl Drop for Pkcs12 { + fn drop(&mut self) { + unsafe { ffi::PKCS12_free(self.0); } + } +} + +impl Pkcs12 { + /// Deserializes a `Pkcs12` structure from DER-encoded data. + pub fn from_der(der: &[u8]) -> Result { + unsafe { + ffi::init(); + let mut ptr = der.as_ptr() as *const c_uchar; + let length = cmp::min(der.len(), c_long::max_value() as usize) as c_long; + let p12 = try!(cvt_p(ffi::d2i_PKCS12(ptr::null_mut(), &mut ptr, length))); + Ok(Pkcs12(p12)) + } + } + + /// Extracts the contents of the `Pkcs12`. + pub fn parse(&self, pass: &str) -> Result { + unsafe { + let pass = CString::new(pass).unwrap(); + + let mut pkey = ptr::null_mut(); + let mut cert = ptr::null_mut(); + let mut chain = ptr::null_mut(); + + try!(cvt(ffi::PKCS12_parse(self.0, pass.as_ptr(), &mut pkey, &mut cert, &mut chain))); + + let pkey = PKey::from_ptr(pkey); + let cert = X509::from_ptr(cert); + let chain = chain as *mut _; + + let mut chain_out = vec![]; + for i in 0..compat::OPENSSL_sk_num(chain) { + let x509 = compat::OPENSSL_sk_value(chain, i); + chain_out.push(X509::from_ptr(x509 as *mut _)); + } + compat::OPENSSL_sk_free(chain as *mut _); + + Ok(ParsedPkcs12 { + pkey: pkey, + cert: cert, + chain: chain_out, + _p: (), + }) + } + } +} + +pub struct ParsedPkcs12 { + pub pkey: PKey, + pub cert: X509, + pub chain: Vec, + _p: (), +} + +#[cfg(ossl110)] +mod compat { + pub use ffi::OPENSSL_sk_free; + pub use ffi::OPENSSL_sk_num; + pub use ffi::OPENSSL_sk_value; +} + +#[cfg(ossl10x)] +#[allow(bad_style)] +mod compat { + use libc::{c_int, c_void}; + use ffi; + + pub use ffi::sk_free as OPENSSL_sk_free; + + pub unsafe fn OPENSSL_sk_num(stack: *mut ffi::_STACK) -> c_int { + (*stack).num + } + + pub unsafe fn OPENSSL_sk_value(stack: *const ffi::_STACK, idx: c_int) + -> *mut c_void { + *(*stack).data.offset(idx as isize) as *mut c_void + } +} + +#[cfg(test)] +mod test { + use hash::MessageDigest; + use serialize::hex::ToHex; + + use super::*; + + #[test] + fn parse() { + let der = include_bytes!("../test/identity.p12"); + let pkcs12 = Pkcs12::from_der(der).unwrap(); + let parsed = pkcs12.parse("mypass").unwrap(); + + assert_eq!(parsed.cert.fingerprint(MessageDigest::sha1()).unwrap().to_hex(), + "59172d9313e84459bcff27f967e79e6e9217e584"); + + assert_eq!(parsed.chain.len(), 1); + assert_eq!(parsed.chain[0].fingerprint(MessageDigest::sha1()).unwrap().to_hex(), + "c0cbdf7cdd03c9773e5468e1f6d2da7d5cbb1875"); + } +} -- cgit v1.2.3 From c0cf4ab1c230421084939626d6c815f162564416 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Thu, 27 Oct 2016 20:33:38 -0700 Subject: Remove private field in ParsedPkcs12 The function definition is fixed - nothing else is going to be coming out of a PKCS#12 archive --- openssl/src/pkcs12.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'openssl/src/pkcs12.rs') diff --git a/openssl/src/pkcs12.rs b/openssl/src/pkcs12.rs index f143ec49..d5d4750a 100644 --- a/openssl/src/pkcs12.rs +++ b/openssl/src/pkcs12.rs @@ -58,7 +58,6 @@ impl Pkcs12 { pkey: pkey, cert: cert, chain: chain_out, - _p: (), }) } } @@ -68,7 +67,6 @@ pub struct ParsedPkcs12 { pub pkey: PKey, pub cert: X509, pub chain: Vec, - _p: (), } #[cfg(ossl110)] -- cgit v1.2.3 From f75f82e466993848393c7a26ccb51dc31b4547fe Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 30 Oct 2016 16:37:45 -0700 Subject: Rustfmt --- openssl/src/pkcs12.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'openssl/src/pkcs12.rs') diff --git a/openssl/src/pkcs12.rs b/openssl/src/pkcs12.rs index d5d4750a..ab0934a8 100644 --- a/openssl/src/pkcs12.rs +++ b/openssl/src/pkcs12.rs @@ -16,7 +16,9 @@ pub struct Pkcs12(*mut ffi::PKCS12); impl Drop for Pkcs12 { fn drop(&mut self) { - unsafe { ffi::PKCS12_free(self.0); } + unsafe { + ffi::PKCS12_free(self.0); + } } } @@ -88,8 +90,7 @@ mod compat { (*stack).num } - pub unsafe fn OPENSSL_sk_value(stack: *const ffi::_STACK, idx: c_int) - -> *mut c_void { + pub unsafe fn OPENSSL_sk_value(stack: *const ffi::_STACK, idx: c_int) -> *mut c_void { *(*stack).data.offset(idx as isize) as *mut c_void } } -- cgit v1.2.3 From f640613863f0b66bc004f9d9d89f73a31701d396 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Mon, 31 Oct 2016 20:12:55 -0700 Subject: Update PKey --- openssl/src/pkcs12.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'openssl/src/pkcs12.rs') diff --git a/openssl/src/pkcs12.rs b/openssl/src/pkcs12.rs index ab0934a8..1318f7f7 100644 --- a/openssl/src/pkcs12.rs +++ b/openssl/src/pkcs12.rs @@ -10,6 +10,7 @@ use {cvt, cvt_p}; use pkey::PKey; use error::ErrorStack; use x509::X509; +use types::OpenSslType; /// A PKCS #12 archive. pub struct Pkcs12(*mut ffi::PKCS12); -- cgit v1.2.3 From 398ab2fbc4f8c254633541a9c0e46b688be14668 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 5 Nov 2016 13:01:54 -0700 Subject: Add a consuming iterator for Stacks --- openssl/src/pkcs12.rs | 36 +++--------------------------------- 1 file changed, 3 insertions(+), 33 deletions(-) (limited to 'openssl/src/pkcs12.rs') diff --git a/openssl/src/pkcs12.rs b/openssl/src/pkcs12.rs index 1318f7f7..6d7e8ba7 100644 --- a/openssl/src/pkcs12.rs +++ b/openssl/src/pkcs12.rs @@ -11,6 +11,7 @@ use pkey::PKey; use error::ErrorStack; use x509::X509; use types::OpenSslType; +use stack::Stack; /// A PKCS #12 archive. pub struct Pkcs12(*mut ffi::PKCS12); @@ -48,19 +49,12 @@ impl Pkcs12 { let pkey = PKey::from_ptr(pkey); let cert = X509::from_ptr(cert); - let chain = chain as *mut _; - - let mut chain_out = vec![]; - for i in 0..compat::OPENSSL_sk_num(chain) { - let x509 = compat::OPENSSL_sk_value(chain, i); - chain_out.push(X509::from_ptr(x509 as *mut _)); - } - compat::OPENSSL_sk_free(chain as *mut _); + let chain = Stack::from_ptr(chain).into_iter().collect(); Ok(ParsedPkcs12 { pkey: pkey, cert: cert, - chain: chain_out, + chain: chain, }) } } @@ -72,30 +66,6 @@ pub struct ParsedPkcs12 { pub chain: Vec, } -#[cfg(ossl110)] -mod compat { - pub use ffi::OPENSSL_sk_free; - pub use ffi::OPENSSL_sk_num; - pub use ffi::OPENSSL_sk_value; -} - -#[cfg(ossl10x)] -#[allow(bad_style)] -mod compat { - use libc::{c_int, c_void}; - use ffi; - - pub use ffi::sk_free as OPENSSL_sk_free; - - pub unsafe fn OPENSSL_sk_num(stack: *mut ffi::_STACK) -> c_int { - (*stack).num - } - - pub unsafe fn OPENSSL_sk_value(stack: *const ffi::_STACK, idx: c_int) -> *mut c_void { - *(*stack).data.offset(idx as isize) as *mut c_void - } -} - #[cfg(test)] mod test { use hash::MessageDigest; -- cgit v1.2.3 From 803725891331daf1839ea88e3035ae151e59cc2e Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 5 Nov 2016 13:57:05 -0700 Subject: Return a Stack in Pkcs12 --- openssl/src/pkcs12.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'openssl/src/pkcs12.rs') diff --git a/openssl/src/pkcs12.rs b/openssl/src/pkcs12.rs index 6d7e8ba7..8c884e7f 100644 --- a/openssl/src/pkcs12.rs +++ b/openssl/src/pkcs12.rs @@ -49,7 +49,7 @@ impl Pkcs12 { let pkey = PKey::from_ptr(pkey); let cert = X509::from_ptr(cert); - let chain = Stack::from_ptr(chain).into_iter().collect(); + let chain = Stack::from_ptr(chain); Ok(ParsedPkcs12 { pkey: pkey, @@ -63,7 +63,7 @@ impl Pkcs12 { pub struct ParsedPkcs12 { pub pkey: PKey, pub cert: X509, - pub chain: Vec, + pub chain: Stack, } #[cfg(test)] -- cgit v1.2.3 From 96a5ccfc6b69a6038ee2217551e041ab8275ab4c Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 5 Nov 2016 18:46:34 -0700 Subject: Implement Pkcs12 via type_! --- openssl/src/pkcs12.rs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'openssl/src/pkcs12.rs') diff --git a/openssl/src/pkcs12.rs b/openssl/src/pkcs12.rs index 8c884e7f..1ef0bf3f 100644 --- a/openssl/src/pkcs12.rs +++ b/openssl/src/pkcs12.rs @@ -10,19 +10,10 @@ use {cvt, cvt_p}; use pkey::PKey; use error::ErrorStack; use x509::X509; -use types::OpenSslType; +use types::{OpenSslType, OpenSslTypeRef}; use stack::Stack; -/// A PKCS #12 archive. -pub struct Pkcs12(*mut ffi::PKCS12); - -impl Drop for Pkcs12 { - fn drop(&mut self) { - unsafe { - ffi::PKCS12_free(self.0); - } - } -} +type_!(Pkcs12, Pkcs12Ref, ffi::PKCS12, ffi::PKCS12_free); impl Pkcs12 { /// Deserializes a `Pkcs12` structure from DER-encoded data. @@ -35,7 +26,9 @@ impl Pkcs12 { Ok(Pkcs12(p12)) } } +} +impl Pkcs12Ref { /// Extracts the contents of the `Pkcs12`. pub fn parse(&self, pass: &str) -> Result { unsafe { @@ -45,7 +38,11 @@ impl Pkcs12 { let mut cert = ptr::null_mut(); let mut chain = ptr::null_mut(); - try!(cvt(ffi::PKCS12_parse(self.0, pass.as_ptr(), &mut pkey, &mut cert, &mut chain))); + try!(cvt(ffi::PKCS12_parse(self.as_ptr(), + pass.as_ptr(), + &mut pkey, + &mut cert, + &mut chain))); let pkey = PKey::from_ptr(pkey); let cert = X509::from_ptr(cert); -- cgit v1.2.3