diff options
Diffstat (limited to 'openssl/src/crypto/pkcs12.rs')
| -rw-r--r-- | openssl/src/crypto/pkcs12.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/openssl/src/crypto/pkcs12.rs b/openssl/src/crypto/pkcs12.rs new file mode 100644 index 00000000..dfe30a6c --- /dev/null +++ b/openssl/src/crypto/pkcs12.rs @@ -0,0 +1,39 @@ +//! PKCS #12 archives. + +use ffi; +use libc::{c_long, c_uchar}; +use std::cmp; +use std::ptr; + +use error::ErrorStack; + +/// 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 { + pub fn from_der(der: &[u8]) -> Result<Pkcs12, ErrorStack> { + unsafe { + 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_ssl_null!(ffi::d2i_PKCS12(ptr::null_mut(), &mut ptr, length)); + Ok(Pkcs12(p12)) + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn from_der() { + let der = include_bytes!("../../test/identity.p12"); + Pkcs12::from_der(der).unwrap(); + } +} |