1use std::sync::Arc;
10
11use rustls::{ClientConfig, ServerConfig};
12
13use crate::binding::BindingPolicy;
14use crate::error::{DigTlsError, Result};
15use crate::identity::PeerId;
16use crate::node_cert::NodeCert;
17use crate::verify::{CapturedBlsPub, CapturedPeerId, DigClientCertVerifier, DigServerCertVerifier};
18
19pub struct ServerTls {
22 pub config: Arc<ServerConfig>,
24 pub captured_peer_id: CapturedPeerId,
26 pub captured_bls: CapturedBlsPub,
28}
29
30pub struct ClientTls {
33 pub config: Arc<ClientConfig>,
35 pub captured_peer_id: CapturedPeerId,
37 pub captured_bls: CapturedBlsPub,
39}
40
41fn ring_provider() -> Arc<rustls::crypto::CryptoProvider> {
42 Arc::new(rustls::crypto::ring::default_provider())
43}
44
45pub fn server_config(node: &NodeCert, binding_policy: BindingPolicy) -> Result<ServerTls> {
50 let captured_peer_id = CapturedPeerId::default();
51 let captured_bls = CapturedBlsPub::default();
52 let verifier = Arc::new(DigClientCertVerifier::new(
53 None,
54 captured_peer_id.clone(),
55 binding_policy,
56 captured_bls.clone(),
57 ));
58 let config = ServerConfig::builder_with_provider(ring_provider())
59 .with_safe_default_protocol_versions()
60 .map_err(|e| DigTlsError::RustlsConfig(format!("protocol versions: {e}")))?
61 .with_client_cert_verifier(verifier)
62 .with_single_cert(node.rustls_cert_chain(), node.rustls_private_key())
63 .map_err(|e| DigTlsError::RustlsConfig(format!("server single cert: {e}")))?;
64 Ok(ServerTls {
65 config: Arc::new(config),
66 captured_peer_id,
67 captured_bls,
68 })
69}
70
71pub fn client_config(
76 node: &NodeCert,
77 expected: Option<PeerId>,
78 binding_policy: BindingPolicy,
79) -> Result<ClientTls> {
80 let captured_peer_id = CapturedPeerId::default();
81 let captured_bls = CapturedBlsPub::default();
82 let verifier = Arc::new(DigServerCertVerifier::new(
83 expected,
84 captured_peer_id.clone(),
85 binding_policy,
86 captured_bls.clone(),
87 ));
88 let config = ClientConfig::builder_with_provider(ring_provider())
89 .with_safe_default_protocol_versions()
90 .map_err(|e| DigTlsError::RustlsConfig(format!("protocol versions: {e}")))?
91 .dangerous()
92 .with_custom_certificate_verifier(verifier)
93 .with_client_auth_cert(node.rustls_cert_chain(), node.rustls_private_key())
94 .map_err(|e| DigTlsError::RustlsConfig(format!("client auth cert: {e}")))?;
95 Ok(ClientTls {
96 config: Arc::new(config),
97 captured_peer_id,
98 captured_bls,
99 })
100}