arnaucube
arnaucube/ark-r1cs-stdPublic Self-hosted repository
ark-r1cs-std/crypto-primitives/src/crh/injective_map/mod.rs
crypto-primitives/src/crh/injective_map/mod.rsRaw
 1use crate::{CryptoError, Error};
 2use algebra_core::bytes::ToBytes;
 3use core::{fmt::Debug, hash::Hash, marker::PhantomData};
 4use rand::Rng;
 5
 6use super::{
 7    pedersen::{PedersenCRH, PedersenParameters, PedersenWindow},
 8    FixedLengthCRH,
 9};
10use algebra_core::{
11    curves::{
12        models::{ModelParameters, TEModelParameters},
13        twisted_edwards_extended::{GroupAffine as TEAffine, GroupProjective as TEProjective},
14        ProjectiveCurve,
15    },
16    groups::Group,
17};
18
19#[cfg(feature = "r1cs")]
20pub mod constraints;
21
22pub trait InjectiveMap<G: Group> {
23    type Output: ToBytes + Clone + Eq + Hash + Default + Debug;
24    fn injective_map(ge: &G) -> Result<Self::Output, CryptoError>;
25}
26
27pub struct TECompressor;
28
29impl<P: TEModelParameters> InjectiveMap<TEAffine<P>> for TECompressor {
30    type Output = <P as ModelParameters>::BaseField;
31
32    fn injective_map(ge: &TEAffine<P>) -> Result<Self::Output, CryptoError> {
33        debug_assert!(ge.is_in_correct_subgroup_assuming_on_curve());
34        Ok(ge.x)
35    }
36}
37
38impl<P: TEModelParameters> InjectiveMap<TEProjective<P>> for TECompressor {
39    type Output = <P as ModelParameters>::BaseField;
40
41    fn injective_map(ge: &TEProjective<P>) -> Result<Self::Output, CryptoError> {
42        let ge = ge.into_affine();
43        debug_assert!(ge.is_in_correct_subgroup_assuming_on_curve());
44        Ok(ge.x)
45    }
46}
47
48pub struct PedersenCRHCompressor<G: Group, I: InjectiveMap<G>, W: PedersenWindow> {
49    _group: PhantomData<G>,
50    _compressor: PhantomData<I>,
51    _crh: PedersenCRH<G, W>,
52}
53
54impl<G: Group, I: InjectiveMap<G>, W: PedersenWindow> FixedLengthCRH
55    for PedersenCRHCompressor<G, I, W>
56{
57    const INPUT_SIZE_BITS: usize = PedersenCRH::<G, W>::INPUT_SIZE_BITS;
58    type Output = I::Output;
59    type Parameters = PedersenParameters<G>;
60
61    fn setup<R: Rng>(rng: &mut R) -> Result<Self::Parameters, Error> {
62        let time = start_timer!(|| format!("PedersenCRHCompressor::Setup"));
63        let params = PedersenCRH::<G, W>::setup(rng);
64        end_timer!(time);
65        params
66    }
67
68    fn evaluate(parameters: &Self::Parameters, input: &[u8]) -> Result<Self::Output, Error> {
69        let eval_time = start_timer!(|| "PedersenCRHCompressor::Eval");
70        let result = I::injective_map(&PedersenCRH::<G, W>::evaluate(parameters, input)?)?;
71        end_timer!(eval_time);
72        Ok(result)
73    }
74}