|
|
|
@ -19,7 +19,7 @@ use tokio::sync::{broadcast, watch::Receiver, Mutex as TokioMutex, Semaphore}; |
|
|
|
use tracing::{error, info}; |
|
|
|
use tracing::{error, info}; |
|
|
|
use trust_dns_resolver::TokioAsyncResolver; |
|
|
|
use trust_dns_resolver::TokioAsyncResolver; |
|
|
|
|
|
|
|
|
|
|
|
use super::abstraction::Tree; |
|
|
|
use super::{abstraction::Tree, CertificateTrustList}; |
|
|
|
|
|
|
|
|
|
|
|
pub const COUNTER: &[u8] = b"c"; |
|
|
|
pub const COUNTER: &[u8] = b"c"; |
|
|
|
|
|
|
|
|
|
|
|
@ -53,6 +53,7 @@ pub struct Globals { |
|
|
|
|
|
|
|
|
|
|
|
struct MatrixServerVerifier { |
|
|
|
struct MatrixServerVerifier { |
|
|
|
inner: WebPKIVerifier, |
|
|
|
inner: WebPKIVerifier, |
|
|
|
|
|
|
|
trust_list: Option<CertificateTrustList>, |
|
|
|
tls_name_override: Arc<RwLock<TlsNameMap>>, |
|
|
|
tls_name_override: Arc<RwLock<TlsNameMap>>, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -66,6 +67,14 @@ impl ServerCertVerifier for MatrixServerVerifier { |
|
|
|
ocsp_response: &[u8], |
|
|
|
ocsp_response: &[u8], |
|
|
|
) -> std::result::Result<rustls::ServerCertVerified, rustls::TLSError> { |
|
|
|
) -> std::result::Result<rustls::ServerCertVerified, rustls::TLSError> { |
|
|
|
if let Some(override_name) = self.tls_name_override.read().unwrap().get(dns_name.into()) { |
|
|
|
if let Some(override_name) = self.tls_name_override.read().unwrap().get(dns_name.into()) { |
|
|
|
|
|
|
|
if self |
|
|
|
|
|
|
|
.trust_list |
|
|
|
|
|
|
|
.as_ref() |
|
|
|
|
|
|
|
.map(|tl| tl.contains(override_name.as_ref().into())) |
|
|
|
|
|
|
|
.unwrap_or_default() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return Ok(rustls::ServerCertVerified::assertion()); |
|
|
|
|
|
|
|
} |
|
|
|
let result = self.inner.verify_server_cert( |
|
|
|
let result = self.inner.verify_server_cert( |
|
|
|
roots, |
|
|
|
roots, |
|
|
|
presented_certs, |
|
|
|
presented_certs, |
|
|
|
@ -80,6 +89,14 @@ impl ServerCertVerifier for MatrixServerVerifier { |
|
|
|
dns_name |
|
|
|
dns_name |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if self |
|
|
|
|
|
|
|
.trust_list |
|
|
|
|
|
|
|
.as_ref() |
|
|
|
|
|
|
|
.map(|tl| tl.contains(dns_name.into())) |
|
|
|
|
|
|
|
.unwrap_or_default() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return Ok(rustls::ServerCertVerified::assertion()); |
|
|
|
|
|
|
|
} |
|
|
|
self.inner |
|
|
|
self.inner |
|
|
|
.verify_server_cert(roots, presented_certs, dns_name, ocsp_response) |
|
|
|
.verify_server_cert(roots, presented_certs, dns_name, ocsp_response) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -164,6 +181,7 @@ impl Globals { |
|
|
|
let tls_name_override = Arc::new(RwLock::new(TlsNameMap::new())); |
|
|
|
let tls_name_override = Arc::new(RwLock::new(TlsNameMap::new())); |
|
|
|
let verifier = Arc::new(MatrixServerVerifier { |
|
|
|
let verifier = Arc::new(MatrixServerVerifier { |
|
|
|
inner: WebPKIVerifier::new(), |
|
|
|
inner: WebPKIVerifier::new(), |
|
|
|
|
|
|
|
trust_list: config.trust_certificates.clone(), |
|
|
|
tls_name_override: tls_name_override.clone(), |
|
|
|
tls_name_override: tls_name_override.clone(), |
|
|
|
}); |
|
|
|
}); |
|
|
|
let mut tlsconfig = rustls::ClientConfig::new(); |
|
|
|
let mut tlsconfig = rustls::ClientConfig::new(); |
|
|
|
|