added cms decryption
This commit is contained in:
parent
f34af83653
commit
caf7b8ecbc
|
|
@ -32,6 +32,7 @@ pub enum ASN1_TYPE {}
|
||||||
pub enum ASN1_OBJECT {}
|
pub enum ASN1_OBJECT {}
|
||||||
pub enum BN_CTX {}
|
pub enum BN_CTX {}
|
||||||
pub enum BN_GENCB {}
|
pub enum BN_GENCB {}
|
||||||
|
pub enum CMS_ContentInfo {}
|
||||||
pub enum CONF {}
|
pub enum CONF {}
|
||||||
pub enum CONF_METHOD {}
|
pub enum CONF_METHOD {}
|
||||||
pub enum COMP_METHOD {}
|
pub enum COMP_METHOD {}
|
||||||
|
|
@ -2575,4 +2576,21 @@ extern "C" {
|
||||||
) -> c_int;
|
) -> c_int;
|
||||||
pub fn HMAC_Update(ctx: *mut HMAC_CTX, data: *const c_uchar, len: size_t) -> c_int;
|
pub fn HMAC_Update(ctx: *mut HMAC_CTX, data: *const c_uchar, len: size_t) -> c_int;
|
||||||
pub fn HMAC_Final(ctx: *mut HMAC_CTX, md: *mut c_uchar, len: *mut c_uint) -> c_int;
|
pub fn HMAC_Final(ctx: *mut HMAC_CTX, md: *mut c_uchar, len: *mut c_uint) -> c_int;
|
||||||
|
|
||||||
|
#[cfg(not(libressl))]
|
||||||
|
pub fn CMS_decrypt(
|
||||||
|
cms: *mut CMS_ContentInfo,
|
||||||
|
pkey: *mut EVP_PKEY,
|
||||||
|
cert: *mut X509,
|
||||||
|
dcont: *mut BIO,
|
||||||
|
out: *mut BIO,
|
||||||
|
flags: c_uint,
|
||||||
|
) -> c_int;
|
||||||
|
#[cfg(not(libressl))]
|
||||||
|
pub fn SMIME_read_CMS(
|
||||||
|
bio: *mut BIO,
|
||||||
|
bcont: *mut *mut BIO,
|
||||||
|
) -> *mut CMS_ContentInfo;
|
||||||
|
#[cfg(not(libressl))]
|
||||||
|
pub fn CMS_ContentInfo_free(cms: *mut CMS_ContentInfo);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -29,6 +29,8 @@ mod util;
|
||||||
pub mod aes;
|
pub mod aes;
|
||||||
pub mod asn1;
|
pub mod asn1;
|
||||||
pub mod bn;
|
pub mod bn;
|
||||||
|
#[cfg(not(libressl))]
|
||||||
|
pub mod cms;
|
||||||
pub mod conf;
|
pub mod conf;
|
||||||
pub mod crypto;
|
pub mod crypto;
|
||||||
pub mod dh;
|
pub mod dh;
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ fn main() {
|
||||||
.header("openssl/pkcs12.h")
|
.header("openssl/pkcs12.h")
|
||||||
.header("openssl/bn.h")
|
.header("openssl/bn.h")
|
||||||
.header("openssl/aes.h")
|
.header("openssl/aes.h")
|
||||||
.header("openssl/ocsp.h");
|
.header("openssl/ocsp.h")
|
||||||
|
.header("openssl/cms.h");
|
||||||
cfg.type_name(|s, is_struct| {
|
cfg.type_name(|s, is_struct| {
|
||||||
// Add some `*` on some callback parameters to get function pointer to
|
// Add some `*` on some callback parameters to get function pointer to
|
||||||
// typecheck in C, especially on MSVC.
|
// typecheck in C, especially on MSVC.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue