mirror of
https://github.com/sbrow/envr.git
synced 2026-06-27 18:48:33 -04:00
329 lines
8.6 KiB
Rust
329 lines
8.6 KiB
Rust
//! Tests for passphrase-based encryption and decryption.
|
|
|
|
use crate::passphrase::*;
|
|
use crate::armor::*;
|
|
use crate::memory::*;
|
|
use crate::types::*;
|
|
use std::ffi::CString;
|
|
|
|
#[test]
|
|
fn test_passphrase_encrypt_decrypt() {
|
|
let plaintext = b"Secret passphrase message";
|
|
let passphrase = CString::new("my-secure-passphrase").unwrap();
|
|
|
|
let mut encrypted = AgeBuffer::null();
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
passphrase.as_ptr(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
let mut decrypted = AgeBuffer::null();
|
|
let result = age_decrypt_passphrase(
|
|
encrypted.data,
|
|
encrypted.len,
|
|
passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
let decrypted_slice = unsafe { std::slice::from_raw_parts(decrypted.data, decrypted.len) };
|
|
assert_eq!(decrypted_slice, plaintext);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
age_free_buffer(&mut decrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_wrong_passphrase() {
|
|
let plaintext = b"Secret message";
|
|
let correct_passphrase = CString::new("correct-passphrase").unwrap();
|
|
let wrong_passphrase = CString::new("wrong-passphrase").unwrap();
|
|
|
|
let mut encrypted = AgeBuffer::null();
|
|
age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
correct_passphrase.as_ptr(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
|
|
let mut decrypted = AgeBuffer::null();
|
|
let result = age_decrypt_passphrase(
|
|
encrypted.data,
|
|
encrypted.len,
|
|
wrong_passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
|
|
assert_eq!(result, AgeResult::DecryptionFailed);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_empty_passphrase() {
|
|
let plaintext = b"Message with empty passphrase";
|
|
let empty_passphrase = CString::new("").unwrap();
|
|
|
|
let mut encrypted = AgeBuffer::null();
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
empty_passphrase.as_ptr(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
let mut decrypted = AgeBuffer::null();
|
|
let result = age_decrypt_passphrase(
|
|
encrypted.data,
|
|
encrypted.len,
|
|
empty_passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
age_free_buffer(&mut decrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_special_characters() {
|
|
let plaintext = b"Message with special passphrase";
|
|
let special_passphrase = CString::new("p@$$w0rd!#$%^&*()_+-=[]{}|;':\",./<>?").unwrap();
|
|
|
|
let mut encrypted = AgeBuffer::null();
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
special_passphrase.as_ptr(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
let mut decrypted = AgeBuffer::null();
|
|
let result = age_decrypt_passphrase(
|
|
encrypted.data,
|
|
encrypted.len,
|
|
special_passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
let decrypted_slice = unsafe { std::slice::from_raw_parts(decrypted.data, decrypted.len) };
|
|
assert_eq!(decrypted_slice, plaintext);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
age_free_buffer(&mut decrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_with_armor() {
|
|
let plaintext = b"Armored passphrase message";
|
|
let passphrase = CString::new("armor-test-pass").unwrap();
|
|
|
|
let mut encrypted = AgeBuffer::null();
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
passphrase.as_ptr(),
|
|
true, // armor = true
|
|
&mut encrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
// Verify it's armored
|
|
let encrypted_slice = unsafe { std::slice::from_raw_parts(encrypted.data, encrypted.len) };
|
|
let encrypted_str = std::str::from_utf8(encrypted_slice).unwrap();
|
|
assert!(encrypted_str.contains("-----BEGIN AGE ENCRYPTED FILE-----"));
|
|
|
|
// Dearmor first
|
|
let armored_cstr = CString::new(encrypted_str).unwrap();
|
|
let mut dearmored = AgeBuffer::null();
|
|
age_dearmor(armored_cstr.as_ptr(), &mut dearmored);
|
|
|
|
// Then decrypt
|
|
let mut decrypted = AgeBuffer::null();
|
|
let result = age_decrypt_passphrase(
|
|
dearmored.data,
|
|
dearmored.len,
|
|
passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
let decrypted_slice = unsafe { std::slice::from_raw_parts(decrypted.data, decrypted.len) };
|
|
assert_eq!(decrypted_slice, plaintext);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
age_free_buffer(&mut dearmored);
|
|
age_free_buffer(&mut decrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_null_input() {
|
|
let passphrase = CString::new("test").unwrap();
|
|
let mut output = AgeBuffer::null();
|
|
|
|
// Null plaintext
|
|
let result = age_encrypt_passphrase(
|
|
std::ptr::null(),
|
|
0,
|
|
passphrase.as_ptr(),
|
|
false,
|
|
&mut output,
|
|
);
|
|
assert_eq!(result, AgeResult::InvalidInput);
|
|
|
|
// Null output
|
|
let plaintext = b"test";
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
passphrase.as_ptr(),
|
|
false,
|
|
std::ptr::null_mut(),
|
|
);
|
|
assert_eq!(result, AgeResult::InvalidInput);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_long_passphrase() {
|
|
let plaintext = b"Message with very long passphrase";
|
|
// 1000 character passphrase
|
|
let long_passphrase = CString::new("a".repeat(1000)).unwrap();
|
|
|
|
let mut encrypted = AgeBuffer::null();
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
long_passphrase.as_ptr(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
let mut decrypted = AgeBuffer::null();
|
|
let result = age_decrypt_passphrase(
|
|
encrypted.data,
|
|
encrypted.len,
|
|
long_passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
age_free_buffer(&mut decrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_encrypt_null_passphrase() {
|
|
let plaintext = b"test";
|
|
let mut encrypted = AgeBuffer::null();
|
|
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
std::ptr::null(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
|
|
assert_eq!(result, AgeResult::InvalidInput);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_decrypt_null_passphrase() {
|
|
let passphrase = CString::new("test").unwrap();
|
|
let plaintext = b"test";
|
|
|
|
// First encrypt with valid passphrase
|
|
let mut encrypted = AgeBuffer::null();
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
passphrase.as_ptr(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
// Try to decrypt with null passphrase
|
|
let mut decrypted = AgeBuffer::null();
|
|
let result = age_decrypt_passphrase(
|
|
encrypted.data,
|
|
encrypted.len,
|
|
std::ptr::null(),
|
|
&mut decrypted,
|
|
);
|
|
|
|
assert_eq!(result, AgeResult::InvalidInput);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_decrypt_null_output() {
|
|
let passphrase = CString::new("test").unwrap();
|
|
let plaintext = b"test";
|
|
|
|
let mut encrypted = AgeBuffer::null();
|
|
let result = age_encrypt_passphrase(
|
|
plaintext.as_ptr(),
|
|
plaintext.len(),
|
|
passphrase.as_ptr(),
|
|
false,
|
|
&mut encrypted,
|
|
);
|
|
assert_eq!(result, AgeResult::Success);
|
|
|
|
// Try to decrypt with null output
|
|
let result = age_decrypt_passphrase(
|
|
encrypted.data,
|
|
encrypted.len,
|
|
passphrase.as_ptr(),
|
|
std::ptr::null_mut(),
|
|
);
|
|
|
|
assert_eq!(result, AgeResult::InvalidInput);
|
|
|
|
age_free_buffer(&mut encrypted);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_decrypt_null_ciphertext() {
|
|
let passphrase = CString::new("test").unwrap();
|
|
let mut decrypted = AgeBuffer::null();
|
|
|
|
let result = age_decrypt_passphrase(
|
|
std::ptr::null(),
|
|
0,
|
|
passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
|
|
assert_eq!(result, AgeResult::InvalidInput);
|
|
}
|
|
|
|
#[test]
|
|
fn test_passphrase_decrypt_corrupted_data() {
|
|
let passphrase = CString::new("test").unwrap();
|
|
let corrupted = b"not valid encrypted data";
|
|
let mut decrypted = AgeBuffer::null();
|
|
|
|
let result = age_decrypt_passphrase(
|
|
corrupted.as_ptr(),
|
|
corrupted.len(),
|
|
passphrase.as_ptr(),
|
|
&mut decrypted,
|
|
);
|
|
|
|
assert_eq!(result, AgeResult::DecryptionFailed);
|
|
} |