diff options
| author | Jonas Schievink <[email protected]> | 2016-06-14 18:17:25 +0200 |
|---|---|---|
| committer | Jonas Schievink <[email protected]> | 2016-06-26 18:25:54 +0200 |
| commit | c399c2475d71c313970dc4e3b271f0086e90b013 (patch) | |
| tree | 9a9c4bd9c4899a5f4eb24794ca54564cde00d974 /openssl/src | |
| parent | Move into utility module (diff) | |
| download | rust-openssl-c399c2475d71c313970dc4e3b271f0086e90b013.tar.xz rust-openssl-c399c2475d71c313970dc4e3b271f0086e90b013.zip | |
Add RSA::private_key_from_pem_cb
Diffstat (limited to 'openssl/src')
| -rw-r--r-- | openssl/src/crypto/rsa.rs | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/openssl/src/crypto/rsa.rs b/openssl/src/crypto/rsa.rs index 52b8590e..d451aab6 100644 --- a/openssl/src/crypto/rsa.rs +++ b/openssl/src/crypto/rsa.rs @@ -3,12 +3,13 @@ use std::fmt; use ssl::error::{SslError, StreamError}; use std::ptr; use std::io::{self, Read, Write}; -use libc::c_int; +use libc::{c_int, c_void}; use bn::BigNum; use bio::MemBio; use crypto::HashTypeInternals; use crypto::hash; +use crypto::util::{CallbackState, invoke_passwd_cb}; pub struct RSA(*mut ffi::RSA); @@ -76,6 +77,26 @@ impl RSA { } } + /// Reads an RSA private key from PEM formatted data and supplies a password callback. + pub fn private_key_from_pem_cb<R, F>(reader: &mut R, pass_cb: F) -> Result<RSA, SslError> + where R: Read, F: FnMut(&mut [i8]) -> usize + { + let mut cb = CallbackState::new(pass_cb); + + let mut mem_bio = try!(MemBio::new()); + try!(io::copy(reader, &mut mem_bio).map_err(StreamError)); + + unsafe { + let cb_ptr = &mut cb as *mut _ as *mut c_void; + let rsa = try_ssl_null!(ffi::PEM_read_bio_RSAPrivateKey(mem_bio.get_handle(), + ptr::null_mut(), + Some(invoke_passwd_cb::<F>), + cb_ptr)); + + Ok(RSA(rsa)) + } + } + /// Writes an RSA private key as unencrypted PEM formatted data pub fn private_key_to_pem<W>(&self, writer: &mut W) -> Result<(), SslError> where W: Write |