From e536d6b23212120001a9ba3852b69e41276c9f28 Mon Sep 17 00:00:00 2001 From: Avril Date: Fri, 13 Aug 2021 16:19:01 +0100 Subject: [PATCH] Moved async_stream::Sink into seperate files. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fortune for chacha20stream's current commit: Curse − 凶 --- src/stream_async/mod.rs | 146 ++++++++++++++++++ src/{stream_async.rs => stream_async/sink.rs} | 143 +---------------- 2 files changed, 147 insertions(+), 142 deletions(-) create mode 100644 src/stream_async/mod.rs rename src/{stream_async.rs => stream_async/sink.rs} (54%) diff --git a/src/stream_async/mod.rs b/src/stream_async/mod.rs new file mode 100644 index 0000000..add6495 --- /dev/null +++ b/src/stream_async/mod.rs @@ -0,0 +1,146 @@ +use super::*; +use key::*; + +use std::io; +use tokio::io::AsyncWrite; +use std::{ + pin::Pin, + task::{Context, Poll}, +}; + +use std::fmt; +use openssl::{ + symm::Crypter, + error::ErrorStack, +}; + +/// Size of the in-structure buffer +#[cfg(feature="smallvec")] +pub const BUFFER_SIZE: usize = 32; + +#[cfg(feature="smallvec")] +type BufferVec = smallvec::SmallVec<[u8; BUFFER_SIZE]>; +#[cfg(not(feature="smallvec"))] +type BufferVec = Vec; + +pub type Error = ErrorStack; + +pub mod sink; +pub use sink::Sink; + +#[cfg(test)] +mod test +{ + use tokio::prelude::*; + #[tokio::test] + async fn sink_sync() + { + let mut output = Vec::new(); + let input = "Hello world!"; + let (key, iv) = crate::cha::keygen(); + + let encrypted = { + let mut sink = super::Sink::encrypt(&mut output, key, iv).expect("Sink::encrypt"); + sink.write_all(input.as_bytes()).await.expect("Sink::write_all"); + sink.flush().await.expect("Sink::flush"); + sink.shutdown().await.expect("Sink::shutdown"); + + sink.into_inner().clone() + }; + + output.clear(); + let decrypted = { + let mut sink = super::Sink::decrypt(&mut output, key, iv).expect("Sink::decrypt"); + sink.write_all(&encrypted[..]).await.expect("Sink::write_all"); + + sink.flush().await.expect("Sink::flush"); + sink.shutdown().await.expect("Sink::shutdown"); + + sink.into_inner().clone() + }; + assert_eq!(&decrypted[..], input.as_bytes()); + } + #[tokio::test] + async fn sink_mem() + { + const BACKLOG: usize = 4; + let (mut client, mut server) = tokio::io::duplex(BACKLOG); + let (key, iv) = crate::cha::keygen(); + + let input = "Hello!"; + + let enctask = tokio::spawn(async move { + let mut sink = super::Sink::encrypt(&mut client, key, iv).expect("Sink::encrypt"); + sink.write_all(input.as_bytes()).await.expect("Sink::write_all"); + sink.flush().await.expect("Sink::flush"); + sink.shutdown().await.expect("Sink::shutdown"); + + drop(client); + }); + + let (mut declient, mut deserver) = tokio::io::duplex(BACKLOG * 2); + let dectask = tokio::spawn(async move { + + let mut sink = super::Sink::decrypt(&mut declient, key, iv).expect("Sink::encrypt"); + tokio::io::copy(&mut server, &mut sink).await.expect("Copy to sink failed"); + sink.flush().await.expect("Sink::flush"); + sink.shutdown().await.expect("Sink::shutdown"); + }); + + let (de, en) = tokio::join![dectask, enctask]; + + de.expect("Dec task panic"); + en.expect("Enc task panic"); + + let mut output = Vec::new(); + tokio::io::copy(&mut deserver, &mut output).await.expect("Copy into vec"); + + println!("In: {}, Out: {}", String::from_utf8_lossy(&output[..]), input); + assert_eq!(&output[..], input.as_bytes()); + } + #[tokio::test] + async fn sink_files() + { + let mut output = tokio::fs::File::from_std(tempfile::tempfile().unwrap()); + + let input = "Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!"; + let (key, iv) = crate::cha::keygen(); + + { + let mut sink = super::Sink::encrypt(&mut output, key, iv).expect("Sink::encrypt"); + sink.write_all(input.as_bytes()).await.expect("Sink::write_all"); + sink.flush().await.expect("Sink::flush"); + sink.shutdown().await.expect("Sink::shutdown"); + } + + let mut encrypted = output; + encrypted.seek(tokio::io::SeekFrom::Start(0)).await.unwrap(); + + let mut output = tokio::fs::File::from_std(tempfile::tempfile().unwrap()); + { + let mut sink = super::Sink::decrypt(&mut output, key, iv).expect("Sink::decrypt"); + tokio::io::copy(&mut encrypted, &mut sink).await.expect("Copy to sinl"); + + sink.flush().await.expect("Sink::flush"); + sink.shutdown().await.expect("Sink::shutdown"); + } + let mut decrypted = output; + + let (r1, r2) = tokio::join![encrypted.sync_data(), + decrypted.sync_data()]; + r1.expect("enc sync"); + r2.expect("dec sync"); + + let decrypted = { + decrypted.seek(tokio::io::SeekFrom::Start(0)).await.unwrap(); + + let mut output = vec![0u8; input.len()]; + decrypted.read_exact(&mut output[..]).await.expect("Read decrypted"); + + output + }; + + assert_eq!(&decrypted[..], input.as_bytes()); + } +} + diff --git a/src/stream_async.rs b/src/stream_async/sink.rs similarity index 54% rename from src/stream_async.rs rename to src/stream_async/sink.rs index bca460f..b925782 100644 --- a/src/stream_async.rs +++ b/src/stream_async/sink.rs @@ -1,29 +1,5 @@ +//! Asyncronous `Write` wrapper. use super::*; -use key::*; - -use std::io; -use tokio::io::AsyncWrite; -use std::{ - pin::Pin, - task::{Context, Poll}, -}; - -use std::fmt; -use openssl::{ - symm::Crypter, - error::ErrorStack, -}; - -/// Size of the in-structure buffer -#[cfg(feature="smallvec")] -pub const BUFFER_SIZE: usize = 32; - -#[cfg(feature="smallvec")] -type BufferVec = smallvec::SmallVec<[u8; BUFFER_SIZE]>; -#[cfg(not(feature="smallvec"))] -type BufferVec = Vec; - -pub type Error = ErrorStack; /// Async ChaCha Sink /// @@ -214,120 +190,3 @@ impl AsyncWrite for Sink poll } } - -#[cfg(test)] -mod test -{ - use tokio::prelude::*; - #[tokio::test] - async fn sink_sync() - { - let mut output = Vec::new(); - let input = "Hello world!"; - let (key, iv) = crate::cha::keygen(); - - let encrypted = { - let mut sink = super::Sink::encrypt(&mut output, key, iv).expect("Sink::encrypt"); - sink.write_all(input.as_bytes()).await.expect("Sink::write_all"); - sink.flush().await.expect("Sink::flush"); - sink.shutdown().await.expect("Sink::shutdown"); - - sink.into_inner().clone() - }; - - output.clear(); - let decrypted = { - let mut sink = super::Sink::decrypt(&mut output, key, iv).expect("Sink::decrypt"); - sink.write_all(&encrypted[..]).await.expect("Sink::write_all"); - - sink.flush().await.expect("Sink::flush"); - sink.shutdown().await.expect("Sink::shutdown"); - - sink.into_inner().clone() - }; - assert_eq!(&decrypted[..], input.as_bytes()); - } - #[tokio::test] - async fn sink_mem() - { - const BACKLOG: usize = 4; - let (mut client, mut server) = tokio::io::duplex(BACKLOG); - let (key, iv) = crate::cha::keygen(); - - let input = "Hello!"; - - let enctask = tokio::spawn(async move { - let mut sink = super::Sink::encrypt(&mut client, key, iv).expect("Sink::encrypt"); - sink.write_all(input.as_bytes()).await.expect("Sink::write_all"); - sink.flush().await.expect("Sink::flush"); - sink.shutdown().await.expect("Sink::shutdown"); - - drop(client); - }); - - let (mut declient, mut deserver) = tokio::io::duplex(BACKLOG * 2); - let dectask = tokio::spawn(async move { - - let mut sink = super::Sink::decrypt(&mut declient, key, iv).expect("Sink::encrypt"); - tokio::io::copy(&mut server, &mut sink).await.expect("Copy to sink failed"); - sink.flush().await.expect("Sink::flush"); - sink.shutdown().await.expect("Sink::shutdown"); - }); - - let (de, en) = tokio::join![dectask, enctask]; - - de.expect("Dec task panic"); - en.expect("Enc task panic"); - - let mut output = Vec::new(); - tokio::io::copy(&mut deserver, &mut output).await.expect("Copy into vec"); - - println!("In: {}, Out: {}", String::from_utf8_lossy(&output[..]), input); - assert_eq!(&output[..], input.as_bytes()); - } - #[tokio::test] - async fn sink_files() - { - let mut output = tokio::fs::File::from_std(tempfile::tempfile().unwrap()); - - let input = "Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!Hello world!"; - let (key, iv) = crate::cha::keygen(); - - { - let mut sink = super::Sink::encrypt(&mut output, key, iv).expect("Sink::encrypt"); - sink.write_all(input.as_bytes()).await.expect("Sink::write_all"); - sink.flush().await.expect("Sink::flush"); - sink.shutdown().await.expect("Sink::shutdown"); - } - - let mut encrypted = output; - encrypted.seek(tokio::io::SeekFrom::Start(0)).await.unwrap(); - - let mut output = tokio::fs::File::from_std(tempfile::tempfile().unwrap()); - { - let mut sink = super::Sink::decrypt(&mut output, key, iv).expect("Sink::decrypt"); - tokio::io::copy(&mut encrypted, &mut sink).await.expect("Copy to sinl"); - - sink.flush().await.expect("Sink::flush"); - sink.shutdown().await.expect("Sink::shutdown"); - } - let mut decrypted = output; - - let (r1, r2) = tokio::join![encrypted.sync_data(), - decrypted.sync_data()]; - r1.expect("enc sync"); - r2.expect("dec sync"); - - let decrypted = { - decrypted.seek(tokio::io::SeekFrom::Start(0)).await.unwrap(); - - let mut output = vec![0u8; input.len()]; - decrypted.read_exact(&mut output[..]).await.expect("Read decrypted"); - - output - }; - - assert_eq!(&decrypted[..], input.as_bytes()); - } -} -