use std::sync::Arc;
use rustls::{ClientConfig, ServerConfig};
use crate::binding::BindingPolicy;
use crate::error::{DigTlsError, Result};
use crate::identity::PeerId;
use crate::node_cert::NodeCert;
use crate::verify::{CapturedBlsPub, CapturedPeerId, DigClientCertVerifier, DigServerCertVerifier};
pub struct ServerTls {
pub config: Arc<ServerConfig>,
pub captured_peer_id: CapturedPeerId,
pub captured_bls: CapturedBlsPub,
}
pub struct ClientTls {
pub config: Arc<ClientConfig>,
pub captured_peer_id: CapturedPeerId,
pub captured_bls: CapturedBlsPub,
}
fn ring_provider() -> Arc<rustls::crypto::CryptoProvider> {
Arc::new(rustls::crypto::ring::default_provider())
}
pub fn server_config(node: &NodeCert, binding_policy: BindingPolicy) -> Result<ServerTls> {
let captured_peer_id = CapturedPeerId::default();
let captured_bls = CapturedBlsPub::default();
let verifier = Arc::new(DigClientCertVerifier::new(
None,
captured_peer_id.clone(),
binding_policy,
captured_bls.clone(),
));
let config = ServerConfig::builder_with_provider(ring_provider())
.with_safe_default_protocol_versions()
.map_err(|e| DigTlsError::RustlsConfig(format!("protocol versions: {e}")))?
.with_client_cert_verifier(verifier)
.with_single_cert(node.rustls_cert_chain(), node.rustls_private_key())
.map_err(|e| DigTlsError::RustlsConfig(format!("server single cert: {e}")))?;
Ok(ServerTls {
config: Arc::new(config),
captured_peer_id,
captured_bls,
})
}
pub fn client_config(
node: &NodeCert,
expected: Option<PeerId>,
binding_policy: BindingPolicy,
) -> Result<ClientTls> {
let captured_peer_id = CapturedPeerId::default();
let captured_bls = CapturedBlsPub::default();
let verifier = Arc::new(DigServerCertVerifier::new(
expected,
captured_peer_id.clone(),
binding_policy,
captured_bls.clone(),
));
let config = ClientConfig::builder_with_provider(ring_provider())
.with_safe_default_protocol_versions()
.map_err(|e| DigTlsError::RustlsConfig(format!("protocol versions: {e}")))?
.dangerous()
.with_custom_certificate_verifier(verifier)
.with_client_auth_cert(node.rustls_cert_chain(), node.rustls_private_key())
.map_err(|e| DigTlsError::RustlsConfig(format!("client auth cert: {e}")))?;
Ok(ClientTls {
config: Arc::new(config),
captured_peer_id,
captured_bls,
})
}