@@ -31,11 +31,17 @@ use openssl::ssl::{SslConnector, SslMethod, SslStream, SslVerifyMode};
31
31
not( feature = "use-openssl" )
32
32
) ) ]
33
33
use rustls:: {
34
+ crypto:: CryptoProvider ,
34
35
pki_types:: ServerName ,
35
36
pki_types:: { Der , TrustAnchor } ,
36
37
ClientConfig , ClientConnection , RootCertStore , StreamOwned ,
37
38
} ;
38
39
40
+ #[ cfg( feature = "use-rustls" ) ]
41
+ use rustls:: crypto:: aws_lc_rs:: default_provider;
42
+ #[ cfg( feature = "use-rustls-ring" ) ]
43
+ use rustls:: crypto:: ring:: default_provider;
44
+
39
45
#[ cfg( any( feature = "default" , feature = "proxy" ) ) ]
40
46
use crate :: socks:: { Socks5Stream , TargetAddr , ToTargetAddr } ;
41
47
@@ -368,6 +374,7 @@ impl RawClient<ElectrumSslStream> {
368
374
socket_addrs : A ,
369
375
validate_domain : bool ,
370
376
timeout : Option < Duration > ,
377
+ crypto_provider : Option < & CryptoProvider > ,
371
378
) -> Result < Self , Error > {
372
379
debug ! (
373
380
"new_ssl socket_addrs.domain():{:?} validate_domain:{} timeout:{:?}" ,
@@ -378,16 +385,27 @@ impl RawClient<ElectrumSslStream> {
378
385
if validate_domain {
379
386
socket_addrs. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
380
387
}
388
+
389
+ let crypto_provider = match crypto_provider {
390
+ Some ( provider) => provider. to_owned ( ) ,
391
+
392
+ #[ cfg( feature = "use-rustls" ) ]
393
+ None => default_provider ( ) ,
394
+
395
+ #[ cfg( feature = "use-rustls-ring" ) ]
396
+ None => default_provider ( ) ,
397
+ } ;
398
+
381
399
match timeout {
382
400
Some ( timeout) => {
383
401
let stream = connect_with_total_timeout ( socket_addrs. clone ( ) , timeout) ?;
384
402
stream. set_read_timeout ( Some ( timeout) ) ?;
385
403
stream. set_write_timeout ( Some ( timeout) ) ?;
386
- Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream)
404
+ Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream, crypto_provider )
387
405
}
388
406
None => {
389
407
let stream = TcpStream :: connect ( socket_addrs. clone ( ) ) ?;
390
- Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream)
408
+ Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream, crypto_provider )
391
409
}
392
410
}
393
411
}
@@ -397,10 +415,13 @@ impl RawClient<ElectrumSslStream> {
397
415
socket_addr : A ,
398
416
validate_domain : bool ,
399
417
tcp_stream : TcpStream ,
418
+ crypto_provider : CryptoProvider ,
400
419
) -> Result < Self , Error > {
401
420
use std:: convert:: TryFrom ;
402
421
403
- let builder = ClientConfig :: builder ( ) ;
422
+ let builder = ClientConfig :: builder_with_provider ( crypto_provider. into ( ) )
423
+ . with_safe_default_protocol_versions ( )
424
+ . map_err ( |e| Error :: CouldNotBuildWithSafeDefaultVersion ( e) ) ?;
404
425
405
426
let config = if validate_domain {
406
427
socket_addr. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
@@ -480,6 +501,7 @@ impl RawClient<ElectrumProxyStream> {
480
501
validate_domain : bool ,
481
502
proxy : & crate :: Socks5Config ,
482
503
timeout : Option < Duration > ,
504
+ crypto_provider : Option < & CryptoProvider > ,
483
505
) -> Result < RawClient < ElectrumSslStream > , Error > {
484
506
let target = target_addr. to_target_addr ( ) ?;
485
507
@@ -496,7 +518,22 @@ impl RawClient<ElectrumProxyStream> {
496
518
stream. get_mut ( ) . set_read_timeout ( timeout) ?;
497
519
stream. get_mut ( ) . set_write_timeout ( timeout) ?;
498
520
499
- RawClient :: new_ssl_from_stream ( target, validate_domain, stream. into_inner ( ) )
521
+ let crypto_provider = match crypto_provider {
522
+ Some ( provider) => provider. to_owned ( ) ,
523
+
524
+ #[ cfg( feature = "use-rustls" ) ]
525
+ None => default_provider ( ) ,
526
+
527
+ #[ cfg( feature = "use-rustls-ring" ) ]
528
+ None => default_provider ( ) ,
529
+ } ;
530
+
531
+ RawClient :: new_ssl_from_stream (
532
+ target,
533
+ validate_domain,
534
+ stream. into_inner ( ) ,
535
+ crypto_provider,
536
+ )
500
537
}
501
538
}
502
539
0 commit comments