@@ -28,7 +28,7 @@ use std::net::{Ipv4Addr, Ipv6Addr};
2828use std:: sync:: Arc ;
2929
3030use rustls:: client:: danger:: ServerCertVerifier ;
31- use rustls:: pki_types;
31+ use rustls:: pki_types:: { self , CertificateDer } ;
3232#[ cfg( not( any( target_vendor = "apple" , windows) ) ) ]
3333use rustls:: pki_types:: { DnsName , ServerName } ;
3434use rustls:: { CertificateError , Error as TlsError , OtherError } ;
@@ -80,13 +80,17 @@ macro_rules! no_error {
8080 } ;
8181}
8282
83- const ROOT1 : pki_types:: CertificateDer < ' static > =
84- pki_types:: CertificateDer :: from_slice ( include_bytes ! ( "root1.crt" ) ) ;
83+ const ROOT1 : CertificateDer = CertificateDer :: from_slice ( include_bytes ! ( "root1.crt" ) ) ;
8584const ROOT1_INT1 : & [ u8 ] = include_bytes ! ( "root1-int1.crt" ) ;
8685const ROOT1_INT1_EXAMPLE_COM_GOOD : & [ u8 ] = include_bytes ! ( "root1-int1-ee_example.com-good.crt" ) ;
8786const ROOT1_INT1_LOCALHOST_IPV4_GOOD : & [ u8 ] = include_bytes ! ( "root1-int1-ee_127.0.0.1-good.crt" ) ;
8887const ROOT1_INT1_LOCALHOST_IPV6_GOOD : & [ u8 ] = include_bytes ! ( "root1-int1-ee_1-good.crt" ) ;
8988
89+ // `ffi-testing` is currently only used for Android, which doesn't support extra roots yet.
90+ #[ cfg_attr( feature = "ffi-testing" , allow( unused) ) ]
91+ #[ cfg( not( any( target_os = "android" , target_os = "windows" ) ) ) ]
92+ const ROOT2 : CertificateDer = CertificateDer :: from_slice ( include_bytes ! ( "root2.crt" ) ) ;
93+
9094const EXAMPLE_COM : & str = "example.com" ;
9195const LOCALHOST_IPV4 : & str = "127.0.0.1" ;
9296const LOCALHOST_IPV6 : & str = "::1" ;
@@ -111,8 +115,8 @@ pub(super) fn verification_without_mock_root() {
111115 let verifier = Verifier :: new ( crypto_provider) . unwrap ( ) ;
112116
113117 let server_name = pki_types:: ServerName :: try_from ( EXAMPLE_COM ) . unwrap ( ) ;
114- let end_entity = pki_types :: CertificateDer :: from ( ROOT1_INT1_EXAMPLE_COM_GOOD ) ;
115- let intermediates = [ pki_types :: CertificateDer :: from ( ROOT1_INT1 ) ] ;
118+ let end_entity = CertificateDer :: from ( ROOT1_INT1_EXAMPLE_COM_GOOD ) ;
119+ let intermediates = [ CertificateDer :: from ( ROOT1_INT1 ) ] ;
116120
117121 // Fails because the server cert has no trust root in Windows, and can't since it uses a self-signed CA.
118122 // Similarly on UNIX platforms using the Webpki verifier, it can't fetch extra certificates through
@@ -139,6 +143,45 @@ fn test_verification_without_mock_root() {
139143 verification_without_mock_root ( )
140144}
141145
146+ #[ cfg( not( any( target_os = "android" , target_os = "windows" ) ) ) ]
147+ #[ test]
148+ fn test_selfsigned_cert_with_extra_roots ( ) {
149+ let crypto_provider = test_provider ( ) ;
150+
151+ let selfsigned = ROOT2 ;
152+ let roots = vec ! [ selfsigned. clone( ) ] ;
153+ let server_name = pki_types:: ServerName :: try_from ( EXAMPLE_COM ) . unwrap ( ) ;
154+
155+ let verifier = Verifier :: new_with_extra_roots ( roots, crypto_provider) . unwrap ( ) ;
156+
157+ verifier
158+ . verify_server_cert ( & selfsigned, & [ ] , & server_name, & [ ] , verification_time ( ) )
159+ . expect ( "failed to validate singular extra root certificate chain" ) ;
160+ }
161+
162+ #[ cfg( not( target_os = "android" ) ) ]
163+ #[ test]
164+ fn test_chain_signed_with_extra_roots ( ) {
165+ let crypto_provider = test_provider ( ) ;
166+
167+ let server_name = pki_types:: ServerName :: try_from ( EXAMPLE_COM ) . unwrap ( ) ;
168+ let end_entity = CertificateDer :: from ( ROOT1_INT1_EXAMPLE_COM_GOOD ) ;
169+ let intermediates = [ CertificateDer :: from ( ROOT1_INT1 ) ] ;
170+ let roots = vec ! [ ROOT1 ] ;
171+
172+ let verifier = Verifier :: new_with_extra_roots ( roots, crypto_provider) . unwrap ( ) ;
173+
174+ verifier
175+ . verify_server_cert (
176+ & end_entity,
177+ & intermediates,
178+ & server_name,
179+ & [ ] ,
180+ verification_time ( ) ,
181+ )
182+ . expect ( "failed to validate extra root-only certificate chain" ) ;
183+ }
184+
142185// Note: Android does not currently support IP address hosts, so these tests are disabled for
143186// Android.
144187// Verifies that our test trust anchor(s) are not trusted when `Verifier::new()`
@@ -349,10 +392,10 @@ fn test_with_mock_root<E: std::error::Error + PartialEq + 'static>(
349392 let mut chain = test_case
350393 . chain
351394 . iter ( )
352- . map ( |bytes| pki_types :: CertificateDer :: from ( * bytes) ) ;
395+ . map ( |bytes| CertificateDer :: from ( * bytes) ) ;
353396
354397 let end_entity = chain. next ( ) . unwrap ( ) ;
355- let intermediates: Vec < pki_types :: CertificateDer < ' _ > > = chain. collect ( ) ;
398+ let intermediates: Vec < CertificateDer < ' _ > > = chain. collect ( ) ;
356399
357400 let server_name = pki_types:: ServerName :: try_from ( test_case. reference_id ) . unwrap ( ) ;
358401
0 commit comments