use crate::CryptoError; use algebra::bytes::ToBytes; use crate::Error; use rand::Rng; use std::{fmt::Debug, hash::Hash, marker::PhantomData}; use super::{ pedersen::{PedersenCRH, PedersenParameters, PedersenWindow}, FixedLengthCRH, }; use algebra::{ curves::{ models::{ModelParameters, TEModelParameters}, twisted_edwards_extended::{GroupAffine as TEAffine, GroupProjective as TEProjective}, ProjectiveCurve, }, groups::Group, }; #[cfg(feature = "r1cs")] pub mod constraints; pub trait InjectiveMap { type Output: ToBytes + Clone + Eq + Hash + Default + Debug; fn injective_map(ge: &G) -> Result; } pub struct TECompressor; impl InjectiveMap> for TECompressor { type Output =

::BaseField; fn injective_map(ge: &TEAffine

) -> Result { debug_assert!(ge.is_in_correct_subgroup_assuming_on_curve()); Ok(ge.x) } } impl InjectiveMap> for TECompressor { type Output =

::BaseField; fn injective_map(ge: &TEProjective

) -> Result { let ge = ge.into_affine(); debug_assert!(ge.is_in_correct_subgroup_assuming_on_curve()); Ok(ge.x) } } pub struct PedersenCRHCompressor, W: PedersenWindow> { _group: PhantomData, _compressor: PhantomData, _crh: PedersenCRH, } impl, W: PedersenWindow> FixedLengthCRH for PedersenCRHCompressor { const INPUT_SIZE_BITS: usize = PedersenCRH::::INPUT_SIZE_BITS; type Output = I::Output; type Parameters = PedersenParameters; fn setup(rng: &mut R) -> Result { let time = start_timer!(|| format!("PedersenCRHCompressor::Setup")); let params = PedersenCRH::::setup(rng); end_timer!(time); params } fn evaluate(parameters: &Self::Parameters, input: &[u8]) -> Result { let eval_time = start_timer!(|| "PedersenCRHCompressor::Eval"); let result = I::injective_map(&PedersenCRH::::evaluate(parameters, input)?)?; end_timer!(eval_time); Ok(result) } }