@@ -345,6 +345,7 @@ dependencies = [ | |||||
"crc32fast", | "crc32fast", | ||||
"futures", | "futures", | ||||
"futures-util", | "futures-util", | ||||
"orion", | |||||
"ring", | "ring", | ||||
"serde", | "serde", | ||||
"serde_json", | "serde_json", | ||||
@@ -3,6 +3,7 @@ use crate::config::ClientConfig as Config; | |||||
use crate::Result; | use crate::Result; | ||||
use async_std::net::TcpStream; | use async_std::net::TcpStream; | ||||
use futures_util::io::AsyncReadExt; | use futures_util::io::AsyncReadExt; | ||||
use ilmp::encrypt; | |||||
/// wraps the client | /// wraps the client | ||||
pub async fn client(port: u16) -> Result<()> { | pub async fn client(port: u16) -> Result<()> { | ||||
@@ -13,14 +14,15 @@ pub async fn client(port: u16) -> Result<()> { | |||||
let (mut read, mut write) = stream.split(); | let (mut read, mut write) = stream.split(); | ||||
let key = crate::initialize_connection(&mut read, &mut write).await?; | let key = crate::initialize_connection(&mut read, &mut write).await?; | ||||
println!("{:?}", key); | |||||
let encryption = encrypt::SymmetricEncrypt::new(key); | |||||
println!("successfully hardened connection"); | |||||
/*let message = ilmp::Message::new( | |||||
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, encrypt::NoEncrypt::new()).await?;*/ | |||||
ilmp::write(&mut write, message, &encryption).await?; | |||||
loop {} | loop {} | ||||
} | } |
@@ -42,7 +42,7 @@ pub async fn initialize_connection( | |||||
agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng).expect("ring broke"); | agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng).expect("ring broke"); | ||||
let my_pub_key = my_priv_key.compute_public_key().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()); | let agreement_packet = ilmp::Agreement::new(my_pub_key.as_ref().into()); | ||||
ilmp::write(write, agreement_packet, encrypt::NoEncrypt::new()).await?; | |||||
ilmp::write(write, agreement_packet, &encrypt::NoEncrypt::new()).await?; | |||||
// receive peer's pub key | // receive peer's pub key | ||||
let packet = ilmp::read(read).await?.unwrap(); | let packet = ilmp::read(read).await?.unwrap(); | ||||
@@ -6,8 +6,11 @@ use async_std::{ | |||||
}; | }; | ||||
use futures::io::{ReadHalf, WriteHalf}; | use futures::io::{ReadHalf, WriteHalf}; | ||||
use futures_util::{io::AsyncReadExt, stream::StreamExt}; | use futures_util::{io::AsyncReadExt, stream::StreamExt}; | ||||
use ilmp::encrypt; | |||||
use ilmp::encrypt::Encryption; | |||||
use ilmp::Sendable; | use ilmp::Sendable; | ||||
use lazy_static::lazy_static; | use lazy_static::lazy_static; | ||||
use orion::aead; | |||||
use std::{collections::HashMap, sync::Mutex}; | use std::{collections::HashMap, sync::Mutex}; | ||||
use uuid::Uuid; | use uuid::Uuid; | ||||
@@ -32,20 +35,30 @@ pub async fn server(port: u16) -> Result<()> { | |||||
let (mut read, mut 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?; | let key = crate::initialize_connection(&mut read, &mut write).await?; | ||||
println!("{:?}", key); | |||||
let encryption = encrypt::SymmetricEncrypt::new(key); | |||||
println!("successfully hardened connection"); | |||||
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, encryption)); | |||||
} | } | ||||
Ok(()) | Ok(()) | ||||
} | } | ||||
async fn handle_stream(mut stream: ReadHalf<TcpStream>, stream_id: Uuid) -> Result<()> { | |||||
async fn handle_stream( | |||||
mut stream: ReadHalf<TcpStream>, | |||||
stream_id: Uuid, | |||||
encryption: encrypt::SymmetricEncrypt, | |||||
) -> Result<()> { | |||||
loop { | loop { | ||||
let packet = ilmp::read(&mut stream).await?; | let packet = ilmp::read(&mut stream).await?; | ||||
if let Some(packet) = packet { | |||||
if let Some(mut packet) = packet { | |||||
if packet.encrypt_kind == encrypt::EncryptKind::Symmetric { | |||||
packet.contents = aead::open(encryption.key().unwrap(), &packet.contents)?; | |||||
} | |||||
let res = match packet.kind { | let res = match packet.kind { | ||||
ilmp::PacketKind::Message => ilmp::Message::from_packet(packet), | ilmp::PacketKind::Message => ilmp::Message::from_packet(packet), | ||||
_ => panic!("bad packet"), | _ => panic!("bad packet"), | ||||