use proofman_verifier::verifier;
pub const VADCOP_VK_LEN_WORDS: usize = 4;
pub const ZISK_PUBLICS: usize = 64;
pub const PROGRAM_VK_LEN: usize = 4;
pub const PROGRAM_N_PUBLICS: usize = PROGRAM_VK_LEN + ZISK_PUBLICS;
pub const VADCOP_FINAL_FLAG_LEN: usize = 1;
pub const IS_VADCOP_FINAL_PROOF: u64 = 1;
const EXPECTED_N_PUBLICS_FINAL: u64 = (VADCOP_FINAL_FLAG_LEN + PROGRAM_N_PUBLICS) as u64;
const EXPECTED_N_PUBLICS_COMPRESSED: u64 = PROGRAM_N_PUBLICS as u64;
pub fn verify_vadcop_final_proof(zisk_proof: &[u64], vadcop_final_vk: &[u64], hash: &str) -> bool {
if zisk_proof.len() < 2 {
return false;
}
if vadcop_final_vk.len() != PROGRAM_VK_LEN {
return false;
}
let minimal = zisk_proof[0] == 1;
let vadcop_proof = &zisk_proof[1..];
let expected_n_publics =
if minimal { EXPECTED_N_PUBLICS_COMPRESSED } else { EXPECTED_N_PUBLICS_FINAL };
if zisk_proof.len() < 2 + expected_n_publics as usize {
return false;
}
if vadcop_proof[0] != expected_n_publics {
return false;
}
let v = verifier(hash);
if minimal {
v.verify_vadcop_final_compressed_u64(vadcop_proof, vadcop_final_vk)
} else {
v.verify_vadcop_final_u64(vadcop_proof, vadcop_final_vk)
}
}
pub fn program_publics(publics_full: &[u64]) -> &[u64] {
if publics_full.len() == VADCOP_FINAL_FLAG_LEN + PROGRAM_N_PUBLICS {
&publics_full[VADCOP_FINAL_FLAG_LEN..]
} else {
publics_full
}
}