1*4185b066SAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*4185b066SAndroid Build Coastguard Worker //
3*4185b066SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*4185b066SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*4185b066SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*4185b066SAndroid Build Coastguard Worker //
7*4185b066SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*4185b066SAndroid Build Coastguard Worker //
9*4185b066SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*4185b066SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*4185b066SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*4185b066SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*4185b066SAndroid Build Coastguard Worker // limitations under the License.
14*4185b066SAndroid Build Coastguard Worker //
15*4185b066SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
16*4185b066SAndroid Build Coastguard Worker
17*4185b066SAndroid Build Coastguard Worker //! This crate provides the default implementations for the Authgraph traits using
18*4185b066SAndroid Build Coastguard Worker //! BoringSSL via the `openssl` crate.
19*4185b066SAndroid Build Coastguard Worker
20*4185b066SAndroid Build Coastguard Worker extern crate alloc; // Needed for use of `ag_err!` from `authgraph_core`
21*4185b066SAndroid Build Coastguard Worker
22*4185b066SAndroid Build Coastguard Worker use authgraph_core::traits;
23*4185b066SAndroid Build Coastguard Worker
24*4185b066SAndroid Build Coastguard Worker /// Macro to auto-generate error mapping around invocations of `openssl` methods.
25*4185b066SAndroid Build Coastguard Worker /// An invocation like:
26*4185b066SAndroid Build Coastguard Worker ///
27*4185b066SAndroid Build Coastguard Worker /// ```ignore
28*4185b066SAndroid Build Coastguard Worker /// let x = ossl!(y.func(a, b))?;
29*4185b066SAndroid Build Coastguard Worker /// ```
30*4185b066SAndroid Build Coastguard Worker ///
31*4185b066SAndroid Build Coastguard Worker /// will map to:
32*4185b066SAndroid Build Coastguard Worker ///
33*4185b066SAndroid Build Coastguard Worker /// ```ignore
34*4185b066SAndroid Build Coastguard Worker /// let x = y.func(a, b).map_err(ag_err!(Internal, "failed to perform: y.func(a, b)"))?;
35*4185b066SAndroid Build Coastguard Worker /// ```
36*4185b066SAndroid Build Coastguard Worker ///
37*4185b066SAndroid Build Coastguard Worker /// Requires local `use authgraph_core::{Error, ag_err}`.
38*4185b066SAndroid Build Coastguard Worker #[macro_export]
39*4185b066SAndroid Build Coastguard Worker macro_rules! ossl {
40*4185b066SAndroid Build Coastguard Worker { $e:expr } => {
41*4185b066SAndroid Build Coastguard Worker $e.map_err(|err| authgraph_core::error::Error(
42*4185b066SAndroid Build Coastguard Worker authgraph_wire::ErrorCode::InternalError,
43*4185b066SAndroid Build Coastguard Worker format!(concat!("failed to perform: ", stringify!($e), ": {:?}"), err)
44*4185b066SAndroid Build Coastguard Worker ))
45*4185b066SAndroid Build Coastguard Worker }
46*4185b066SAndroid Build Coastguard Worker }
47*4185b066SAndroid Build Coastguard Worker
48*4185b066SAndroid Build Coastguard Worker mod aes;
49*4185b066SAndroid Build Coastguard Worker pub use aes::BoringAes;
50*4185b066SAndroid Build Coastguard Worker pub mod ec;
51*4185b066SAndroid Build Coastguard Worker pub use ec::BoringEcDh;
52*4185b066SAndroid Build Coastguard Worker pub use ec::BoringEcDsa;
53*4185b066SAndroid Build Coastguard Worker mod hmac;
54*4185b066SAndroid Build Coastguard Worker pub use hmac::{BoringHkdf, BoringHmac, BoringSha256};
55*4185b066SAndroid Build Coastguard Worker mod rng;
56*4185b066SAndroid Build Coastguard Worker pub use rng::BoringRng;
57*4185b066SAndroid Build Coastguard Worker pub mod test_device;
58*4185b066SAndroid Build Coastguard Worker
59*4185b066SAndroid Build Coastguard Worker #[cfg(test)]
60*4185b066SAndroid Build Coastguard Worker mod tests;
61*4185b066SAndroid Build Coastguard Worker
62*4185b066SAndroid Build Coastguard Worker /// Return a populated [`traits::CryptoTraitImpl`] structure that uses BoringSSL implementations for
63*4185b066SAndroid Build Coastguard Worker /// cryptographic traits.
crypto_trait_impls() -> traits::CryptoTraitImpl64*4185b066SAndroid Build Coastguard Worker pub fn crypto_trait_impls() -> traits::CryptoTraitImpl {
65*4185b066SAndroid Build Coastguard Worker traits::CryptoTraitImpl {
66*4185b066SAndroid Build Coastguard Worker aes_gcm: Box::new(BoringAes),
67*4185b066SAndroid Build Coastguard Worker ecdh: Box::new(BoringEcDh),
68*4185b066SAndroid Build Coastguard Worker ecdsa: Box::new(BoringEcDsa),
69*4185b066SAndroid Build Coastguard Worker hmac: Box::new(BoringHmac),
70*4185b066SAndroid Build Coastguard Worker hkdf: Box::new(BoringHkdf),
71*4185b066SAndroid Build Coastguard Worker sha256: Box::new(BoringSha256),
72*4185b066SAndroid Build Coastguard Worker rng: Box::new(BoringRng),
73*4185b066SAndroid Build Coastguard Worker }
74*4185b066SAndroid Build Coastguard Worker }
75