Commit 2a8923c0 authored by Steven Fackler's avatar Steven Fackler
Browse files

Macro-implement private_key_to_pem

parent 08e0c4ca
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
@@ -14,19 +14,7 @@ use util::{CallbackState, invoke_passwd_cb_old};
type_!(Dsa, DsaRef, ffi::DSA, ffi::DSA_free);

impl DsaRef {
    /// Encodes a DSA private key as unencrypted PEM formatted data.
    pub fn private_key_to_pem(&self) -> Result<Vec<u8>, ErrorStack> {
        assert!(self.has_private_key());
        let mem_bio = try!(MemBio::new());

        unsafe {
            try!(cvt(ffi::PEM_write_bio_DSAPrivateKey(mem_bio.as_ptr(), self.as_ptr(),
                                                      ptr::null(), ptr::null_mut(), 0,
                                                      None, ptr::null_mut())))
        };

        Ok(mem_bio.get_buf().to_owned())
    }
    private_key_to_pem!(ffi::PEM_write_bio_DSAPrivateKey);

    /// Encodes a DSA public key as PEM formatted data.
    pub fn public_key_to_pem(&self) -> Result<Vec<u8>, ErrorStack> {
+19 −0
Original line number Diff line number Diff line
@@ -75,3 +75,22 @@ macro_rules! private_key_from_pem {
        }
    }
}

macro_rules! private_key_to_pem {
    ($f:path) => {
        /// Serializes the private key to PEM.
        pub fn private_key_to_pem(&self) -> Result<Vec<u8>, ::error::ErrorStack> {
            unsafe {
                let bio = try!(MemBio::new());
                try!(cvt($f(bio.as_ptr(),
                            self.as_ptr(),
                            ptr::null(),
                            ptr::null_mut(),
                            -1,
                            None,
                            ptr::null_mut())));
                Ok(bio.get_buf().to_owned())
            }
        }
    }
}
+1 −16
Original line number Diff line number Diff line
@@ -48,22 +48,7 @@ impl PKeyRef {
        }
    }

    /// Encodes the private key in the PEM format.
    // FIXME: also add password and encryption
    pub fn private_key_to_pem(&self) -> Result<Vec<u8>, ErrorStack> {
        let mem_bio = try!(MemBio::new());
        unsafe {
            try!(cvt(ffi::PEM_write_bio_PrivateKey(mem_bio.as_ptr(),
                                                   self.as_ptr(),
                                                   ptr::null(),
                                                   ptr::null_mut(),
                                                   -1,
                                                   None,
                                                   ptr::null_mut())));

        }
        Ok(mem_bio.get_buf().to_owned())
    }
    private_key_to_pem!(ffi::PEM_write_bio_PrivateKey);

    /// Encodes the public key in the PEM format.
    pub fn public_key_to_pem(&self) -> Result<Vec<u8>, ErrorStack> {
+1 −15
Original line number Diff line number Diff line
@@ -23,21 +23,7 @@ pub const PKCS1_OAEP_PADDING: Padding = Padding(ffi::RSA_PKCS1_OAEP_PADDING);
type_!(Rsa, RsaRef, ffi::RSA, ffi::RSA_free);

impl RsaRef {
    /// Writes an RSA private key as unencrypted PEM formatted data
    pub fn private_key_to_pem(&self) -> Result<Vec<u8>, ErrorStack> {
        let mem_bio = try!(MemBio::new());

        unsafe {
            try!(cvt(ffi::PEM_write_bio_RSAPrivateKey(mem_bio.as_ptr(),
                                                      self.as_ptr(),
                                                      ptr::null(),
                                                      ptr::null_mut(),
                                                      0,
                                                      None,
                                                      ptr::null_mut())));
        }
        Ok(mem_bio.get_buf().to_owned())
    }
    private_key_to_pem!(ffi::PEM_write_bio_RSAPrivateKey);

    /// Writes an RSA public key as PEM formatted data
    pub fn public_key_to_pem(&self) -> Result<Vec<u8>, ErrorStack> {