#[cfg(test)]
mod tests {
use crate::crypto::{
self, decrypt_stream, derive_key, encrypt_stream, generate_random_bytes, DEFAULT_CHUNK_SIZE,
};
use std::io::Cursor;
#[test]
fn test_key_derivation() {
let password = b"mysecretpassword";
let salt = [0x00; crypto::SALT_LEN];
let key = derive_key(password, &salt);
assert_eq!(key.as_slice().len(), crypto::KEY_LEN);
let password2 = b"anotherpassword";
let key2 = derive_key(password2, &salt);
assert_ne!(key.as_slice(), key2.as_slice());
let salt2 = [0xFF; crypto::SALT_LEN];
let key3 = derive_key(password, &salt2);
assert_ne!(key.as_slice(), key3.as_slice());
}
#[test]
fn test_encrypt_decrypt_roundtrip() -> Result<(), Box<dyn std::error::Error>> {
let original_data =
b"This is a secret message that should be encrypted and then decrypted successfully.";
let password = b"test_password_123";
let salt = generate_random_bytes::<{ crypto::SALT_LEN }>();
let iv = generate_random_bytes::<{ crypto::IV_LEN }>();
let key = derive_key(password, &salt);
let mut input_cursor = Cursor::new(original_data.to_vec());
let mut encrypted_buffer = Cursor::new(Vec::new());
let encrypted_size = encrypt_stream(
&mut input_cursor,
&mut encrypted_buffer,
&key,
&iv,
&[],
DEFAULT_CHUNK_SIZE,
)?;
encrypted_buffer.set_position(0);
let mut decrypted_buffer = Cursor::new(Vec::new());
let decrypted_size = decrypt_stream(
&mut encrypted_buffer,
&mut decrypted_buffer,
&key,
&iv,
&[],
DEFAULT_CHUNK_SIZE,
)?;
assert!(encrypted_size > original_data.len());
assert_eq!(decrypted_size, original_data.len());
assert_eq!(decrypted_buffer.into_inner(), original_data.to_vec());
Ok(())
}
#[test]
fn test_encrypt_decrypt_with_different_chunk_sizes() -> Result<(), Box<dyn std::error::Error>> {
let original_data =
b"Test data for different chunk sizes during encryption and decryption.";
let password = b"chunk_test_password";
let salt = generate_random_bytes::<{ crypto::SALT_LEN }>();
let iv = generate_random_bytes::<{ crypto::IV_LEN }>();
let key = derive_key(password, &salt);
let chunk_sizes = [1024, 4096, 16384];
for chunk_size in chunk_sizes.iter() {
let mut input_cursor = Cursor::new(original_data.to_vec());
let mut encrypted_buffer = Cursor::new(Vec::new());
let encrypted_size = encrypt_stream(
&mut input_cursor,
&mut encrypted_buffer,
&key,
&iv,
&[],
*chunk_size,
)?;
encrypted_buffer.set_position(0);
let mut decrypted_buffer = Cursor::new(Vec::new());
let decrypted_size = decrypt_stream(
&mut encrypted_buffer,
&mut decrypted_buffer,
&key,
&iv,
&[],
*chunk_size,
)?;
assert!(encrypted_size > original_data.len());
assert_eq!(decrypted_size, original_data.len());
assert_eq!(decrypted_buffer.into_inner(), original_data.to_vec());
}
Ok(())
}
#[test]
fn test_encryption_with_wrong_key_fails() -> Result<(), Box<dyn std::error::Error>> {
let original_data = b"Secret message";
let correct_password = b"correct_password";
let wrong_password = b"wrong_password";
let salt = generate_random_bytes::<{ crypto::SALT_LEN }>();
let iv = generate_random_bytes::<{ crypto::IV_LEN }>();
let correct_key = derive_key(correct_password, &salt);
let wrong_key = derive_key(wrong_password, &salt);
let mut input_cursor = Cursor::new(original_data.to_vec());
let mut encrypted_buffer = Cursor::new(Vec::new());
encrypt_stream(
&mut input_cursor,
&mut encrypted_buffer,
&correct_key,
&iv,
&[],
DEFAULT_CHUNK_SIZE,
)?;
encrypted_buffer.set_position(0);
let mut decrypted_buffer = Cursor::new(Vec::new());
let result = decrypt_stream(
&mut encrypted_buffer,
&mut decrypted_buffer,
&wrong_key,
&iv,
&[],
DEFAULT_CHUNK_SIZE,
);
assert!(result.is_err());
Ok(())
}
#[test]
fn test_random_byte_generation() {
let bytes1 = generate_random_bytes::<32>();
let bytes2 = generate_random_bytes::<32>();
assert_ne!(bytes1, bytes2);
assert_eq!(bytes1.len(), 32);
assert_eq!(bytes2.len(), 32);
}
#[test]
fn test_empty_data_encryption() -> Result<(), Box<dyn std::error::Error>> {
let original_data = b"";
let password = b"empty_test_password";
let salt = generate_random_bytes::<{ crypto::SALT_LEN }>();
let iv = generate_random_bytes::<{ crypto::IV_LEN }>();
let key = derive_key(password, &salt);
let mut input_cursor = Cursor::new(original_data.to_vec());
let mut encrypted_buffer = Cursor::new(Vec::new());
let encrypted_size = encrypt_stream(
&mut input_cursor,
&mut encrypted_buffer,
&key,
&iv,
&[],
DEFAULT_CHUNK_SIZE,
)?;
encrypted_buffer.set_position(0);
let mut decrypted_buffer = Cursor::new(Vec::new());
let decrypted_size = decrypt_stream(
&mut encrypted_buffer,
&mut decrypted_buffer,
&key,
&iv,
&[],
DEFAULT_CHUNK_SIZE,
)?;
assert_eq!(encrypted_size, 0);
assert_eq!(decrypted_size, 0);
assert_eq!(decrypted_buffer.into_inner(), Vec::<u8>::new());
Ok(())
}
}