diff options
| author | Steven Fackler <[email protected]> | 2015-10-14 22:25:48 -0400 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2015-10-14 22:25:48 -0400 |
| commit | 38b0defd91fb8965afda164c09afa72d07359eb0 (patch) | |
| tree | 16283f2a026afd2caf723c94636c12a2eff7f80f /openssl/src/crypto/pkey.rs | |
| parent | Merge branch 'release-v0.6.6' into release (diff) | |
| parent | Release v0.6.7 (diff) | |
| download | rust-openssl-0.6.7.tar.xz rust-openssl-0.6.7.zip | |
Merge branch 'release-v0.6.7' into releasev0.6.7
Diffstat (limited to 'openssl/src/crypto/pkey.rs')
| -rw-r--r-- | openssl/src/crypto/pkey.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/openssl/src/crypto/pkey.rs b/openssl/src/crypto/pkey.rs index 5a528b1b..695bd8a6 100644 --- a/openssl/src/crypto/pkey.rs +++ b/openssl/src/crypto/pkey.rs @@ -96,6 +96,22 @@ impl PKey { } } + /// Reads public key from PEM, takes ownership of handle + pub fn public_key_from_pem<R>(reader: &mut R) -> Result<PKey, SslError> where R: Read { + let mut mem_bio = try!(MemBio::new()); + try!(io::copy(reader, &mut mem_bio).map_err(StreamError)); + + unsafe { + let evp = try_ssl_null!(ffi::PEM_read_bio_PUBKEY(mem_bio.get_handle(), + ptr::null_mut(), + None, ptr::null_mut())); + Ok(PKey { + evp: evp, + parts: Parts::Public, + }) + } + } + fn _tostr(&self, f: unsafe extern "C" fn(*mut ffi::RSA, *const *mut u8) -> c_int) -> Vec<u8> { unsafe { let rsa = ffi::EVP_PKEY_get1_RSA(self.evp); @@ -467,6 +483,16 @@ mod tests { } #[test] + fn test_public_key_from_pem() { + let key_path = Path::new("test/key.pem.pub"); + let mut file = File::open(&key_path) + .ok() + .expect("Failed to open `test/key.pem.pub`"); + + super::PKey::public_key_from_pem(&mut file).unwrap(); + } + + #[test] fn test_encrypt() { let mut k0 = super::PKey::new(); let mut k1 = super::PKey::new(); |