diff --git a/Cargo.lock b/Cargo.lock index 70ad6601..c8242769 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3742,6 +3742,7 @@ dependencies = [ "dialoguer", "directories-next", "ecdsa_fun", + "ed25519-dalek", "futures", "get-port", "hyper 0.14.7", diff --git a/swap/Cargo.toml b/swap/Cargo.toml index dac3dacb..b2045724 100644 --- a/swap/Cargo.toml +++ b/swap/Cargo.toml @@ -26,6 +26,7 @@ data-encoding = "2.3" dialoguer = "0.8" directories-next = "2" ecdsa_fun = { git = "https://github.com/LLFourn/secp256kfun", features = ["libsecp_compat", "serde"] } +ed25519-dalek = "1" futures = { version = "0.3", default-features = false } itertools = "0.10" libp2p = { version = "0.37", default-features = false, features = ["tcp-tokio", "yamux", "mplex", "dns-tokio", "noise", "request-response", "websocket"] } diff --git a/swap/src/seed.rs b/swap/src/seed.rs index 1536959d..f5a65777 100644 --- a/swap/src/seed.rs +++ b/swap/src/seed.rs @@ -12,6 +12,7 @@ use std::fmt; use std::fs::{self, File}; use std::io::{self, Write}; use std::path::{Path, PathBuf}; +use torut::onion::TorSecretKeyV3; pub const SEED_LENGTH: usize = 32; @@ -47,6 +48,14 @@ impl Seed { identity::Keypair::Ed25519(key.into()) } + pub fn derive_torv3_key(&self) -> TorSecretKeyV3 { + let bytes = self.derive(b"TOR").bytes(); + let sk = ed25519_dalek::SecretKey::from_bytes(&bytes) + .expect("Failed to create a new extended secret key for Tor."); + let esk = ed25519_dalek::ExpandedSecretKey::from(&sk); + esk.to_bytes().into() + } + pub fn from_file_or_generate(data_dir: &Path) -> Result { let file_path_buf = data_dir.join("seed.pem"); let file_path = Path::new(&file_path_buf);