Skip to content

Commit 3a83d9f

Browse files
authored
Add CanonicalSerialize and CanonicalDeserialize to Path and CRH outputs and relax Path visibility (#48)
1 parent 7ec0005 commit 3a83d9f

File tree

7 files changed

+133
-97
lines changed

7 files changed

+133
-97
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ ark-ff = { version = "^0.2.0", default-features = false }
1919
ark-ec = { version = "^0.2.0", default-features = false }
2020
ark-std = { version = "^0.2.0", default-features = false }
2121
ark-relations = { version = "^0.2.0", default-features = false }
22+
ark-serialize = { version = "^0.2.0", default-features = false, features = [ "derive" ] }
2223

2324
blake2 = { version = "0.9", default-features = false }
2425
digest = "0.9"

src/crh/injective_map/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,20 @@ use ark_ec::{
99
twisted_edwards_extended::{GroupAffine as TEAffine, GroupProjective as TEProjective},
1010
ProjectiveCurve,
1111
};
12+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
1213

1314
#[cfg(feature = "r1cs")]
1415
pub mod constraints;
1516

1617
pub trait InjectiveMap<C: ProjectiveCurve> {
17-
type Output: ToBytes + Clone + Eq + Hash + Default + Debug;
18+
type Output: ToBytes
19+
+ Clone
20+
+ Eq
21+
+ Hash
22+
+ Default
23+
+ Debug
24+
+ CanonicalSerialize
25+
+ CanonicalDeserialize;
1826

1927
fn injective_map(ge: &C::Affine) -> Result<Self::Output, CryptoError>;
2028
}

src/crh/mod.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::Error;
1111

1212
#[cfg(feature = "r1cs")]
1313
pub mod constraints;
14+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
1415
#[cfg(feature = "r1cs")]
1516
pub use constraints::*;
1617

@@ -19,7 +20,14 @@ pub use constraints::*;
1920
pub trait CRH {
2021
const INPUT_SIZE_BITS: usize;
2122

22-
type Output: ToBytes + Clone + Eq + core::fmt::Debug + Hash + Default;
23+
type Output: ToBytes
24+
+ Clone
25+
+ Eq
26+
+ core::fmt::Debug
27+
+ Hash
28+
+ Default
29+
+ CanonicalSerialize
30+
+ CanonicalDeserialize;
2331
type Parameters: Clone + Default;
2432

2533
fn setup<R: Rng>(r: &mut R) -> Result<Self::Parameters, Error>;
@@ -32,7 +40,14 @@ pub trait TwoToOneCRH {
3240
/// The bit size of the right input.
3341
const RIGHT_INPUT_SIZE_BITS: usize;
3442

35-
type Output: ToBytes + Clone + Eq + core::fmt::Debug + Hash + Default;
43+
type Output: ToBytes
44+
+ Clone
45+
+ Eq
46+
+ core::fmt::Debug
47+
+ Hash
48+
+ Default
49+
+ CanonicalSerialize
50+
+ CanonicalDeserialize;
3651
type Parameters: Clone + Default;
3752

3853
fn setup<R: Rng>(r: &mut R) -> Result<Self::Parameters, Error>;

src/encryption/elgamal/constraints.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,75 @@ where
228228
})
229229
}
230230
}
231+
232+
#[cfg(test)]
233+
mod test {
234+
use crate::encryption::constraints::AsymmetricEncryptionGadget;
235+
use ark_std::{test_rng, UniformRand};
236+
237+
use ark_ed_on_bls12_381::{constraints::EdwardsVar, EdwardsProjective as JubJub, Fq};
238+
239+
use crate::encryption::elgamal::{constraints::ElGamalEncGadget, ElGamal, Randomness};
240+
use crate::encryption::AsymmetricEncryptionScheme;
241+
use ark_r1cs_std::prelude::*;
242+
use ark_relations::r1cs::ConstraintSystem;
243+
244+
#[test]
245+
fn test_elgamal_gadget() {
246+
let rng = &mut test_rng();
247+
248+
type MyEnc = ElGamal<JubJub>;
249+
type MyGadget = ElGamalEncGadget<JubJub, EdwardsVar>;
250+
251+
// compute primitive result
252+
let parameters = MyEnc::setup(rng).unwrap();
253+
let (pk, _) = MyEnc::keygen(&parameters, rng).unwrap();
254+
let msg = JubJub::rand(rng).into();
255+
let randomness = Randomness::rand(rng);
256+
let primitive_result = MyEnc::encrypt(&parameters, &pk, &msg, &randomness).unwrap();
257+
258+
// construct constraint system
259+
let cs = ConstraintSystem::<Fq>::new_ref();
260+
let randomness_var =
261+
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::RandomnessVar::new_witness(
262+
ark_relations::ns!(cs, "gadget_randomness"),
263+
|| Ok(&randomness),
264+
)
265+
.unwrap();
266+
let parameters_var =
267+
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::ParametersVar::new_constant(
268+
ark_relations::ns!(cs, "gadget_parameters"),
269+
&parameters,
270+
)
271+
.unwrap();
272+
let msg_var =
273+
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::PlaintextVar::new_witness(
274+
ark_relations::ns!(cs, "gadget_message"),
275+
|| Ok(&msg),
276+
)
277+
.unwrap();
278+
let pk_var =
279+
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::PublicKeyVar::new_witness(
280+
ark_relations::ns!(cs, "gadget_public_key"),
281+
|| Ok(&pk),
282+
)
283+
.unwrap();
284+
285+
// use gadget
286+
let result_var =
287+
MyGadget::encrypt(&parameters_var, &msg_var, &randomness_var, &pk_var).unwrap();
288+
289+
// check that result equals expected ciphertext in the constraint system
290+
let expected_var =
291+
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::OutputVar::new_input(
292+
ark_relations::ns!(cs, "gadget_expected"),
293+
|| Ok(&primitive_result),
294+
)
295+
.unwrap();
296+
expected_var.enforce_equal(&result_var).unwrap();
297+
298+
assert_eq!(primitive_result.0, result_var.c1.value().unwrap());
299+
assert_eq!(primitive_result.1, result_var.c2.value().unwrap());
300+
assert!(cs.is_satisfied().unwrap());
301+
}
302+
}

src/encryption/elgamal/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,32 @@ where
103103
Ok(m)
104104
}
105105
}
106+
107+
#[cfg(test)]
108+
mod test {
109+
use ark_std::{test_rng, UniformRand};
110+
111+
use ark_ed_on_bls12_381::EdwardsProjective as JubJub;
112+
113+
use crate::encryption::elgamal::{ElGamal, Randomness};
114+
use crate::encryption::AsymmetricEncryptionScheme;
115+
116+
#[test]
117+
fn test_elgamal_encryption() {
118+
let rng = &mut test_rng();
119+
120+
// setup and key generation
121+
let parameters = ElGamal::<JubJub>::setup(rng).unwrap();
122+
let (pk, sk) = ElGamal::<JubJub>::keygen(&parameters, rng).unwrap();
123+
124+
// get a random msg and encryption randomness
125+
let msg = JubJub::rand(rng).into();
126+
let r = Randomness::rand(rng);
127+
128+
// encrypt and decrypt the message
129+
let cipher = ElGamal::<JubJub>::encrypt(&parameters, &pk, &msg, &r).unwrap();
130+
let check_msg = ElGamal::<JubJub>::decrypt(&parameters, &sk, &cipher).unwrap();
131+
132+
assert_eq!(msg, check_msg);
133+
}
134+
}

src/encryption/mod.rs

Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -36,94 +36,3 @@ pub trait AsymmetricEncryptionScheme {
3636
ciphertext: &Self::Ciphertext,
3737
) -> Result<Self::Plaintext, Error>;
3838
}
39-
40-
#[cfg(test)]
41-
mod test {
42-
use crate::encryption::constraints::AsymmetricEncryptionGadget;
43-
use ark_std::{test_rng, UniformRand};
44-
45-
use ark_ed_on_bls12_381::{constraints::EdwardsVar, EdwardsProjective as JubJub, Fq};
46-
47-
use crate::encryption::elgamal::{constraints::ElGamalEncGadget, ElGamal, Randomness};
48-
use crate::encryption::AsymmetricEncryptionScheme;
49-
use ark_r1cs_std::prelude::*;
50-
use ark_relations::r1cs::ConstraintSystem;
51-
52-
#[test]
53-
fn test_elgamal_encryption() {
54-
let rng = &mut test_rng();
55-
56-
// setup and key generation
57-
let parameters = ElGamal::<JubJub>::setup(rng).unwrap();
58-
let (pk, sk) = ElGamal::<JubJub>::keygen(&parameters, rng).unwrap();
59-
60-
// get a random msg and encryption randomness
61-
let msg = JubJub::rand(rng).into();
62-
let r = Randomness::rand(rng);
63-
64-
// encrypt and decrypt the message
65-
let cipher = ElGamal::<JubJub>::encrypt(&parameters, &pk, &msg, &r).unwrap();
66-
let check_msg = ElGamal::<JubJub>::decrypt(&parameters, &sk, &cipher).unwrap();
67-
68-
assert_eq!(msg, check_msg);
69-
}
70-
71-
#[test]
72-
fn test_elgamal_gadget() {
73-
let rng = &mut test_rng();
74-
75-
type MyEnc = ElGamal<JubJub>;
76-
type MyGadget = ElGamalEncGadget<JubJub, EdwardsVar>;
77-
78-
// compute primitive result
79-
let parameters = MyEnc::setup(rng).unwrap();
80-
let (pk, _) = MyEnc::keygen(&parameters, rng).unwrap();
81-
let msg = JubJub::rand(rng).into();
82-
let randomness = Randomness::rand(rng);
83-
let primitive_result = MyEnc::encrypt(&parameters, &pk, &msg, &randomness).unwrap();
84-
85-
// construct constraint system
86-
let cs = ConstraintSystem::<Fq>::new_ref();
87-
let randomness_var =
88-
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::RandomnessVar::new_witness(
89-
ark_relations::ns!(cs, "gadget_randomness"),
90-
|| Ok(&randomness),
91-
)
92-
.unwrap();
93-
let parameters_var =
94-
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::ParametersVar::new_constant(
95-
ark_relations::ns!(cs, "gadget_parameters"),
96-
&parameters,
97-
)
98-
.unwrap();
99-
let msg_var =
100-
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::PlaintextVar::new_witness(
101-
ark_relations::ns!(cs, "gadget_message"),
102-
|| Ok(&msg),
103-
)
104-
.unwrap();
105-
let pk_var =
106-
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::PublicKeyVar::new_witness(
107-
ark_relations::ns!(cs, "gadget_public_key"),
108-
|| Ok(&pk),
109-
)
110-
.unwrap();
111-
112-
// use gadget
113-
let result_var =
114-
MyGadget::encrypt(&parameters_var, &msg_var, &randomness_var, &pk_var).unwrap();
115-
116-
// check that result equals expected ciphertext in the constraint system
117-
let expected_var =
118-
<MyGadget as AsymmetricEncryptionGadget<MyEnc, Fq>>::OutputVar::new_input(
119-
ark_relations::ns!(cs, "gadget_expected"),
120-
|| Ok(&primitive_result),
121-
)
122-
.unwrap();
123-
expected_var.enforce_equal(&result_var).unwrap();
124-
125-
assert_eq!(primitive_result.0, result_var.c1.value().unwrap());
126-
assert_eq!(primitive_result.1, result_var.c2.value().unwrap());
127-
assert!(cs.is_satisfied().unwrap());
128-
}
129-
}

src/merkle_tree/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use crate::crh::TwoToOneCRH;
44
use crate::CRH;
55
use ark_ff::ToBytes;
6+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write};
67
use ark_std::vec::Vec;
78

89
#[cfg(feature = "r1cs")]
@@ -30,12 +31,13 @@ pub type LeafParam<P> = <<P as Config>::LeafHash as CRH>::Parameters;
3031
/// [I] J
3132
/// ```
3233
/// Suppose we want to prove I, then `leaf_sibling_hash` is J, `auth_path` is `[C,D]`
34+
#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
3335
pub struct Path<P: Config> {
34-
pub(crate) leaf_sibling_hash: LeafDigest<P>,
36+
pub leaf_sibling_hash: LeafDigest<P>,
3537
/// The sibling of path node ordered from higher layer to lower layer (does not include root node).
36-
pub(crate) auth_path: Vec<TwoToOneDigest<P>>,
38+
pub auth_path: Vec<TwoToOneDigest<P>>,
3739
/// stores the leaf index of the node
38-
pub(crate) leaf_index: usize,
40+
pub leaf_index: usize,
3941
}
4042

4143
impl<P: Config> Path<P> {

0 commit comments

Comments
 (0)