Skip to content

Commit 74f1ee3

Browse files
feat!: update to [email protected] (#41)
* feat: update to [email protected] * fixup * update iroh-metrics * update to released version * happy deny
1 parent 60dfdbb commit 74f1ee3

File tree

10 files changed

+243
-170
lines changed

10 files changed

+243
-170
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ genawaiter = { version = "0.99.1", features = ["futures03"] }
4040
hashlink = { version = "0.9.0", optional = true }
4141
hex = "0.4.3"
4242
indicatif = { version = "0.17.8", optional = true }
43-
iroh-base = { version = "0.29.0" }
43+
iroh-base = { version = "0.30" }
4444
iroh-io = { version = "0.6.0", features = ["stats"] }
45-
iroh-metrics = { version = "0.29.0", default-features = false }
46-
iroh = "0.29.0"
45+
iroh-metrics = { version = "0.30.0", default-features = false }
46+
iroh = "0.30"
4747
nested_enum_utils = { version = "0.1.0", optional = true }
4848
num_cpus = "1.15.0"
4949
oneshot = "0.1.8"
@@ -66,6 +66,7 @@ serde = { version = "1", features = ["derive"] }
6666
serde-error = "0.1.3"
6767
smallvec = { version = "1.10.0", features = ["serde", "const_new"] }
6868
strum = { version = "0.26.3", optional = true }
69+
ssh-key = { version = "0.6", optional = true, features = ["ed25519"] }
6970
tempfile = { version = "3.10.0", optional = true }
7071
thiserror = "2"
7172
tokio = { version = "1", features = ["fs"] }
@@ -79,8 +80,8 @@ console = { version = "0.15.8", optional = true }
7980

8081
[dev-dependencies]
8182
http-body = "1.0"
82-
iroh-test = { version = "0.29" }
83-
iroh = { version = "0.29", features = ["test-utils"] }
83+
iroh-test = { version = "0.30" }
84+
iroh = { version = "0.30", features = ["test-utils"] }
8485
futures-buffered = "0.2.4"
8586
proptest = "1.0.0"
8687
serde_json = "1.0.107"
@@ -103,14 +104,15 @@ metrics = ["iroh-metrics/metrics"]
103104
redb = ["dep:redb"]
104105
cli = ["rpc", "dep:clap", "dep:indicatif", "dep:console"]
105106
rpc = [
106-
"dep:quic-rpc",
107-
"dep:quic-rpc-derive",
108-
"dep:nested_enum_utils",
109-
"dep:strum",
110-
"dep:futures-util",
111-
"dep:portable-atomic",
112-
"dep:walkdir",
113-
"downloader",
107+
"dep:quic-rpc",
108+
"dep:quic-rpc-derive",
109+
"dep:nested_enum_utils",
110+
"dep:strum",
111+
"dep:futures-util",
112+
"dep:portable-atomic",
113+
"dep:walkdir",
114+
"dep:ssh-key",
115+
"downloader",
114116
]
115117

116118
example-iroh = [
@@ -182,7 +184,3 @@ debug-assertions = false
182184
opt-level = 3
183185
panic = 'abort'
184186
incremental = false
185-
186-
[patch.crates-io]
187-
iroh-base = { git = "https://github.com/n0-computer/iroh" }
188-
iroh = { git = "https://github.com/n0-computer/iroh" }

deny.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,4 @@ ignore = [
3737
]
3838

3939
[sources]
40-
allow-git = [
41-
"https://github.com/n0-computer/iroh.git",
42-
]
40+
allow-git = []

examples/hello-world-fetch.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ async fn main() -> Result<()> {
5656
"node relay server url: {:?}",
5757
node.endpoint()
5858
.home_relay()
59+
.get()?
5960
.expect("a default relay url should be provided")
6061
.to_string()
6162
);

examples/local-swarm-discovery.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ async fn main() -> anyhow::Result<()> {
6161
setup_logging();
6262
let cli = Cli::parse();
6363

64-
let key = SecretKey::generate();
64+
let key = SecretKey::generate(rand::rngs::OsRng);
6565
let discovery = LocalSwarmDiscovery::new(key.public())?;
6666

6767
println!("Starting iroh node with local node discovery...");

src/downloader/test.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ async fn smoke_test() {
7676
Downloader::spawn_for_test(dialer.clone(), getter.clone(), concurrency_limits);
7777

7878
// send a request and make sure the peer is requested the corresponding download
79-
let peer = SecretKey::generate().public();
79+
let peer = SecretKey::generate(rand::thread_rng()).public();
8080
let kind: DownloadKind = HashAndFormat::raw(Hash::new([0u8; 32])).into();
8181
let req = DownloadRequest::new(kind, vec![peer]);
8282
let handle = downloader.queue(req).await;
@@ -101,7 +101,7 @@ async fn deduplication() {
101101
let (downloader, _lp) =
102102
Downloader::spawn_for_test(dialer.clone(), getter.clone(), concurrency_limits);
103103

104-
let peer = SecretKey::generate().public();
104+
let peer = SecretKey::generate(rand::thread_rng()).public();
105105
let kind: DownloadKind = HashAndFormat::raw(Hash::new([0u8; 32])).into();
106106
let mut handles = Vec::with_capacity(10);
107107
for _ in 0..10 {
@@ -134,7 +134,7 @@ async fn cancellation() {
134134
let (downloader, _lp) =
135135
Downloader::spawn_for_test(dialer.clone(), getter.clone(), concurrency_limits);
136136

137-
let peer = SecretKey::generate().public();
137+
let peer = SecretKey::generate(rand::thread_rng()).public();
138138
let kind_1: DownloadKind = HashAndFormat::raw(Hash::new([0u8; 32])).into();
139139
let req = DownloadRequest::new(kind_1, vec![peer]);
140140
let handle_a = downloader.queue(req.clone()).await;
@@ -175,7 +175,7 @@ async fn max_concurrent_requests_total() {
175175
Downloader::spawn_for_test(dialer.clone(), getter.clone(), concurrency_limits);
176176

177177
// send the downloads
178-
let peer = SecretKey::generate().public();
178+
let peer = SecretKey::generate(rand::thread_rng()).public();
179179
let mut handles = Vec::with_capacity(5);
180180
let mut expected_history = Vec::with_capacity(5);
181181
for i in 0..5 {
@@ -219,7 +219,7 @@ async fn max_concurrent_requests_per_peer() {
219219
Downloader::spawn_for_test(dialer.clone(), getter.clone(), concurrency_limits);
220220

221221
// send the downloads
222-
let peer = SecretKey::generate().public();
222+
let peer = SecretKey::generate(rand::thread_rng()).public();
223223
let mut handles = Vec::with_capacity(5);
224224
for i in 0..5 {
225225
let kind = HashAndFormat::raw(Hash::new([i; 32]));
@@ -275,7 +275,7 @@ async fn concurrent_progress() {
275275
let (downloader, _lp) =
276276
Downloader::spawn_for_test(dialer.clone(), getter.clone(), Default::default());
277277

278-
let peer = SecretKey::generate().public();
278+
let peer = SecretKey::generate(rand::thread_rng()).public();
279279
let hash = Hash::new([0u8; 32]);
280280
let kind_1 = HashAndFormat::raw(hash);
281281

@@ -369,11 +369,12 @@ async fn long_queue() {
369369

370370
let (downloader, _lp) =
371371
Downloader::spawn_for_test(dialer.clone(), getter.clone(), concurrency_limits);
372+
let mut rng = rand::thread_rng();
372373
// send the downloads
373374
let nodes = [
374-
SecretKey::generate().public(),
375-
SecretKey::generate().public(),
376-
SecretKey::generate().public(),
375+
SecretKey::generate(&mut rng).public(),
376+
SecretKey::generate(&mut rng).public(),
377+
SecretKey::generate(&mut rng).public(),
377378
];
378379
let mut handles = vec![];
379380
for i in 0..100usize {
@@ -417,7 +418,7 @@ async fn fail_while_running() {
417418
.boxed()
418419
}));
419420

420-
let node = SecretKey::generate().public();
421+
let node = SecretKey::generate(rand::thread_rng()).public();
421422
let req_success = DownloadRequest::new(blob_success, vec![node]);
422423
let req_fail = DownloadRequest::new(blob_fail, vec![node]);
423424
let handle_success = downloader.queue(req_success).await;
@@ -437,7 +438,7 @@ async fn retry_nodes_simple() {
437438
let getter = getter::TestingGetter::default();
438439
let (downloader, _lp) =
439440
Downloader::spawn_for_test(dialer.clone(), getter.clone(), Default::default());
440-
let node = SecretKey::generate().public();
441+
let node = SecretKey::generate(rand::thread_rng()).public();
441442
let dial_attempts = Arc::new(AtomicUsize::new(0));
442443
let dial_attempts2 = dial_attempts.clone();
443444
// fail on first dial, then succeed
@@ -467,7 +468,7 @@ async fn retry_nodes_fail() {
467468
Default::default(),
468469
config,
469470
);
470-
let node = SecretKey::generate().public();
471+
let node = SecretKey::generate(rand::thread_rng()).public();
471472
// fail always
472473
dialer.set_dial_outcome(move |_node| false);
473474

@@ -504,8 +505,9 @@ async fn retry_nodes_jump_queue() {
504505
let (downloader, _lp) =
505506
Downloader::spawn_for_test(dialer.clone(), getter.clone(), concurrency_limits);
506507

507-
let good_node = SecretKey::generate().public();
508-
let bad_node = SecretKey::generate().public();
508+
let mut rng = rand::thread_rng();
509+
let good_node = SecretKey::generate(&mut rng).public();
510+
let bad_node = SecretKey::generate(&mut rng).public();
509511

510512
dialer.set_dial_outcome(move |node| node == good_node);
511513
let kind1 = HashAndFormat::raw(Hash::new([0u8; 32]));

src/hash.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
33
use std::{borrow::Borrow, fmt, str::FromStr};
44

5-
use iroh_base::base32::{self, parse_array_hex_or_base32, HexOrBase32ParseError};
65
use postcard::experimental::max_size::MaxSize;
76
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
87

@@ -52,10 +51,10 @@ impl Hash {
5251
self.0.to_hex().to_string()
5352
}
5453

55-
/// Convert to a base32 string limited to the first 10 bytes for a friendly string
54+
/// Convert to a hex string limited to the first 5bytes for a friendly string
5655
/// representation of the hash.
5756
pub fn fmt_short(&self) -> String {
58-
base32::fmt_short(self.as_bytes())
57+
data_encoding::HEXLOWER.encode(&self.as_bytes()[..5])
5958
}
6059
}
6160

@@ -134,11 +133,35 @@ impl fmt::Display for Hash {
134133
}
135134
}
136135

136+
#[derive(Debug, thiserror::Error)]
137+
pub enum HexOrBase32ParseError {
138+
#[error("Invalid length")]
139+
DecodeInvalidLength,
140+
#[error("Failed to decode {0}")]
141+
Decode(#[from] data_encoding::DecodeError),
142+
}
143+
137144
impl FromStr for Hash {
138145
type Err = HexOrBase32ParseError;
139146

140147
fn from_str(s: &str) -> Result<Self, Self::Err> {
141-
parse_array_hex_or_base32(s).map(Hash::from)
148+
let mut bytes = [0u8; 32];
149+
150+
let res = if s.len() == 64 {
151+
// hex
152+
data_encoding::HEXLOWER.decode_mut(s.as_bytes(), &mut bytes)
153+
} else {
154+
data_encoding::BASE32_NOPAD.decode_mut(s.to_ascii_uppercase().as_bytes(), &mut bytes)
155+
};
156+
match res {
157+
Ok(len) => {
158+
if len != 32 {
159+
return Err(HexOrBase32ParseError::DecodeInvalidLength);
160+
}
161+
}
162+
Err(partial) => return Err(partial.error.into()),
163+
}
164+
Ok(Self(blake3::Hash::from_bytes(bytes)))
142165
}
143166
}
144167

src/rpc/client/blobs.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,15 +1903,17 @@ mod tests {
19031903
let (relay_map, _relay_url, _guard) = iroh::test_utils::run_relay_server().await?;
19041904
let dns_pkarr_server = DnsPkarrServer::run().await?;
19051905

1906-
let secret1 = SecretKey::generate();
1906+
let mut rng = rand::thread_rng();
1907+
1908+
let secret1 = SecretKey::generate(&mut rng);
19071909
let endpoint1 = iroh::Endpoint::builder()
19081910
.relay_mode(RelayMode::Custom(relay_map.clone()))
19091911
.insecure_skip_relay_cert_verify(true)
19101912
.dns_resolver(dns_pkarr_server.dns_resolver())
19111913
.secret_key(secret1.clone())
19121914
.discovery(dns_pkarr_server.discovery(secret1));
19131915
let node1 = Node::memory().endpoint(endpoint1).spawn().await?;
1914-
let secret2 = SecretKey::generate();
1916+
let secret2 = SecretKey::generate(&mut rng);
19151917
let endpoint2 = iroh::Endpoint::builder()
19161918
.relay_mode(RelayMode::Custom(relay_map.clone()))
19171919
.insecure_skip_relay_cert_verify(true)

src/ticket.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,13 @@ mod tests {
154154
use std::net::SocketAddr;
155155

156156
use iroh::{PublicKey, SecretKey};
157-
use iroh_base::base32;
158157
use iroh_test::{assert_eq_hex, hexdump::parse_hexdump};
159158

160159
use super::*;
161160

162161
fn make_ticket() -> BlobTicket {
163162
let hash = Hash::new(b"hi there");
164-
let peer = SecretKey::generate().public();
163+
let peer = SecretKey::generate(rand::thread_rng()).public();
165164
let addr = SocketAddr::from_str("127.0.0.1:1234").unwrap();
166165
let relay_url = None;
167166
BlobTicket {
@@ -201,7 +200,11 @@ mod tests {
201200
format: BlobFormat::Raw,
202201
hash,
203202
};
204-
let base32 = base32::parse_vec(ticket.to_string().strip_prefix("blob").unwrap()).unwrap();
203+
let encoded = ticket.to_string();
204+
let stripped = encoded.strip_prefix("blob").unwrap();
205+
let base32 = data_encoding::BASE32_NOPAD
206+
.decode(stripped.to_ascii_uppercase().as_bytes())
207+
.unwrap();
205208
let expected = parse_hexdump("
206209
00 # discriminator for variant 0
207210
ae58ff8833241ac82d6ff7611046ed67b5072d142c588d0063e942d9a75502b6 # node id, 32 bytes, see above

src/util/fs.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,21 @@ pub async fn load_secret_key(key_path: PathBuf) -> anyhow::Result<iroh::SecretKe
133133

134134
if key_path.exists() {
135135
let keystr = tokio::fs::read(key_path).await?;
136-
let secret_key = SecretKey::try_from_openssh(keystr).context("invalid keyfile")?;
136+
137+
let ser_key = ssh_key::private::PrivateKey::from_openssh(keystr)?;
138+
let ssh_key::private::KeypairData::Ed25519(kp) = ser_key.key_data() else {
139+
bail!("invalid key format");
140+
};
141+
let secret_key = SecretKey::from_bytes(&kp.private.to_bytes());
137142
Ok(secret_key)
138143
} else {
139-
let secret_key = SecretKey::generate();
140-
let ser_key = secret_key.to_openssh()?;
144+
let secret_key = SecretKey::generate(rand::rngs::OsRng);
145+
let ckey = ssh_key::private::Ed25519Keypair {
146+
public: secret_key.public().public().into(),
147+
private: secret_key.secret().into(),
148+
};
149+
let ser_key =
150+
ssh_key::private::PrivateKey::from(ckey).to_openssh(ssh_key::LineEnding::default())?;
141151

142152
// Try to canonicalize if possible
143153
let key_path = key_path.canonicalize().unwrap_or(key_path);

0 commit comments

Comments
 (0)