@@ -21,12 +21,15 @@ use bitcoin::{Script, Txid};
21
21
22
22
#[ cfg( feature = "use-openssl" ) ]
23
23
use openssl:: ssl:: { SslConnector , SslMethod , SslStream , SslVerifyMode } ;
24
+
24
25
#[ cfg( all(
25
26
any( feature = "default" , feature = "use-rustls" ) ,
26
27
not( feature = "use-openssl" )
27
28
) ) ]
28
29
use rustls:: {
29
- ClientConfig , ClientConnection , OwnedTrustAnchor , RootCertStore , ServerName , StreamOwned ,
30
+ pki_types:: ServerName ,
31
+ pki_types:: { Der , TrustAnchor } ,
32
+ ClientConfig , ClientConnection , RootCertStore , StreamOwned ,
30
33
} ;
31
34
32
35
#[ cfg( any( feature = "default" , feature = "proxy" ) ) ]
@@ -287,25 +290,48 @@ impl RawClient<ElectrumSslStream> {
287
290
not( feature = "use-openssl" )
288
291
) ) ]
289
292
mod danger {
290
- use rustls;
291
- use rustls:: client:: ServerCertVerified ;
292
- use rustls:: { Certificate , Error , ServerName } ;
293
- use std:: time:: SystemTime ;
293
+ use raw_client:: ServerName ;
294
+ use rustls:: client:: danger:: ServerCertVerified ;
295
+ use rustls:: pki_types:: CertificateDer ;
296
+ use rustls:: pki_types:: UnixTime ;
297
+ use rustls:: Error ;
294
298
299
+ #[ derive( Debug ) ]
295
300
pub struct NoCertificateVerification { }
296
301
297
- impl rustls:: client:: ServerCertVerifier for NoCertificateVerification {
302
+ impl rustls:: client:: danger :: ServerCertVerifier for NoCertificateVerification {
298
303
fn verify_server_cert (
299
304
& self ,
300
- _end_entity : & Certificate ,
301
- _intermediates : & [ Certificate ] ,
305
+ _end_entity : & CertificateDer ,
306
+ _intermediates : & [ CertificateDer ] ,
302
307
_server_name : & ServerName ,
303
- _scts : & mut dyn Iterator < Item = & [ u8 ] > ,
304
308
_ocsp_response : & [ u8 ] ,
305
- _now : SystemTime ,
309
+ _now : UnixTime ,
306
310
) -> Result < ServerCertVerified , Error > {
307
311
Ok ( ServerCertVerified :: assertion ( ) )
308
312
}
313
+
314
+ fn verify_tls12_signature (
315
+ & self ,
316
+ _message : & [ u8 ] ,
317
+ _cert : & CertificateDer < ' _ > ,
318
+ _dss : & rustls:: DigitallySignedStruct ,
319
+ ) -> Result < rustls:: client:: danger:: HandshakeSignatureValid , Error > {
320
+ Ok ( rustls:: client:: danger:: HandshakeSignatureValid :: assertion ( ) )
321
+ }
322
+
323
+ fn verify_tls13_signature (
324
+ & self ,
325
+ _message : & [ u8 ] ,
326
+ _cert : & CertificateDer < ' _ > ,
327
+ _dss : & rustls:: DigitallySignedStruct ,
328
+ ) -> Result < rustls:: client:: danger:: HandshakeSignatureValid , Error > {
329
+ Ok ( rustls:: client:: danger:: HandshakeSignatureValid :: assertion ( ) )
330
+ }
331
+
332
+ fn supported_verify_schemes ( & self ) -> Vec < rustls:: SignatureScheme > {
333
+ vec ! [ ]
334
+ }
309
335
}
310
336
}
311
337
@@ -358,24 +384,25 @@ impl RawClient<ElectrumSslStream> {
358
384
) -> Result < Self , Error > {
359
385
use std:: convert:: TryFrom ;
360
386
361
- let builder = ClientConfig :: builder ( ) . with_safe_defaults ( ) ;
387
+ let builder = ClientConfig :: builder ( ) ;
362
388
363
389
let config = if validate_domain {
364
390
socket_addr. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
365
391
366
- let mut store = RootCertStore :: empty ( ) ;
367
- store . add_trust_anchors ( webpki_roots :: TLS_SERVER_ROOTS . into_iter ( ) . map ( |t| {
368
- OwnedTrustAnchor :: from_subject_spki_name_constraints (
369
- t. subject ,
370
- t. spki ,
371
- t. name_constraints ,
372
- )
373
- } ) ) ;
392
+ let store = webpki_roots :: TLS_SERVER_ROOTS
393
+ . into_iter ( )
394
+ . map ( |t| TrustAnchor {
395
+ subject : Der :: from_slice ( t. subject ) ,
396
+ subject_public_key_info : Der :: from_slice ( t. spki ) ,
397
+ name_constraints : t. name_constraints . map ( |nc| Der :: from_slice ( nc ) ) ,
398
+ } )
399
+ . collect :: < RootCertStore > ( ) ;
374
400
375
401
// TODO: cert pinning
376
402
builder. with_root_certificates ( store) . with_no_client_auth ( )
377
403
} else {
378
404
builder
405
+ . dangerous ( )
379
406
. with_custom_certificate_verifier ( std:: sync:: Arc :: new (
380
407
danger:: NoCertificateVerification { } ,
381
408
) )
@@ -385,7 +412,7 @@ impl RawClient<ElectrumSslStream> {
385
412
let domain = socket_addr. domain ( ) . unwrap_or ( "NONE" ) . to_string ( ) ;
386
413
let session = ClientConnection :: new (
387
414
std:: sync:: Arc :: new ( config) ,
388
- ServerName :: try_from ( domain. as_str ( ) )
415
+ ServerName :: try_from ( domain. clone ( ) )
389
416
. map_err ( |_| Error :: InvalidDNSNameError ( domain. clone ( ) ) ) ?,
390
417
)
391
418
. map_err ( Error :: CouldNotCreateConnection ) ?;
0 commit comments