diff options
| author | Stephen Demos <[email protected]> | 2017-08-08 11:57:46 -0700 |
|---|---|---|
| committer | Stephen Demos <[email protected]> | 2017-08-09 12:26:45 -0700 |
| commit | caf7b8ecbc845739e9ef67a66ff145563b0ae1aa (patch) | |
| tree | dbc1aa454de9b2662a89a0e1e8bbd1029e0cf104 /openssl/src | |
| parent | Init in bn_ctx constructor (diff) | |
| download | rust-openssl-caf7b8ecbc845739e9ef67a66ff145563b0ae1aa.tar.xz rust-openssl-caf7b8ecbc845739e9ef67a66ff145563b0ae1aa.zip | |
added cms decryption
Diffstat (limited to 'openssl/src')
| -rw-r--r-- | openssl/src/cms.rs | 60 | ||||
| -rw-r--r-- | openssl/src/lib.rs | 2 |
2 files changed, 62 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)) + } + } +} diff --git a/openssl/src/lib.rs b/openssl/src/lib.rs index 44752dcc..d99807e5 100644 --- a/openssl/src/lib.rs +++ b/openssl/src/lib.rs @@ -29,6 +29,8 @@ mod util; pub mod aes; pub mod asn1; pub mod bn; +#[cfg(not(libressl))] +pub mod cms; pub mod conf; pub mod crypto; pub mod dh; |