use crate::{CryptoError, Error}; use algebra_core::bytes::ToBytes; use core::{fmt::Debug, hash::Hash, marker::PhantomData}; use rand::Rng; use super::{pedersen, FixedLengthCRH}; use algebra_core::curves::{ models::{ModelParameters, TEModelParameters}, twisted_edwards_extended::{GroupAffine as TEAffine, GroupProjective as TEProjective}, ProjectiveCurve, }; #[cfg(feature = "r1cs")] pub mod constraints; pub trait InjectiveMap { type Output: ToBytes + Clone + Eq + Hash + Default + Debug; fn injective_map(ge: &C::Affine) -> 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) } } pub struct PedersenCRHCompressor, W: pedersen::Window> { _group: PhantomData, _compressor: PhantomData, _crh: pedersen::CRH, } impl, W: pedersen::Window> FixedLengthCRH for PedersenCRHCompressor { const INPUT_SIZE_BITS: usize = pedersen::CRH::::INPUT_SIZE_BITS; type Output = I::Output; type Parameters = pedersen::Parameters; fn setup(rng: &mut R) -> Result { let time = start_timer!(|| format!("PedersenCRHCompressor::Setup")); let params = pedersen::CRH::::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(&pedersen::CRH::::evaluate(parameters, input)?)?; end_timer!(eval_time); Ok(result) } }