aboutsummaryrefslogtreecommitdiff
path: root/openssl/src
diff options
context:
space:
mode:
authorJonas Schievink <[email protected]>2016-06-14 18:17:25 +0200
committerJonas Schievink <[email protected]>2016-06-26 18:25:54 +0200
commitc399c2475d71c313970dc4e3b271f0086e90b013 (patch)
tree9a9c4bd9c4899a5f4eb24794ca54564cde00d974 /openssl/src
parentMove into utility module (diff)
downloadrust-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.rs23
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