use core::{fmt::Debug, marker::PhantomData}; use crate::crh::{ injective_map::{InjectiveMap, PedersenCRHCompressor, TECompressor}, pedersen::{constraints as ped_constraints, Window}, FixedLengthCRHGadget, }; use algebra_core::{ curves::{ models::{ModelParameters, TEModelParameters}, twisted_edwards_extended::GroupProjective as TEProjective, }, fields::{Field, PrimeField, SquareRootField}, ProjectiveCurve, }; use r1cs_core::SynthesisError; use r1cs_std::{ fields::fp::FpVar, groups::{curves::twisted_edwards::AffineVar as TEVar, CurveVar}, prelude::*, }; type ConstraintF = <::BaseField as Field>::BasePrimeField; pub trait InjectiveMapGadget< C: ProjectiveCurve, I: InjectiveMap, GG: CurveVar>, > where for<'a> &'a GG: GroupOpsBounds<'a, C, GG>, { type OutputVar: EqGadget> + ToBytesGadget> + CondSelectGadget> + AllocVar> + R1CSVar, Value = I::Output> + Debug + Clone + Sized; fn evaluate(ge: &GG) -> Result; } pub struct TECompressorGadget; impl InjectiveMapGadget, TECompressor, TEVar>> for TECompressorGadget where F: PrimeField + SquareRootField, P: TEModelParameters + ModelParameters, { type OutputVar = FpVar; fn evaluate(ge: &TEVar>) -> Result { Ok(ge.x.clone()) } } pub struct PedersenCRHCompressorGadget where C: ProjectiveCurve, I: InjectiveMap, W: Window, GG: CurveVar>, for<'a> &'a GG: GroupOpsBounds<'a, C, GG>, IG: InjectiveMapGadget, { #[doc(hidden)] _compressor: PhantomData, #[doc(hidden)] _compressor_gadget: PhantomData, #[doc(hidden)] _crh: ped_constraints::CRHGadget, } impl FixedLengthCRHGadget, ConstraintF> for PedersenCRHCompressorGadget where C: ProjectiveCurve, I: InjectiveMap, GG: CurveVar>, for<'a> &'a GG: GroupOpsBounds<'a, C, GG>, IG: InjectiveMapGadget, W: Window, { type OutputVar = IG::OutputVar; type ParametersVar = ped_constraints::CRHParametersVar; #[tracing::instrument(target = "r1cs", skip(parameters, input))] fn evaluate( parameters: &Self::ParametersVar, input: &[UInt8>], ) -> Result { let result = ped_constraints::CRHGadget::::evaluate(parameters, input)?; IG::evaluate(&result) } }