@@ -34,7 +34,7 @@ use iroh_base::{PublicKey, SecretKey};
3434use n0_future:: { SinkExt , TryStreamExt } ;
3535use nested_enum_utils:: common_fields;
3636#[ cfg( feature = "server" ) ]
37- use rand:: { CryptoRng , RngCore } ;
37+ use rand:: CryptoRng ;
3838use snafu:: { Backtrace , ResultExt , Snafu } ;
3939use tracing:: trace;
4040
@@ -196,7 +196,7 @@ pub(crate) enum VerificationError {
196196impl ServerChallenge {
197197 /// Generates a new challenge.
198198 #[ cfg( feature = "server" ) ]
199- pub ( crate ) fn new ( mut rng : impl RngCore + CryptoRng ) -> Self {
199+ pub ( crate ) fn new < R : CryptoRng + ? Sized > ( rng : & mut R ) -> Self {
200200 let mut challenge = [ 0u8 ; 16 ] ;
201201 rng. fill_bytes ( & mut challenge) ;
202202 Self { challenge }
@@ -402,7 +402,6 @@ pub(crate) enum Mechanism {
402402pub ( crate ) async fn serverside (
403403 io : & mut ( impl BytesStreamSink + ExportKeyingMaterial ) ,
404404 client_auth_header : Option < HeaderValue > ,
405- rng : impl RngCore + CryptoRng ,
406405) -> Result < SuccessfulAuthentication , Error > {
407406 if let Some ( client_auth_header) = client_auth_header {
408407 let client_auth_bytes = data_encoding:: BASE64URL_NOPAD
@@ -433,7 +432,7 @@ pub(crate) async fn serverside(
433432 // We'll fall back to verification that takes another round trip more time.
434433 }
435434
436- let challenge = ServerChallenge :: new ( rng) ;
435+ let challenge = ServerChallenge :: new ( & mut rand :: rng ( ) ) ;
437436 write_frame ( io, & challenge) . await ?;
438437
439438 let ( _, frame) = read_frame ( io, & [ ClientAuth :: TAG ] ) . await ?;
@@ -531,6 +530,7 @@ mod tests {
531530 use iroh_base:: { PublicKey , SecretKey } ;
532531 use n0_future:: { Sink , SinkExt , Stream , TryStreamExt } ;
533532 use n0_snafu:: { Result , ResultExt } ;
533+ use rand:: SeedableRng ;
534534 use tokio_util:: codec:: { Framed , LengthDelimitedCodec } ;
535535 use tracing:: { Instrument , info_span} ;
536536 use tracing_test:: traced_test;
@@ -647,10 +647,9 @@ mod tests {
647647 }
648648 . instrument ( info_span ! ( "clientside" ) ) ,
649649 async {
650- let auth_n =
651- super :: serverside ( & mut server_io, client_auth_header, rand:: rngs:: OsRng )
652- . await
653- . context ( "serverside" ) ?;
650+ let auth_n = super :: serverside ( & mut server_io, client_auth_header)
651+ . await
652+ . context ( "serverside" ) ?;
654653 let mechanism = auth_n. mechanism ;
655654 let is_authorized = restricted_to. is_none_or ( |key| key == auth_n. client_key ) ;
656655 let key = auth_n. authorize_if ( is_authorized, & mut server_io) . await ?;
@@ -664,7 +663,9 @@ mod tests {
664663 #[ tokio:: test]
665664 #[ traced_test]
666665 async fn test_handshake_via_shared_secrets ( ) -> Result {
667- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
666+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
667+
668+ let secret_key = SecretKey :: generate ( & mut rng) ;
668669 let ( client, server) = simulate_handshake ( & secret_key, Some ( 42 ) , Some ( 42 ) , None ) . await ;
669670 client?;
670671 let ( public_key, auth) = server?;
@@ -676,7 +677,9 @@ mod tests {
676677 #[ tokio:: test]
677678 #[ traced_test]
678679 async fn test_handshake_via_challenge ( ) -> Result {
679- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
680+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
681+
682+ let secret_key = SecretKey :: generate ( & mut rng) ;
680683 let ( client, server) = simulate_handshake ( & secret_key, None , None , None ) . await ;
681684 client?;
682685 let ( public_key, auth) = server?;
@@ -688,7 +691,9 @@ mod tests {
688691 #[ tokio:: test]
689692 #[ traced_test]
690693 async fn test_handshake_mismatching_shared_secrets ( ) -> Result {
691- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
694+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
695+
696+ let secret_key = SecretKey :: generate ( & mut rng) ;
692697 // mismatching shared secrets *might* happen with HTTPS proxies that don't also middle-man the shared secret
693698 let ( client, server) = simulate_handshake ( & secret_key, Some ( 10 ) , Some ( 99 ) , None ) . await ;
694699 client?;
@@ -701,7 +706,8 @@ mod tests {
701706 #[ tokio:: test]
702707 #[ traced_test]
703708 async fn test_handshake_challenge_fallback ( ) -> Result {
704- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
709+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
710+ let secret_key = SecretKey :: generate ( & mut rng) ;
705711 // clients might not have access to shared secrets
706712 let ( client, server) = simulate_handshake ( & secret_key, None , Some ( 99 ) , None ) . await ;
707713 client?;
@@ -714,7 +720,8 @@ mod tests {
714720 #[ tokio:: test]
715721 #[ traced_test]
716722 async fn test_handshake_with_auth_positive ( ) -> Result {
717- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
723+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
724+ let secret_key = SecretKey :: generate ( & mut rng) ;
718725 let public_key = secret_key. public ( ) ;
719726 let ( client, server) = simulate_handshake ( & secret_key, None , None , Some ( public_key) ) . await ;
720727 client?;
@@ -726,9 +733,10 @@ mod tests {
726733 #[ tokio:: test]
727734 #[ traced_test]
728735 async fn test_handshake_with_auth_negative ( ) -> Result {
729- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
736+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
737+ let secret_key = SecretKey :: generate ( & mut rng) ;
730738 let public_key = secret_key. public ( ) ;
731- let wrong_secret_key = SecretKey :: generate ( rand :: rngs :: OsRng ) ;
739+ let wrong_secret_key = SecretKey :: generate ( & mut rng ) ;
732740 let ( client, server) =
733741 simulate_handshake ( & wrong_secret_key, None , None , Some ( public_key) ) . await ;
734742 assert ! ( client. is_err( ) ) ;
@@ -739,9 +747,10 @@ mod tests {
739747 #[ tokio:: test]
740748 #[ traced_test]
741749 async fn test_handshake_via_shared_secret_with_auth_negative ( ) -> Result {
742- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
750+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
751+ let secret_key = SecretKey :: generate ( & mut rng) ;
743752 let public_key = secret_key. public ( ) ;
744- let wrong_secret_key = SecretKey :: generate ( rand :: rngs :: OsRng ) ;
753+ let wrong_secret_key = SecretKey :: generate ( & mut rng ) ;
745754 let ( client, server) =
746755 simulate_handshake ( & wrong_secret_key, Some ( 42 ) , Some ( 42 ) , Some ( public_key) ) . await ;
747756 assert ! ( client. is_err( ) ) ;
@@ -751,8 +760,9 @@ mod tests {
751760
752761 #[ test]
753762 fn test_client_auth_roundtrip ( ) -> Result {
754- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
755- let challenge = ServerChallenge :: new ( rand:: rngs:: OsRng ) ;
763+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
764+ let secret_key = SecretKey :: generate ( & mut rng) ;
765+ let challenge = ServerChallenge :: new ( & mut rng) ;
756766 let client_auth = ClientAuth :: new ( & secret_key, & challenge) ;
757767
758768 let bytes = postcard:: to_allocvec ( & client_auth) . e ( ) ?;
@@ -766,7 +776,8 @@ mod tests {
766776
767777 #[ test]
768778 fn test_km_client_auth_roundtrip ( ) -> Result {
769- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
779+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
780+ let secret_key = SecretKey :: generate ( & mut rng) ;
770781 let client_auth = KeyMaterialClientAuth :: new (
771782 & secret_key,
772783 & TestKeyingMaterial {
@@ -787,8 +798,9 @@ mod tests {
787798
788799 #[ test]
789800 fn test_challenge_verification ( ) -> Result {
790- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
791- let challenge = ServerChallenge :: new ( rand:: rngs:: OsRng ) ;
801+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
802+ let secret_key = SecretKey :: generate ( & mut rng) ;
803+ let challenge = ServerChallenge :: new ( & mut rng) ;
792804 let client_auth = ClientAuth :: new ( & secret_key, & challenge) ;
793805 assert ! ( client_auth. verify( & challenge) . is_ok( ) ) ;
794806
@@ -797,7 +809,8 @@ mod tests {
797809
798810 #[ test]
799811 fn test_key_material_verification ( ) -> Result {
800- let secret_key = SecretKey :: generate ( rand:: rngs:: OsRng ) ;
812+ let mut rng = rand_chacha:: ChaCha8Rng :: seed_from_u64 ( 0u64 ) ;
813+ let secret_key = SecretKey :: generate ( & mut rng) ;
801814 let io = TestKeyingMaterial {
802815 inner : ( ) ,
803816 shared_secret : Some ( 42 ) ,
0 commit comments