From 6d4bfaa490af285443a7e8413040e58b889d2993 Mon Sep 17 00:00:00 2001 From: Leon Anavi Date: Tue, 22 Mar 2016 00:16:56 +0200 Subject: [PATCH 1/6] Cast correctly c_char raw pointers (fixes build on ARM #363) Fix error caused by mismatched types while building crate openssl for Raspberry Pi 2 and other ARM devices. Signed-off-by: Leon Anavi --- openssl/src/ssl/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openssl/src/ssl/mod.rs b/openssl/src/ssl/mod.rs index 38527dc6..ebaffb18 100644 --- a/openssl/src/ssl/mod.rs +++ b/openssl/src/ssl/mod.rs @@ -827,7 +827,7 @@ impl <'a> SslCipher<'a> { let desc_ptr = ffi::SSL_CIPHER_description(self.cipher, buf.as_mut_ptr(), 128); if !desc_ptr.is_null() { - String::from_utf8(CStr::from_ptr(desc_ptr).to_bytes().to_vec()).ok() + String::from_utf8(CStr::from_ptr(desc_ptr as *const _).to_bytes().to_vec()).ok() } else { None } From c4187638a888f13d61ec1ce6a90840ed2f4777d3 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 27 Mar 2016 13:29:24 -0700 Subject: [PATCH 2/6] Update for nightly changes --- openssl/src/ssl/bio.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openssl/src/ssl/bio.rs b/openssl/src/ssl/bio.rs index 8d295928..26c23d4c 100644 --- a/openssl/src/ssl/bio.rs +++ b/openssl/src/ssl/bio.rs @@ -72,7 +72,7 @@ unsafe fn state<'a, S: 'a>(bio: *mut BIO) -> &'a mut StreamState { #[cfg(feature = "nightly")] fn recover(f: F) -> Result> where F: FnOnce() -> T { - ::std::panic::recover(::std::panic::AssertRecoverSafe::new(f)) + ::std::panic::recover(::std::panic::AssertRecoverSafe(f)) } #[cfg(not(feature = "nightly"))] From 02f114faae1f829b799afccdd8b0e370923f4178 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 27 Mar 2016 13:37:00 -0700 Subject: [PATCH 3/6] Cleanup --- openssl/src/ssl/bio.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/openssl/src/ssl/bio.rs b/openssl/src/ssl/bio.rs index 26c23d4c..5accb3e5 100644 --- a/openssl/src/ssl/bio.rs +++ b/openssl/src/ssl/bio.rs @@ -86,9 +86,7 @@ unsafe extern "C" fn bwrite(bio: *mut BIO, buf: *const c_char, len: c_ let state = state::(bio); let buf = slice::from_raw_parts(buf as *const _, len as usize); - let result = recover(|| state.stream.write(buf)); - - match result { + match recover(|| state.stream.write(buf)) { Ok(Ok(len)) => len as c_int, Ok(Err(err)) => { if retriable_error(&err) { @@ -110,9 +108,7 @@ unsafe extern "C" fn bread(bio: *mut BIO, buf: *mut c_char, len: c_int) let state = state::(bio); let buf = slice::from_raw_parts_mut(buf as *mut _, len as usize); - let result = recover(|| state.stream.read(buf)); - - match result { + match recover(|| state.stream.read(buf)) { Ok(Ok(len)) => len as c_int, Ok(Err(err)) => { if retriable_error(&err) { @@ -146,9 +142,8 @@ unsafe extern "C" fn ctrl(bio: *mut BIO, -> c_long { if cmd == BIO_CTRL_FLUSH { let state = state::(bio); - let result = recover(|| state.stream.flush()); - match result { + match recover(|| state.stream.flush()) { Ok(Ok(())) => 1, Ok(Err(err)) => { state.error = Some(err); From c4b7b85d99b3e9ca154ba03be67bd6281825973c Mon Sep 17 00:00:00 2001 From: Joe Wilm Date: Mon, 4 Apr 2016 15:20:13 -0700 Subject: [PATCH 4/6] Add safe wrapper BioMethod for ffi::BIO_METHOD Adds a wrapper for ffi::BIO_METHOD located at ssl::bio::BioMethod. This enables SslStream to be Send without doing an unsafe impl on the ffi struct. --- openssl/src/ssl/bio.rs | 41 ++++++++++++++++++++++++++--------------- openssl/src/ssl/mod.rs | 6 +++--- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/openssl/src/ssl/bio.rs b/openssl/src/ssl/bio.rs index 5accb3e5..4adbfbe2 100644 --- a/openssl/src/ssl/bio.rs +++ b/openssl/src/ssl/bio.rs @@ -1,5 +1,5 @@ use libc::{c_char, c_int, c_long, c_void, strlen}; -use ffi::{BIO, BIO_METHOD, BIO_CTRL_FLUSH, BIO_TYPE_NONE, BIO_new}; +use ffi::{self, BIO, BIO_CTRL_FLUSH, BIO_TYPE_NONE, BIO_new}; use ffi_extras::{BIO_clear_retry_flags, BIO_set_retry_read, BIO_set_retry_write}; use std::any::Any; use std::io; @@ -17,19 +17,30 @@ pub struct StreamState { pub panic: Option>, } -pub fn new(stream: S) -> Result<(*mut BIO, Arc), SslError> { - let method = Arc::new(BIO_METHOD { - type_: BIO_TYPE_NONE, - name: b"rust\0".as_ptr() as *const _, - bwrite: Some(bwrite::), - bread: Some(bread::), - bputs: Some(bputs::), - bgets: None, - ctrl: Some(ctrl::), - create: Some(create), - destroy: Some(destroy::), - callback_ctrl: None, - }); +/// Safe wrapper for BIO_METHOD +pub struct BioMethod(ffi::BIO_METHOD); + +impl BioMethod { + pub fn new() -> BioMethod { + BioMethod(ffi::BIO_METHOD { + type_: BIO_TYPE_NONE, + name: b"rust\0".as_ptr() as *const _, + bwrite: Some(bwrite::), + bread: Some(bread::), + bputs: Some(bputs::), + bgets: None, + ctrl: Some(ctrl::), + create: Some(create), + destroy: Some(destroy::), + callback_ctrl: None, + }) + } +} + +unsafe impl Send for BioMethod {} + +pub fn new(stream: S) -> Result<(*mut BIO, Arc), SslError> { + let method = Arc::new(BioMethod::new::()); let state = Box::new(StreamState { stream: stream, @@ -38,7 +49,7 @@ pub fn new(stream: S) -> Result<(*mut BIO, Arc), Ss }); unsafe { - let bio = try_ssl_null!(BIO_new(&*method)); + let bio = try_ssl_null!(BIO_new(&method.0)); (*bio).ptr = Box::into_raw(state) as *mut _; (*bio).init = 1; diff --git a/openssl/src/ssl/mod.rs b/openssl/src/ssl/mod.rs index ebaffb18..7b5cf492 100644 --- a/openssl/src/ssl/mod.rs +++ b/openssl/src/ssl/mod.rs @@ -35,6 +35,8 @@ mod bio; #[cfg(test)] mod tests; +use self::bio::BioMethod; + #[doc(inline)] pub use ssl::error::Error; @@ -1117,12 +1119,10 @@ make_LibSslError! { /// A stream wrapper which handles SSL encryption for an underlying stream. pub struct SslStream { ssl: Ssl, - _method: Arc, // NOTE: this *must* be after the Ssl field so things drop right + _method: Arc, // NOTE: this *must* be after the Ssl field so things drop right _p: PhantomData, } -unsafe impl Send for SslStream {} - /// # Deprecated /// /// This method does not behave as expected and will be removed in a future From 4016edd4de9f660a1a4c5fa67f2f04c6a828fab0 Mon Sep 17 00:00:00 2001 From: Kevin King <4kevinking@gmail.com> Date: Wed, 6 Apr 2016 18:44:17 -0400 Subject: [PATCH 5/6] add EVP_PKEY_copy_parameters to FFI copy EVP_PKEY params in PKey::clone test that PKey::clone creates a copy --- openssl-sys/src/lib.rs | 1 + openssl/src/c_helpers.c | 4 ---- openssl/src/crypto/pkey.rs | 22 +++++++++++++++------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index 6d6d6103..77f846ab 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -548,6 +548,7 @@ extern "C" { pub fn EVP_PKEY_new() -> *mut EVP_PKEY; pub fn EVP_PKEY_free(k: *mut EVP_PKEY); pub fn EVP_PKEY_assign(pkey: *mut EVP_PKEY, typ: c_int, key: *const c_void) -> c_int; + pub fn EVP_PKEY_copy_parameters(to: *mut EVP_PKEY, from: *const EVP_PKEY) -> c_int; pub fn EVP_PKEY_get1_RSA(k: *mut EVP_PKEY) -> *mut RSA; pub fn EVP_PKEY_set1_RSA(k: *mut EVP_PKEY, r: *mut RSA) -> c_int; pub fn EVP_PKEY_cmp(a: *const EVP_PKEY, b: *const EVP_PKEY) -> c_int; diff --git a/openssl/src/c_helpers.c b/openssl/src/c_helpers.c index 1b48565e..e884bebd 100644 --- a/openssl/src/c_helpers.c +++ b/openssl/src/c_helpers.c @@ -8,10 +8,6 @@ void rust_SSL_CTX_clone(SSL_CTX *ctx) { CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX); } -void rust_EVP_PKEY_clone(EVP_PKEY *pkey) { - CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY); -} - void rust_X509_clone(X509 *x509) { CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509); } diff --git a/openssl/src/crypto/pkey.rs b/openssl/src/crypto/pkey.rs index cafd50ad..f945276d 100644 --- a/openssl/src/crypto/pkey.rs +++ b/openssl/src/crypto/pkey.rs @@ -53,10 +53,6 @@ fn openssl_hash_nid(hash: HashType) -> c_int { } } -extern "C" { - fn rust_EVP_PKEY_clone(pkey: *mut ffi::EVP_PKEY); -} - pub struct PKey { evp: *mut ffi::EVP_PKEY, parts: Parts, @@ -614,10 +610,10 @@ impl Drop for PKey { impl Clone for PKey { fn clone(&self) -> Self { unsafe { - rust_EVP_PKEY_clone(self.evp); + let new_evp = ffi::EVP_PKEY_new(); + assert!(ffi::EVP_PKEY_copy_parameters(new_evp, self.evp) == 0); + PKey::from_handle(new_evp, self.parts) } - - PKey::from_handle(self.evp, self.parts) } } @@ -866,4 +862,16 @@ mod tests { pkey.load_pub(&[]); pkey.verify(&[], &[]); } + + #[test] + fn test_pkey_clone_creates_copy() { + let mut pkey = super::PKey::new(); + pkey.gen(512); + let old_pkey_n = pkey.get_rsa().n().unwrap(); + + let mut pkey2 = pkey.clone(); + pkey2.gen(512); + + assert!(old_pkey_n == pkey.get_rsa().n().unwrap()); + } } From d143203f882c1295d7a1def3821eccd779364202 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Wed, 6 Apr 2016 21:34:20 -0700 Subject: [PATCH 6/6] Release v0.7.9 --- README.md | 2 +- openssl-sys-extras/Cargo.toml | 6 +++--- openssl-sys-extras/src/lib.rs | 2 +- openssl-sys/Cargo.toml | 4 ++-- openssl-sys/src/lib.rs | 2 +- openssl/Cargo.toml | 8 ++++---- openssl/src/lib.rs | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 6f3bf7cb..d10e478e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://travis-ci.org/sfackler/rust-openssl.svg?branch=master)](https://travis-ci.org/sfackler/rust-openssl) -[Documentation](https://sfackler.github.io/rust-openssl/doc/v0.7.8/openssl). +[Documentation](https://sfackler.github.io/rust-openssl/doc/v0.7.9/openssl). ## Building diff --git a/openssl-sys-extras/Cargo.toml b/openssl-sys-extras/Cargo.toml index 29e2c862..6ef228a6 100644 --- a/openssl-sys-extras/Cargo.toml +++ b/openssl-sys-extras/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "openssl-sys-extras" -version = "0.7.8" +version = "0.7.9" authors = ["Steven Fackler "] license = "MIT" description = "Extra FFI bindings to OpenSSL that require a C shim" repository = "https://github.com/sfackler/rust-openssl" -documentation = "https://sfackler.github.io/rust-openssl/doc/v0.7.8/openssl_sys_extras" +documentation = "https://sfackler.github.io/rust-openssl/doc/v0.7.9/openssl_sys_extras" build = "build.rs" [features] @@ -13,7 +13,7 @@ ecdh_auto = [] [dependencies] libc = "0.2" -openssl-sys = { version = "0.7.8", path = "../openssl-sys" } +openssl-sys = { version = "0.7.9", path = "../openssl-sys" } [build-dependencies] gcc = "0.3" diff --git a/openssl-sys-extras/src/lib.rs b/openssl-sys-extras/src/lib.rs index 890c323b..15f3fbd6 100644 --- a/openssl-sys-extras/src/lib.rs +++ b/openssl-sys-extras/src/lib.rs @@ -1,5 +1,5 @@ #![allow(non_upper_case_globals, non_snake_case)] -#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/v0.7.8")] +#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/v0.7.9")] extern crate openssl_sys; extern crate libc; diff --git a/openssl-sys/Cargo.toml b/openssl-sys/Cargo.toml index 2498c234..35cebfc9 100644 --- a/openssl-sys/Cargo.toml +++ b/openssl-sys/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "openssl-sys" -version = "0.7.8" +version = "0.7.9" authors = ["Alex Crichton ", "Steven Fackler "] license = "MIT" description = "FFI bindings to OpenSSL" repository = "https://github.com/sfackler/rust-openssl" -documentation = "https://sfackler.github.io/rust-openssl/doc/v0.7.8/openssl_sys" +documentation = "https://sfackler.github.io/rust-openssl/doc/v0.7.9/openssl_sys" links = "openssl" build = "build.rs" diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index 77f846ab..85f434ae 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -1,6 +1,6 @@ #![allow(non_camel_case_types, non_upper_case_globals, non_snake_case)] #![allow(dead_code)] -#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/v0.7.8")] +#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/v0.7.9")] extern crate libc; diff --git a/openssl/Cargo.toml b/openssl/Cargo.toml index 5bfd3edb..09f84433 100644 --- a/openssl/Cargo.toml +++ b/openssl/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "openssl" -version = "0.7.8" +version = "0.7.9" authors = ["Steven Fackler "] license = "Apache-2.0" description = "OpenSSL bindings" repository = "https://github.com/sfackler/rust-openssl" -documentation = "https://sfackler.github.io/rust-openssl/doc/v0.7.8/openssl" +documentation = "https://sfackler.github.io/rust-openssl/doc/v0.7.9/openssl" readme = "../README.md" keywords = ["crypto", "tls", "ssl", "dtls"] build = "build.rs" @@ -32,8 +32,8 @@ nightly = [] bitflags = "0.4" lazy_static = "0.1" libc = "0.2" -openssl-sys = { version = "0.7.8", path = "../openssl-sys" } -openssl-sys-extras = { version = "0.7.8", path = "../openssl-sys-extras" } +openssl-sys = { version = "0.7.9", path = "../openssl-sys" } +openssl-sys-extras = { version = "0.7.9", path = "../openssl-sys-extras" } [build-dependencies] gcc = "0.3" diff --git a/openssl/src/lib.rs b/openssl/src/lib.rs index 9db1df92..ad982597 100644 --- a/openssl/src/lib.rs +++ b/openssl/src/lib.rs @@ -1,4 +1,4 @@ -#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/v0.7.8")] +#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/v0.7.9")] #![cfg_attr(feature = "nightly", feature(const_fn, recover, panic_propagate))] #[macro_use]