#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
use std::sync::Arc;
#[cfg(feature = "dbg")]
use rustls::crypto::CryptoProvider;
#[cfg(feature = "dbg")]
use rustls::pki_types::CertificateDer;
use rustls::{client::WantsClientCert, ClientConfig, ConfigBuilder, WantsVerifier};
mod verification;
pub use verification::Verifier;
#[cfg(any(all(doc, docsrs), target_os = "android"))]
#[cfg_attr(docsrs, doc(cfg(target_os = "android")))]
pub mod android;
#[cfg(any(test, feature = "ffi-testing"))]
mod tests;
#[cfg(feature = "ffi-testing")]
#[cfg_attr(feature = "ffi-testing", allow(unused_imports))]
pub use tests::ffi::*;
#[cfg(feature = "dbg")]
pub fn verifier_for_dbg(
root: CertificateDer<'static>,
crypto_provider: Arc<CryptoProvider>,
) -> Arc<dyn rustls::client::danger::ServerCertVerifier> {
Arc::new(Verifier::new_with_fake_root(root, crypto_provider))
}
pub trait BuilderVerifierExt {
fn with_platform_verifier(
self,
) -> Result<ConfigBuilder<ClientConfig, WantsClientCert>, rustls::Error>;
}
impl BuilderVerifierExt for ConfigBuilder<ClientConfig, WantsVerifier> {
fn with_platform_verifier(
self,
) -> Result<ConfigBuilder<ClientConfig, WantsClientCert>, rustls::Error> {
let verifier = Verifier::new(self.crypto_provider().clone())?;
Ok(self
.dangerous()
.with_custom_certificate_verifier(Arc::new(verifier)))
}
}
pub trait ConfigVerifierExt {
fn with_platform_verifier() -> Result<ClientConfig, rustls::Error>;
}
impl ConfigVerifierExt for ClientConfig {
fn with_platform_verifier() -> Result<ClientConfig, rustls::Error> {
Ok(ClientConfig::builder()
.with_platform_verifier()?
.with_no_client_auth())
}
}