@@ -4,7 +4,8 @@ use rustls::client::danger::{HandshakeSignatureValid, ServerCertVerified, Server
4
4
use rustls:: client:: WebPkiServerVerifier ;
5
5
use rustls:: pki_types;
6
6
use rustls:: {
7
- CertificateError , DigitallySignedStruct , Error as TlsError , OtherError , SignatureScheme ,
7
+ crypto:: CryptoProvider , CertificateError , DigitallySignedStruct , Error as TlsError , OtherError ,
8
+ SignatureScheme ,
8
9
} ;
9
10
use std:: fmt:: Debug ;
10
11
use std:: sync:: { Arc , Mutex } ;
@@ -28,17 +29,24 @@ pub struct Verifier {
28
29
/// Testing only: an additional root CA certificate to trust.
29
30
#[ cfg( any( test, feature = "ffi-testing" , feature = "dbg" ) ) ]
30
31
test_only_root_ca_override : Option < Vec < u8 > > ,
32
+
33
+ pub ( super ) crypto_provider : OnceCell < Arc < CryptoProvider > > ,
31
34
}
32
35
33
36
impl Verifier {
34
37
/// Creates a new verifier whose certificate validation is provided by
35
38
/// WebPKI, using root certificates provided by the platform.
39
+ ///
40
+ /// A [`CryptoProvider`] must be set with
41
+ /// [`set_provider`][Verifier::set_provider]/[`with_provider`][Verifier::with_provider] or
42
+ /// [`CryptoProvider::install_default`] before the verifier can be used.
36
43
pub fn new ( ) -> Self {
37
44
Self {
38
45
inner : OnceCell :: new ( ) ,
39
46
extra_roots : Vec :: new ( ) . into ( ) ,
40
47
#[ cfg( any( test, feature = "ffi-testing" , feature = "dbg" ) ) ]
41
48
test_only_root_ca_override : None ,
49
+ crypto_provider : OnceCell :: new ( ) ,
42
50
}
43
51
}
44
52
@@ -53,6 +61,7 @@ impl Verifier {
53
61
extra_roots : roots. into_iter ( ) . collect :: < Vec < _ > > ( ) . into ( ) ,
54
62
#[ cfg( any( test, feature = "ffi-testing" , feature = "dbg" ) ) ]
55
63
test_only_root_ca_override : None ,
64
+ crypto_provider : OnceCell :: new ( ) ,
56
65
}
57
66
}
58
67
@@ -63,6 +72,7 @@ impl Verifier {
63
72
inner : OnceCell :: new ( ) ,
64
73
extra_roots : Vec :: new ( ) . into ( ) ,
65
74
test_only_root_ca_override : Some ( root. into ( ) ) ,
75
+ crypto_provider : OnceCell :: new ( ) ,
66
76
}
67
77
}
68
78
@@ -85,9 +95,12 @@ impl Verifier {
85
95
if ( added != 1 ) || ( ignored != 0 ) {
86
96
panic ! ( "Failed to insert fake, test-only root trust anchor" ) ;
87
97
}
88
- return Ok ( WebPkiServerVerifier :: builder ( root_store. into ( ) )
89
- . build ( )
90
- . unwrap ( ) ) ;
98
+ return Ok ( WebPkiServerVerifier :: builder_with_provider (
99
+ root_store. into ( ) ,
100
+ Arc :: clone ( self . get_provider ( ) ) ,
101
+ )
102
+ . build ( )
103
+ . unwrap ( ) ) ;
91
104
}
92
105
}
93
106
@@ -143,9 +156,12 @@ impl Verifier {
143
156
} ) ) ;
144
157
} ;
145
158
146
- WebPkiServerVerifier :: builder ( root_store. into ( ) )
147
- . build ( )
148
- . map_err ( |e| TlsError :: Other ( OtherError ( Arc :: new ( e) ) ) )
159
+ WebPkiServerVerifier :: builder_with_provider (
160
+ root_store. into ( ) ,
161
+ Arc :: clone ( self . get_provider ( ) ) ,
162
+ )
163
+ . build ( )
164
+ . map_err ( |e| TlsError :: Other ( OtherError ( Arc :: new ( e) ) ) )
149
165
}
150
166
}
151
167
0 commit comments