192f3ab15Sopenharmony_ci#![allow(
292f3ab15Sopenharmony_ci    clippy::missing_safety_doc,
392f3ab15Sopenharmony_ci    dead_code,
492f3ab15Sopenharmony_ci    non_camel_case_types,
592f3ab15Sopenharmony_ci    non_snake_case,
692f3ab15Sopenharmony_ci    non_upper_case_globals,
792f3ab15Sopenharmony_ci    unused_imports
892f3ab15Sopenharmony_ci)]
992f3ab15Sopenharmony_ci#![cfg_attr(feature = "unstable_boringssl", allow(ambiguous_glob_reexports))]
1092f3ab15Sopenharmony_ci#![doc(html_root_url = "https://docs.rs/openssl-sys/0.9")]
1192f3ab15Sopenharmony_ci#![recursion_limit = "128"] // configure fixed limit across all rust versions
1292f3ab15Sopenharmony_ci
1392f3ab15Sopenharmony_ciextern crate libc;
1492f3ab15Sopenharmony_cipub use libc::*;
1592f3ab15Sopenharmony_ci
1692f3ab15Sopenharmony_ci#[cfg(feature = "unstable_boringssl")]
1792f3ab15Sopenharmony_ciextern crate bssl_sys;
1892f3ab15Sopenharmony_ci#[cfg(feature = "unstable_boringssl")]
1992f3ab15Sopenharmony_cipub use bssl_sys::*;
2092f3ab15Sopenharmony_ci
2192f3ab15Sopenharmony_ci#[cfg(all(boringssl, not(feature = "unstable_boringssl")))]
2292f3ab15Sopenharmony_ci#[path = "."]
2392f3ab15Sopenharmony_cimod boringssl {
2492f3ab15Sopenharmony_ci    include!(concat!(env!("OUT_DIR"), "/bindgen.rs"));
2592f3ab15Sopenharmony_ci
2692f3ab15Sopenharmony_ci    pub fn init() {
2792f3ab15Sopenharmony_ci        unsafe {
2892f3ab15Sopenharmony_ci            CRYPTO_library_init();
2992f3ab15Sopenharmony_ci        }
3092f3ab15Sopenharmony_ci    }
3192f3ab15Sopenharmony_ci}
3292f3ab15Sopenharmony_ci#[cfg(all(boringssl, not(feature = "unstable_boringssl")))]
3392f3ab15Sopenharmony_cipub use boringssl::*;
3492f3ab15Sopenharmony_ci
3592f3ab15Sopenharmony_ci#[cfg(openssl)]
3692f3ab15Sopenharmony_ci#[path = "."]
3792f3ab15Sopenharmony_cimod openssl {
3892f3ab15Sopenharmony_ci    use libc::*;
3992f3ab15Sopenharmony_ci
4092f3ab15Sopenharmony_ci    #[cfg(feature = "bindgen")]
4192f3ab15Sopenharmony_ci    include!(concat!(env!("OUT_DIR"), "/bindgen.rs"));
4292f3ab15Sopenharmony_ci
4392f3ab15Sopenharmony_ci    pub use self::aes::*;
4492f3ab15Sopenharmony_ci    pub use self::asn1::*;
4592f3ab15Sopenharmony_ci    pub use self::bio::*;
4692f3ab15Sopenharmony_ci    pub use self::bn::*;
4792f3ab15Sopenharmony_ci    pub use self::cms::*;
4892f3ab15Sopenharmony_ci    pub use self::crypto::*;
4992f3ab15Sopenharmony_ci    pub use self::dtls1::*;
5092f3ab15Sopenharmony_ci    pub use self::ec::*;
5192f3ab15Sopenharmony_ci    pub use self::err::*;
5292f3ab15Sopenharmony_ci    pub use self::evp::*;
5392f3ab15Sopenharmony_ci    #[cfg(not(feature = "bindgen"))]
5492f3ab15Sopenharmony_ci    pub use self::handwritten::*;
5592f3ab15Sopenharmony_ci    pub use self::obj_mac::*;
5692f3ab15Sopenharmony_ci    pub use self::ocsp::*;
5792f3ab15Sopenharmony_ci    pub use self::pem::*;
5892f3ab15Sopenharmony_ci    pub use self::pkcs7::*;
5992f3ab15Sopenharmony_ci    pub use self::rsa::*;
6092f3ab15Sopenharmony_ci    pub use self::sha::*;
6192f3ab15Sopenharmony_ci    pub use self::srtp::*;
6292f3ab15Sopenharmony_ci    pub use self::ssl::*;
6392f3ab15Sopenharmony_ci    pub use self::ssl3::*;
6492f3ab15Sopenharmony_ci    pub use self::tls1::*;
6592f3ab15Sopenharmony_ci    pub use self::types::*;
6692f3ab15Sopenharmony_ci    pub use self::x509::*;
6792f3ab15Sopenharmony_ci    pub use self::x509_vfy::*;
6892f3ab15Sopenharmony_ci    pub use self::x509v3::*;
6992f3ab15Sopenharmony_ci
7092f3ab15Sopenharmony_ci    #[macro_use]
7192f3ab15Sopenharmony_ci    mod macros;
7292f3ab15Sopenharmony_ci
7392f3ab15Sopenharmony_ci    mod aes;
7492f3ab15Sopenharmony_ci    mod asn1;
7592f3ab15Sopenharmony_ci    mod bio;
7692f3ab15Sopenharmony_ci    mod bn;
7792f3ab15Sopenharmony_ci    mod cms;
7892f3ab15Sopenharmony_ci    mod crypto;
7992f3ab15Sopenharmony_ci    mod dtls1;
8092f3ab15Sopenharmony_ci    mod ec;
8192f3ab15Sopenharmony_ci    mod err;
8292f3ab15Sopenharmony_ci    mod evp;
8392f3ab15Sopenharmony_ci    #[cfg(not(feature = "bindgen"))]
8492f3ab15Sopenharmony_ci    mod handwritten;
8592f3ab15Sopenharmony_ci    mod obj_mac;
8692f3ab15Sopenharmony_ci    mod ocsp;
8792f3ab15Sopenharmony_ci    mod pem;
8892f3ab15Sopenharmony_ci    mod pkcs7;
8992f3ab15Sopenharmony_ci    mod rsa;
9092f3ab15Sopenharmony_ci    mod sha;
9192f3ab15Sopenharmony_ci    mod srtp;
9292f3ab15Sopenharmony_ci    mod ssl;
9392f3ab15Sopenharmony_ci    mod ssl3;
9492f3ab15Sopenharmony_ci    mod tls1;
9592f3ab15Sopenharmony_ci    mod types;
9692f3ab15Sopenharmony_ci    mod x509;
9792f3ab15Sopenharmony_ci    mod x509_vfy;
9892f3ab15Sopenharmony_ci    mod x509v3;
9992f3ab15Sopenharmony_ci
10092f3ab15Sopenharmony_ci    use std::sync::Once;
10192f3ab15Sopenharmony_ci    // explicitly initialize to work around https://github.com/openssl/openssl/issues/3505
10292f3ab15Sopenharmony_ci    static INIT: Once = Once::new();
10392f3ab15Sopenharmony_ci
10492f3ab15Sopenharmony_ci    // FIXME remove
10592f3ab15Sopenharmony_ci    pub type PasswordCallback = unsafe extern "C" fn(
10692f3ab15Sopenharmony_ci        buf: *mut c_char,
10792f3ab15Sopenharmony_ci        size: c_int,
10892f3ab15Sopenharmony_ci        rwflag: c_int,
10992f3ab15Sopenharmony_ci        user_data: *mut c_void,
11092f3ab15Sopenharmony_ci    ) -> c_int;
11192f3ab15Sopenharmony_ci
11292f3ab15Sopenharmony_ci    #[cfg(ossl110)]
11392f3ab15Sopenharmony_ci    pub fn init() {
11492f3ab15Sopenharmony_ci        use std::ptr;
11592f3ab15Sopenharmony_ci
11692f3ab15Sopenharmony_ci        #[cfg(not(ossl111b))]
11792f3ab15Sopenharmony_ci        let init_options = OPENSSL_INIT_LOAD_SSL_STRINGS;
11892f3ab15Sopenharmony_ci        #[cfg(ossl111b)]
11992f3ab15Sopenharmony_ci        let init_options = OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_NO_ATEXIT;
12092f3ab15Sopenharmony_ci
12192f3ab15Sopenharmony_ci        INIT.call_once(|| unsafe {
12292f3ab15Sopenharmony_ci            OPENSSL_init_ssl(init_options, ptr::null_mut());
12392f3ab15Sopenharmony_ci        })
12492f3ab15Sopenharmony_ci    }
12592f3ab15Sopenharmony_ci
12692f3ab15Sopenharmony_ci    #[cfg(not(ossl110))]
12792f3ab15Sopenharmony_ci    pub fn init() {
12892f3ab15Sopenharmony_ci        use std::io::{self, Write};
12992f3ab15Sopenharmony_ci        use std::mem;
13092f3ab15Sopenharmony_ci        use std::process;
13192f3ab15Sopenharmony_ci        use std::sync::{Mutex, MutexGuard};
13292f3ab15Sopenharmony_ci
13392f3ab15Sopenharmony_ci        static mut MUTEXES: *mut Vec<Mutex<()>> = 0 as *mut Vec<Mutex<()>>;
13492f3ab15Sopenharmony_ci        static mut GUARDS: *mut Vec<Option<MutexGuard<'static, ()>>> =
13592f3ab15Sopenharmony_ci            0 as *mut Vec<Option<MutexGuard<'static, ()>>>;
13692f3ab15Sopenharmony_ci
13792f3ab15Sopenharmony_ci        unsafe extern "C" fn locking_function(
13892f3ab15Sopenharmony_ci            mode: c_int,
13992f3ab15Sopenharmony_ci            n: c_int,
14092f3ab15Sopenharmony_ci            _file: *const c_char,
14192f3ab15Sopenharmony_ci            _line: c_int,
14292f3ab15Sopenharmony_ci        ) {
14392f3ab15Sopenharmony_ci            let mutex = &(*MUTEXES)[n as usize];
14492f3ab15Sopenharmony_ci
14592f3ab15Sopenharmony_ci            if mode & CRYPTO_LOCK != 0 {
14692f3ab15Sopenharmony_ci                (*GUARDS)[n as usize] = Some(mutex.lock().unwrap());
14792f3ab15Sopenharmony_ci            } else {
14892f3ab15Sopenharmony_ci                if let None = (*GUARDS)[n as usize].take() {
14992f3ab15Sopenharmony_ci                    let _ = writeln!(
15092f3ab15Sopenharmony_ci                        io::stderr(),
15192f3ab15Sopenharmony_ci                        "BUG: rust-openssl lock {} already unlocked, aborting",
15292f3ab15Sopenharmony_ci                        n
15392f3ab15Sopenharmony_ci                    );
15492f3ab15Sopenharmony_ci                    process::abort();
15592f3ab15Sopenharmony_ci                }
15692f3ab15Sopenharmony_ci            }
15792f3ab15Sopenharmony_ci        }
15892f3ab15Sopenharmony_ci
15992f3ab15Sopenharmony_ci        cfg_if! {
16092f3ab15Sopenharmony_ci            if #[cfg(unix)] {
16192f3ab15Sopenharmony_ci                fn set_id_callback() {
16292f3ab15Sopenharmony_ci                    unsafe extern "C" fn thread_id() -> c_ulong {
16392f3ab15Sopenharmony_ci                        ::libc::pthread_self() as c_ulong
16492f3ab15Sopenharmony_ci                    }
16592f3ab15Sopenharmony_ci
16692f3ab15Sopenharmony_ci                    unsafe {
16792f3ab15Sopenharmony_ci                        CRYPTO_set_id_callback__fixed_rust(Some(thread_id));
16892f3ab15Sopenharmony_ci                    }
16992f3ab15Sopenharmony_ci                }
17092f3ab15Sopenharmony_ci            } else {
17192f3ab15Sopenharmony_ci                fn set_id_callback() {}
17292f3ab15Sopenharmony_ci            }
17392f3ab15Sopenharmony_ci        }
17492f3ab15Sopenharmony_ci
17592f3ab15Sopenharmony_ci        INIT.call_once(|| unsafe {
17692f3ab15Sopenharmony_ci            SSL_library_init();
17792f3ab15Sopenharmony_ci            SSL_load_error_strings();
17892f3ab15Sopenharmony_ci            OPENSSL_add_all_algorithms_noconf();
17992f3ab15Sopenharmony_ci
18092f3ab15Sopenharmony_ci            let num_locks = CRYPTO_num_locks();
18192f3ab15Sopenharmony_ci            let mut mutexes = Box::new(Vec::new());
18292f3ab15Sopenharmony_ci            for _ in 0..num_locks {
18392f3ab15Sopenharmony_ci                mutexes.push(Mutex::new(()));
18492f3ab15Sopenharmony_ci            }
18592f3ab15Sopenharmony_ci            MUTEXES = mem::transmute(mutexes);
18692f3ab15Sopenharmony_ci            let guards: Box<Vec<Option<MutexGuard<()>>>> =
18792f3ab15Sopenharmony_ci                Box::new((0..num_locks).map(|_| None).collect());
18892f3ab15Sopenharmony_ci            GUARDS = mem::transmute(guards);
18992f3ab15Sopenharmony_ci
19092f3ab15Sopenharmony_ci            CRYPTO_set_locking_callback__fixed_rust(Some(locking_function));
19192f3ab15Sopenharmony_ci            set_id_callback();
19292f3ab15Sopenharmony_ci        })
19392f3ab15Sopenharmony_ci    }
19492f3ab15Sopenharmony_ci
19592f3ab15Sopenharmony_ci    /// Disable explicit initialization of the openssl libs.
19692f3ab15Sopenharmony_ci    ///
19792f3ab15Sopenharmony_ci    /// This is only appropriate to use if the openssl crate is being consumed by an application
19892f3ab15Sopenharmony_ci    /// that will be performing the initialization explicitly.
19992f3ab15Sopenharmony_ci    ///
20092f3ab15Sopenharmony_ci    /// # Safety
20192f3ab15Sopenharmony_ci    ///
20292f3ab15Sopenharmony_ci    /// In some versions of openssl, skipping initialization will fall back to the default procedure
20392f3ab15Sopenharmony_ci    /// while other will cause difficult to debug errors so care must be taken when calling this.
20492f3ab15Sopenharmony_ci    pub unsafe fn assume_init() {
20592f3ab15Sopenharmony_ci        INIT.call_once(|| {});
20692f3ab15Sopenharmony_ci    }
20792f3ab15Sopenharmony_ci}
20892f3ab15Sopenharmony_ci#[cfg(openssl)]
20992f3ab15Sopenharmony_cipub use openssl::*;
210