rustls_mbedcrypto_provider/
lib.rs1#![forbid(unsafe_code, unused_must_use)]
16#![cfg_attr(not(bench), forbid(unstable_features))]
17#![deny(
18 clippy::alloc_instead_of_core,
19 clippy::clone_on_ref_ptr,
20 clippy::std_instead_of_core,
21 clippy::use_self,
22 clippy::upper_case_acronyms,
23 trivial_casts,
24 trivial_numeric_casts,
25 missing_docs,
26 unreachable_pub,
27 unused_import_braces,
28 unused_extern_crates,
29 unused_qualifications
30)]
31#![allow(
42 clippy::too_many_arguments,
43 clippy::new_ret_no_self,
44 clippy::ptr_arg,
45 clippy::single_component_path_imports,
46 clippy::new_without_default,
47 unused_imports
48)]
49#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
51#![cfg_attr(bench, feature(test))]
52extern crate alloc;
56
57#[cfg(bench)]
68#[allow(unused_extern_crates)]
69extern crate test;
70
71#[cfg(feature = "logging")]
73use log;
74
75#[cfg(not(feature = "logging"))]
76#[allow(unused_imports)]
77pub(crate) mod log {
78 macro_rules! ignore_log ( ($($tt:tt)*) => {{}} );
79 pub(crate) use ignore_log as trace;
80 pub(crate) use ignore_log as debug;
81 pub(crate) use ignore_log as warn;
82 pub(crate) use ignore_log as error;
83}
84
85pub mod aead;
87pub(crate) mod agreement;
88pub(crate) mod error;
89#[cfg(feature = "fips")]
90pub(crate) mod fips_utils;
91pub mod hash;
93pub mod hmac;
95pub mod kx;
97
98#[cfg(feature = "self_tests")]
99pub mod self_tests;
100pub mod sign;
102pub mod signature_verify_algo;
104#[cfg(feature = "tls12")]
106pub(crate) mod tls12;
107pub(crate) mod tls13;
109
110use mbedtls::rng::Random;
111use rustls::{
112 crypto::{CryptoProvider, KeyProvider, SecureRandom, WebPkiSupportedAlgorithms},
113 SignatureScheme, SupportedCipherSuite,
114};
115
116pub mod rng {
118
119 #[cfg(not(any(target_env = "sgx", feature = "rdrand")))]
124 pub type MbedRng = mbedtls::rng::CtrDrbg;
125
126 #[cfg(not(any(target_env = "sgx", feature = "rdrand")))]
133 pub fn rng_new() -> Option<MbedRng> {
134 let entropy = alloc::sync::Arc::new(mbedtls::rng::OsEntropy::new());
135 mbedtls::rng::CtrDrbg::new(entropy, None).ok()
136 }
137
138 #[cfg(any(target_env = "sgx", feature = "rdrand"))]
143 pub type MbedRng = mbedtls::rng::Rdrand;
144
145 #[cfg(any(target_env = "sgx", feature = "rdrand"))]
151 pub fn rng_new() -> Option<MbedRng> {
152 Some(mbedtls::rng::Rdrand)
153 }
154}
155
156pub fn mbedtls_crypto_provider() -> CryptoProvider {
160 CryptoProvider {
161 cipher_suites: ALL_CIPHER_SUITES.to_vec(),
162 kx_groups: ALL_KX_GROUPS.to_vec(),
163 signature_verification_algorithms: SUPPORTED_SIG_ALGS,
164 secure_random: &MbedtlsSecureRandom,
165 key_provider: &MbedtlsKeyProvider,
166 }
167}
168
169#[derive(Debug)]
170pub struct MbedtlsSecureRandom;
172
173impl SecureRandom for MbedtlsSecureRandom {
174 fn fill(&self, buf: &mut [u8]) -> Result<(), rustls::crypto::GetRandomFailed> {
175 rng::rng_new()
176 .ok_or(rustls::crypto::GetRandomFailed)?
177 .random(buf)
178 .map_err(|_| rustls::crypto::GetRandomFailed)
179 }
180}
181
182#[derive(Debug)]
183pub struct MbedtlsKeyProvider;
185
186impl KeyProvider for MbedtlsKeyProvider {
187 fn load_private_key(
188 &self,
189 key_der: webpki::types::PrivateKeyDer<'static>,
190 ) -> Result<alloc::sync::Arc<dyn rustls::sign::SigningKey>, rustls::Error> {
191 Ok(alloc::sync::Arc::new(sign::MbedTlsPkSigningKeyWrapper::new(
192 &key_der,
193 rng::rng_new,
194 )?))
195 }
196}
197
198pub static DEFAULT_CIPHER_SUITES: &[SupportedCipherSuite] = ALL_CIPHER_SUITES;
203
204pub static ALL_CIPHER_SUITES: &[SupportedCipherSuite] = &[
206 tls13::TLS13_AES_256_GCM_SHA384,
208 tls13::TLS13_AES_128_GCM_SHA256,
209 tls13::TLS13_CHACHA20_POLY1305_SHA256,
210 #[cfg(feature = "tls12")]
212 tls12::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
213 #[cfg(feature = "tls12")]
214 tls12::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
215 #[cfg(feature = "tls12")]
216 tls12::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
217 #[cfg(feature = "tls12")]
218 tls12::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
219 #[cfg(feature = "tls12")]
220 tls12::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
221 #[cfg(feature = "tls12")]
222 tls12::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
223 #[cfg(feature = "tls12")]
224 tls12::TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
225 #[cfg(feature = "tls12")]
226 tls12::TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
227 #[cfg(feature = "tls12")]
228 tls12::TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
229];
230
231pub mod cipher_suite {
233 #[cfg(feature = "tls12")]
234 pub use super::tls12::{
235 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
236 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
237 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
238 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
239 };
240 pub use super::tls13::{TLS13_AES_128_GCM_SHA256, TLS13_AES_256_GCM_SHA384, TLS13_CHACHA20_POLY1305_SHA256};
241}
242
243pub static SUPPORTED_SIG_ALGS: WebPkiSupportedAlgorithms = WebPkiSupportedAlgorithms {
246 all: &[
247 signature_verify_algo::ECDSA_P256_SHA256,
248 signature_verify_algo::ECDSA_P256_SHA384,
249 signature_verify_algo::ECDSA_P384_SHA256,
250 signature_verify_algo::ECDSA_P384_SHA384,
251 signature_verify_algo::RSA_PSS_SHA256,
252 signature_verify_algo::RSA_PSS_SHA384,
253 signature_verify_algo::RSA_PSS_SHA512,
254 signature_verify_algo::RSA_PKCS1_SHA256,
255 signature_verify_algo::RSA_PKCS1_SHA384,
256 signature_verify_algo::RSA_PKCS1_SHA512,
257 ],
258 mapping: &[
259 (
260 SignatureScheme::ECDSA_NISTP384_SHA384,
261 &[
262 signature_verify_algo::ECDSA_P384_SHA384,
263 signature_verify_algo::ECDSA_P256_SHA384,
264 ],
265 ),
266 (
267 SignatureScheme::ECDSA_NISTP256_SHA256,
268 &[
269 signature_verify_algo::ECDSA_P256_SHA256,
270 signature_verify_algo::ECDSA_P384_SHA256,
271 ],
272 ),
273 (SignatureScheme::RSA_PSS_SHA512, &[signature_verify_algo::RSA_PSS_SHA512]),
274 (SignatureScheme::RSA_PSS_SHA384, &[signature_verify_algo::RSA_PSS_SHA384]),
275 (SignatureScheme::RSA_PSS_SHA256, &[signature_verify_algo::RSA_PSS_SHA256]),
276 (SignatureScheme::RSA_PKCS1_SHA512, &[signature_verify_algo::RSA_PKCS1_SHA512]),
277 (SignatureScheme::RSA_PKCS1_SHA384, &[signature_verify_algo::RSA_PKCS1_SHA384]),
278 (SignatureScheme::RSA_PKCS1_SHA256, &[signature_verify_algo::RSA_PKCS1_SHA256]),
279 ],
280};
281
282pub mod kx_group {
286 pub use super::kx::FFDHE2048;
287 pub use super::kx::FFDHE3072;
288 pub use super::kx::FFDHE4096;
289 pub use super::kx::FFDHE6144;
290 pub use super::kx::FFDHE8192;
291
292 pub use super::kx::SECP256R1;
293 pub use super::kx::SECP384R1;
294 pub use super::kx::SECP521R1;
295 pub use super::kx::X25519;
296}
297
298pub use kx::ALL_KX_GROUPS;