commit
3fe5d562fb
|
|
@ -1,6 +1,5 @@
|
||||||
use ffi;
|
use ffi;
|
||||||
use libc::{c_char, c_int, c_uchar, c_uint, c_void};
|
use libc::{c_char, c_int, c_uchar, c_uint, c_void};
|
||||||
use std::any::Any;
|
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::slice;
|
use std::slice;
|
||||||
|
|
@ -18,7 +17,7 @@ use x509::X509StoreContextRef;
|
||||||
|
|
||||||
pub extern "C" fn raw_verify<F>(preverify_ok: c_int, x509_ctx: *mut ffi::X509_STORE_CTX) -> c_int
|
pub extern "C" fn raw_verify<F>(preverify_ok: c_int, x509_ctx: *mut ffi::X509_STORE_CTX) -> c_int
|
||||||
where
|
where
|
||||||
F: Fn(bool, &mut X509StoreContextRef) -> bool + Any + 'static + Sync + Send,
|
F: Fn(bool, &mut X509StoreContextRef) -> bool + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let idx = ffi::SSL_get_ex_data_X509_STORE_CTX_idx();
|
let idx = ffi::SSL_get_ex_data_X509_STORE_CTX_idx();
|
||||||
|
|
@ -44,7 +43,6 @@ pub extern "C" fn raw_psk<F>(
|
||||||
) -> c_uint
|
) -> c_uint
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, Option<&[u8]>, &mut [u8], &mut [u8]) -> Result<usize, ErrorStack>
|
F: Fn(&mut SslRef, Option<&[u8]>, &mut [u8], &mut [u8]) -> Result<usize, ErrorStack>
|
||||||
+ Any
|
|
||||||
+ 'static
|
+ 'static
|
||||||
+ Sync
|
+ Sync
|
||||||
+ Send,
|
+ Send,
|
||||||
|
|
@ -74,7 +72,7 @@ pub extern "C" fn ssl_raw_verify<F>(
|
||||||
x509_ctx: *mut ffi::X509_STORE_CTX,
|
x509_ctx: *mut ffi::X509_STORE_CTX,
|
||||||
) -> c_int
|
) -> c_int
|
||||||
where
|
where
|
||||||
F: Fn(bool, &mut X509StoreContextRef) -> bool + Any + 'static + Sync + Send,
|
F: Fn(bool, &mut X509StoreContextRef) -> bool + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let idx = ffi::SSL_get_ex_data_X509_STORE_CTX_idx();
|
let idx = ffi::SSL_get_ex_data_X509_STORE_CTX_idx();
|
||||||
|
|
@ -90,7 +88,7 @@ where
|
||||||
|
|
||||||
pub extern "C" fn raw_sni<F>(ssl: *mut ffi::SSL, al: *mut c_int, _arg: *mut c_void) -> c_int
|
pub extern "C" fn raw_sni<F>(ssl: *mut ffi::SSL, al: *mut c_int, _arg: *mut c_void) -> c_int
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef) -> Result<(), SniError> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef) -> Result<(), SniError> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let ssl_ctx = ffi::SSL_get_SSL_CTX(ssl);
|
let ssl_ctx = ffi::SSL_get_SSL_CTX(ssl);
|
||||||
|
|
@ -175,7 +173,7 @@ pub unsafe extern "C" fn raw_tmp_dh<F>(
|
||||||
keylength: c_int,
|
keylength: c_int,
|
||||||
) -> *mut ffi::DH
|
) -> *mut ffi::DH
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
let ctx = ffi::SSL_get_SSL_CTX(ssl);
|
let ctx = ffi::SSL_get_SSL_CTX(ssl);
|
||||||
let callback = ffi::SSL_CTX_get_ex_data(ctx, get_callback_idx::<F>());
|
let callback = ffi::SSL_CTX_get_ex_data(ctx, get_callback_idx::<F>());
|
||||||
|
|
@ -202,7 +200,7 @@ pub unsafe extern "C" fn raw_tmp_ecdh<F>(
|
||||||
keylength: c_int,
|
keylength: c_int,
|
||||||
) -> *mut ffi::EC_KEY
|
) -> *mut ffi::EC_KEY
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
let ctx = ffi::SSL_get_SSL_CTX(ssl);
|
let ctx = ffi::SSL_get_SSL_CTX(ssl);
|
||||||
let callback = ffi::SSL_CTX_get_ex_data(ctx, get_callback_idx::<F>());
|
let callback = ffi::SSL_CTX_get_ex_data(ctx, get_callback_idx::<F>());
|
||||||
|
|
@ -228,7 +226,7 @@ pub unsafe extern "C" fn raw_tmp_dh_ssl<F>(
|
||||||
keylength: c_int,
|
keylength: c_int,
|
||||||
) -> *mut ffi::DH
|
) -> *mut ffi::DH
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
let callback = ffi::SSL_get_ex_data(ssl, get_ssl_callback_idx::<F>());
|
let callback = ffi::SSL_get_ex_data(ssl, get_ssl_callback_idx::<F>());
|
||||||
let callback = &*(callback as *mut F);
|
let callback = &*(callback as *mut F);
|
||||||
|
|
@ -254,7 +252,7 @@ pub unsafe extern "C" fn raw_tmp_ecdh_ssl<F>(
|
||||||
keylength: c_int,
|
keylength: c_int,
|
||||||
) -> *mut ffi::EC_KEY
|
) -> *mut ffi::EC_KEY
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
let callback = ffi::SSL_get_ex_data(ssl, get_ssl_callback_idx::<F>());
|
let callback = ffi::SSL_get_ex_data(ssl, get_ssl_callback_idx::<F>());
|
||||||
let callback = &*(callback as *mut F);
|
let callback = &*(callback as *mut F);
|
||||||
|
|
@ -275,7 +273,7 @@ where
|
||||||
|
|
||||||
pub unsafe extern "C" fn raw_tlsext_status<F>(ssl: *mut ffi::SSL, _: *mut c_void) -> c_int
|
pub unsafe extern "C" fn raw_tlsext_status<F>(ssl: *mut ffi::SSL, _: *mut c_void) -> c_int
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef) -> Result<bool, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef) -> Result<bool, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
let ssl_ctx = ffi::SSL_get_SSL_CTX(ssl as *const _);
|
let ssl_ctx = ffi::SSL_get_SSL_CTX(ssl as *const _);
|
||||||
let callback = ffi::SSL_CTX_get_ex_data(ssl_ctx, get_callback_idx::<F>());
|
let callback = ffi::SSL_CTX_get_ex_data(ssl_ctx, get_callback_idx::<F>());
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
use std::any::Any;
|
|
||||||
use std::error;
|
use std::error;
|
||||||
use std::error::Error as StdError;
|
use std::error::Error as StdError;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
@ -107,7 +106,7 @@ pub enum HandshakeError<S> {
|
||||||
WouldBlock(MidHandshakeSslStream<S>),
|
WouldBlock(MidHandshakeSslStream<S>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: Any + fmt::Debug> StdError for HandshakeError<S> {
|
impl<S: fmt::Debug> StdError for HandshakeError<S> {
|
||||||
fn description(&self) -> &str {
|
fn description(&self) -> &str {
|
||||||
match *self {
|
match *self {
|
||||||
HandshakeError::SetupFailure(_) => "stream setup failed",
|
HandshakeError::SetupFailure(_) => "stream setup failed",
|
||||||
|
|
@ -124,7 +123,7 @@ impl<S: Any + fmt::Debug> StdError for HandshakeError<S> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S: Any + fmt::Debug> fmt::Display for HandshakeError<S> {
|
impl<S: fmt::Debug> fmt::Display for HandshakeError<S> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
f.write_str(StdError::description(self))?;
|
f.write_str(StdError::description(self))?;
|
||||||
match *self {
|
match *self {
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,6 @@ use ffi;
|
||||||
use foreign_types::{ForeignType, ForeignTypeRef, Opaque};
|
use foreign_types::{ForeignType, ForeignTypeRef, Opaque};
|
||||||
use libc::{c_int, c_long, c_ulong, c_void};
|
use libc::{c_int, c_long, c_ulong, c_void};
|
||||||
use libc::{c_uchar, c_uint};
|
use libc::{c_uchar, c_uint};
|
||||||
use std::any::Any;
|
|
||||||
use std::any::TypeId;
|
use std::any::TypeId;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
@ -351,7 +350,7 @@ lazy_static! {
|
||||||
// Creates a static index for user data of type T
|
// Creates a static index for user data of type T
|
||||||
// Registers a destructor for the data which will be called
|
// Registers a destructor for the data which will be called
|
||||||
// when context is freed
|
// when context is freed
|
||||||
fn get_callback_idx<T: Any + 'static>() -> c_int {
|
fn get_callback_idx<T: 'static>() -> c_int {
|
||||||
*INDEXES
|
*INDEXES
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|
@ -359,7 +358,7 @@ fn get_callback_idx<T: Any + 'static>() -> c_int {
|
||||||
.or_insert_with(|| get_new_idx::<T>())
|
.or_insert_with(|| get_new_idx::<T>())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_ssl_callback_idx<T: Any + 'static>() -> c_int {
|
fn get_ssl_callback_idx<T: 'static>() -> c_int {
|
||||||
*SSL_INDEXES
|
*SSL_INDEXES
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|
@ -490,7 +489,7 @@ impl SslContextBuilder {
|
||||||
pub fn set_verify_callback<F>(&mut self, mode: SslVerifyMode, verify: F)
|
pub fn set_verify_callback<F>(&mut self, mode: SslVerifyMode, verify: F)
|
||||||
where
|
where
|
||||||
// FIXME should take a mutable reference to the store
|
// FIXME should take a mutable reference to the store
|
||||||
F: Fn(bool, &mut X509StoreContextRef) -> bool + Any + 'static + Sync + Send,
|
F: Fn(bool, &mut X509StoreContextRef) -> bool + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let verify = Box::new(verify);
|
let verify = Box::new(verify);
|
||||||
|
|
@ -516,7 +515,7 @@ impl SslContextBuilder {
|
||||||
/// [`SSL_CTX_set_tlsext_servername_callback`]: https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_tlsext_servername_callback.html
|
/// [`SSL_CTX_set_tlsext_servername_callback`]: https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_tlsext_servername_callback.html
|
||||||
pub fn set_servername_callback<F>(&mut self, callback: F)
|
pub fn set_servername_callback<F>(&mut self, callback: F)
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef) -> Result<(), SniError> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef) -> Result<(), SniError> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let callback = Box::new(callback);
|
let callback = Box::new(callback);
|
||||||
|
|
@ -612,7 +611,7 @@ impl SslContextBuilder {
|
||||||
/// [`SSL_CTX_set_tmp_dh_callback`]: https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_tmp_dh.html
|
/// [`SSL_CTX_set_tmp_dh_callback`]: https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_tmp_dh.html
|
||||||
pub fn set_tmp_dh_callback<F>(&mut self, callback: F)
|
pub fn set_tmp_dh_callback<F>(&mut self, callback: F)
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let callback = Box::new(callback);
|
let callback = Box::new(callback);
|
||||||
|
|
@ -650,7 +649,7 @@ impl SslContextBuilder {
|
||||||
#[cfg(any(all(feature = "v101", ossl101), all(feature = "v102", ossl102)))]
|
#[cfg(any(all(feature = "v101", ossl101), all(feature = "v102", ossl102)))]
|
||||||
pub fn set_tmp_ecdh_callback<F>(&mut self, callback: F)
|
pub fn set_tmp_ecdh_callback<F>(&mut self, callback: F)
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let callback = Box::new(callback);
|
let callback = Box::new(callback);
|
||||||
|
|
@ -1022,7 +1021,7 @@ impl SslContextBuilder {
|
||||||
/// [`SSL_CTX_set_tlsext_status_cb`]: https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_tlsext_status_cb.html
|
/// [`SSL_CTX_set_tlsext_status_cb`]: https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_tlsext_status_cb.html
|
||||||
pub fn set_status_callback<F>(&mut self, callback: F) -> Result<(), ErrorStack>
|
pub fn set_status_callback<F>(&mut self, callback: F) -> Result<(), ErrorStack>
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef) -> Result<bool, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef) -> Result<bool, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let callback = Box::new(callback);
|
let callback = Box::new(callback);
|
||||||
|
|
@ -1051,7 +1050,6 @@ impl SslContextBuilder {
|
||||||
pub fn set_psk_callback<F>(&mut self, callback: F)
|
pub fn set_psk_callback<F>(&mut self, callback: F)
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, Option<&[u8]>, &mut [u8], &mut [u8]) -> Result<usize, ErrorStack>
|
F: Fn(&mut SslRef, Option<&[u8]>, &mut [u8], &mut [u8]) -> Result<usize, ErrorStack>
|
||||||
+ Any
|
|
||||||
+ 'static
|
+ 'static
|
||||||
+ Sync
|
+ Sync
|
||||||
+ Send,
|
+ Send,
|
||||||
|
|
@ -1500,7 +1498,7 @@ impl SslRef {
|
||||||
pub fn set_verify_callback<F>(&mut self, mode: SslVerifyMode, verify: F)
|
pub fn set_verify_callback<F>(&mut self, mode: SslVerifyMode, verify: F)
|
||||||
where
|
where
|
||||||
// FIXME should take a mutable reference to the x509 store
|
// FIXME should take a mutable reference to the x509 store
|
||||||
F: Fn(bool, &mut X509StoreContextRef) -> bool + Any + 'static + Sync + Send,
|
F: Fn(bool, &mut X509StoreContextRef) -> bool + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let verify = Box::new(verify);
|
let verify = Box::new(verify);
|
||||||
|
|
@ -1531,7 +1529,7 @@ impl SslRef {
|
||||||
/// [`SSL_set_tmp_dh_callback`]: https://www.openssl.org/docs/man1.0.2/ssl/SSL_set_tmp_dh.html
|
/// [`SSL_set_tmp_dh_callback`]: https://www.openssl.org/docs/man1.0.2/ssl/SSL_set_tmp_dh.html
|
||||||
pub fn set_tmp_dh_callback<F>(&mut self, callback: F)
|
pub fn set_tmp_dh_callback<F>(&mut self, callback: F)
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<Dh, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let callback = Box::new(callback);
|
let callback = Box::new(callback);
|
||||||
|
|
@ -1564,7 +1562,7 @@ impl SslRef {
|
||||||
#[cfg(any(all(feature = "v101", ossl101), all(feature = "v102", ossl102)))]
|
#[cfg(any(all(feature = "v101", ossl101), all(feature = "v102", ossl102)))]
|
||||||
pub fn set_tmp_ecdh_callback<F>(&mut self, callback: F)
|
pub fn set_tmp_ecdh_callback<F>(&mut self, callback: F)
|
||||||
where
|
where
|
||||||
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + Any + 'static + Sync + Send,
|
F: Fn(&mut SslRef, bool, u32) -> Result<EcKey, ErrorStack> + 'static + Sync + Send,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let callback = Box::new(callback);
|
let callback = Box::new(callback);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue