diff --git a/src/comms.rs b/src/comms.rs new file mode 100644 index 0000000..a5d6844 --- /dev/null +++ b/src/comms.rs @@ -0,0 +1,36 @@ +use super::crypto; +use aes_gcm::{aead::consts::U12, aes::Aes256, AesGcm}; +use rand::rngs::OsRng; +use std::error::Error; +use tokio::{ + io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter}, + net::tcp::{ReadHalf, WriteHalf}, +}; + +pub async fn send_bytes( + writer: &mut BufWriter>, + enc: Option<(&mut AesGcm, &mut OsRng)>, + data: &Vec, +) -> Result<(), Box> { + let processed = enc.map_or(Ok(data.clone()), |enc| { + crypto::aes_encrypt(data, enc.0, enc.1) + })?; + writer.write_all(&processed).await?; + writer.flush().await?; + + Ok(()) +} + +pub async fn recv_bytes( + reader: &mut BufReader>, + cipher: Option<&mut AesGcm>, + buf: &mut Vec, +) -> Result<(), Box> { + let recv_bytes = reader.read_until(b'\n', buf).await?; + *buf = cipher.map_or(Ok(buf.clone()), |c| crypto::aes_decrypt(&buf, c))?; + if recv_bytes == 0 { + todo!("ERROR: No message received or client crashed"); + } + + Ok(()) +}