@@ -78,6 +78,12 @@ version = "1.0.0" | |||||
source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" | checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" | ||||
[[package]] | |||||
name = "base64" | |||||
version = "0.12.1" | |||||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" | |||||
[[package]] | [[package]] | ||||
name = "bitflags" | name = "bitflags" | ||||
version = "1.2.1" | version = "1.2.1" | ||||
@@ -483,6 +489,7 @@ dependencies = [ | |||||
"futures-util", | "futures-util", | ||||
"ilmp", | "ilmp", | ||||
"lazy_static", | "lazy_static", | ||||
"orion", | |||||
"ring", | "ring", | ||||
"serde", | "serde", | ||||
"serde_json", | "serde_json", | ||||
@@ -538,6 +545,18 @@ version = "1.4.0" | |||||
source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" | checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" | ||||
[[package]] | |||||
name = "orion" | |||||
version = "0.15.1" | |||||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
checksum = "6e2dd0d645e94ec75aacc27460cb68438263342f4e4e1aeaf7af67847687e7a8" | |||||
dependencies = [ | |||||
"base64", | |||||
"getrandom", | |||||
"subtle", | |||||
"zeroize", | |||||
] | |||||
[[package]] | [[package]] | ||||
name = "pin-project" | name = "pin-project" | ||||
version = "0.4.16" | version = "0.4.16" | ||||
@@ -773,6 +792,12 @@ dependencies = [ | |||||
"syn", | "syn", | ||||
] | ] | ||||
[[package]] | |||||
name = "subtle" | |||||
version = "2.2.2" | |||||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
checksum = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" | |||||
[[package]] | [[package]] | ||||
name = "syn" | name = "syn" | ||||
version = "1.0.21" | version = "1.0.21" | ||||
@@ -1001,3 +1026,9 @@ dependencies = [ | |||||
"winapi 0.2.8", | "winapi 0.2.8", | ||||
"winapi-build", | "winapi-build", | ||||
] | ] | ||||
[[package]] | |||||
name = "zeroize" | |||||
version = "1.1.0" | |||||
source = "registry+https://github.com/rust-lang/crates.io-index" | |||||
checksum = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" |
@@ -19,3 +19,4 @@ toml = "0.5.6" | |||||
ilmp = { path = "../ilmp"} | ilmp = { path = "../ilmp"} | ||||
ring = "0.16.13" | ring = "0.16.13" | ||||
thiserror = "1.0.18" | thiserror = "1.0.18" | ||||
orion = "0.15.1" |
@@ -2,25 +2,25 @@ | |||||
use crate::config::ClientConfig as Config; | use crate::config::ClientConfig as Config; | ||||
use crate::Result; | use crate::Result; | ||||
use async_std::net::TcpStream; | use async_std::net::TcpStream; | ||||
/*use futures::io::ReadHalf;*/ | |||||
use futures_util::io::AsyncReadExt; | use futures_util::io::AsyncReadExt; | ||||
/// wraps the client | /// wraps the client | ||||
pub async fn client(port: u16) -> Result<()> { | pub async fn client(port: u16) -> Result<()> { | ||||
let _config = Config::load()?; | let _config = Config::load()?; | ||||
let mut stream = TcpStream::connect(format!("127.0.0.1:{}", &port)).await?; | |||||
let stream = TcpStream::connect(format!("127.0.0.1:{}", &port)).await?; | |||||
println!("connection established to: {}:{}", stream.peer_addr()?.ip(), port); | println!("connection established to: {}:{}", stream.peer_addr()?.ip(), port); | ||||
let (mut read, mut write) = stream.split(); | |||||
let message = ilmp::Message::new( | |||||
let key = crate::initialize_connection(&mut read, &mut write).await?; | |||||
println!("{:?}", key); | |||||
/*let message = ilmp::Message::new( | |||||
"Isabelle".to_owned(), | "Isabelle".to_owned(), | ||||
"oh god oh fuck this shit actually works".to_owned(), | "oh god oh fuck this shit actually works".to_owned(), | ||||
); | ); | ||||
ilmp::write(&mut stream, message, ilmp::NoEncrypt::new()).await; | |||||
ilmp::write(&mut stream, message, encrypt::NoEncrypt::new()).await?;*/ | |||||
loop {} | loop {} | ||||
/*let (read, mut write) = stream.split();*/ | |||||
Ok(()) | |||||
} | } |
@@ -3,7 +3,12 @@ mod client; | |||||
mod config; | mod config; | ||||
mod server; | mod server; | ||||
use ring::{agreement, rand}; | |||||
use async_std::net::TcpStream; | |||||
use futures::io::{ReadHalf, WriteHalf}; | |||||
use ilmp::encrypt; | |||||
use ilmp::Sendable; | |||||
use orion::aead; | |||||
use ring::{agreement, digest, rand}; | |||||
use thiserror::Error; | use thiserror::Error; | ||||
// re-exports | // re-exports | ||||
@@ -20,21 +25,35 @@ pub enum MsgError { | |||||
StdIo(#[from] std::io::Error), | StdIo(#[from] std::io::Error), | ||||
#[error("toml error")] | #[error("toml error")] | ||||
Toml(#[from] toml::de::Error), | Toml(#[from] toml::de::Error), | ||||
#[error("ring fucking broke")] | |||||
Ring, | |||||
#[error("orion error")] | |||||
Orion(#[from] orion::errors::UnknownCryptoError), | |||||
} | } | ||||
pub struct AsymmetricKeys { | |||||
pub private: agreement::EphemeralPrivateKey, | |||||
pub public: agreement::PublicKey, | |||||
} | |||||
/// uses ring's agreement to generate key material and key | |||||
pub async fn initialize_connection( | |||||
read: &mut ReadHalf<TcpStream>, | |||||
write: &mut WriteHalf<TcpStream>, | |||||
) -> Result<aead::SecretKey> { | |||||
// create / send agreement key | |||||
let rng = rand::SystemRandom::new(); | |||||
let my_priv_key = | |||||
agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng).expect("ring broke"); | |||||
let my_pub_key = my_priv_key.compute_public_key().expect("ring broke"); | |||||
let agreement_packet = ilmp::Agreement::new(my_pub_key.as_ref().into()); | |||||
ilmp::write(write, agreement_packet, encrypt::NoEncrypt::new()).await?; | |||||
// receive peer's pub key | |||||
let packet = ilmp::read(read).await?.unwrap(); | |||||
let agreement_packet = ilmp::Agreement::from_packet(packet)?; | |||||
let peer_pub_key = | |||||
agreement::UnparsedPublicKey::new(&agreement::X25519, agreement_packet.public_key); | |||||
impl AsymmetricKeys { | |||||
pub fn generate() -> AsymmetricKeys { | |||||
let rng = rand::SystemRandom::new(); | |||||
let private = agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng) | |||||
.expect("failed to create private key"); | |||||
let public = private | |||||
.compute_public_key() | |||||
.expect("failed to create public key"); | |||||
AsymmetricKeys { private, public } | |||||
} | |||||
// generate aead key | |||||
agreement::agree_ephemeral(my_priv_key, &peer_pub_key, MsgError::Ring, |key_material| { | |||||
let key_material = | |||||
digest::digest(&digest::SHA256, key_material.as_ref().into()).as_ref().to_vec(); | |||||
Ok(aead::SecretKey::from_slice(&key_material)?) | |||||
}) | |||||
} | } |
@@ -18,7 +18,6 @@ lazy_static! { | |||||
/// wraps the server | /// wraps the server | ||||
pub async fn server(port: u16) -> Result<()> { | pub async fn server(port: u16) -> Result<()> { | ||||
let asym_keys = crate::AsymmetricKeys::generate(); | |||||
let listener = TcpListener::bind(format!("127.0.0.1:{}", &port)).await?; | let listener = TcpListener::bind(format!("127.0.0.1:{}", &port)).await?; | ||||
println!("online as server at: {}:{}", listener.local_addr()?.ip(), port); | println!("online as server at: {}:{}", listener.local_addr()?.ip(), port); | ||||
@@ -31,11 +30,12 @@ pub async fn server(port: u16) -> Result<()> { | |||||
println!("new stream from: {}", &stream_addr); | println!("new stream from: {}", &stream_addr); | ||||
let (read, write) = stream.split(); | |||||
let (mut read, mut write) = stream.split(); | |||||
let stream_id = Uuid::new_v4(); | let stream_id = Uuid::new_v4(); | ||||
let key = crate::initialize_connection(&mut read, &mut write).await?; | |||||
println!("{:?}", key); | |||||
WRITE_STREAMS.lock().expect("could not aqcuire lock").insert(stream_id.clone(), write); | WRITE_STREAMS.lock().expect("could not aqcuire lock").insert(stream_id.clone(), write); | ||||
task::spawn(handle_stream(read, stream_id)); | task::spawn(handle_stream(read, stream_id)); | ||||
} | } | ||||