Implement CR suggestions
* Don't do un-necessary heap pointer gymnastics * Use the to_der! macro instead of a manually written impl * Allow optional arguments for CMS_sign
This commit is contained in:
parent
5360f5ad04
commit
13caf731a2
|
|
@ -64,6 +64,16 @@ impl CmsContentInfoRef {
|
||||||
Ok(out.get_buf().to_owned())
|
Ok(out.get_buf().to_owned())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
to_der! {
|
||||||
|
/// Serializes this CmsContentInfo using DER.
|
||||||
|
///
|
||||||
|
/// OpenSSL documentation at [`i2d_CMS_ContentInfo`]
|
||||||
|
///
|
||||||
|
/// [`i2d_CMS_ContentInfo`]: https://www.openssl.org/docs/man1.0.2/crypto/i2d_CMS_ContentInfo.html
|
||||||
|
to_der,
|
||||||
|
ffi::i2d_CMS_ContentInfo
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CmsContentInfo {
|
impl CmsContentInfo {
|
||||||
|
|
@ -82,50 +92,42 @@ impl CmsContentInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a signing cert `signcert`, private key `pkey`, an optional certificate stack `certs`,
|
/// Given a signing cert `signcert`, private key `pkey`, a certificate stack `certs`,
|
||||||
/// data `data` and flags `flags`, create a CmsContentInfo struct.
|
/// data `data` and flags `flags`, create a CmsContentInfo struct.
|
||||||
///
|
///
|
||||||
|
/// All arguments are optional.
|
||||||
|
///
|
||||||
/// OpenSSL documentation at [`CMS_sign`]
|
/// OpenSSL documentation at [`CMS_sign`]
|
||||||
///
|
///
|
||||||
/// [`CMS_sign`]: https://www.openssl.org/docs/manmaster/man3/CMS_sign.html
|
/// [`CMS_sign`]: https://www.openssl.org/docs/manmaster/man3/CMS_sign.html
|
||||||
pub fn sign<T: HasPrivate>(
|
pub fn sign<T: HasPrivate>(
|
||||||
signcert: &X509,
|
signcert: Option<&X509>,
|
||||||
pkey: &PKeyRef<T>,
|
pkey: Option<&PKeyRef<T>>,
|
||||||
certs: Option<&Stack<X509>>,
|
certs: Option<&Stack<X509>>,
|
||||||
data: &[u8],
|
data: Option<&[u8]>,
|
||||||
flags: u32,
|
flags: u32,
|
||||||
) -> Result<CmsContentInfo, ErrorStack> {
|
) -> Result<CmsContentInfo, ErrorStack> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let signcert = signcert.as_ptr();
|
let signcert = match signcert {
|
||||||
let pkey = pkey.as_ptr();
|
Some(cert) => cert.as_ptr(),
|
||||||
let data_bio = MemBioSlice::new(data)?;
|
None => ptr::null_mut(),
|
||||||
let cms = cvt_p(ffi::CMS_sign(
|
};
|
||||||
signcert,
|
let pkey = match pkey {
|
||||||
pkey,
|
Some(pkey) => pkey.as_ptr(),
|
||||||
certs.unwrap_or(&Stack::<X509>::new()?).as_ptr(),
|
None => ptr::null_mut(),
|
||||||
data_bio.as_ptr(),
|
};
|
||||||
flags,
|
let data_bio_ptr = match data {
|
||||||
))?;
|
Some(data) => MemBioSlice::new(data)?.as_ptr(),
|
||||||
|
None => ptr::null_mut(),
|
||||||
|
};
|
||||||
|
let certs = match certs {
|
||||||
|
Some(certs) => certs.as_ptr(),
|
||||||
|
None => ptr::null_mut(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let cms = cvt_p(ffi::CMS_sign(signcert, pkey, certs, data_bio_ptr, flags))?;
|
||||||
|
|
||||||
Ok(CmsContentInfo::from_ptr(cms))
|
Ok(CmsContentInfo::from_ptr(cms))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Serializes this CmsContentInfo using DER.
|
|
||||||
///
|
|
||||||
/// OpenSSL documentation at [`i2d_CMS_ContentInfo`]
|
|
||||||
///
|
|
||||||
/// [`i2d_CMS_ContentInfo`]: https://www.openssl.org/docs/man1.0.2/crypto/i2d_CMS_ContentInfo.html
|
|
||||||
pub fn to_der(&mut self) -> Result<Vec<u8>, ErrorStack> {
|
|
||||||
unsafe {
|
|
||||||
let size = ffi::i2d_CMS_ContentInfo(self.as_ptr(), ptr::null_mut());
|
|
||||||
let mut der = vec![0u8; size as usize];
|
|
||||||
|
|
||||||
let raw_ptr = Box::into_raw(Box::new(der.as_mut_ptr()));
|
|
||||||
ffi::i2d_CMS_ContentInfo(self.as_ptr(), raw_ptr);
|
|
||||||
|
|
||||||
Box::from_raw(raw_ptr);
|
|
||||||
Ok(der)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue