From 09db1579ebc0d1d03b095a474c9c716cad27ed31 Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Fri, 18 Apr 2025 11:14:34 +0200 Subject: [PATCH] unit tests --- src/dghv.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/dghv.rs b/src/dghv.rs index 292b1cd..c30db91 100644 --- a/src/dghv.rs +++ b/src/dghv.rs @@ -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 + ); + } + } +}