Adding suggestions from review.

This commit is contained in:
Brian Chin 2017-01-30 16:51:10 -08:00
parent 72a10f3e65
commit 302ee77d32
4 changed files with 42 additions and 38 deletions

View File

@ -1310,6 +1310,15 @@ pub unsafe fn BIO_set_retry_write(b: *mut BIO) {
BIO_set_flags(b, BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY)
}
// EVP_PKEY_CTX_ctrl macros
pub unsafe fn EVP_PKEY_CTX_set_rsa_padding(ctx: *mut EVP_PKEY_CTX, pad: c_int) -> c_int {
EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, RSA_PKEY_CTRL_RSA_PADDING, pad, ptr::null_mut())
}
pub unsafe fn EVP_PKEY_CTX_get_rsa_padding(ctx: *mut EVP_PKEY_CTX, ppad: *mut c_int) -> c_int {
EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, RSA_PKEY_CTRL_GET_RSA_PADDING, 0, ppad as *mut c_void)
}
pub unsafe fn SSL_CTX_set_mode(ctx: *mut SSL_CTX, op: c_long) -> c_long {
SSL_CTX_ctrl(ctx, SSL_CTRL_MODE, op, ptr::null_mut())
}

View File

@ -8,7 +8,7 @@ use bio::MemBioSlice;
use dh::Dh;
use dsa::Dsa;
use ec::EcKey;
use rsa::Rsa;
use rsa::{Rsa, Padding};
use error::ErrorStack;
use util::{CallbackState, invoke_passwd_cb_old};
use types::{OpenSslType, OpenSslTypeRef};
@ -153,6 +153,23 @@ impl PKey {
pub struct PKeyCtxRef(::util::Opaque);
impl PKeyCtxRef {
pub fn set_rsa_padding(&mut self, pad: Padding) -> Result<(), ErrorStack> {
unsafe {
try!(cvt(ffi::EVP_PKEY_CTX_set_rsa_padding(self.as_ptr(), pad.as_raw())));
}
Ok(())
}
pub fn rsa_padding(&mut self) -> Result<Padding, ErrorStack> {
let mut pad: c_int = 0;
unsafe {
try!(cvt(ffi::EVP_PKEY_CTX_get_rsa_padding(self.as_ptr(), &mut pad)));
};
Ok(Padding::from_raw(pad))
}
}
impl ::types::OpenSslTypeRef for PKeyCtxRef {
type CType = ffi::EVP_PKEY_CTX;
}

View File

@ -10,12 +10,21 @@ use bio::MemBioSlice;
use error::ErrorStack;
use util::{CallbackState, invoke_passwd_cb_old};
use types::OpenSslTypeRef;
use pkey::PKeyCtxRef;
/// Type of encryption padding to use.
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Padding(c_int);
impl Padding {
pub fn from_raw(value: c_int) -> Padding {
Padding(value)
}
pub fn as_raw(&self) -> c_int {
self.0
}
}
pub const NO_PADDING: Padding = Padding(ffi::RSA_NO_PADDING);
pub const PKCS1_PADDING: Padding = Padding(ffi::RSA_PKCS1_PADDING);
pub const PKCS1_OAEP_PADDING: Padding = Padding(ffi::RSA_PKCS1_OAEP_PADDING);
@ -344,33 +353,6 @@ mod compat {
}
}
// EVP_PKEY_CTX_ctrl macros
unsafe fn pkey_ctx_set_rsa_padding(ctx: *mut ffi::EVP_PKEY_CTX, pad: c_int) -> c_int {
ffi::EVP_PKEY_CTX_ctrl(ctx, ffi::EVP_PKEY_RSA, -1, ffi::RSA_PKEY_CTRL_RSA_PADDING, pad, ptr::null_mut())
}
unsafe fn pkey_ctx_get_rsa_padding(ctx: *mut ffi::EVP_PKEY_CTX, ppad: *mut c_int) -> c_int {
ffi::EVP_PKEY_CTX_ctrl(ctx, ffi::EVP_PKEY_RSA, -1, ffi::RSA_PKEY_CTRL_GET_RSA_PADDING, 0, ppad as *mut c_void)
}
// This is needed here, as it needs access to the private data of Padding.
impl PKeyCtxRef {
pub fn set_rsa_padding(&mut self, pad: Padding) -> Result<(), ErrorStack> {
unsafe {
try!(cvt(pkey_ctx_set_rsa_padding(self.as_ptr(), pad.0)));
}
Ok(())
}
pub fn get_rsa_padding(&mut self) -> Result<Padding, ErrorStack> {
let mut pad: c_int = 0;
unsafe {
try!(cvt(pkey_ctx_get_rsa_padding(self.as_ptr(), &mut pad)));
};
Ok(Padding(pad))
}
}
#[cfg(test)]
mod test {
use symm::Cipher;

View File

@ -81,7 +81,6 @@ pub struct Signer<'a> {
md_ctx: *mut ffi::EVP_MD_CTX,
pkey_ctx: *mut ffi::EVP_PKEY_CTX,
pkey_pd: PhantomData<&'a PKeyRef>,
pkey_ctx_pd: PhantomData<&'a PKeyCtxRef>
}
impl<'a> Drop for Signer<'a> {
@ -116,12 +115,11 @@ impl<'a> Signer<'a> {
md_ctx: ctx,
pkey_ctx: pctx,
pkey_pd: PhantomData,
pkey_ctx_pd: PhantomData
})
}
}
pub fn pkey_ctx(&mut self) -> &mut PKeyCtxRef {
pub fn pkey_ctx_mut(&mut self) -> &mut PKeyCtxRef {
unsafe { ::types::OpenSslTypeRef::from_ptr_mut(self.pkey_ctx) }
}
@ -159,7 +157,6 @@ pub struct Verifier<'a> {
md_ctx: *mut ffi::EVP_MD_CTX,
pkey_ctx: *mut ffi::EVP_PKEY_CTX,
pkey_pd: PhantomData<&'a PKeyRef>,
pkey_ctx_pd: PhantomData<&'a PKeyCtxRef>,
}
impl<'a> Drop for Verifier<'a> {
@ -194,12 +191,11 @@ impl<'a> Verifier<'a> {
md_ctx: ctx,
pkey_ctx: pctx,
pkey_pd: PhantomData,
pkey_ctx_pd: PhantomData,
})
}
}
pub fn pkey_ctx(&mut self) -> &mut PKeyCtxRef {
pub fn pkey_ctx_mut(&mut self) -> &mut PKeyCtxRef {
unsafe { ::types::OpenSslTypeRef::from_ptr_mut(self.pkey_ctx) }
}
@ -291,8 +287,8 @@ mod test {
let pkey = PKey::from_rsa(private_key).unwrap();
let mut signer = Signer::new(MessageDigest::sha256(), &pkey).unwrap();
assert_eq!(signer.pkey_ctx().get_rsa_padding().unwrap(), PKCS1_PADDING);
signer.pkey_ctx().set_rsa_padding(PKCS1_PADDING).unwrap();
assert_eq!(signer.pkey_ctx_mut().rsa_padding().unwrap(), PKCS1_PADDING);
signer.pkey_ctx_mut().set_rsa_padding(PKCS1_PADDING).unwrap();
signer.update(INPUT).unwrap();
let result = signer.finish().unwrap();
@ -306,7 +302,7 @@ mod test {
let pkey = PKey::from_rsa(private_key).unwrap();
let mut verifier = Verifier::new(MessageDigest::sha256(), &pkey).unwrap();
assert_eq!(verifier.pkey_ctx().get_rsa_padding().unwrap(), PKCS1_PADDING);
assert_eq!(verifier.pkey_ctx_mut().rsa_padding().unwrap(), PKCS1_PADDING);
verifier.update(INPUT).unwrap();
assert!(verifier.finish(SIGNATURE).unwrap());
}