diff options
| author | Steven Fackler <[email protected]> | 2015-09-16 01:11:58 -0400 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2015-09-16 01:11:58 -0400 |
| commit | 618b68f9c08de6503945041a85cd8723a634a313 (patch) | |
| tree | 5a27457085f7740c6ea20342a6cf97c316dcf34f /openssl/src | |
| parent | Merge pull request #270 from mvdnes/crypto_segv (diff) | |
| parent | Add DH::from_pem() to load DH parameters from a file (diff) | |
| download | rust-openssl-618b68f9c08de6503945041a85cd8723a634a313.tar.xz rust-openssl-618b68f9c08de6503945041a85cd8723a634a313.zip | |
Merge pull request #262 from jedisct1/read_dhparams
Add DH::from_pem() to load DH parameters from a file
Diffstat (limited to 'openssl/src')
| -rw-r--r-- | openssl/src/dh/mod.rs | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/openssl/src/dh/mod.rs b/openssl/src/dh/mod.rs index cbf9d3ab..7be5dd04 100644 --- a/openssl/src/dh/mod.rs +++ b/openssl/src/dh/mod.rs @@ -1,5 +1,8 @@ use ffi; -use ssl::error::SslError; +use std::io; +use std::io::prelude::*; +use ssl::error::{SslError, StreamError}; +use bio::MemBio; use bn::BigNum; use std::mem; use std::ptr; @@ -18,6 +21,16 @@ impl DH { Ok(DH(dh)) } + pub fn from_pem<R>(reader: &mut R) -> Result<DH, SslError> where R: Read { + let mut mem_bio = try!(MemBio::new()); + try!(io::copy(reader, &mut mem_bio).map_err(StreamError)); + let dh = unsafe { + ffi::PEM_read_bio_DHparams(mem_bio.get_handle(), ptr::null_mut(), None, ptr::null_mut()) + }; + try_ssl_null!(dh); + Ok(DH(dh)) + } + #[cfg(feature = "rfc5114")] pub fn get_1024_160() -> Result<DH, SslError> { let dh = unsafe { ffi::DH_get_1024_160() }; @@ -68,6 +81,8 @@ impl Drop for DH { #[cfg(test)] mod tests { + use std::fs::File; + use std::path::Path; use super::DH; use bn::BigNum; use ssl::SslContext; @@ -94,4 +109,15 @@ mod tests { let dh = DH::from_params(p, g, q).unwrap(); ctx.set_tmp_dh(dh).unwrap(); } + + #[test] + fn test_dh_from_pem() { + let ctx = SslContext::new(Sslv23).unwrap(); + let pem_path = Path::new("test/dhparams.pem"); + let mut file = File::open(&pem_path) + .ok() + .expect("Failed to open `test/dhparams.pem`"); + let dh = DH::from_pem(&mut file).ok().expect("Failed to load PEM"); + ctx.set_tmp_dh(dh).unwrap(); + } } |