#[cfg(test)]
mod tests {
use crate::verifiers;
use crate::types::VerificationError;
use vrf_wasm::vrf::ecvrf::ECVRFKeyPair;
use vrf_wasm::vrf::{VRFKeyPair, VRFProof};
use vrf_wasm::serde_helpers::ToFromByteArray;
use vrf_wasm::rng;
#[test]
fn test_cross_verification_basic() {
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let input = b"test_input_for_vrf";
let proof = keypair.prove(input);
let vrf_output = proof.to_hash();
let pk_bytes = keypair.public_key().to_byte_array();
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut proof_bytes = Vec::with_capacity(80);
proof_bytes.extend_from_slice(&gamma_bytes);
proof_bytes.extend_from_slice(&challenge_bytes);
proof_bytes.extend_from_slice(&scalar_bytes);
let verification_result = verifiers::verify_vrf(
proof_bytes,
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(verification_result.is_ok(), "VRF proof verification failed: {:?}", verification_result.err());
let verified_output = verification_result.unwrap();
assert_eq!(verified_output, vrf_output, "VRF outputs do not match");
}
#[test]
fn test_cross_verification_multiple_inputs() {
let test_inputs = [
b"test_input_1".as_slice(),
b"test_input_2",
b"different_seed_value",
b"", b"very_long_input_that_exceeds_normal_length_to_test_edge_cases_and_ensure_robustness",
&[0u8; 32], &[255u8; 16], ];
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let pk_bytes = keypair.public_key().to_byte_array();
for (i, input) in test_inputs.iter().enumerate() {
let proof = keypair.prove(input);
let vrf_output = proof.to_hash();
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut proof_bytes = Vec::with_capacity(80);
proof_bytes.extend_from_slice(&gamma_bytes);
proof_bytes.extend_from_slice(&challenge_bytes);
proof_bytes.extend_from_slice(&scalar_bytes);
let verification_result = verifiers::verify_vrf(
proof_bytes,
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(
verification_result.is_ok(),
"VRF proof verification failed for input {}: {:?}",
i,
verification_result.err()
);
let verified_output = verification_result.unwrap();
assert_eq!(
verified_output, vrf_output,
"VRF outputs do not match for input {}",
i
);
}
}
#[test]
fn test_cross_verification_different_keypairs() {
let input = b"consistent_test_input";
for i in 0..5 {
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let pk_bytes = keypair.public_key().to_byte_array();
let proof = keypair.prove(input);
let vrf_output = proof.to_hash();
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut proof_bytes = Vec::with_capacity(80);
proof_bytes.extend_from_slice(&gamma_bytes);
proof_bytes.extend_from_slice(&challenge_bytes);
proof_bytes.extend_from_slice(&scalar_bytes);
let verification_result = verifiers::verify_vrf(
proof_bytes,
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(
verification_result.is_ok(),
"VRF proof verification failed for keypair {}: {:?}",
i,
verification_result.err()
);
let verified_output = verification_result.unwrap();
assert_eq!(
verified_output, vrf_output,
"VRF outputs do not match for keypair {}",
i
);
}
}
#[test]
fn test_cross_verification_invalid_proof() {
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let pk_bytes = keypair.public_key().to_byte_array();
let input = b"test_input";
let proof = keypair.prove(input);
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut corrupted_proof_bytes = Vec::with_capacity(80);
let mut corrupted_gamma = gamma_bytes;
corrupted_gamma[0] ^= 0xFF; corrupted_proof_bytes.extend_from_slice(&corrupted_gamma);
corrupted_proof_bytes.extend_from_slice(&challenge_bytes);
corrupted_proof_bytes.extend_from_slice(&scalar_bytes);
let result = verifiers::verify_vrf(
corrupted_proof_bytes,
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(result.is_err(), "Corrupted gamma should fail verification");
let mut corrupted_proof_bytes = Vec::with_capacity(80);
let mut corrupted_challenge = challenge_bytes;
corrupted_challenge[0] ^= 0xFF; corrupted_proof_bytes.extend_from_slice(&gamma_bytes);
corrupted_proof_bytes.extend_from_slice(&corrupted_challenge);
corrupted_proof_bytes.extend_from_slice(&scalar_bytes);
let result = verifiers::verify_vrf(
corrupted_proof_bytes,
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(result.is_err(), "Corrupted challenge should fail verification");
let mut corrupted_proof_bytes = Vec::with_capacity(80);
let mut corrupted_scalar = scalar_bytes;
corrupted_scalar[0] ^= 0xFF; corrupted_proof_bytes.extend_from_slice(&gamma_bytes);
corrupted_proof_bytes.extend_from_slice(&challenge_bytes);
corrupted_proof_bytes.extend_from_slice(&corrupted_scalar);
let result = verifiers::verify_vrf(
corrupted_proof_bytes,
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(result.is_err(), "Corrupted scalar should fail verification");
}
#[test]
fn test_cross_verification_wrong_public_key() {
let mut rng_instance = rng::WasmRng;
let keypair1 = ECVRFKeyPair::generate(&mut rng_instance);
let keypair2 = ECVRFKeyPair::generate(&mut rng_instance);
let input = b"test_input";
let proof = keypair1.prove(input);
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut proof_bytes = Vec::with_capacity(80);
proof_bytes.extend_from_slice(&gamma_bytes);
proof_bytes.extend_from_slice(&challenge_bytes);
proof_bytes.extend_from_slice(&scalar_bytes);
let wrong_pk_bytes = keypair2.public_key().to_byte_array();
let result = verifiers::verify_vrf(
proof_bytes,
wrong_pk_bytes.to_vec(),
input.to_vec(),
);
assert!(result.is_err(), "Verification with wrong public key should fail");
assert!(matches!(result.err(), Some(VerificationError::InvalidProof)));
}
#[test]
fn test_cross_verification_wrong_input() {
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let pk_bytes = keypair.public_key().to_byte_array();
let original_input = b"original_input";
let wrong_input = b"wrong_input";
let proof = keypair.prove(original_input);
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut proof_bytes = Vec::with_capacity(80);
proof_bytes.extend_from_slice(&gamma_bytes);
proof_bytes.extend_from_slice(&challenge_bytes);
proof_bytes.extend_from_slice(&scalar_bytes);
let result = verifiers::verify_vrf(
proof_bytes,
pk_bytes.to_vec(),
wrong_input.to_vec(),
);
assert!(result.is_err(), "Verification with wrong input should fail");
assert!(matches!(result.err(), Some(VerificationError::InvalidProof)));
}
#[test]
fn test_cross_verification_fixed_array_api() {
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let input = b"test_input_for_fixed_api";
let proof = keypair.prove(input);
let vrf_output = proof.to_hash();
let pk_bytes = keypair.public_key().to_byte_array();
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut proof_array = [0u8; 80];
proof_array[0..32].copy_from_slice(&gamma_bytes);
proof_array[32..48].copy_from_slice(&challenge_bytes);
proof_array[48..80].copy_from_slice(&scalar_bytes);
let verification_result = verifiers::verify_vrf_fixed(
&proof_array,
&pk_bytes,
input,
);
assert!(verification_result.is_ok(), "Fixed-array VRF proof verification failed: {:?}", verification_result.err());
let verified_output = verification_result.unwrap();
assert_eq!(verified_output, vrf_output, "Fixed-array VRF outputs do not match");
}
#[test]
fn test_cross_verification_boolean_api() {
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let pk_bytes = keypair.public_key().to_byte_array();
let input = b"test_input_for_boolean_api";
let proof = keypair.prove(input);
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
let mut proof_bytes = Vec::with_capacity(80);
proof_bytes.extend_from_slice(&gamma_bytes);
proof_bytes.extend_from_slice(&challenge_bytes);
proof_bytes.extend_from_slice(&scalar_bytes);
let is_valid = verifiers::verify_vrf_bool(
proof_bytes.clone(),
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(is_valid, "Valid proof should return true");
let mut invalid_proof = proof_bytes;
invalid_proof[0] ^= 0xFF; let is_valid = verifiers::verify_vrf_bool(
invalid_proof,
pk_bytes.to_vec(),
input.to_vec(),
);
assert!(!is_valid, "Invalid proof should return false");
}
#[test]
fn test_proof_component_structure() {
let mut rng_instance = rng::WasmRng;
let keypair = ECVRFKeyPair::generate(&mut rng_instance);
let input = b"test_input_for_vrf";
let proof = keypair.prove(input);
let vrf_output = proof.to_hash();
let (gamma_bytes, challenge_bytes, scalar_bytes) = proof.to_components();
assert_eq!(gamma_bytes.len(), 32, "Gamma component should be 32 bytes");
assert_eq!(challenge_bytes.len(), 16, "Challenge component should be 16 bytes");
assert_eq!(scalar_bytes.len(), 32, "Scalar component should be 32 bytes");
let mut proof_bytes = Vec::with_capacity(80);
proof_bytes.extend_from_slice(&gamma_bytes);
proof_bytes.extend_from_slice(&challenge_bytes);
proof_bytes.extend_from_slice(&scalar_bytes);
assert_eq!(proof_bytes.len(), 80, "Complete proof should be exactly 80 bytes");
assert_eq!(vrf_output.len(), 64, "VRF output should be 64 bytes");
println!("✅ Proof structure test passed - suite string compatibility verified");
}
#[test]
fn test_suite_string_constants() {
let test_gamma = [1u8; 32];
let test_challenge = [2u8; 16];
let test_scalar = [3u8; 32];
let mut test_proof_bytes = Vec::with_capacity(80);
test_proof_bytes.extend_from_slice(&test_gamma);
test_proof_bytes.extend_from_slice(&test_challenge);
test_proof_bytes.extend_from_slice(&test_scalar);
assert_eq!(test_proof_bytes.len(), 80);
let test_pk = [4u8; 32];
let test_input = b"test";
let result = verifiers::verify_vrf(
test_proof_bytes,
test_pk.to_vec(),
test_input.to_vec(),
);
assert!(result.is_err(), "Invalid test proof should fail verification");
println!("✅ Suite string structure test passed");
}
}