Skip to main content

binary_codec/bitstream/
mod.rs

1pub mod reader;
2pub mod writer;
3
4/// Crypto Stream
5pub trait CryptoStream {
6    /// Applies the keystream byte to the given byte and returns the result.
7    fn apply_keystream_byte(&mut self, b: u8) -> u8;
8
9    /// Applies the keystream to the given slice and returns the result.
10    fn apply_keystream(&mut self, slice: &[u8]) -> &[u8];
11
12    /// Get the underlying original/encrypted buffer
13    /// `original` indicates whether to return the original (unencrypted) buffer or the encrypted buffer.
14    fn get_cached(&self, original: bool) -> &[u8];
15
16    /// Extend the internal state of this crypto stream with another's.
17    fn replace(&mut self, other: &Box<dyn CryptoStream>);
18}
19
20#[cfg(test)]
21mod tests {
22    use crate::bitstream::{reader::BitStreamReader, writer::BitStreamWriter};
23
24    #[test]
25    fn can_serialize_and_deserialize_using_bitstream() {
26        let mut buffer = Vec::new();
27        let mut writer = BitStreamWriter::new(&mut buffer);
28
29        writer.write_bit(true);
30        writer.write_bit(false);
31        writer.write_bit(true);
32        writer.write_byte(12);
33        writer.write_bytes(&[34, 56]);
34
35        assert_eq!(writer.byte_pos(), 4);
36
37        let mut reader = BitStreamReader::new(&buffer);
38        assert_eq!(reader.read_bit().unwrap(), true);
39        assert_eq!(reader.read_bit().unwrap(), false);
40        assert_eq!(reader.read_bit().unwrap(), true);
41        assert_eq!(reader.read_byte().unwrap(), 12);
42        assert_eq!(reader.read_byte().unwrap(), 34);
43        assert_eq!(reader.read_byte().unwrap(), 56);
44
45        assert_eq!(buffer, [0b00000101, 12, 34, 56]);
46    }
47}