diff options
Diffstat (limited to 'openssl/src')
| -rw-r--r-- | openssl/src/dh.rs | 8 | ||||
| -rw-r--r-- | openssl/src/ec.rs | 61 | ||||
| -rw-r--r-- | openssl/src/lib.rs | 2 | ||||
| -rw-r--r-- | openssl/src/ssl/tests/mod.rs | 72 |
4 files changed, 66 insertions, 77 deletions
diff --git a/openssl/src/dh.rs b/openssl/src/dh.rs index 09d286f9..6dd97844 100644 --- a/openssl/src/dh.rs +++ b/openssl/src/dh.rs @@ -4,7 +4,7 @@ use foreign_types::ForeignTypeRef; use std::mem; use std::ptr; -use {cvt, cvt_p, init}; +use {cvt, cvt_p}; use bn::BigNum; foreign_type! { @@ -43,7 +43,7 @@ impl Dh { #[cfg(any(all(feature = "v102", ossl102), all(feature = "v110", ossl110)))] pub fn get_1024_160() -> Result<Dh, ErrorStack> { unsafe { - init(); + ffi::init(); cvt_p(ffi::DH_get_1024_160()).map(Dh) } } @@ -52,7 +52,7 @@ impl Dh { #[cfg(any(all(feature = "v102", ossl102), all(feature = "v110", ossl110)))] pub fn get_2048_224() -> Result<Dh, ErrorStack> { unsafe { - init(); + ffi::init(); cvt_p(ffi::DH_get_2048_224()).map(Dh) } } @@ -61,7 +61,7 @@ impl Dh { #[cfg(any(all(feature = "v102", ossl102), all(feature = "v110", ossl110)))] pub fn get_2048_256() -> Result<Dh, ErrorStack> { unsafe { - init(); + ffi::init(); cvt_p(ffi::DH_get_2048_256()).map(Dh) } } diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs index 95baa833..e221b411 100644 --- a/openssl/src/ec.rs +++ b/openssl/src/ec.rs @@ -459,12 +459,35 @@ impl EcKeyBuilderRef { pub fn generate_key(&mut self) -> Result<&mut EcKeyBuilderRef, ErrorStack> { unsafe { cvt(ffi::EC_KEY_generate_key(self.as_ptr())).map(|_| self) } } + + /// Sets the public key based on affine coordinates. + pub fn set_public_key_affine_coordinates(&mut self, + x: &BigNumRef, + y: &BigNumRef) + -> Result<&mut EcKeyBuilderRef, ErrorStack> { + unsafe { + cvt(ffi::EC_KEY_set_public_key_affine_coordinates(self.as_ptr(), + x.as_ptr(), + y.as_ptr()) + ).map(|_| self) + } + } + + /// Sets the private key. + pub fn set_private_key(&mut self, + key: &BigNumRef) + -> Result<&mut EcKeyBuilderRef, ErrorStack> { + unsafe { + cvt(ffi::EC_KEY_set_private_key(self.as_ptr(), key.as_ptr())).map(|_| self) + } + } } #[cfg(test)] mod test { - use bn::BigNumContext; + use bn::{BigNum, BigNumContext}; use nid; + use data_encoding; use super::*; #[test] @@ -539,4 +562,40 @@ mod test { assert!(ec_key.public_key().is_some()); assert!(ec_key.private_key().is_none()); } + + #[test] + fn key_from_affine_coordinates() { + let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); + let x = data_encoding::base64url::decode_nopad("MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes()) + .unwrap(); + let y = data_encoding::base64url::decode_nopad("4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes()) + .unwrap(); + + let xbn = BigNum::from_slice(&x).unwrap(); + let ybn = BigNum::from_slice(&y).unwrap(); + + let mut builder = EcKeyBuilder::new().unwrap(); + builder.set_group(&group).unwrap(); + builder.set_public_key_affine_coordinates(&xbn, &ybn).unwrap(); + + let ec_key = builder.build(); + assert!(ec_key.check_key().is_ok()); + assert!(ec_key.public_key().is_some()); + } + + #[test] + fn set_private_key() { + let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); + let d = data_encoding::base64url::decode_nopad("870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE".as_bytes()) + .unwrap(); + + let dbn = BigNum::from_slice(&d).unwrap(); + + let mut builder = EcKeyBuilder::new().unwrap(); + builder.set_group(&group).unwrap(); + builder.set_private_key(&dbn).unwrap(); + + let ec_key = builder.build(); + assert!(ec_key.private_key().is_some()); + } } diff --git a/openssl/src/lib.rs b/openssl/src/lib.rs index d99807e5..d71d8d9d 100644 --- a/openssl/src/lib.rs +++ b/openssl/src/lib.rs @@ -13,6 +13,8 @@ extern crate openssl_sys as ffi; extern crate hex; #[cfg(test)] extern crate tempdir; +#[cfg(test)] +extern crate data_encoding; #[doc(inline)] pub use ffi::init; diff --git a/openssl/src/ssl/tests/mod.rs b/openssl/src/ssl/tests/mod.rs index eed7e0a8..cfad9cca 100644 --- a/openssl/src/ssl/tests/mod.rs +++ b/openssl/src/ssl/tests/mod.rs @@ -114,29 +114,6 @@ impl Server { ], ) } - - fn new_dtlsv1<I>(input: I) -> (Server, UdpConnected) - where - I: IntoIterator<Item = &'static str>, - I::IntoIter: Send + 'static, - { - let mut input = input.into_iter(); - let (s, addr) = Server::spawn( - &["-dtls1"], - Some(Box::new(move |mut io| for s in input.by_ref() { - if io.write_all(s.as_bytes()).is_err() { - break; - } - })), - ); - // Need to wait for the UDP socket to get bound in our child process, - // but don't currently have a great way to do that so just wait for a - // bit. - thread::sleep(Duration::from_millis(100)); - let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); - socket.connect(&addr).unwrap(); - (s, UdpConnected(socket)) - } } impl Drop for Server { @@ -146,25 +123,6 @@ impl Drop for Server { } } -#[derive(Debug)] -struct UdpConnected(UdpSocket); - -impl Read for UdpConnected { - fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { - self.0.recv(buf) - } -} - -impl Write for UdpConnected { - fn write(&mut self, buf: &[u8]) -> io::Result<usize> { - self.0.send(buf) - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - macro_rules! run_test( ($module:ident, $blk:expr) => ( #[cfg(test)] @@ -195,13 +153,6 @@ macro_rules! run_test( let (_s, stream) = Server::new(); $blk(SslMethod::tls(), stream); } - - #[test] - #[ignore] // FIXME(#467) - fn dtlsv1() { - let (_s, stream) = Server::new_dtlsv1(Some("hello")); - $blk(SslMethod::dtls(), stream); - } } ); ); @@ -480,18 +431,6 @@ run_test!(get_peer_certificate, |method, stream| { }); #[test] -#[cfg_attr(any(libressl, windows, target_arch = "arm"), ignore)] // FIXME(#467) -fn test_write_dtlsv1() { - let (_s, stream) = Server::new_dtlsv1(iter::repeat("y\n")); - let ctx = SslContext::builder(SslMethod::dtls()).unwrap(); - let mut stream = Ssl::new(&ctx.build()).unwrap().connect(stream).unwrap(); - stream.write_all(b"hello").unwrap(); - stream.flush().unwrap(); - stream.write_all(b" there").unwrap(); - stream.flush().unwrap(); -} - -#[test] fn test_read() { let (_s, tcp) = Server::new(); let ctx = SslContext::builder(SslMethod::tls()).unwrap(); @@ -796,17 +735,6 @@ fn test_alpn_server_select_none() { assert_eq!(None, stream.ssl().selected_alpn_protocol()); } -#[test] -#[cfg_attr(any(libressl, windows, target_arch = "arm"), ignore)] // FIXME(#467) -fn test_read_dtlsv1() { - let (_s, stream) = Server::new_dtlsv1(Some("hello")); - - let ctx = SslContext::builder(SslMethod::dtls()).unwrap(); - let mut stream = Ssl::new(&ctx.build()).unwrap().connect(stream).unwrap(); - let mut buf = [0u8; 100]; - assert!(stream.read(&mut buf).is_ok()); -} - fn wait_io(stream: &TcpStream, read: bool, timeout_ms: u32) -> bool { unsafe { let mut set: select::fd_set = mem::zeroed(); |