From 3fdf7b4f109997f32b95381029126ece04036335 Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Wed, 5 Feb 2020 12:38:32 +0000 Subject: [PATCH] Provider starting to use new config --- sfw-provider/src/commands/run.rs | 20 +---- .../src/provider/client_handling/mod.rs | 9 +- sfw-provider/src/provider/mix_handling/mod.rs | 7 +- sfw-provider/src/provider/mod.rs | 87 ++++++++----------- 4 files changed, 48 insertions(+), 75 deletions(-) diff --git a/sfw-provider/src/commands/run.rs b/sfw-provider/src/commands/run.rs index 1b49cf3ba2..2280ba9e24 100644 --- a/sfw-provider/src/commands/run.rs +++ b/sfw-provider/src/commands/run.rs @@ -161,24 +161,6 @@ pub fn execute(matches: &ArgMatches) { config.get_clients_ledger_path() ); - // key will be loaded directly provider in just a moment - let key_pair = ServiceProvider::load_sphinx_keys(&config); - - // stupid temporary hack - let private_bytes = key_pair.private_key().to_bytes(); - let public_bytes = key_pair.public_key().to_bytes(); - - let old_startup_config = provider::Config { - client_socket_address: config.get_clients_listening_address(), - directory_server: config.get_presence_directory_server(), - mix_socket_address: config.get_mix_listening_address(), - // identity keys are wrapper for encryption keys so this temporary hack will work to just make it compile once - public_key: MixIdentityPublicKey::from_bytes(public_bytes.as_ref()), - secret_key: MixIdentityPrivateKey::from_bytes(private_bytes.as_ref()), - store_dir: Default::default(), - }; - - let provider = ServiceProvider::new(old_startup_config); - + let provider = ServiceProvider::new(config); provider.start().unwrap() } diff --git a/sfw-provider/src/provider/client_handling/mod.rs b/sfw-provider/src/provider/client_handling/mod.rs index 35fbbf5eb9..bdd39f7286 100644 --- a/sfw-provider/src/provider/client_handling/mod.rs +++ b/sfw-provider/src/provider/client_handling/mod.rs @@ -1,5 +1,6 @@ use crate::provider::storage::{ClientStorage, StoreError}; use crate::provider::ClientLedger; +use crypto::encryption; use crypto::identity::MixIdentityPrivateKey; use futures::lock::Mutex as FMutex; use hmac::{Hmac, Mac}; @@ -54,14 +55,14 @@ impl From for ClientProcessingError { pub(crate) struct ClientProcessingData { store_dir: PathBuf, registered_clients_ledger: Arc>, - secret_key: MixIdentityPrivateKey, + secret_key: encryption::PrivateKey, } impl ClientProcessingData { pub(crate) fn new( store_dir: PathBuf, registered_clients_ledger: Arc>, - secret_key: MixIdentityPrivateKey, + secret_key: encryption::PrivateKey, ) -> Self { ClientProcessingData { store_dir, @@ -132,7 +133,7 @@ impl ClientRequestProcessor { let auth_token = ClientRequestProcessor::generate_new_auth_token( req.destination_address.to_vec(), - processing_data.secret_key, + &processing_data.secret_key, ); if !unlocked_ledger.has_token(&auth_token) { unlocked_ledger.insert_token(auth_token.clone(), req.destination_address); @@ -153,7 +154,7 @@ impl ClientRequestProcessor { std::fs::create_dir_all(full_store_dir) } - fn generate_new_auth_token(data: Vec, key: MixIdentityPrivateKey) -> AuthToken { + fn generate_new_auth_token(data: Vec, key: &encryption::PrivateKey) -> AuthToken { // also note that `new_varkey` doesn't even have an execution branch returning an error let mut auth_token_raw = HmacSha256::new_varkey(&key.to_bytes()) .expect("HMAC should be able take key of any size"); diff --git a/sfw-provider/src/provider/mix_handling/mod.rs b/sfw-provider/src/provider/mix_handling/mod.rs index 60ceaf700e..7e8ceaf085 100644 --- a/sfw-provider/src/provider/mix_handling/mod.rs +++ b/sfw-provider/src/provider/mix_handling/mod.rs @@ -1,4 +1,5 @@ use crate::provider::storage::StoreData; +use crypto::encryption; use crypto::identity::MixIdentityPrivateKey; use log::{error, warn}; use sphinx::{ProcessedPacket, SphinxPacket}; @@ -37,12 +38,12 @@ impl From for MixProcessingError { // ProcessingData defines all data required to correctly unwrap sphinx packets #[derive(Debug, Clone)] pub(crate) struct MixProcessingData { - secret_key: MixIdentityPrivateKey, + secret_key: encryption::PrivateKey, pub(crate) store_dir: PathBuf, } impl MixProcessingData { - pub(crate) fn new(secret_key: MixIdentityPrivateKey, store_dir: PathBuf) -> Self { + pub(crate) fn new(secret_key: encryption::PrivateKey, store_dir: PathBuf) -> Self { MixProcessingData { secret_key, store_dir, @@ -70,7 +71,7 @@ impl MixPacketProcessor { } }; let (client_address, client_surb_id, payload) = - match packet.process(read_processing_data.secret_key.as_scalar()) { + match packet.process(read_processing_data.secret_key.inner()) { Ok(ProcessedPacket::ProcessedPacketFinalHop(client_address, surb_id, payload)) => { (client_address, surb_id, payload) } diff --git a/sfw-provider/src/provider/mod.rs b/sfw-provider/src/provider/mod.rs index a980c454ed..8636932972 100644 --- a/sfw-provider/src/provider/mod.rs +++ b/sfw-provider/src/provider/mod.rs @@ -1,4 +1,5 @@ use crate::config::persistance::pathfinder::ProviderPathfinder; +use crate::config::Config; use crate::provider::client_handling::{ClientProcessingData, ClientRequestProcessor}; use crate::provider::mix_handling::{MixPacketProcessor, MixProcessingData}; use crate::provider::storage::ClientStorage; @@ -28,15 +29,6 @@ mod storage; const STORED_MESSAGE_FILENAME_LENGTH: usize = 16; const MESSAGE_RETRIEVAL_LIMIT: usize = 5; -pub struct Config { - pub client_socket_address: SocketAddr, - pub directory_server: String, - pub mix_socket_address: SocketAddr, - pub public_key: MixIdentityPublicKey, - pub secret_key: MixIdentityPrivateKey, - pub store_dir: PathBuf, -} - #[derive(Debug)] pub enum ProviderError { TcpListenerBindingError, @@ -102,29 +94,34 @@ impl ClientLedger { } pub struct ServiceProvider { - directory_server: String, - mix_network_address: SocketAddr, - client_network_address: SocketAddr, - public_key: MixIdentityPublicKey, - secret_key: MixIdentityPrivateKey, - store_dir: PathBuf, + config: Config, + sphinx_keypair: encryption::KeyPair, registered_clients_ledger: ClientLedger, } impl ServiceProvider { pub fn new(config: Config) -> Self { + let sphinx_keypair = Self::load_sphinx_keys(&config); + ServiceProvider { - mix_network_address: config.mix_socket_address, - client_network_address: config.client_socket_address, - secret_key: config.secret_key, - public_key: config.public_key, - store_dir: PathBuf::from(config.store_dir.clone()), + config, + sphinx_keypair, // TODO: load initial ledger from file registered_clients_ledger: ClientLedger::new(), - directory_server: config.directory_server.clone(), } } + fn load_sphinx_keys(config_file: &Config) -> encryption::KeyPair { + let sphinx_keypair = PemStore::new(ProviderPathfinder::new_from_config(&config_file)) + .read_encryption() + .expect("Failed to read stored sphinx key files"); + println!( + "Public encryption key: {}\nFor time being, it is identical to identity keys", + sphinx_keypair.public_key().to_base58_string() + ); + sphinx_keypair + } + async fn process_mixnet_socket_connection( mut socket: tokio::net::TcpStream, processing_data: Arc>, @@ -239,7 +236,7 @@ impl ServiceProvider { async fn start_mixnet_listening( address: SocketAddr, - secret_key: MixIdentityPrivateKey, + secret_key: encryption::PrivateKey, store_dir: PathBuf, ) -> Result<(), ProviderError> { let mut listener = tokio::net::TcpListener::bind(address).await?; @@ -261,7 +258,7 @@ impl ServiceProvider { address: SocketAddr, store_dir: PathBuf, client_ledger: Arc>, - secret_key: MixIdentityPrivateKey, + secret_key: encryption::PrivateKey, ) -> Result<(), ProviderError> { let mut listener = tokio::net::TcpListener::bind(address).await?; let processing_data = @@ -279,19 +276,6 @@ impl ServiceProvider { } } - // TODO: make private and change config import path - pub fn load_sphinx_keys(config_file: &crate::config::Config) -> encryption::KeyPair { - let sphinx_keypair = PemStore::new(ProviderPathfinder::new_from_config(&config_file)) - .read_encryption() - .expect("Failed to read stored sphinx key files"); - println!( - "Public encryption key: {}\nFor time being, it is identical to identity keys", - sphinx_keypair.public_key().to_base58_string() - ); - sphinx_keypair - } - - // Note: this now consumes the provider pub fn start(self) -> Result<(), Box> { // Create the runtime, probably later move it to Provider struct itself? // TODO: figure out the difference between Runtime and Handle @@ -301,25 +285,30 @@ impl ServiceProvider { let initial_client_ledger = self.registered_clients_ledger; let thread_shareable_ledger = initial_client_ledger.add_arc_futures_mutex(); - let presence_notifier = presence::Notifier::new( - self.directory_server, - self.client_network_address.clone(), - self.mix_network_address.clone(), - self.public_key, - thread_shareable_ledger.clone(), + let notifier_config = presence::NotifierConfig::new( + self.config.get_presence_directory_server(), + self.config.get_mix_announce_address(), + self.config.get_clients_announce_address(), + self.sphinx_keypair.public_key().to_base58_string(), + self.config.get_presence_sending_delay(), ); - let presence_future = rt.spawn(presence_notifier.run()); + let presence_future = rt.spawn({ + let presence_notifier = + presence::Notifier::new(notifier_config, thread_shareable_ledger.clone()); + presence_notifier.run() + }); + let mix_future = rt.spawn(ServiceProvider::start_mixnet_listening( - self.mix_network_address, - self.secret_key.clone(), - self.store_dir.clone(), + self.config.get_mix_listening_address(), + *self.sphinx_keypair.private_key(), + self.config.get_clients_inboxes_dir(), )); let client_future = rt.spawn(ServiceProvider::start_client_listening( - self.client_network_address, - self.store_dir.clone(), + self.config.get_clients_listening_address(), + self.config.get_clients_inboxes_dir(), thread_shareable_ledger, - self.secret_key, + *self.sphinx_keypair.private_key(), )); // Spawn the root task rt.block_on(async {