aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/crypto/pkcs12.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openssl/src/crypto/pkcs12.rs')
-rw-r--r--openssl/src/crypto/pkcs12.rs39
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();
+ }
+}