From 56858c4109ff37a168ee2bc96641df4f2f5e1b04 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Dec 2019 14:46:15 +0000 Subject: [PATCH 1/4] provider: sending proper public keys to directory server --- Cargo.lock | 50 ++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 48 ++++++++++++++------------------------ src/provider/mod.rs | 50 +++++++++++++++++++++++++++++++--------- src/provider/presence.rs | 12 +++++++--- 5 files changed, 116 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cd56c97e08..00d72ba61b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -797,6 +797,11 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazycell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" version = "0.2.65" @@ -892,6 +897,17 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio-named-pipes" version = "0.1.6" @@ -983,12 +999,14 @@ dependencies = [ "sfw-provider-requests 0.1.0", "sphinx 0.1.0", "tokio 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ws 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "nym-sfw-provider" version = "0.1.0" dependencies = [ + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1484,6 +1502,17 @@ dependencies = [ "sphinx 0.1.0", ] +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sha2" version = "0.8.0" @@ -1949,6 +1978,23 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ws" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -2053,6 +2099,7 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum keystream 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" "checksum lioness 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" "checksum lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e57b3997725d2b60dbec1297f6c2e2957cc383db1cebd6be812163f969c7d586" @@ -2065,6 +2112,7 @@ dependencies = [ "checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" "checksum miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625" "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" +"checksum mio-extras 2.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" "checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" @@ -2126,6 +2174,7 @@ dependencies = [ "checksum serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0" "checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" "checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" @@ -2178,4 +2227,5 @@ dependencies = [ "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +"checksum ws 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a2c47b5798ccc774ffb93ff536aec7c4275d722fd9c740c83cdd1af1f2d94" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/Cargo.toml b/Cargo.toml index adc36dc964..37e504aad1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +base64 = "0.11.0" clap = "2.33.0" curve25519-dalek = "1.2.3" hex = "0.4.0" diff --git a/src/main.rs b/src/main.rs index b4146f4b2b..b31f1e7b9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use crate::provider::presence; use crate::provider::ServiceProvider; use clap::{App, Arg, ArgMatches, SubCommand}; use curve25519_dalek::scalar::Scalar; +use nym_client::identity::mixnet::KeyPair; use std::net::ToSocketAddrs; use std::path::PathBuf; use std::process; @@ -43,13 +44,6 @@ fn main() { .takes_value(true) .required(true), ) - .arg( - Arg::with_name("keyfile") - .short("k") - .long("keyfile") - .help("Optional path to the persistent keyfile of the node") - .takes_value(true), - ) .arg( Arg::with_name("storeDir") .short("s") @@ -72,31 +66,22 @@ fn main() { } fn run(matches: &ArgMatches) { - println!("Running the service provider!"); + println!("Running the service provider"); let is_local = matches.is_present("local"); let mix_host = matches.value_of("mixHost").unwrap_or("0.0.0.0"); let mix_port = match matches.value_of("mixPort").unwrap().parse::() { Ok(n) => n, - Err(err) => panic!("Invalid port value provided - {:?}", err), + Err(err) => panic!("Invalid mix host port value provided - {:?}", err), }; let client_host = matches.value_of("clientHost").unwrap_or("0.0.0.0"); let client_port = match matches.value_of("clientPort").unwrap().parse::() { Ok(n) => n, - Err(err) => panic!("Invalid port value provided - {:?}", err), + Err(err) => panic!("Invalid client port value provided - {:?}", err), }; - let secret_key: Scalar = match matches.value_of("keyfile") { - Some(keyfile) => { - println!("Todo: load keyfile from <{:?}>", keyfile); - Default::default() - } - None => { - println!("Todo: generate fresh sphinx keypair"); - Default::default() - } - }; + let key_pair = KeyPair::new(); // TODO: persist this so keypairs don't change every restart let store_dir = PathBuf::from(matches.value_of("storeDir").unwrap()); @@ -104,7 +89,7 @@ fn run(matches: &ArgMatches) { println!("The value of mix_port is: {:?}", mix_port); println!("The value of client_host is: {:?}", client_host); println!("The value of client_port is: {:?}", client_port); - println!("The value of key is: {:?}", secret_key); + println!("The value of key is: {:?}", key_pair.private.clone()); println!("The value of store_dir is: {:?}", store_dir); let mix_socket_address = (mix_host, mix_port) @@ -128,21 +113,22 @@ fn run(matches: &ArgMatches) { client_socket_address ); - // Start sending presence notifications in a separate thread - thread::spawn(move || { - let notifier = presence::Notifier::new(is_local.clone()); - notifier.run(); - }); - - // make sure our socket_address is equal to our predefined-hardcoded value - // assert_eq!("127.0.0.1:8081", mix_socket_address.to_string()); - let provider = ServiceProvider::new( mix_socket_address, client_socket_address, - secret_key, + key_pair.private, store_dir, ); + + // Start sending presence notifications in a separate thread + thread::spawn(move || { + // TODO + // let key_bytes = self.public_key.to_bytes().to_vec(); + // let b64 = base64::encode_config(&key_bytes, base64::URL_SAFE); + // b64.to_string() + let notifier = presence::Notifier::new(is_local.clone(), mix_socket_address, &key_pair); + notifier.run(); + }); provider.start_listening().unwrap() } diff --git a/src/provider/mod.rs b/src/provider/mod.rs index 4fb98cf6c2..3009ba2c15 100644 --- a/src/provider/mod.rs +++ b/src/provider/mod.rs @@ -28,7 +28,12 @@ pub struct ServiceProvider { } impl ServiceProvider { - pub fn new(mix_network_address: SocketAddr, client_network_address: SocketAddr, secret_key: Scalar, store_dir: PathBuf) -> Self { + pub fn new( + mix_network_address: SocketAddr, + client_network_address: SocketAddr, + secret_key: Scalar, + store_dir: PathBuf, + ) -> Self { ServiceProvider { mix_network_address, client_network_address, @@ -37,8 +42,10 @@ impl ServiceProvider { } } - - async fn process_mixnet_socket_connection(mut socket: tokio::net::TcpStream, processing_data: Arc>) { + async fn process_mixnet_socket_connection( + mut socket: tokio::net::TcpStream, + processing_data: Arc>, + ) { let mut buf = [0u8; sphinx::PACKET_SIZE]; // In a loop, read data from the socket and write the data back. @@ -50,14 +57,21 @@ impl ServiceProvider { return; } Ok(_) => { - let store_data = match MixPacketProcessor::process_sphinx_data_packet(buf.as_ref(), processing_data.as_ref()) { + let store_data = match MixPacketProcessor::process_sphinx_data_packet( + buf.as_ref(), + processing_data.as_ref(), + ) { Ok(sd) => sd, Err(e) => { eprintln!("failed to process sphinx packet; err = {:?}", e); return; } }; - ClientStorage::store_processed_data(store_data, processing_data.read().unwrap().store_dir.as_path()).unwrap_or_else(|e| { + ClientStorage::store_processed_data( + store_data, + processing_data.read().unwrap().store_dir.as_path(), + ) + .unwrap_or_else(|e| { eprintln!("failed to store processed sphinx message; err = {:?}", e); return; }); @@ -86,7 +100,10 @@ impl ServiceProvider { } // TODO: FIGURE OUT HOW TO SET READ_DEADLINES IN TOKIO - async fn process_client_socket_connection(mut socket: tokio::net::TcpStream, processing_data: Arc>) { + async fn process_client_socket_connection( + mut socket: tokio::net::TcpStream, + processing_data: Arc>, + ) { let mut buf = [0; 1024]; // TODO: restore the for loop once we go back to persistent tcp socket connection @@ -97,7 +114,10 @@ impl ServiceProvider { Err(()) } Ok(n) => { - match ClientRequestProcessor::process_client_request(buf[..n].as_ref(), processing_data.as_ref()) { + match ClientRequestProcessor::process_client_request( + buf[..n].as_ref(), + processing_data.as_ref(), + ) { Err(e) => { eprintln!("failed to process client request; err = {:?}", e); Err(()) @@ -129,7 +149,8 @@ impl ServiceProvider { async fn start_mixnet_listening(&self) -> Result<(), Box> { let mut listener = tokio::net::TcpListener::bind(self.mix_network_address).await?; - let processing_data = MixProcessingData::new(self.secret_key, self.store_dir.clone()).add_arc_rwlock(); + let processing_data = + MixProcessingData::new(self.secret_key, self.store_dir.clone()).add_arc_rwlock(); loop { let (socket, _) = listener.accept().await?; @@ -137,7 +158,8 @@ impl ServiceProvider { // (if I understand it all correctly) let thread_processing_data = processing_data.clone(); tokio::spawn(async move { - ServiceProvider::process_mixnet_socket_connection(socket, thread_processing_data).await + ServiceProvider::process_mixnet_socket_connection(socket, thread_processing_data) + .await }); } } @@ -152,12 +174,18 @@ impl ServiceProvider { // (if I understand it all correctly) let thread_processing_data = processing_data.clone(); tokio::spawn(async move { - ServiceProvider::process_client_socket_connection(socket, thread_processing_data).await + ServiceProvider::process_client_socket_connection(socket, thread_processing_data) + .await }); } } - async fn start_listeners(&self) -> (Result<(), Box>, Result<(), Box>) { + async fn start_listeners( + &self, + ) -> ( + Result<(), Box>, + Result<(), Box>, + ) { futures::future::join(self.start_mixnet_listening(), self.start_client_listening()).await } diff --git a/src/provider/presence.rs b/src/provider/presence.rs index 21412e2e8a..21869cb25c 100644 --- a/src/provider/presence.rs +++ b/src/provider/presence.rs @@ -1,5 +1,7 @@ use nym_client::clients::directory; use nym_client::clients::directory::DirectoryClient; +use nym_client::identity::mixnet::KeyPair; +use std::net::SocketAddr; use std::thread; use std::time::Duration; @@ -13,18 +15,22 @@ pub struct Notifier { } impl Notifier { - pub fn new(is_local: bool) -> Notifier { + pub fn new(is_local: bool, host: SocketAddr, key_pair: &KeyPair) -> Notifier { let url = if is_local { "http://localhost:8080".to_string() } else { "https://directory.nymtech.net".to_string() }; + let key_bytes = key_pair.public.to_bytes().to_vec(); + let b64 = base64::encode_config(&key_bytes, base64::URL_SAFE); + let public_key64 = b64.to_string(); + let config = directory::Config { base_url: url }; let net_client = directory::Client::new(config); let presence = MixProviderPresence { - host: "halpin.org:6666".to_string(), - pub_key: "superkey".to_string(), + host: host.to_string(), + pub_key: public_key64, registered_clients: vec![], }; Notifier { From e6350a0ea42e50e0a7db0274e7d50d95f69a3245 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Dec 2019 14:46:37 +0000 Subject: [PATCH 2/4] main: removing superseded comment --- src/main.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index b31f1e7b9a..842182f2c1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -122,10 +122,6 @@ fn run(matches: &ArgMatches) { // Start sending presence notifications in a separate thread thread::spawn(move || { - // TODO - // let key_bytes = self.public_key.to_bytes().to_vec(); - // let b64 = base64::encode_config(&key_bytes, base64::URL_SAFE); - // b64.to_string() let notifier = presence::Notifier::new(is_local.clone(), mix_socket_address, &key_pair); notifier.run(); }); From 3f5e219b1c566801f97de4907143d2dfaf253c03 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 16 Dec 2019 14:47:18 +0000 Subject: [PATCH 3/4] whitespace --- src/provider/presence.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/provider/presence.rs b/src/provider/presence.rs index 21869cb25c..189adeaa4b 100644 --- a/src/provider/presence.rs +++ b/src/provider/presence.rs @@ -6,7 +6,6 @@ use std::thread; use std::time::Duration; use nym_client::clients::directory::presence::MixProviderPresence; - use nym_client::clients::directory::requests::presence_providers_post::PresenceMixProviderPoster; pub struct Notifier { From 016f5829a551d745d12404f4040f4b3f68951dc2 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Thu, 19 Dec 2019 11:46:30 +0000 Subject: [PATCH 4/4] Removing required arguments and setting default values --- src/main.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4a6614d546..00662a0f59 100644 --- a/src/main.rs +++ b/src/main.rs @@ -47,7 +47,6 @@ fn main() { .long("storeDir") .help("Directory storing all packets for the clients") .takes_value(true) - .required(true), ) .arg( Arg::with_name("registeredLedger") @@ -55,7 +54,6 @@ fn main() { .long("registeredLedger") .help("Directory of the ledger of registered clients") .takes_value(true) - .required(true), ).arg(Arg::with_name("local") .long("local") .help("Flag to indicate whether the provider should run on a local deployment.") @@ -110,8 +108,16 @@ fn new_config(matches: &ArgMatches) -> provider::Config { }; let key_pair = KeyPair::new(); // TODO: persist this so keypairs don't change every restart - let store_dir = PathBuf::from(matches.value_of("storeDir").unwrap_or("/tmp/nym-provider")); - let registered_client_ledger_dir = PathBuf::from(matches.value_of("registeredLedger").unwrap()); + let store_dir = PathBuf::from( + matches + .value_of("storeDir") + .unwrap_or("/tmp/nym-provider/inboxes"), + ); + let registered_client_ledger_dir = PathBuf::from( + matches + .value_of("registeredLedger") + .unwrap_or("/tmp/nym-provider/registered_clients"), + ); println!("The value of mix_host is: {:?}", mix_host); println!("The value of mix_port is: {:?}", mix_port);