| // Copyright 2026 The BoringSSL Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #![deny( |
| missing_docs, |
| unsafe_op_in_unsafe_fn, |
| clippy::missing_safety_doc, |
| clippy::indexing_slicing, |
| clippy::unwrap_used, |
| clippy::panic, |
| clippy::expect_used, |
| clippy::undocumented_unsafe_blocks |
| )] |
| #![allow(private_bounds)] |
| #![cfg_attr(not(any(feature = "std", test)), no_std)] |
| #![recursion_limit = "512"] |
| |
| //! BoringSSL TLS bindings |
| //! |
| //! *WARNING* this crate is still work in progress. |
| |
| extern crate alloc; |
| extern crate core; |
| |
| use core::panic::AssertUnwindSafe; |
| |
| pub mod config; |
| pub mod connection; |
| pub mod context; |
| pub mod credentials; |
| pub mod errors; |
| mod ffi; |
| pub mod io; |
| mod methods; |
| #[macro_use] |
| #[doc(hidden)] |
| mod macros; |
| |
| #[allow(unused)] |
| pub(crate) trait Methods { |
| /// Safety: `ssl` must outlive `'a` and it must be passed in from BoringSSL |
| /// through vtable calls. |
| unsafe extern "C" fn from_ssl<'a>(ssl: *mut bssl_sys::SSL) -> Option<&'a mut Self>; |
| } |
| |
| #[inline] |
| fn abort_on_panic<T>(work: impl FnOnce() -> T) -> T { |
| let assert_unwind_safe = AssertUnwindSafe(work); |
| let call = move || { |
| let AssertUnwindSafe(work) = { assert_unwind_safe }; |
| work() |
| }; |
| #[cfg(feature = "std")] |
| let res = match std::panic::catch_unwind(call) { |
| Ok(res) => res, |
| Err(_) => { |
| eprintln!("panic about to cross language boundary"); |
| std::process::abort() |
| } |
| }; |
| #[cfg(not(feature = "std"))] |
| let res = call(); |
| res |
| } |