aboutsummaryrefslogtreecommitdiff
path: root/openssl/src
diff options
context:
space:
mode:
Diffstat (limited to 'openssl/src')
-rw-r--r--openssl/src/dh.rs8
-rw-r--r--openssl/src/ec.rs61
-rw-r--r--openssl/src/lib.rs2
-rw-r--r--openssl/src/ssl/tests/mod.rs72
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();