1 #![allow( 2 clippy::missing_safety_doc, 3 clippy::unreadable_literal, 4 clippy::uninlined_format_args, 5 clippy::upper_case_acronyms, 6 dead_code, 7 non_camel_case_types, 8 non_snake_case, 9 non_upper_case_globals, 10 overflowing_literals, 11 unused_imports 12 )] 13 #![doc(html_root_url = "https://docs.rs/openssl-sys/0.9")] 14 #![recursion_limit = "128"] // configure fixed limit across all rust versions 15 16 extern crate libc; 17 pub use libc::*; 18 19 #[cfg(feature = "unstable_boringssl")] 20 extern crate bssl_sys; 21 #[cfg(feature = "unstable_boringssl")] 22 pub use bssl_sys::*; 23 24 #[cfg(all(boringssl, not(feature = "unstable_boringssl")))] 25 #[path = "."] 26 mod boringssl { 27 include!(concat!(env!("OUT_DIR"), "/bindgen.rs")); 28 init()29 pub fn init() { 30 unsafe { 31 CRYPTO_library_init(); 32 } 33 } 34 } 35 #[cfg(all(boringssl, not(feature = "unstable_boringssl")))] 36 pub use boringssl::*; 37 38 #[cfg(openssl)] 39 #[path = "."] 40 mod openssl { 41 use libc::*; 42 43 #[cfg(feature = "bindgen")] 44 include!(concat!(env!("OUT_DIR"), "/bindgen.rs")); 45 46 pub use self::aes::*; 47 pub use self::asn1::*; 48 pub use self::bio::*; 49 pub use self::bn::*; 50 pub use self::cms::*; 51 pub use self::crypto::*; 52 pub use self::dtls1::*; 53 pub use self::ec::*; 54 pub use self::err::*; 55 pub use self::evp::*; 56 #[cfg(not(feature = "bindgen"))] 57 pub use self::handwritten::*; 58 pub use self::obj_mac::*; 59 pub use self::ocsp::*; 60 pub use self::pem::*; 61 pub use self::pkcs7::*; 62 pub use self::rsa::*; 63 pub use self::sha::*; 64 pub use self::srtp::*; 65 pub use self::ssl::*; 66 pub use self::ssl3::*; 67 pub use self::tls1::*; 68 pub use self::types::*; 69 pub use self::x509::*; 70 pub use self::x509_vfy::*; 71 pub use self::x509v3::*; 72 73 #[macro_use] 74 mod macros; 75 76 mod aes; 77 mod asn1; 78 mod bio; 79 mod bn; 80 mod cms; 81 mod crypto; 82 mod dtls1; 83 mod ec; 84 mod err; 85 mod evp; 86 #[cfg(not(feature = "bindgen"))] 87 mod handwritten; 88 mod obj_mac; 89 mod ocsp; 90 mod pem; 91 mod pkcs7; 92 mod rsa; 93 mod sha; 94 mod srtp; 95 mod ssl; 96 mod ssl3; 97 mod tls1; 98 mod types; 99 mod x509; 100 mod x509_vfy; 101 mod x509v3; 102 103 use std::sync::Once; 104 // explicitly initialize to work around https://github.com/openssl/openssl/issues/3505 105 static INIT: Once = Once::new(); 106 107 // FIXME remove 108 pub type PasswordCallback = unsafe extern "C" fn( 109 buf: *mut c_char, 110 size: c_int, 111 rwflag: c_int, 112 user_data: *mut c_void, 113 ) -> c_int; 114 115 #[cfg(ossl110)] init()116 pub fn init() { 117 use std::ptr; 118 119 #[cfg(not(ossl111b))] 120 let init_options = OPENSSL_INIT_LOAD_SSL_STRINGS; 121 #[cfg(ossl111b)] 122 let init_options = OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_NO_ATEXIT; 123 124 INIT.call_once(|| unsafe { 125 OPENSSL_init_ssl(init_options, ptr::null_mut()); 126 }) 127 } 128 129 #[cfg(not(ossl110))] init()130 pub fn init() { 131 use std::io::{self, Write}; 132 use std::mem; 133 use std::process; 134 use std::sync::{Mutex, MutexGuard}; 135 136 static mut MUTEXES: *mut Vec<Mutex<()>> = 0 as *mut Vec<Mutex<()>>; 137 static mut GUARDS: *mut Vec<Option<MutexGuard<'static, ()>>> = 138 0 as *mut Vec<Option<MutexGuard<'static, ()>>>; 139 140 unsafe extern "C" fn locking_function( 141 mode: c_int, 142 n: c_int, 143 _file: *const c_char, 144 _line: c_int, 145 ) { 146 let mutex = &(*MUTEXES)[n as usize]; 147 148 if mode & CRYPTO_LOCK != 0 { 149 (*GUARDS)[n as usize] = Some(mutex.lock().unwrap()); 150 } else { 151 if let None = (*GUARDS)[n as usize].take() { 152 let _ = writeln!( 153 io::stderr(), 154 "BUG: rust-openssl lock {} already unlocked, aborting", 155 n 156 ); 157 process::abort(); 158 } 159 } 160 } 161 162 cfg_if! { 163 if #[cfg(unix)] { 164 fn set_id_callback() { 165 unsafe extern "C" fn thread_id() -> c_ulong { 166 ::libc::pthread_self() as c_ulong 167 } 168 169 unsafe { 170 CRYPTO_set_id_callback__fixed_rust(Some(thread_id)); 171 } 172 } 173 } else { 174 fn set_id_callback() {} 175 } 176 } 177 178 INIT.call_once(|| unsafe { 179 SSL_library_init(); 180 SSL_load_error_strings(); 181 OPENSSL_add_all_algorithms_noconf(); 182 183 let num_locks = CRYPTO_num_locks(); 184 let mut mutexes = Box::new(Vec::new()); 185 for _ in 0..num_locks { 186 mutexes.push(Mutex::new(())); 187 } 188 MUTEXES = mem::transmute(mutexes); 189 let guards: Box<Vec<Option<MutexGuard<()>>>> = 190 Box::new((0..num_locks).map(|_| None).collect()); 191 GUARDS = mem::transmute(guards); 192 193 CRYPTO_set_locking_callback__fixed_rust(Some(locking_function)); 194 set_id_callback(); 195 }) 196 } 197 198 /// Disable explicit initialization of the openssl libs. 199 /// 200 /// This is only appropriate to use if the openssl crate is being consumed by an application 201 /// that will be performing the initialization explicitly. 202 /// 203 /// # Safety 204 /// 205 /// In some versions of openssl, skipping initialization will fall back to the default procedure 206 /// while other will cause difficult to debug errors so care must be taken when calling this. assume_init()207 pub unsafe fn assume_init() { 208 INIT.call_once(|| {}); 209 } 210 } 211 #[cfg(openssl)] 212 pub use openssl::*; 213