diff options
author | Stephen Demos <stphndemos@gmail.com> | 2017-08-08 11:57:46 -0700 |
---|---|---|
committer | Stephen Demos <stphndemos@gmail.com> | 2017-08-09 12:26:45 -0700 |
commit | caf7b8ecbc845739e9ef67a66ff145563b0ae1aa (patch) | |
tree | dbc1aa454de9b2662a89a0e1e8bbd1029e0cf104 /openssl/src/cms.rs | |
parent | f34af836533dbe85a10b115ab1259d2ebeb331c4 (diff) | |
download | rust-openssl-caf7b8ecbc845739e9ef67a66ff145563b0ae1aa.zip |
added cms decryption
Diffstat (limited to 'openssl/src/cms.rs')
-rw-r--r-- | openssl/src/cms.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/openssl/src/cms.rs b/openssl/src/cms.rs new file mode 100644 index 00000000..9619d0b8 --- /dev/null +++ b/openssl/src/cms.rs @@ -0,0 +1,60 @@ +//! CMS archive + +use ffi; +use foreign_types::{ForeignType, ForeignTypeRef}; +use std::ptr; +use error::ErrorStack; + +use bio::{MemBio, MemBioSlice}; + +use x509::X509; +use pkey::PKeyRef; + +use cvt; +use cvt_p; + +foreign_type! { + type CType = ffi::CMS_ContentInfo; + fn drop = ffi::CMS_ContentInfo_free; + + pub struct CmsContentInfo; + pub struct CmsContentInfoRef; +} + +impl CmsContentInfoRef { + pub fn decrypt(&self, pkey: &PKeyRef, cert: &X509) -> Result<Vec<u8>, ErrorStack> { + unsafe { + let pkey = pkey.as_ptr(); + let cert = cert.as_ptr(); + let out = try!(MemBio::new()); + let flags: u32 = 0; + + try!(cvt(ffi::CMS_decrypt( + self.as_ptr(), + pkey, + cert, + ptr::null_mut(), + out.as_ptr(), + flags.into(), + ))); + + Ok(out.get_buf().to_owned()) + } + } + +} + +impl CmsContentInfo { + pub fn smime_read_cms(smime: &[u8]) -> Result<CmsContentInfo, ErrorStack> { + unsafe { + let bio = try!(MemBioSlice::new(smime)); + + let cms = try!(cvt_p(ffi::SMIME_read_CMS( + bio.as_ptr(), + ptr::null_mut(), + ))); + + Ok(CmsContentInfo::from_ptr(cms)) + } + } +} |