@@ -37,22 +37,26 @@ const EXPORTER_LABEL: &[u8; 24] = b"EXPORTER-Channel-Binding";
3737/// The header name for giving measurements
3838const MEASUREMENT_HEADER : & str = "X-Flashbots-Measurement" ;
3939
40+ /// TLS Credentials
4041pub struct TlsCertAndKey {
42+ /// Der-encoded TLS certificate chain
4143 pub cert_chain : Vec < CertificateDer < ' static > > ,
44+ /// Der-encoded TLS private key
4245 pub key : PrivateKeyDer < ' static > ,
4346}
4447
48+ /// Inner struct used by [ProxyClient] and [ProxyServer]
4549struct Proxy < L , R >
4650where
4751 L : QuoteGenerator ,
4852 R : QuoteVerifier ,
4953{
5054 /// The underlying TCP listener
5155 listener : TcpListener ,
52- /// Type of CVM platform we run on (including none)
53- local_attestation_platform : L ,
54- /// Type of CVM platform the remote party runs on (including none)
55- remote_attestation_platform : R ,
56+ /// Quote generation type to use (including none)
57+ local_quote_generator : L ,
58+ /// Verifier for remote attestation (including none)
59+ remote_quote_verifier : R ,
5660}
5761
5862/// A TLS over TCP server which provides an attestation before forwarding traffic to a given target address
@@ -75,11 +79,11 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyServer<L, R> {
7579 cert_and_key : TlsCertAndKey ,
7680 local : impl ToSocketAddrs ,
7781 target : SocketAddr ,
78- local_attestation_platform : L ,
79- remote_attestation_platform : R ,
82+ local_quote_generator : L ,
83+ remote_quote_verifier : R ,
8084 client_auth : bool ,
8185 ) -> Result < Self , ProxyError > {
82- if remote_attestation_platform . is_cvm ( ) && !client_auth {
86+ if remote_quote_verifier . is_cvm ( ) && !client_auth {
8387 return Err ( ProxyError :: NoClientAuth ) ;
8488 }
8589
@@ -102,8 +106,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyServer<L, R> {
102106 server_config. into ( ) ,
103107 local,
104108 target,
105- local_attestation_platform ,
106- remote_attestation_platform ,
109+ local_quote_generator ,
110+ remote_quote_verifier ,
107111 )
108112 . await
109113 }
@@ -116,16 +120,16 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyServer<L, R> {
116120 server_config : Arc < ServerConfig > ,
117121 local : impl ToSocketAddrs ,
118122 target : SocketAddr ,
119- local_attestation_platform : L ,
120- remote_attestation_platform : R ,
123+ local_quote_generator : L ,
124+ remote_quote_verifier : R ,
121125 ) -> Result < Self , ProxyError > {
122126 let acceptor = tokio_rustls:: TlsAcceptor :: from ( server_config) ;
123127 let listener = TcpListener :: bind ( local) . await ?;
124128
125129 let inner = Proxy {
126130 listener,
127- local_attestation_platform ,
128- remote_attestation_platform ,
131+ local_quote_generator ,
132+ remote_quote_verifier ,
129133 } ;
130134
131135 Ok ( Self {
@@ -143,16 +147,16 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyServer<L, R> {
143147 let acceptor = self . acceptor . clone ( ) ;
144148 let target = self . target ;
145149 let cert_chain = self . cert_chain . clone ( ) ;
146- let local_attestation_platform = self . inner . local_attestation_platform . clone ( ) ;
147- let remote_attestation_platform = self . inner . remote_attestation_platform . clone ( ) ;
150+ let local_quote_generator = self . inner . local_quote_generator . clone ( ) ;
151+ let remote_quote_verifier = self . inner . remote_quote_verifier . clone ( ) ;
148152 tokio:: spawn ( async move {
149153 if let Err ( err) = Self :: handle_connection (
150154 inbound,
151155 acceptor,
152156 target,
153157 cert_chain,
154- local_attestation_platform ,
155- remote_attestation_platform ,
158+ local_quote_generator ,
159+ remote_quote_verifier ,
156160 )
157161 . await
158162 {
@@ -172,8 +176,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyServer<L, R> {
172176 acceptor : TlsAcceptor ,
173177 target : SocketAddr ,
174178 cert_chain : Vec < CertificateDer < ' static > > ,
175- local_attestation_platform : L ,
176- remote_attestation_platform : R ,
179+ local_quote_generator : L ,
180+ remote_quote_verifier : R ,
177181 ) -> Result < ( ) , ProxyError > {
178182 let mut tls_stream = acceptor. accept ( inbound) . await ?;
179183 let ( _io, connection) = tls_stream. get_ref ( ) ;
@@ -187,8 +191,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyServer<L, R> {
187191
188192 let remote_cert_chain = connection. peer_certificates ( ) . map ( |c| c. to_owned ( ) ) ;
189193
190- let attestation = if local_attestation_platform . is_cvm ( ) {
191- local_attestation_platform . create_attestation ( & cert_chain, exporter) ?
194+ let attestation = if local_quote_generator . is_cvm ( ) {
195+ local_quote_generator . create_attestation ( & cert_chain, exporter) ?
192196 } else {
193197 Vec :: new ( )
194198 } ;
@@ -206,8 +210,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyServer<L, R> {
206210 let mut buf = vec ! [ 0 ; length] ;
207211 tls_stream. read_exact ( & mut buf) . await ?;
208212
209- let measurements = if remote_attestation_platform . is_cvm ( ) {
210- remote_attestation_platform
213+ let measurements = if remote_quote_verifier . is_cvm ( ) {
214+ remote_quote_verifier
211215 . verify_attestation (
212216 buf,
213217 & remote_cert_chain. ok_or ( ProxyError :: NoClientAuth ) ?,
@@ -311,10 +315,10 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
311315 cert_and_key : Option < TlsCertAndKey > ,
312316 address : impl ToSocketAddrs ,
313317 server_name : String ,
314- local_attestation_platform : L ,
315- remote_attestation_platform : R ,
318+ local_quote_generator : L ,
319+ remote_quote_verifier : R ,
316320 ) -> Result < Self , ProxyError > {
317- if local_attestation_platform . is_cvm ( ) && cert_and_key. is_none ( ) {
321+ if local_quote_generator . is_cvm ( ) && cert_and_key. is_none ( ) {
318322 return Err ( ProxyError :: NoClientAuth ) ;
319323 }
320324
@@ -337,8 +341,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
337341 client_config. into ( ) ,
338342 address,
339343 server_name,
340- local_attestation_platform ,
341- remote_attestation_platform ,
344+ local_quote_generator ,
345+ remote_quote_verifier ,
342346 cert_and_key. map ( |c| c. cert_chain ) ,
343347 )
344348 . await
@@ -351,17 +355,17 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
351355 client_config : Arc < ClientConfig > ,
352356 local : impl ToSocketAddrs ,
353357 target_name : String ,
354- local_attestation_platform : L ,
355- remote_attestation_platform : R ,
358+ local_quote_generator : L ,
359+ remote_quote_verifier : R ,
356360 cert_chain : Option < Vec < CertificateDer < ' static > > > ,
357361 ) -> Result < Self , ProxyError > {
358362 let listener = TcpListener :: bind ( local) . await ?;
359363 let connector = TlsConnector :: from ( client_config. clone ( ) ) ;
360364
361365 let inner = Proxy {
362366 listener,
363- local_attestation_platform ,
364- remote_attestation_platform ,
367+ local_quote_generator ,
368+ remote_quote_verifier ,
365369 } ;
366370
367371 Ok ( Self {
@@ -378,8 +382,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
378382
379383 let connector = self . connector . clone ( ) ;
380384 let target = self . target . clone ( ) ;
381- let local_attestation_platform = self . inner . local_attestation_platform . clone ( ) ;
382- let remote_attestation_platform = self . inner . remote_attestation_platform . clone ( ) ;
385+ let local_quote_generator = self . inner . local_quote_generator . clone ( ) ;
386+ let remote_quote_verifier = self . inner . remote_quote_verifier . clone ( ) ;
383387 let cert_chain = self . cert_chain . clone ( ) ;
384388
385389 tokio:: spawn ( async move {
@@ -388,8 +392,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
388392 connector,
389393 target,
390394 cert_chain,
391- local_attestation_platform ,
392- remote_attestation_platform ,
395+ local_quote_generator ,
396+ remote_quote_verifier ,
393397 )
394398 . await
395399 {
@@ -411,24 +415,24 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
411415 connector : TlsConnector ,
412416 target : String ,
413417 cert_chain : Option < Vec < CertificateDer < ' static > > > ,
414- local_attestation_platform : L ,
415- remote_attestation_platform : R ,
418+ local_quote_generator : L ,
419+ remote_quote_verifier : R ,
416420 ) -> Result < ( ) , ProxyError > {
417421 let http = Builder :: new ( ) ;
418422 let service = service_fn ( move |req| {
419423 let connector = connector. clone ( ) ;
420424 let target = target. clone ( ) ;
421425 let cert_chain = cert_chain. clone ( ) ;
422- let local_attestation_platform = local_attestation_platform . clone ( ) ;
423- let remote_attestation_platform = remote_attestation_platform . clone ( ) ;
426+ let local_quote_generator = local_quote_generator . clone ( ) ;
427+ let remote_quote_verifier = remote_quote_verifier . clone ( ) ;
424428 async move {
425429 match Self :: handle_http_request (
426430 req,
427431 connector,
428432 target,
429433 cert_chain,
430- local_attestation_platform ,
431- remote_attestation_platform ,
434+ local_quote_generator ,
435+ remote_quote_verifier ,
432436 )
433437 . await
434438 {
@@ -455,8 +459,8 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
455459 connector : TlsConnector ,
456460 target : String ,
457461 cert_chain : Option < Vec < CertificateDer < ' static > > > ,
458- local_attestation_platform : L ,
459- remote_attestation_platform : R ,
462+ local_quote_generator : L ,
463+ remote_quote_verifier : R ,
460464 ) -> Result <
461465 (
462466 tokio_rustls:: client:: TlsStream < TcpStream > ,
@@ -490,16 +494,16 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
490494 let mut buf = vec ! [ 0 ; length] ;
491495 tls_stream. read_exact ( & mut buf) . await ?;
492496
493- let measurements = if remote_attestation_platform . is_cvm ( ) {
494- remote_attestation_platform
497+ let measurements = if remote_quote_verifier . is_cvm ( ) {
498+ remote_quote_verifier
495499 . verify_attestation ( buf, & remote_cert_chain, exporter)
496500 . await ?
497501 } else {
498502 None
499503 } ;
500504
501- let attestation = if local_attestation_platform . is_cvm ( ) {
502- local_attestation_platform
505+ let attestation = if local_quote_generator . is_cvm ( ) {
506+ local_quote_generator
503507 . create_attestation ( & cert_chain. ok_or ( ProxyError :: NoClientAuth ) ?, exporter) ?
504508 } else {
505509 Vec :: new ( )
@@ -520,15 +524,15 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
520524 connector : TlsConnector ,
521525 target : String ,
522526 cert_chain : Option < Vec < CertificateDer < ' static > > > ,
523- local_attestation_platform : L ,
524- remote_attestation_platform : R ,
527+ local_quote_generator : L ,
528+ remote_quote_verifier : R ,
525529 ) -> Result < Response < BoxBody < bytes:: Bytes , hyper:: Error > > , ProxyError > {
526530 let ( tls_stream, measurements) = Self :: setup_connection (
527531 connector,
528532 target,
529533 cert_chain,
530- local_attestation_platform ,
531- remote_attestation_platform ,
534+ local_quote_generator ,
535+ remote_quote_verifier ,
532536 )
533537 . await ?;
534538
@@ -575,23 +579,18 @@ impl<L: QuoteGenerator, R: QuoteVerifier> ProxyClient<L, R> {
575579/// Just get the attested remote certificate, with no client authentication
576580pub async fn get_tls_cert < R : QuoteVerifier > (
577581 server_name : String ,
578- remote_attestation_platform : R ,
582+ remote_quote_verifier : R ,
579583) -> Result < Vec < CertificateDer < ' static > > , ProxyError > {
580584 let root_store = RootCertStore :: from_iter ( webpki_roots:: TLS_SERVER_ROOTS . iter ( ) . cloned ( ) ) ;
581585 let client_config = ClientConfig :: builder ( )
582586 . with_root_certificates ( root_store)
583587 . with_no_client_auth ( ) ;
584- get_tls_cert_with_config (
585- server_name,
586- remote_attestation_platform,
587- client_config. into ( ) ,
588- )
589- . await
588+ get_tls_cert_with_config ( server_name, remote_quote_verifier, client_config. into ( ) ) . await
590589}
591590
592591async fn get_tls_cert_with_config < R : QuoteVerifier > (
593592 server_name : String ,
594- remote_attestation_platform : R ,
593+ remote_quote_verifier : R ,
595594 client_config : Arc < ClientConfig > ,
596595) -> Result < Vec < CertificateDer < ' static > > , ProxyError > {
597596 let connector = TlsConnector :: from ( client_config) ;
@@ -622,8 +621,8 @@ async fn get_tls_cert_with_config<R: QuoteVerifier>(
622621 let mut buf = vec ! [ 0 ; length] ;
623622 tls_stream. read_exact ( & mut buf) . await ?;
624623
625- if remote_attestation_platform . is_cvm ( ) {
626- remote_attestation_platform
624+ if remote_quote_verifier . is_cvm ( ) {
625+ remote_quote_verifier
627626 . verify_attestation ( buf, & remote_cert_chain, exporter)
628627 . await ?;
629628 }
0 commit comments