1#![cfg_attr(not(feature = "std"), no_std)]
56
57#[cfg(feature = "alloc")]
58extern crate alloc;
59
60#[cfg(feature = "array-buffer")]
61mod array_buffer;
62mod buffer;
63mod error;
64mod reader;
65mod rw;
66mod writer;
67
68pub use aead;
69
70#[cfg(feature = "array-buffer")]
71pub use array_buffer::ArrayBuffer;
72pub use buffer::{CappedBuffer, ResizeBuffer};
73pub use error::{Error, IntoInnerError, InvalidCapacity};
74pub use reader::DecryptBufReader;
75pub use rw::{Read, Write};
76pub use writer::EncryptBufWriter;
77
78use aead::stream::{StreamBE32, StreamLE31};
79
80pub type EncryptBE32BufWriter<A, B, W> = EncryptBufWriter<A, B, W, StreamBE32<A>>;
82pub type EncryptLE31BufWriter<A, B, W> = EncryptBufWriter<A, B, W, StreamLE31<A>>;
84pub type DecryptBE32BufReader<A, B, W> = DecryptBufReader<A, B, W, StreamBE32<A>>;
86pub type DecryptLE31BufReader<A, B, W> = DecryptBufReader<A, B, W, StreamLE31<A>>;
88
89#[cfg(feature = "std")]
90#[cfg(test)]
91mod tests {
92 use super::*;
93 use aead::generic_array::ArrayLength;
94 use aead::stream::{NewStream, Nonce, NonceSize, StreamBE32, StreamPrimitive};
95 use aead::{AeadCore, AeadInPlace, Key, KeyInit};
96 use chacha20poly1305::ChaCha20Poly1305;
97 use core::ops::Sub;
98 use std::io::{Read, Write};
99
100 fn encrypt_decrypt<A, S>(plaintext: &[u8])
101 where
102 A: AeadInPlace + KeyInit + Clone,
103 S: StreamPrimitive<A> + NewStream<A>,
104 <A as AeadCore>::NonceSize: Sub<S::NonceOverhead>,
105 NonceSize<A, S>: ArrayLength<u8>,
106 {
107 let aead = {
108 let mut key = Key::<A>::default();
109 key.copy_from_slice(b"my very super super secret key!!");
110 A::new(&key)
111 };
112 let nonce = Nonce::<A, S>::default();
113
114 let mut blob = Vec::default();
115
116 let mut writer = EncryptBufWriter::<A, _, _, S>::from_aead(
117 aead.clone(),
118 &nonce,
119 ArrayBuffer::<128>::new(),
120 &mut blob,
121 )
122 .unwrap();
123 writer.write_all(plaintext).unwrap();
124 std::io::Write::flush(&mut writer).unwrap();
125 drop(writer);
126
127 let mut reader = DecryptBufReader::<A, _, _, S>::from_aead(
128 aead,
129 ArrayBuffer::<256>::new(),
130 blob.as_slice(),
131 )
132 .unwrap();
133 let mut out = Vec::new();
134 let _ = reader.read_to_end(&mut out).unwrap();
135 assert_eq!(out, plaintext);
136 }
137
138 #[test]
139 fn short_message() {
140 let plaintext = b"hello world!";
141 encrypt_decrypt::<ChaCha20Poly1305, StreamBE32<ChaCha20Poly1305>>(plaintext);
142 encrypt_decrypt::<ChaCha20Poly1305, StreamLE31<ChaCha20Poly1305>>(plaintext);
143 }
144
145 #[test]
146 fn long_message() {
147 let plaintext = b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur eu erat non turpis viverra mollis vel a mauris. Vestibulum luctus justo vitae diam ultrices, eget vehicula velit consectetur. Sed ut sapien odio. Nullam non porttitor augue. Duis euismod, augue sed blandit eleifend, leo enim rhoncus lacus, in efficitur metus massa quis justo. Nunc velit quam, aliquam vitae enim ut, facilisis molestie odio. Phasellus nec euismod nisi, sit amet dignissim arcu. Nullam pulvinar aliquam purus ut aliquet. Sed iaculis, odio in luctus molestie, purus dui vehicula est, sed egestas erat diam sed arcu. Cras venenatis magna vitae tristique mattis.";
148 encrypt_decrypt::<ChaCha20Poly1305, StreamBE32<ChaCha20Poly1305>>(plaintext);
149 encrypt_decrypt::<ChaCha20Poly1305, StreamLE31<ChaCha20Poly1305>>(plaintext);
150 }
151}