@@ -360,18 +360,21 @@ pub struct AttestedCertificateVerifier {
360360
361361impl AttestedCertificateVerifier {
362362 pub fn new (
363- root_store : RootCertStore ,
363+ root_store : Option < RootCertStore > ,
364364 attestation_verifier : AttestationVerifier ,
365365 ) -> Result < Self , AttestedTlsError > {
366366 Self :: new_with_provider ( root_store, attestation_verifier, default_crypto_provider ( ) ?)
367367 }
368368
369369 pub fn new_with_provider (
370- root_store : RootCertStore ,
370+ root_store : Option < RootCertStore > ,
371371 attestation_verifier : AttestationVerifier ,
372372 provider : Arc < CryptoProvider > ,
373373 ) -> Result < Self , AttestedTlsError > {
374- let root_store = Arc :: new ( root_store) ;
374+ let root_store = Arc :: new ( match root_store {
375+ Some ( root_store) => root_store,
376+ None => Self :: synthetic_root_store ( ) ?,
377+ } ) ;
375378 let server_inner =
376379 WebPkiServerVerifier :: builder_with_provider ( root_store. clone ( ) , provider. clone ( ) )
377380 . build ( )
@@ -383,6 +386,19 @@ impl AttestedCertificateVerifier {
383386 Ok ( Self { server_inner, client_inner, attestation_verifier } )
384387 }
385388
389+ fn synthetic_root_store ( ) -> Result < RootCertStore , AttestedTlsError > {
390+ let key_pair = KeyPair :: generate_for ( & PKCS_ECDSA_P256_SHA256 ) ?;
391+ let mut params =
392+ ra_tls:: rcgen:: CertificateParams :: new ( vec ! [ "attested-tls-placeholder-ca" . to_string( ) ] ) ?;
393+ params. is_ca = ra_tls:: rcgen:: IsCa :: Ca ( ra_tls:: rcgen:: BasicConstraints :: Unconstrained ) ;
394+ let cert = params. self_signed ( & key_pair) ?;
395+
396+ let mut root_store = RootCertStore :: empty ( ) ;
397+ root_store. add ( cert. der ( ) . clone ( ) ) ?;
398+
399+ Ok ( root_store)
400+ }
401+
386402 fn extract_custom_attestation_from_cert (
387403 cert : & CertificateDer < ' _ > ,
388404 ) -> Result < AttestationExchangeMessage , rustls:: Error > {
@@ -713,14 +729,8 @@ mod tests {
713729 . await
714730 . unwrap ( ) ;
715731
716- let server_certificate =
717- resolver. state . certificate . read ( ) . unwrap ( ) . first ( ) . unwrap ( ) . clone ( ) ;
718-
719- let mut roots = RootCertStore :: empty ( ) ;
720- roots. add ( server_certificate) . unwrap ( ) ;
721-
722732 let verifier = AttestedCertificateVerifier :: new_with_provider (
723- roots ,
733+ None ,
724734 AttestationVerifier :: mock ( ) ,
725735 provider. clone ( ) ,
726736 )
@@ -780,7 +790,7 @@ mod tests {
780790 roots. add ( ca_cert) . unwrap ( ) ;
781791
782792 let verifier = AttestedCertificateVerifier :: new_with_provider (
783- roots,
793+ Some ( roots) ,
784794 AttestationVerifier :: mock ( ) ,
785795 provider. clone ( ) ,
786796 )
@@ -882,36 +892,14 @@ mod tests {
882892 . await
883893 . expect ( "client resolver construction should succeed" ) ;
884894
885- let server_certificate = server_resolver
886- . state
887- . certificate
888- . read ( )
889- . expect ( "certificate lock poisoned" )
890- . first ( )
891- . expect ( "resolver should hold a certificate" )
892- . clone ( ) ;
893- let client_certificate = client_resolver
894- . state
895- . certificate
896- . read ( )
897- . expect ( "certificate lock poisoned" )
898- . first ( )
899- . expect ( "resolver should hold a certificate" )
900- . clone ( ) ;
901-
902- let mut client_roots = RootCertStore :: empty ( ) ;
903- client_roots. add ( server_certificate) . expect ( "server certificate should be trusted" ) ;
904- let mut server_roots = RootCertStore :: empty ( ) ;
905- server_roots. add ( client_certificate) . expect ( "client certificate should be trusted" ) ;
906-
907895 let server_verifier = AttestedCertificateVerifier :: new_with_provider (
908- server_roots ,
896+ None ,
909897 AttestationVerifier :: mock ( ) ,
910898 provider. clone ( ) ,
911899 )
912900 . expect ( "server verifier construction should succeed" ) ;
913901 let client_verifier = AttestedCertificateVerifier :: new_with_provider (
914- client_roots ,
902+ None ,
915903 AttestationVerifier :: mock ( ) ,
916904 provider. clone ( ) ,
917905 )
@@ -963,20 +951,8 @@ mod tests {
963951 )
964952 . await
965953 . expect ( "resolver construction should succeed" ) ;
966- let server_certificate = resolver
967- . state
968- . certificate
969- . read ( )
970- . expect ( "certificate lock poisoned" )
971- . first ( )
972- . expect ( "resolver should hold a certificate" )
973- . clone ( ) ;
974-
975- let mut roots = RootCertStore :: empty ( ) ;
976- roots. add ( server_certificate) . expect ( "resolver certificate should be trusted" ) ;
977-
978954 let verifier = AttestedCertificateVerifier :: new_with_provider (
979- roots ,
955+ None ,
980956 AttestationVerifier :: mock ( ) ,
981957 provider. clone ( ) ,
982958 )
@@ -1015,7 +991,7 @@ mod tests {
1015991 async fn malformed_certificate_returns_bad_encoding ( ) {
1016992 let provider: Arc < CryptoProvider > = aws_lc_rs:: default_provider ( ) . into ( ) ;
1017993 let verifier = AttestedCertificateVerifier :: new_with_provider (
1018- non_empty_root_store ( ) ,
994+ None ,
1019995 AttestationVerifier :: mock ( ) ,
1020996 provider,
1021997 )
@@ -1038,7 +1014,7 @@ mod tests {
10381014 let mut roots = RootCertStore :: empty ( ) ;
10391015 roots. add ( cert. clone ( ) ) . expect ( "plain certificate should be trusted" ) ;
10401016 let verifier = AttestedCertificateVerifier :: new_with_provider (
1041- roots,
1017+ Some ( roots) ,
10421018 AttestationVerifier :: mock ( ) ,
10431019 provider,
10441020 )
@@ -1067,7 +1043,7 @@ mod tests {
10671043 . await
10681044 . expect ( "resolver construction should succeed" ) ;
10691045 let verifier = AttestedCertificateVerifier :: new_with_provider (
1070- non_empty_root_store ( ) ,
1046+ None ,
10711047 AttestationVerifier :: expect_none ( ) ,
10721048 provider,
10731049 )
@@ -1117,15 +1093,6 @@ mod tests {
11171093 . into ( )
11181094 }
11191095
1120- fn non_empty_root_store ( ) -> RootCertStore {
1121- let mut roots = RootCertStore :: empty ( ) ;
1122- let ca = test_ca ( ) ;
1123- let ca_cert = CertificateDer :: from_pem_slice ( ca. pem_cert . as_bytes ( ) )
1124- . expect ( "test CA PEM should parse" ) ;
1125- roots. add ( ca_cert) . expect ( "test CA certificate should be trusted" ) ;
1126- roots
1127- }
1128-
11291096 fn transfer_tls_client_to_server ( client : & mut ClientConnection , server : & mut ServerConnection ) {
11301097 let mut tls = Vec :: new ( ) ;
11311098
0 commit comments