use crate::constants::CHALLENGE_LENGTH;
use crate::types::{VrfOutput, VrfPublicKey, VrfProof, VerificationError};
const RFC_VRF_PROOF_LENGTH: usize = 32 + CHALLENGE_LENGTH + 32;
pub fn verify_vrf_fixed(
proof_bytes: &[u8; RFC_VRF_PROOF_LENGTH], public_key_bytes: &[u8; 32], input: &[u8],
) -> Result<VrfOutput, VerificationError> {
let public_key = VrfPublicKey(*public_key_bytes);
let proof = VrfProof {
gamma: proof_bytes[0..32].try_into()
.map_err(|_| VerificationError::InvalidProofLength)?,
c: proof_bytes[32..(32 + CHALLENGE_LENGTH)].try_into()
.map_err(|_| VerificationError::InvalidProofLength)?,
s: proof_bytes[(32 + CHALLENGE_LENGTH)..RFC_VRF_PROOF_LENGTH].try_into()
.map_err(|_| VerificationError::InvalidProofLength)?,
};
proof.verify(input, &public_key)
}
pub fn verify_vrf(
proof_bytes: Vec<u8>,
public_key_bytes: Vec<u8>,
input: Vec<u8>,
) -> Result<VrfOutput, VerificationError> {
if public_key_bytes.len() != 32 {
return Err(VerificationError::InvalidPublicKey);
}
if proof_bytes.len() != RFC_VRF_PROOF_LENGTH { return Err(VerificationError::InvalidProofLength);
}
let public_key_array: [u8; 32] = public_key_bytes.try_into()
.map_err(|_| VerificationError::InvalidPublicKey)?;
let proof_array: [u8; RFC_VRF_PROOF_LENGTH] = proof_bytes.try_into()
.map_err(|_| VerificationError::InvalidProofLength)?;
verify_vrf_fixed(&proof_array, &public_key_array, &input)
}
pub fn verify_vrf_bool(
proof_bytes: Vec<u8>,
public_key_bytes: Vec<u8>,
input: Vec<u8>,
) -> bool {
verify_vrf(proof_bytes, public_key_bytes, input).is_ok()
}