mod ecies {
use crate::{encryption::ECIESPoseidonEncryption, EncryptionScheme};
use snarkvm_curves::edwards_bls12::EdwardsParameters;
use snarkvm_utilities::{FromBytes, ToBytes, UniformRand};
use rand::{thread_rng, Rng};
pub const ITERATIONS: usize = 1000;
type TestEncryptionScheme = ECIESPoseidonEncryption<EdwardsParameters>;
#[test]
fn test_encrypt_and_decrypt() {
let rng = &mut thread_rng();
let encryption = TestEncryptionScheme::setup("simple_encryption");
let private_key = encryption.generate_private_key(rng);
let public_key = encryption.generate_public_key(&private_key);
let (_randomness, _ciphertext_randomizer, symmetric_key) = encryption.generate_asymmetric_key(&public_key, rng);
let number_of_bytes = 320;
let message = (0..number_of_bytes).map(|_| u8::rand(rng)).collect::<Vec<u8>>();
let ciphertext = encryption.encrypt(&symmetric_key, &message).unwrap();
dbg!(ciphertext.len());
let candidate_message = encryption.decrypt(&symmetric_key, &ciphertext).unwrap();
assert_eq!(message, candidate_message);
}
#[test]
fn test_encryption_public_key_to_bytes_le() {
let rng = &mut thread_rng();
let encryption = TestEncryptionScheme::setup("encryption_public_key_serialization");
for _ in 0..ITERATIONS {
let private_key = encryption.generate_private_key(rng);
let public_key = encryption.generate_public_key(&private_key);
let public_key_bytes = public_key.to_bytes_le().unwrap();
let recovered_public_key =
<TestEncryptionScheme as EncryptionScheme>::PublicKey::read_le(&public_key_bytes[..]).unwrap();
assert_eq!(public_key, recovered_public_key);
}
}
#[test]
fn test_encryption_symmetric_key_commitment() {
let rng = &mut thread_rng();
let encryption = TestEncryptionScheme::setup("encryption_symmetric_key_commitment");
let private_key = encryption.generate_private_key(rng);
let public_key = encryption.generate_public_key(&private_key);
let (_randomness, ciphertext_randomizer, symmetric_key) = encryption.generate_asymmetric_key(&public_key, rng);
let symmetric_key_commitment = encryption.generate_symmetric_key_commitment(&symmetric_key);
{
let candidate_symmetric_key = encryption
.generate_symmetric_key(&private_key, ciphertext_randomizer)
.unwrap();
assert_eq!(symmetric_key, candidate_symmetric_key);
}
{
let candidate_symmetric_key_commitment = encryption.generate_symmetric_key_commitment(&symmetric_key);
assert_eq!(symmetric_key_commitment, candidate_symmetric_key_commitment);
}
for _ in 0..ITERATIONS {
let (_randomness, _ciphertext_randomizer, alternate_symmetric_key) =
encryption.generate_asymmetric_key(&public_key, rng);
let candidate_symmetric_key_commitment =
encryption.generate_symmetric_key_commitment(&alternate_symmetric_key);
assert_ne!(symmetric_key_commitment, candidate_symmetric_key_commitment);
}
for _ in 0..ITERATIONS {
let alternate_private_key = encryption.generate_private_key(rng);
let alternate_public_key = encryption.generate_public_key(&alternate_private_key);
let (_randomness, _ciphertext_randomizer, alternate_symmetric_key) =
encryption.generate_asymmetric_key(&alternate_public_key, rng);
let candidate_symmetric_key_commitment =
encryption.generate_symmetric_key_commitment(&alternate_symmetric_key);
assert_ne!(symmetric_key_commitment, candidate_symmetric_key_commitment);
}
}
#[test]
fn test_ciphertext_random_manipulation() {
let rng = &mut thread_rng();
let encryption = TestEncryptionScheme::setup("simple_encryption");
let private_key = encryption.generate_private_key(rng);
let public_key = encryption.generate_public_key(&private_key);
let (_randomness, _ciphertext_randomizer, symmetric_key) = encryption.generate_asymmetric_key(&public_key, rng);
let number_of_bytes = 320;
let message = (0..number_of_bytes).map(|_| u8::rand(rng)).collect::<Vec<u8>>();
let ciphertext = encryption.encrypt(&symmetric_key, &message).unwrap();
let candidate_message = encryption.decrypt(&symmetric_key, &ciphertext).unwrap();
assert_eq!(message, candidate_message);
for _ in 0..ITERATIONS {
let mut ciphertext = ciphertext.clone();
let idx = rng.gen_range(0..30);
ciphertext[idx] = ciphertext[idx].wrapping_add(rng.gen_range(1..u8::MAX));
let candidate_message = encryption.decrypt(&symmetric_key, &ciphertext).unwrap();
assert_ne!(message, candidate_message);
}
}
}