Commit 302ee77d authored by Brian Chin's avatar Brian Chin
Browse files

Adding suggestions from review.

parent 72a10f3e
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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())
}
+18 −1
Original line number Diff line number Diff line
@@ -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 −28
Original line number Diff line number Diff line
@@ -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;
+5 −9
Original line number Diff line number Diff line
@@ -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());
    }