@@ -31,11 +31,17 @@ use openssl::ssl::{SslConnector, SslMethod, SslStream, SslVerifyMode};
3131 not( feature = "use-openssl" )
3232) ) ]
3333use rustls:: {
34+ crypto:: CryptoProvider ,
3435 pki_types:: ServerName ,
3536 pki_types:: { Der , TrustAnchor } ,
3637 ClientConfig , ClientConnection , RootCertStore , StreamOwned ,
3738} ;
3839
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+
3945#[ cfg( any( feature = "default" , feature = "proxy" ) ) ]
4046use crate :: socks:: { Socks5Stream , TargetAddr , ToTargetAddr } ;
4147
@@ -368,6 +374,7 @@ impl RawClient<ElectrumSslStream> {
368374 socket_addrs : A ,
369375 validate_domain : bool ,
370376 timeout : Option < Duration > ,
377+ crypto_provider : Option < & CryptoProvider > ,
371378 ) -> Result < Self , Error > {
372379 debug ! (
373380 "new_ssl socket_addrs.domain():{:?} validate_domain:{} timeout:{:?}" ,
@@ -378,16 +385,27 @@ impl RawClient<ElectrumSslStream> {
378385 if validate_domain {
379386 socket_addrs. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
380387 }
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+
381399 match timeout {
382400 Some ( timeout) => {
383401 let stream = connect_with_total_timeout ( socket_addrs. clone ( ) , timeout) ?;
384402 stream. set_read_timeout ( Some ( timeout) ) ?;
385403 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 )
387405 }
388406 None => {
389407 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 )
391409 }
392410 }
393411 }
@@ -397,10 +415,13 @@ impl RawClient<ElectrumSslStream> {
397415 socket_addr : A ,
398416 validate_domain : bool ,
399417 tcp_stream : TcpStream ,
418+ crypto_provider : CryptoProvider ,
400419 ) -> Result < Self , Error > {
401420 use std:: convert:: TryFrom ;
402421
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) ) ?;
404425
405426 let config = if validate_domain {
406427 socket_addr. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
@@ -480,6 +501,7 @@ impl RawClient<ElectrumProxyStream> {
480501 validate_domain : bool ,
481502 proxy : & crate :: Socks5Config ,
482503 timeout : Option < Duration > ,
504+ crypto_provider : Option < & CryptoProvider > ,
483505 ) -> Result < RawClient < ElectrumSslStream > , Error > {
484506 let target = target_addr. to_target_addr ( ) ?;
485507
@@ -496,7 +518,22 @@ impl RawClient<ElectrumProxyStream> {
496518 stream. get_mut ( ) . set_read_timeout ( timeout) ?;
497519 stream. get_mut ( ) . set_write_timeout ( timeout) ?;
498520
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+ )
500537 }
501538}
502539
0 commit comments