Skip to content

Commit fc975f4

Browse files
Merge 3d37d62 into 797fae6
2 parents 797fae6 + 3d37d62 commit fc975f4

File tree

32 files changed

+1160
-753
lines changed

32 files changed

+1160
-753
lines changed

Cargo.lock

Lines changed: 848 additions & 530 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

iroh-base/Cargo.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ rust-version = "1.85"
1515
workspace = true
1616

1717
[dependencies]
18-
curve25519-dalek = { version = "4.1.3", features = ["serde", "rand_core", "zeroize"], optional = true }
18+
curve25519-dalek = { version = "=5.0.0-pre.1", features = ["serde", "rand_core", "zeroize"], optional = true }
1919
data-encoding = { version = "2.3.3", optional = true }
20-
ed25519-dalek = { version = "2.1.1", features = ["serde", "rand_core", "zeroize"], optional = true }
20+
ed25519-dalek = { version = "=3.0.0-pre.1", features = ["serde", "rand_core", "zeroize"], optional = true }
2121
derive_more = { version = "2.0.1", features = ["display"], optional = true }
2222
url = { version = "2.5.3", features = ["serde"], optional = true }
2323
postcard = { version = "1", default-features = false, features = ["alloc", "use-std", "experimental-derive"], optional = true }
24-
rand_core = { version = "0.6.4", optional = true }
24+
rand_core = { version = "0.9.3", optional = true }
2525
serde = { version = "1", features = ["derive", "rc"] }
2626
snafu = { version = "0.8.5", features = ["rust_1_81"], optional = true }
2727
n0-snafu = "0.2.2"
@@ -30,7 +30,8 @@ nested_enum_utils = "0.2.0"
3030
[dev-dependencies]
3131
postcard = { version = "1", features = ["use-std"] }
3232
proptest = "1.0.0"
33-
rand = "0.8"
33+
rand = "0.9.2"
34+
rand_chacha = "0.9"
3435
serde_json = "1"
3536
serde_test = "1"
3637

iroh-base/src/key.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use curve25519_dalek::edwards::CompressedEdwardsY;
1313
pub use ed25519_dalek::{Signature, SignatureError};
1414
use ed25519_dalek::{SigningKey, VerifyingKey};
1515
use nested_enum_utils::common_fields;
16-
use rand_core::CryptoRngCore;
16+
use rand_core::CryptoRng;
1717
use serde::{Deserialize, Serialize};
1818
use snafu::{Backtrace, Snafu};
1919

@@ -288,11 +288,10 @@ impl SecretKey {
288288
///
289289
/// ```rust
290290
/// // use the OsRng option for OS depedndent most secure RNG.
291-
/// let mut rng = rand::rngs::OsRng;
292-
/// let _key = iroh_base::SecretKey::generate(&mut rng);
291+
/// let _key = iroh_base::SecretKey::generate(&mut rand::rng());
293292
/// ```
294-
pub fn generate<R: CryptoRngCore>(mut csprng: R) -> Self {
295-
let secret = SigningKey::generate(&mut csprng);
293+
pub fn generate<R: CryptoRng + ?Sized>(csprng: &mut R) -> Self {
294+
let secret = SigningKey::generate(csprng);
296295

297296
Self { secret }
298297
}
@@ -372,6 +371,7 @@ fn decode_base32_hex(s: &str) -> Result<[u8; 32], KeyParsingError> {
372371
#[cfg(test)]
373372
mod tests {
374373
use data_encoding::HEXLOWER;
374+
use rand::SeedableRng;
375375

376376
use super::*;
377377

@@ -405,7 +405,8 @@ mod tests {
405405

406406
#[test]
407407
fn test_from_str() {
408-
let key = SecretKey::generate(&mut rand::thread_rng());
408+
let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0u64);
409+
let key = SecretKey::generate(&mut rng);
409410
assert_eq!(
410411
SecretKey::from_str(&HEXLOWER.encode(&key.to_bytes()))
411412
.unwrap()

iroh-base/src/ticket/node.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,14 @@ mod tests {
136136
use std::net::{Ipv4Addr, SocketAddr};
137137

138138
use data_encoding::HEXLOWER;
139+
use rand::SeedableRng;
139140

140141
use super::*;
141142
use crate::key::{PublicKey, SecretKey};
142143

143144
fn make_ticket() -> NodeTicket {
144-
let peer = SecretKey::generate(&mut rand::thread_rng()).public();
145+
let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0u64);
146+
let peer = SecretKey::generate(&mut rng).public();
145147
let addr = SocketAddr::from((Ipv4Addr::LOCALHOST, 1234));
146148
let relay_url = None;
147149
NodeTicket {

iroh-dns-server/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ iroh-metrics = { version = "0.35", features = ["service"] }
3232
lru = "0.13"
3333
n0-future = "0.1.2"
3434
n0-snafu = "0.2.2"
35-
pkarr = { version = "3.7", features = ["relays", "dht"], default-features = false }
35+
pkarr = { version = "5", features = ["relays", "dht"], default-features = false }
3636
rcgen = "0.13"
3737
redb = "2.6.3"
3838
regex = "1.10.3"
@@ -64,8 +64,8 @@ criterion = "0.5.1"
6464
data-encoding = "2.3.3"
6565
hickory-resolver = "0.25.0"
6666
iroh = { path = "../iroh" }
67-
rand = "0.8"
68-
rand_chacha = "0.3.1"
67+
rand = "0.9.2"
68+
rand_chacha = "0.9"
6969
tracing-test = "0.2.5"
7070

7171
[[bench]]

iroh-dns-server/examples/publish.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ async fn main() -> Result<()> {
6363
Ok(s) => SecretKey::from_str(&s)
6464
.context("failed to parse IROH_SECRET environment variable as iroh secret key")?,
6565
Err(_) => {
66-
let s = SecretKey::generate(rand::rngs::OsRng);
66+
let s = SecretKey::generate(&mut rand::rng());
6767
println!("Generated a new node secret. To reuse, set");
6868
println!(
6969
"\tIROH_SECRET={}",

iroh-dns-server/src/lib.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ mod tests {
2727
};
2828
use n0_snafu::{Result, ResultExt};
2929
use pkarr::{SignedPacket, Timestamp};
30+
use rand::{CryptoRng, SeedableRng};
3031
use tracing_test::traced_test;
3132

3233
use crate::{
@@ -167,7 +168,9 @@ mod tests {
167168

168169
let origin = "irohdns.example.";
169170

170-
let secret_key = SecretKey::generate(rand::thread_rng());
171+
let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0u64);
172+
173+
let secret_key = SecretKey::generate(&mut rng);
171174
let node_id = secret_key.public();
172175
let pkarr = PkarrRelayClient::new(pkarr_relay);
173176
let relay_url: RelayUrl = "https://relay.example.".parse()?;
@@ -189,6 +192,8 @@ mod tests {
189192
#[tokio::test]
190193
#[traced_test]
191194
async fn store_eviction() -> Result {
195+
let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0u64);
196+
192197
let options = ZoneStoreOptions {
193198
eviction: Duration::from_millis(100),
194199
eviction_interval: Duration::from_millis(100),
@@ -198,7 +203,7 @@ mod tests {
198203
let store = ZoneStore::in_memory(options, Default::default())?;
199204

200205
// create a signed packet
201-
let signed_packet = random_signed_packet()?;
206+
let signed_packet = random_signed_packet(&mut rng)?;
202207
let key = PublicKeyBytes::from_signed_packet(&signed_packet);
203208

204209
store
@@ -219,6 +224,8 @@ mod tests {
219224
#[tokio::test]
220225
#[traced_test]
221226
async fn integration_mainline() -> Result {
227+
let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0u64);
228+
222229
// run a mainline testnet
223230
let testnet = pkarr::mainline::Testnet::new_async(5).await.e()?;
224231
let bootstrap = testnet.bootstrap.clone();
@@ -231,7 +238,7 @@ mod tests {
231238
let origin = "irohdns.example.";
232239

233240
// create a signed packet
234-
let secret_key = SecretKey::generate(rand::thread_rng());
241+
let secret_key = SecretKey::generate(&mut rng);
235242
let node_id = secret_key.public();
236243
let relay_url: RelayUrl = "https://relay.example.".parse()?;
237244
let node_info = NodeInfo::new(node_id).with_relay_url(Some(relay_url.clone()));
@@ -260,8 +267,8 @@ mod tests {
260267
DnsResolver::with_nameserver(nameserver)
261268
}
262269

263-
fn random_signed_packet() -> Result<SignedPacket> {
264-
let secret_key = SecretKey::generate(rand::thread_rng());
270+
fn random_signed_packet<R: CryptoRng + ?Sized>(rng: &mut R) -> Result<SignedPacket> {
271+
let secret_key = SecretKey::generate(rng);
265272
let node_id = secret_key.public();
266273
let relay_url: RelayUrl = "https://relay.example.".parse()?;
267274
let node_info = NodeInfo::new(node_id).with_relay_url(Some(relay_url.clone()));

iroh-relay/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ iroh-metrics = { version = "0.35", default-features = false }
3636
n0-future = "0.1.2"
3737
num_enum = "0.7"
3838
pin-project = "1"
39-
pkarr = { version = "3.7", default-features = false, features = ["signed_packet"] }
39+
pkarr = { version = "5", default-features = false, features = ["signed_packet"] }
4040
postcard = { version = "1", default-features = false, features = [
4141
"alloc",
4242
"use-std",
4343
"experimental-derive",
4444
] }
4545
quinn = { package = "iroh-quinn", version = "0.14.0", default-features = false, features = ["rustls-ring"] }
4646
quinn-proto = { package = "iroh-quinn-proto", version = "0.13.0" }
47-
rand = "0.8"
47+
rand = "0.9.2"
4848
reqwest = { version = "0.12", default-features = false, features = [
4949
"rustls-tls",
5050
] }
@@ -123,7 +123,7 @@ getrandom = { version = "0.3.2", features = ["wasm_js"] }
123123
clap = { version = "4", features = ["derive"] }
124124
crypto_box = { version = "0.9.1", features = ["serde", "chacha20"] }
125125
proptest = "1.2.0"
126-
rand_chacha = "0.3.1"
126+
rand_chacha = "0.9"
127127
tokio = { version = "1", features = [
128128
"io-util",
129129
"sync",

iroh-relay/src/protos/handshake.rs

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use iroh_base::{PublicKey, SecretKey};
3434
use n0_future::{SinkExt, TryStreamExt};
3535
use nested_enum_utils::common_fields;
3636
#[cfg(feature = "server")]
37-
use rand::{CryptoRng, RngCore};
37+
use rand::CryptoRng;
3838
use snafu::{Backtrace, ResultExt, Snafu};
3939
use tracing::trace;
4040

@@ -196,7 +196,7 @@ pub(crate) enum VerificationError {
196196
impl 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 {
402402
pub(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

Comments
 (0)