Adding suggestions from review.
This commit is contained in:
parent
72a10f3e65
commit
302ee77d32
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue