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}