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