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}