Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
175 changes: 13 additions & 162 deletions client/network/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
use crate::{
behaviour::{self, Behaviour, BehaviourOut},
bitswap::Bitswap,
config::{parse_str_addr, Params, TransportConfig, AddrWithPeerId},
config::{parse_str_addr, Params, TransportConfig},
discovery::DiscoveryConfig,
error::Error,
network_state::{
Expand Down Expand Up @@ -80,7 +80,8 @@ use std::{
borrow::Cow,
cmp,
collections::{HashMap, HashSet},
fs, iter,
fs, fs::remove_file,
iter,
marker::PhantomData,
num::NonZeroUsize,
pin::Pin,
Expand All @@ -101,13 +102,6 @@ mod tests;

pub use libp2p::identity::{error::DecodingError, Keypair, PublicKey};
use sc_network_common::service::{NetworkBlock, NetworkRequest, NetworkTransaction};
use jsonrpsee::{
core::client::{ClientT, self},
http_client::HttpClientBuilder,
rpc_params,
};
use serde::{Deserialize, Serialize};
use base64::decode;

/// Substrate network service. Handles network IO and manages connectivity.
pub struct NetworkService<B: BlockT + 'static, H: ExHashT> {
Expand Down Expand Up @@ -139,102 +133,6 @@ pub struct NetworkService<B: BlockT + 'static, H: ExHashT> {
_marker: PhantomData<H>,
}

#[allow(non_snake_case)]
#[derive(Serialize, Deserialize)]
pub struct QkdKey {
pub key_ID: String,
pub key: String,
}

#[derive(Deserialize)]
pub struct QkdResponse {
pub keys: Vec<QkdKey>,
}

async fn get_pre_shared_key_rpc(rpc_addr: &AddrWithPeerId, qkd_addr: &AddrWithPeerId, local_peer_id: PeerId) -> Result<String, Error> {
let mut rpc_url = "http://".to_string();
rpc_url.push_str(&rpc_addr.host.to_string());

let client = match HttpClientBuilder::default().build(rpc_url.clone()) {
Ok(client) => client,
Err(_) => {
return Err(Error::BuildHttpClientForRpcError{url: rpc_url})
}
};

let params_rpc = rpc_params![local_peer_id.to_string()];

let response = match client.request::<QkdKey>("psk_getKey", params_rpc).await {
Ok(response) => response,
Err(err) => {
return Err(Error::GetPreSharedKeyError {
err: err.to_string()
})
}
};

let mut qkd_url = String::new();
qkd_url.push_str("http://");
qkd_url.push_str(&qkd_addr.host.to_string());
let path: String = qkd_addr.path.clone().unwrap();
qkd_url.push_str(&path);
qkd_url.push_str("/dec_keys?key_ID=");
qkd_url.push_str(&response.key_ID);

let qkd_response = match reqwest::get(qkd_url).await {
Ok(qkd_response) => qkd_response,
Err(err) => {
return Err(Error::GetPreSharedKeyError {
err: err.to_string()
})
}
};

let body = match qkd_response.text().await {
Ok(b) => b,
Err(_) => {
return Err(Error::GetPreSharedKeyError{
err: "Convert QKD response to string failed.".to_string()}
)
}
};

let psk_key = match serde_json::from_str::<QkdResponse>(&body) {
Ok(psk_key) => psk_key,
Err(_) => {
return Err(Error::GetPreSharedKeyError {
err: "Parsing QKD response failed.".to_string()
})
}
};

let qkd_key_bytes = match decode(psk_key.keys[0].key.clone()) {
Ok(qkd_key_bytes) => qkd_key_bytes,
Err(_) => {
return Err(Error::GetPreSharedKeyError {
err: "Decode QKD key failed.".to_string()
})
}
};

let mut psk_bytes = match hex::decode(response.key.clone()) {
Ok(psk_bytes) => psk_bytes,
Err(_) => {
return Err(Error::GetPreSharedKeyError {
err: "Decode pre-shared key failed.".to_string()
})
}
};

for i in 0..32 {
psk_bytes[i] = qkd_key_bytes[i] ^ psk_bytes[i];
}

let psk_string = hex::encode(psk_bytes.clone());

Ok(psk_string)
}

impl<B, H, Client> NetworkWorker<B, H, Client>
where
B: BlockT + 'static,
Expand All @@ -246,7 +144,7 @@ where
+ Send
+ Sync
+ 'static,
{
{
/// Creates the network service.
///
/// Returns a `NetworkWorker` that implements `Future` and must be regularly polled in order
Expand All @@ -257,61 +155,6 @@ where
let local_identity = params.network_config.node_key.clone().into_keypair()?;
let local_public = local_identity.public();
let local_peer_id = local_public.to_peer_id();

loop {
match params.network_config.pre_shared_key.clone().into_pre_share_key() {
Ok(_) => {
log::info!("Found file with pre-shared key.");
break;
},
Err(err) => {
log::info!("File with pre-shared key not found.");
log::info!("Error: {:?}", err);
let addresses = params.network_config.external_nodes_rpc.clone();
if addresses.is_empty() {
return Err(Error::NotFoundRpcAddresses)
}

let qkd_addrs = params.network_config.qkd_addr.clone();

'mainFor: for addr in &addresses {
for qkd_addr in &qkd_addrs {
if addr.peer_id == qkd_addr.peer_id {
match get_pre_shared_key_rpc(addr, qkd_addr, local_peer_id).await {
Ok(psk) => {
if !psk.is_empty() {

log::info!(
"Request for a pre-shared key to a node with peer id: {:?}",
addr.peer_id.to_string(),
);

params.network_config.pre_shared_key.clone().write_psk_to_file(psk.as_bytes());

log::info!(
"The pre-shared key was sucessfully redone and writen to the file from the node with peer id: {:?}",
addr.peer_id.to_string(),
);

break 'mainFor;
}
},
Err(err) => {
log::info!(
"Failed to get a common key from a node with a peer id: {:?}. Error: {:?}",
addr.peer_id.to_string(),
err
);
continue 'mainFor;
}
}
}
}
log::info!("No QKD address is configured for the node with peer id {:?}", addr.peer_id.to_string());
}
}
}
}

params.network_config.pre_shared_key.clone().into_pre_share_key()?;

Expand Down Expand Up @@ -646,6 +489,14 @@ where
)?;
(params.transactions_handler_executor)(tx_handler.run().boxed());

// after loading psk we can delete it
let _result = match remove_file("psk") {
Err(err) => {
error!("Couldn't remove psk file: {:?}", err)
},
_ => {}
};

Ok(NetworkWorker {
external_addresses,
num_connected,
Expand All @@ -661,7 +512,7 @@ where
boot_node_ids,
})
}

//TODO doc
/// doc
pub fn new_for_test(mut params: Params<B, H, Client>) -> Result<Self, Error> {
Expand Down