|  | @@ -65,7 +65,7 @@ mod private {
 | 
											
												
													
														|  |          addr: Arc<BlockAddr>,
 |  |          addr: Arc<BlockAddr>,
 | 
											
												
													
														|  |          creds: Arc<C>,
 |  |          creds: Arc<C>,
 | 
											
												
													
														|  |      ) -> Result<impl Router> {
 |  |      ) -> Result<impl Router> {
 | 
											
												
													
														|  | -        QuicRouter::new(addr, creds)
 |  | 
 | 
											
												
													
														|  | 
 |  | +        QuicRouter::new(addr, Arc::new(CertResolver::new(creds)?))
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      lazy_static! {
 |  |      lazy_static! {
 | 
											
										
											
												
													
														|  | @@ -93,20 +93,20 @@ mod private {
 | 
											
												
													
														|  |              .map_err(|err| err.into())
 |  |              .map_err(|err| err.into())
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    fn server_config<C: 'static + Creds + Send + Sync>(creds: Arc<C>) -> Result<ServerConfig> {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    fn server_config(resolver: Arc<CertResolver>) -> Result<ServerConfig> {
 | 
											
												
													
														|  |          let server_config = common_config(rustls::ServerConfig::builder())?
 |  |          let server_config = common_config(rustls::ServerConfig::builder())?
 | 
											
												
													
														|  |              .with_client_cert_verifier(Arc::new(ClientCertVerifier))
 |  |              .with_client_cert_verifier(Arc::new(ClientCertVerifier))
 | 
											
												
													
														|  | -            .with_cert_resolver(Arc::new(CertResolver::new(creds)?));
 |  | 
 | 
											
												
													
														|  | 
 |  | +            .with_cert_resolver(resolver);
 | 
											
												
													
														|  |          Ok(ServerConfig::with_crypto(Arc::new(server_config)))
 |  |          Ok(ServerConfig::with_crypto(Arc::new(server_config)))
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    fn client_config<C: 'static + Creds + Send + Sync>(
 |  | 
 | 
											
												
													
														|  | 
 |  | +    fn client_config(
 | 
											
												
													
														|  |          server_path: Arc<BlockPath>,
 |  |          server_path: Arc<BlockPath>,
 | 
											
												
													
														|  | -        creds: Arc<C>,
 |  | 
 | 
											
												
													
														|  | 
 |  | +        resolver: Arc<CertResolver>,
 | 
											
												
													
														|  |      ) -> Result<ClientConfig> {
 |  |      ) -> Result<ClientConfig> {
 | 
											
												
													
														|  |          let client_config = common_config(rustls::ClientConfig::builder())?
 |  |          let client_config = common_config(rustls::ClientConfig::builder())?
 | 
											
												
													
														|  |              .with_custom_certificate_verifier(Arc::new(ServerCertVerifier::new(server_path)))
 |  |              .with_custom_certificate_verifier(Arc::new(ServerCertVerifier::new(server_path)))
 | 
											
												
													
														|  | -            .with_client_cert_resolver(Arc::new(CertResolver::new(creds)?));
 |  | 
 | 
											
												
													
														|  | 
 |  | +            .with_client_cert_resolver(resolver);
 | 
											
												
													
														|  |          Ok(ClientConfig::new(Arc::new(client_config)))
 |  |          Ok(ClientConfig::new(Arc::new(client_config)))
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -683,25 +683,25 @@ mod private {
 | 
											
												
													
														|  |          };
 |  |          };
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    struct QuicRouter<C> {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    struct QuicRouter {
 | 
											
												
													
														|  |          recv_addr: Arc<BlockAddr>,
 |  |          recv_addr: Arc<BlockAddr>,
 | 
											
												
													
														|  | -        creds: Arc<C>,
 |  | 
 | 
											
												
													
														|  | 
 |  | +        resolver: Arc<CertResolver>,
 | 
											
												
													
														|  |          endpoint: Endpoint,
 |  |          endpoint: Endpoint,
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    impl<C: 'static + Creds + Send + Sync> QuicRouter<C> {
 |  | 
 | 
											
												
													
														|  | -        fn new(recv_addr: Arc<BlockAddr>, creds: Arc<C>) -> Result<Self> {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    impl QuicRouter {
 | 
											
												
													
														|  | 
 |  | +        fn new(recv_addr: Arc<BlockAddr>, resolver: Arc<CertResolver>) -> Result<Self> {
 | 
											
												
													
														|  |              let socket_addr = recv_addr.socket_addr();
 |  |              let socket_addr = recv_addr.socket_addr();
 | 
											
												
													
														|  | -            let endpoint = Endpoint::server(server_config(creds.clone())?, socket_addr)?;
 |  | 
 | 
											
												
													
														|  | 
 |  | +            let endpoint = Endpoint::server(server_config(resolver.clone())?, socket_addr)?;
 | 
											
												
													
														|  |              Ok(Self {
 |  |              Ok(Self {
 | 
											
												
													
														|  |                  endpoint,
 |  |                  endpoint,
 | 
											
												
													
														|  | -                creds,
 |  | 
 | 
											
												
													
														|  | 
 |  | +                resolver,
 | 
											
												
													
														|  |                  recv_addr,
 |  |                  recv_addr,
 | 
											
												
													
														|  |              })
 |  |              })
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    impl<C: 'static + Creds + Send + Sync> Router for QuicRouter<C> {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    impl Router for QuicRouter {
 | 
											
												
													
														|  |          type Receiver<T: 'static + DeserializeOwned + Send> = QuicReceiver<T>;
 |  |          type Receiver<T: 'static + DeserializeOwned + Send> = QuicReceiver<T>;
 | 
											
												
													
														|  |          type ReceiverFut<'a, T: 'static + DeserializeOwned + Send + Unpin> =
 |  |          type ReceiverFut<'a, T: 'static + DeserializeOwned + Send + Unpin> =
 | 
											
												
													
														|  |              Ready<Result<QuicReceiver<T>>>;
 |  |              Ready<Result<QuicReceiver<T>>>;
 | 
											
										
											
												
													
														|  | @@ -720,7 +720,7 @@ mod private {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          fn sender(&self, addr: Arc<BlockAddr>) -> Self::SenderFut<'_> {
 |  |          fn sender(&self, addr: Arc<BlockAddr>) -> Self::SenderFut<'_> {
 | 
											
												
													
														|  |              Box::pin(async {
 |  |              Box::pin(async {
 | 
											
												
													
														|  | -                QuicSender::from_endpoint(self.endpoint.clone(), addr, self.creds.clone()).await
 |  | 
 | 
											
												
													
														|  | 
 |  | +                QuicSender::from_endpoint(self.endpoint.clone(), addr, self.resolver.clone()).await
 | 
											
												
													
														|  |              })
 |  |              })
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
										
											
												
													
														|  | @@ -812,14 +812,14 @@ mod private {
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      impl QuicSender {
 |  |      impl QuicSender {
 | 
											
												
													
														|  | -        async fn from_endpoint<C: 'static + Creds + Send + Sync>(
 |  | 
 | 
											
												
													
														|  | 
 |  | +        async fn from_endpoint(
 | 
											
												
													
														|  |              endpoint: Endpoint,
 |  |              endpoint: Endpoint,
 | 
											
												
													
														|  |              addr: Arc<BlockAddr>,
 |  |              addr: Arc<BlockAddr>,
 | 
											
												
													
														|  | -            creds: Arc<C>,
 |  | 
 | 
											
												
													
														|  | 
 |  | +            resolver: Arc<CertResolver>,
 | 
											
												
													
														|  |          ) -> Result<Self> {
 |  |          ) -> Result<Self> {
 | 
											
												
													
														|  |              let socket_addr = addr.socket_addr();
 |  |              let socket_addr = addr.socket_addr();
 | 
											
												
													
														|  |              let connecting = endpoint.connect_with(
 |  |              let connecting = endpoint.connect_with(
 | 
											
												
													
														|  | -                client_config(addr.path.clone(), creds)?,
 |  | 
 | 
											
												
													
														|  | 
 |  | +                client_config(addr.path.clone(), resolver)?,
 | 
											
												
													
														|  |                  socket_addr,
 |  |                  socket_addr,
 | 
											
												
													
														|  |                  // The ServerCertVerifier ensures we connect to the correct path.
 |  |                  // The ServerCertVerifier ensures we connect to the correct path.
 | 
											
												
													
														|  |                  "INDETERMINANT",
 |  |                  "INDETERMINANT",
 |