| @@ -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)); | ||||
| } | } | ||||