wecanencrypt 0.2.0

Simple Rust OpenPGP library for encryption, signing, and key management (includes rpgp).
Documentation
mod compressed;
mod limited;
mod literal;
mod packet_body;
mod signed;
mod signed_one_pass;
mod sym_encrypted;
mod sym_encrypted_protected;

pub use self::{
    compressed::CompressedDataReader, limited::LimitedReader, literal::LiteralDataReader,
    packet_body::PacketBodyReader, signed::SignatureBodyReader,
    signed_one_pass::SignatureOnePassReader, sym_encrypted::SymEncryptedDataReader,
    sym_encrypted_protected::SymEncryptedProtectedDataReader,
};

#[cfg(test)]
mod tests {
    use std::io::{BufReader, Read};

    use rand::SeedableRng;
    use rand_chacha::ChaCha8Rng;
    use testresult::TestResult;

    use crate::pgp::{
        composed::{Message, MessageBuilder},
        packet::DataMode,
        types::CompressionAlgorithm,
        util::test::{check_strings, random_string, ChaosReader},
    };

    #[test]
    fn test_read_literal_data_no_compression() -> TestResult {
        let _ = pretty_env_logger::try_init();
        let mut rng = ChaCha8Rng::seed_from_u64(1);

        for file_size in (1..1024 * 10).step_by(100) {
            for is_partial in [true, false] {
                println!("--- size: {file_size}, is_partial: {is_partial}");

                let buf = random_string(&mut rng, file_size);
                let message = if is_partial {
                    let mut builder = MessageBuilder::from_reader("test.txt", buf.as_bytes());
                    builder.partial_chunk_size(512)?;
                    builder.to_vec(&mut rng)?
                } else {
                    MessageBuilder::from_bytes("test.txt", buf.clone()).to_vec(&mut rng)?
                };

                let reader = ChaosReader::new(rng.clone(), message.clone());
                let mut reader = BufReader::new(reader);
                let mut msg = Message::from_bytes(&mut reader).unwrap();

                let mut out = String::new();
                msg.read_to_string(&mut out)?;
                check_strings(out, buf);

                let header = msg.literal_data_header().unwrap();
                assert_eq!(header.file_name(), &b""[..]);
                assert_eq!(header.mode(), DataMode::Binary);
            }
        }
        Ok(())
    }

    #[test]
    fn test_read_literal_data_compression_zip() -> TestResult {
        let _ = pretty_env_logger::try_init();
        let mut rng = ChaCha8Rng::seed_from_u64(1);

        for file_size in (1..1024 * 10).step_by(100) {
            for is_partial in [true, false] {
                for is_armor in [true, false] {
                    println!(
                        "--- size: {file_size}, is_partial: {is_partial}, is_armor: {is_armor}"
                    );
                    let buf = random_string(&mut rng, file_size);

                    if is_armor {
                        let message = if is_partial {
                            let mut builder =
                                MessageBuilder::from_reader("test.txt", buf.as_bytes());
                            builder
                                .compression(CompressionAlgorithm::ZIP)
                                .partial_chunk_size(512)?;
                            builder.to_armored_string(&mut rng, Default::default())?
                        } else {
                            let mut builder = MessageBuilder::from_bytes("test.txt", buf.clone());
                            builder.compression(CompressionAlgorithm::ZIP);
                            builder.to_armored_string(&mut rng, Default::default())?
                        };
                        let reader = ChaosReader::new(rng.clone(), message.clone());
                        let mut reader = BufReader::new(reader);
                        let (message, _) = Message::from_armor(&mut reader)?;

                        let mut decompressed_message = message.decompress()?;
                        let mut out = String::new();
                        decompressed_message.read_to_string(&mut out)?;

                        check_strings(out, buf);

                        let header = decompressed_message.literal_data_header().unwrap();
                        assert_eq!(header.file_name(), &b""[..]);
                        assert_eq!(header.mode(), DataMode::Binary);
                    } else {
                        let mut builder = MessageBuilder::from_bytes("test.txt", buf.clone());
                        builder.compression(CompressionAlgorithm::ZIP);
                        if is_partial {
                            builder.partial_chunk_size(512)?;
                        }
                        let message = builder.to_vec(&mut rng)?;

                        let reader = ChaosReader::new(rng.clone(), message.clone());
                        let mut reader = BufReader::new(reader);
                        let message = Message::from_bytes(&mut reader)?;

                        let mut decompressed_message = message.decompress()?;
                        let mut out = String::new();
                        decompressed_message.read_to_string(&mut out)?;

                        check_strings(out, buf);

                        let header = decompressed_message.literal_data_header().unwrap();
                        assert_eq!(header.file_name(), &b""[..]);
                        assert_eq!(header.mode(), DataMode::Binary);
                    }
                }
            }
        }
        Ok(())
    }
}