#![forbid(unsafe_code, unused_must_use)]
#![cfg_attr(not(bench), forbid(unstable_features))]
#![deny(
clippy::alloc_instead_of_core,
clippy::clone_on_ref_ptr,
clippy::std_instead_of_core,
clippy::use_self,
clippy::upper_case_acronyms,
trivial_casts,
trivial_numeric_casts,
missing_docs,
unreachable_pub,
unused_import_braces,
unused_extern_crates,
unused_qualifications
)]
#![allow(
clippy::too_many_arguments,
clippy::new_ret_no_self,
clippy::ptr_arg,
clippy::single_component_path_imports,
clippy::new_without_default
)]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
#![cfg_attr(bench, feature(test))]
extern crate alloc;
#[cfg(bench)]
#[allow(unused_extern_crates)]
extern crate test;
#[cfg(feature = "logging")]
use log;
#[cfg(not(feature = "logging"))]
#[allow(unused_imports)]
pub(crate) mod log {
macro_rules! ignore_log ( ($($tt:tt)*) => {{}} );
pub(crate) use ignore_log as trace;
pub(crate) use ignore_log as debug;
pub(crate) use ignore_log as warn;
pub(crate) use ignore_log as error;
}
pub mod aead;
pub(crate) mod agreement;
pub(crate) mod error;
pub mod hash;
pub mod hmac;
pub(crate) mod kx;
pub mod sign;
pub mod signature_verify_algo;
#[cfg(feature = "tls12")]
pub(crate) mod tls12;
pub(crate) mod tls13;
use mbedtls::rng::Random;
use rustls::{
crypto::{CryptoProvider, KeyProvider, SecureRandom, WebPkiSupportedAlgorithms},
SignatureScheme, SupportedCipherSuite,
};
pub mod rng {
#[cfg(not(any(target_env = "sgx", feature = "rdrand")))]
use mbedtls::rng::{CtrDrbg, OsEntropy};
#[cfg(any(target_env = "sgx", feature = "rdrand"))]
use mbedtls::rng::Rdrand;
#[cfg(not(any(target_env = "sgx", feature = "rdrand")))]
pub fn rng_new() -> Option<CtrDrbg> {
let entropy = alloc::sync::Arc::new(OsEntropy::new());
CtrDrbg::new(entropy, None).ok()
}
#[cfg(any(target_env = "sgx", feature = "rdrand"))]
pub const fn rng_new() -> Option<Rdrand> {
Some(Rdrand)
}
}
pub fn mbedtls_crypto_provider() -> CryptoProvider {
CryptoProvider {
cipher_suites: ALL_CIPHER_SUITES.to_vec(),
kx_groups: ALL_KX_GROUPS.to_vec(),
signature_verification_algorithms: SUPPORTED_SIG_ALGS,
secure_random: &MbedtlsSecureRandom,
key_provider: &MbedtlsKeyProvider,
}
}
#[derive(Debug)]
pub struct MbedtlsSecureRandom;
impl SecureRandom for MbedtlsSecureRandom {
fn fill(&self, buf: &mut [u8]) -> Result<(), rustls::crypto::GetRandomFailed> {
rng::rng_new()
.ok_or(rustls::crypto::GetRandomFailed)?
.random(buf)
.map_err(|_| rustls::crypto::GetRandomFailed)
}
}
#[derive(Debug)]
pub struct MbedtlsKeyProvider;
impl KeyProvider for MbedtlsKeyProvider {
fn load_private_key(
&self,
key_der: webpki::types::PrivateKeyDer<'static>,
) -> Result<alloc::sync::Arc<dyn rustls::sign::SigningKey>, rustls::Error> {
Ok(alloc::sync::Arc::new(sign::MbedTlsPkSigningKey::new(&key_der)?))
}
}
pub static DEFAULT_CIPHER_SUITES: &[SupportedCipherSuite] = ALL_CIPHER_SUITES;
pub static ALL_CIPHER_SUITES: &[SupportedCipherSuite] = &[
tls13::TLS13_AES_256_GCM_SHA384,
tls13::TLS13_AES_128_GCM_SHA256,
tls13::TLS13_CHACHA20_POLY1305_SHA256,
#[cfg(feature = "tls12")]
tls12::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
#[cfg(feature = "tls12")]
tls12::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
#[cfg(feature = "tls12")]
tls12::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
#[cfg(feature = "tls12")]
tls12::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
#[cfg(feature = "tls12")]
tls12::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
#[cfg(feature = "tls12")]
tls12::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
];
pub mod cipher_suite {
#[cfg(feature = "tls12")]
pub use super::tls12::{
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
};
pub use super::tls13::{TLS13_AES_128_GCM_SHA256, TLS13_AES_256_GCM_SHA384, TLS13_CHACHA20_POLY1305_SHA256};
}
pub static SUPPORTED_SIG_ALGS: WebPkiSupportedAlgorithms = WebPkiSupportedAlgorithms {
all: &[
signature_verify_algo::ECDSA_P256_SHA256,
signature_verify_algo::ECDSA_P256_SHA384,
signature_verify_algo::ECDSA_P384_SHA256,
signature_verify_algo::ECDSA_P384_SHA384,
signature_verify_algo::RSA_PSS_SHA256,
signature_verify_algo::RSA_PSS_SHA384,
signature_verify_algo::RSA_PSS_SHA512,
signature_verify_algo::RSA_PKCS1_SHA256,
signature_verify_algo::RSA_PKCS1_SHA384,
signature_verify_algo::RSA_PKCS1_SHA512,
],
mapping: &[
(
SignatureScheme::ECDSA_NISTP384_SHA384,
&[
signature_verify_algo::ECDSA_P384_SHA384,
signature_verify_algo::ECDSA_P256_SHA384,
],
),
(
SignatureScheme::ECDSA_NISTP256_SHA256,
&[
signature_verify_algo::ECDSA_P256_SHA256,
signature_verify_algo::ECDSA_P384_SHA256,
],
),
(SignatureScheme::RSA_PSS_SHA512, &[signature_verify_algo::RSA_PSS_SHA512]),
(SignatureScheme::RSA_PSS_SHA384, &[signature_verify_algo::RSA_PSS_SHA384]),
(SignatureScheme::RSA_PSS_SHA256, &[signature_verify_algo::RSA_PSS_SHA256]),
(SignatureScheme::RSA_PKCS1_SHA512, &[signature_verify_algo::RSA_PKCS1_SHA512]),
(SignatureScheme::RSA_PKCS1_SHA384, &[signature_verify_algo::RSA_PKCS1_SHA384]),
(SignatureScheme::RSA_PKCS1_SHA256, &[signature_verify_algo::RSA_PKCS1_SHA256]),
],
};
pub mod kx_group {
pub use super::kx::SECP256R1;
pub use super::kx::SECP384R1;
pub use super::kx::SECP521R1;
pub use super::kx::X25519;
}
pub use kx::ALL_KX_GROUPS;