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