@@ -22,6 +22,10 @@ use bitcoin::{Script, Txid};
22
22
#[ cfg( feature = "use-openssl" ) ]
23
23
use openssl:: ssl:: { SslConnector , SslMethod , SslStream , SslVerifyMode } ;
24
24
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;
25
29
#[ cfg( all(
26
30
any(
27
31
feature = "default" ,
@@ -31,6 +35,7 @@ use openssl::ssl::{SslConnector, SslMethod, SslStream, SslVerifyMode};
31
35
not( feature = "use-openssl" )
32
36
) ) ]
33
37
use rustls:: {
38
+ crypto:: CryptoProvider ,
34
39
pki_types:: ServerName ,
35
40
pki_types:: { Der , TrustAnchor } ,
36
41
ClientConfig , ClientConnection , RootCertStore , StreamOwned ,
@@ -368,6 +373,7 @@ impl RawClient<ElectrumSslStream> {
368
373
socket_addrs : A ,
369
374
validate_domain : bool ,
370
375
timeout : Option < Duration > ,
376
+ crypto_provider : Option < & CryptoProvider > ,
371
377
) -> Result < Self , Error > {
372
378
debug ! (
373
379
"new_ssl socket_addrs.domain():{:?} validate_domain:{} timeout:{:?}" ,
@@ -378,16 +384,27 @@ impl RawClient<ElectrumSslStream> {
378
384
if validate_domain {
379
385
socket_addrs. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
380
386
}
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
+
381
398
match timeout {
382
399
Some ( timeout) => {
383
400
let stream = connect_with_total_timeout ( socket_addrs. clone ( ) , timeout) ?;
384
401
stream. set_read_timeout ( Some ( timeout) ) ?;
385
402
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 )
387
404
}
388
405
None => {
389
406
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 )
391
408
}
392
409
}
393
410
}
@@ -397,10 +414,13 @@ impl RawClient<ElectrumSslStream> {
397
414
socket_addr : A ,
398
415
validate_domain : bool ,
399
416
tcp_stream : TcpStream ,
417
+ crypto_provider : CryptoProvider ,
400
418
) -> Result < Self , Error > {
401
419
use std:: convert:: TryFrom ;
402
420
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) ) ?;
404
424
405
425
let config = if validate_domain {
406
426
socket_addr. domain ( ) . ok_or ( Error :: MissingDomain ) ?;
@@ -480,6 +500,7 @@ impl RawClient<ElectrumProxyStream> {
480
500
validate_domain : bool ,
481
501
proxy : & crate :: Socks5Config ,
482
502
timeout : Option < Duration > ,
503
+ crypto_provider : Option < & CryptoProvider > ,
483
504
) -> Result < RawClient < ElectrumSslStream > , Error > {
484
505
let target = target_addr. to_target_addr ( ) ?;
485
506
@@ -496,7 +517,22 @@ impl RawClient<ElectrumProxyStream> {
496
517
stream. get_mut ( ) . set_read_timeout ( timeout) ?;
497
518
stream. get_mut ( ) . set_write_timeout ( timeout) ?;
498
519
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
+ )
500
536
}
501
537
}
502
538
0 commit comments