unit tests

This commit is contained in:
Sam Hadow 2025-04-18 11:14:34 +02:00
parent 38ed69808d
commit 09db1579eb

View File

@ -37,3 +37,78 @@ pub fn generate_secret_key(eta: u32) -> Integer {
.find(|p: &Integer| p.is_odd())
.unwrap()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_secret_key_generation_properties() {
let eta = 64;
let key = generate_secret_key(eta);
assert!(key.significant_bits() <= eta);
assert!(key.significant_bits() >= eta - 1);
assert!(key.is_odd());
}
#[test]
fn test_encrypt_decrypt_bit() {
let eta = 64;
let key = generate_secret_key(eta);
let bit = 0;
let ciphertext = encrypt_bit(bit, &key);
let decrypted = decrypt_bit(&ciphertext, &key);
assert_eq!(decrypted, bit);
let bit = 1;
let ciphertext = encrypt_bit(bit, &key);
let decrypted = decrypt_bit(&ciphertext, &key);
assert_eq!(decrypted, bit);
}
#[test]
fn test_multiple_encryptions_are_different() {
let eta = 64;
let key = generate_secret_key(eta);
let bit = 1;
let c1 = encrypt_bit(bit, &key);
let c2 = encrypt_bit(bit, &key);
assert_ne!(c1, c2);
assert_eq!(decrypt_bit(&c1, &key), bit);
assert_eq!(decrypt_bit(&c2, &key), bit);
}
#[test]
fn test_is_homomorphic() {
let eta = 1024;
let key = generate_secret_key(eta);
for &(b1, b2) in &[(0, 0), (0, 1), (1, 0), (1, 1)] {
let c1 = encrypt_bit(b1, &key);
let c2 = encrypt_bit(b2, &key);
let sum: Integer = c1.clone() + &c2;
let product: Integer = c1 * c2;
let decrypted_sum = decrypt_bit(&sum, &key);
let decrypted_product = decrypt_bit(&product, &key);
let expected_xor = b1 ^ b2;
let expected_and = b1 & b2;
assert_eq!(
decrypted_sum, expected_xor,
"Failed XOR test for inputs: {}, {}",
b1, b2
);
assert_eq!(
decrypted_product, expected_and,
"Failed AND test for inputs: {}, {}",
b1, b2
);
}
}
}