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