@@ -22,6 +22,10 @@ use bitcoin::{Script, Txid};
2222#[ cfg( feature = "use-openssl" ) ]
2323use openssl:: ssl:: { SslConnector , SslMethod , SslStream , SslVerifyMode } ;
2424
25+ #[ cfg( feature = "use-rustls" ) ]
26+ use rustls:: crypto:: aws_lc_rs:: default_provider;
27+ #[ cfg( feature = "use-rustls-ring" ) ]
28+ use rustls:: crypto:: ring:: default_provider;
2529#[ cfg( all(
2630 any(
2731 feature = "default" ,
@@ -31,6 +35,7 @@ use openssl::ssl::{SslConnector, SslMethod, SslStream, SslVerifyMode};
3135 not( feature = "use-openssl" )
3236) ) ]
3337use rustls:: {
38+ crypto:: CryptoProvider ,
3439 pki_types:: ServerName ,
3540 pki_types:: { Der , TrustAnchor } ,
3641 ClientConfig , ClientConnection , RootCertStore , StreamOwned ,
@@ -368,6 +373,7 @@ impl RawClient<ElectrumSslStream> {
368373 socket_addrs : A ,
369374 validate_domain : bool ,
370375 timeout : Option < Duration > ,
376+ crypto_provider : Option < & CryptoProvider > ,
371377 ) -> Result < Self , Error > {
372378 debug ! (
373379 "new_ssl socket_addrs.domain():{:?} validate_domain:{} timeout:{:?}" ,
@@ -378,16 +384,27 @@ impl RawClient<ElectrumSslStream> {
378384 if validate_domain {
379385 socket_addrs. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
380386 }
387+
388+ let crypto_provider = match crypto_provider {
389+ Some ( provider) => provider. to_owned ( ) ,
390+
391+ #[ cfg( feature = "use-rustls" ) ]
392+ None => default_provider ( ) ,
393+
394+ #[ cfg( feature = "use-rustls-ring" ) ]
395+ None => default_provider ( ) ,
396+ } ;
397+
381398 match timeout {
382399 Some ( timeout) => {
383400 let stream = connect_with_total_timeout ( socket_addrs. clone ( ) , timeout) ?;
384401 stream. set_read_timeout ( Some ( timeout) ) ?;
385402 stream. set_write_timeout ( Some ( timeout) ) ?;
386- Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream)
403+ Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream, crypto_provider )
387404 }
388405 None => {
389406 let stream = TcpStream :: connect ( socket_addrs. clone ( ) ) ?;
390- Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream)
407+ Self :: new_ssl_from_stream ( socket_addrs, validate_domain, stream, crypto_provider )
391408 }
392409 }
393410 }
@@ -397,10 +414,13 @@ impl RawClient<ElectrumSslStream> {
397414 socket_addr : A ,
398415 validate_domain : bool ,
399416 tcp_stream : TcpStream ,
417+ crypto_provider : CryptoProvider ,
400418 ) -> Result < Self , Error > {
401419 use std:: convert:: TryFrom ;
402420
403- let builder = ClientConfig :: builder ( ) ;
421+ let builder = ClientConfig :: builder_with_provider ( crypto_provider. into ( ) )
422+ . with_safe_default_protocol_versions ( )
423+ . map_err ( |e| Error :: CouldNotBuildWithSafeDefaultVersion ( e) ) ?;
404424
405425 let config = if validate_domain {
406426 socket_addr. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
@@ -480,6 +500,7 @@ impl RawClient<ElectrumProxyStream> {
480500 validate_domain : bool ,
481501 proxy : & crate :: Socks5Config ,
482502 timeout : Option < Duration > ,
503+ crypto_provider : Option < & CryptoProvider > ,
483504 ) -> Result < RawClient < ElectrumSslStream > , Error > {
484505 let target = target_addr. to_target_addr ( ) ?;
485506
@@ -496,7 +517,22 @@ impl RawClient<ElectrumProxyStream> {
496517 stream. get_mut ( ) . set_read_timeout ( timeout) ?;
497518 stream. get_mut ( ) . set_write_timeout ( timeout) ?;
498519
499- RawClient :: new_ssl_from_stream ( target, validate_domain, stream. into_inner ( ) )
520+ let crypto_provider = match crypto_provider {
521+ Some ( provider) => provider. to_owned ( ) ,
522+
523+ #[ cfg( feature = "use-rustls" ) ]
524+ None => default_provider ( ) ,
525+
526+ #[ cfg( feature = "use-rustls-ring" ) ]
527+ None => default_provider ( ) ,
528+ } ;
529+
530+ RawClient :: new_ssl_from_stream (
531+ target,
532+ validate_domain,
533+ stream. into_inner ( ) ,
534+ crypto_provider,
535+ )
500536 }
501537}
502538
0 commit comments