11//! Definitions used in tests for this crate.
22
3+ use ff:: Field ;
34use group:: { Group , GroupEncoding } ;
45
56use crate :: linear_relation:: { msm_pr, LinearRelation } ;
@@ -25,6 +26,27 @@ pub fn discrete_logarithm<G: Group + GroupEncoding>(
2526 ( relation, vec ! [ x] )
2627}
2728
29+ /// LinearMap for knowledge of a translated discrete logarithm relative to a fixed basepoint.
30+ #[ allow( non_snake_case) ]
31+ pub fn translated_discrete_logarithm < G : Group + GroupEncoding > (
32+ x : G :: Scalar ,
33+ ) -> ( LinearRelation < G > , Vec < G :: Scalar > ) {
34+ let mut relation: LinearRelation < G > = LinearRelation :: new ( ) ;
35+
36+ let var_x = relation. allocate_scalar ( ) ;
37+ let var_G = relation. allocate_element ( ) ;
38+
39+ let var_X = relation. allocate_eq ( ( var_x + <<G as Group >:: Scalar as Field >:: ONE ) * var_G) ;
40+
41+ relation. set_element ( var_G, G :: generator ( ) ) ;
42+ relation. compute_image ( & [ x] ) . unwrap ( ) ;
43+
44+ let X = relation. linear_map . group_elements . get ( var_X) . unwrap ( ) ;
45+
46+ assert ! ( vec![ X ] == relation. linear_map. evaluate( & [ x] ) . unwrap( ) ) ;
47+ ( relation, vec ! [ x] )
48+ }
49+
2850/// LinearMap for knowledge of a discrete logarithm equality between two pairs.
2951#[ allow( non_snake_case) ]
3052pub fn dleq < G : Group + GroupEncoding > ( H : G , x : G :: Scalar ) -> ( LinearRelation < G > , Vec < G :: Scalar > ) {
@@ -47,6 +69,31 @@ pub fn dleq<G: Group + GroupEncoding>(H: G, x: G::Scalar) -> (LinearRelation<G>,
4769 ( relation, vec ! [ x] )
4870}
4971
72+ /// LinearMap for knowledge of a translated dleq.
73+ #[ allow( non_snake_case) ]
74+ pub fn translated_dleq < G : Group + GroupEncoding > (
75+ H : G ,
76+ x : G :: Scalar ,
77+ ) -> ( LinearRelation < G > , Vec < G :: Scalar > ) {
78+ let mut relation: LinearRelation < G > = LinearRelation :: new ( ) ;
79+
80+ let var_x = relation. allocate_scalar ( ) ;
81+ let [ var_G, var_H] = relation. allocate_elements ( ) ;
82+
83+ let var_X = relation. allocate_eq ( var_x * var_G + var_H) ;
84+ let var_Y = relation. allocate_eq ( var_x * var_H + var_G) ;
85+
86+ relation. set_elements ( [ ( var_G, G :: generator ( ) ) , ( var_H, H ) ] ) ;
87+ relation. compute_image ( & [ x] ) . unwrap ( ) ;
88+
89+ let X = relation. linear_map . group_elements . get ( var_X) . unwrap ( ) ;
90+ let Y = relation. linear_map . group_elements . get ( var_Y) . unwrap ( ) ;
91+
92+ assert_eq ! ( X , G :: generator( ) * x + H ) ;
93+ assert_eq ! ( Y , H * x + G :: generator( ) ) ;
94+ ( relation, vec ! [ x] )
95+ }
96+
5097/// LinearMap for knowledge of an opening to a Pederson commitment.
5198#[ allow( non_snake_case) ]
5299pub fn pedersen_commitment < G : Group + GroupEncoding > (
@@ -85,7 +132,8 @@ pub fn pedersen_commitment_dleq<G: Group + GroupEncoding>(
85132 let [ var_x, var_r] = relation. allocate_scalars ( ) ;
86133
87134 let var_Gs = relation. allocate_elements :: < 4 > ( ) ;
88- let [ var_X, var_Y] = relation. allocate_elements ( ) ;
135+ let var_X = relation. allocate_eq ( var_x * var_Gs[ 0 ] + var_r * var_Gs[ 1 ] ) ;
136+ let var_Y = relation. allocate_eq ( var_x * var_Gs[ 2 ] + var_r * var_Gs[ 3 ] ) ;
89137
90138 relation. set_elements ( [
91139 ( var_Gs[ 0 ] , generators[ 0 ] ) ,
@@ -95,9 +143,6 @@ pub fn pedersen_commitment_dleq<G: Group + GroupEncoding>(
95143 ] ) ;
96144 relation. set_elements ( [ ( var_X, X ) , ( var_Y, Y ) ] ) ;
97145
98- relation. append_equation ( var_X, [ ( var_x, var_Gs[ 0 ] ) , ( var_r, var_Gs[ 1 ] ) ] ) ;
99- relation. append_equation ( var_Y, [ ( var_x, var_Gs[ 2 ] ) , ( var_r, var_Gs[ 3 ] ) ] ) ;
100-
101146 assert ! ( vec![ X , Y ] == relation. linear_map. evaluate( & witness) . unwrap( ) ) ;
102147 ( relation, witness. to_vec ( ) )
103148}
@@ -119,7 +164,12 @@ pub fn bbs_blind_commitment_computation<G: Group + GroupEncoding>(
119164 let [ var_secret_prover_blind, var_msg_1, var_msg_2, var_msg_3] = relation. allocate_scalars ( ) ;
120165
121166 let [ var_Q_2, var_J_1, var_J_2, var_J_3] = relation. allocate_elements ( ) ;
122- let var_C = relation. allocate_element ( ) ;
167+ let var_C = relation. allocate_eq (
168+ var_secret_prover_blind * var_Q_2
169+ + var_msg_1 * var_J_1
170+ + var_msg_2 * var_J_2
171+ + var_msg_3 * var_J_3,
172+ ) ;
123173
124174 relation. set_elements ( [
125175 ( var_Q_2, Q_2 ) ,
@@ -129,16 +179,6 @@ pub fn bbs_blind_commitment_computation<G: Group + GroupEncoding>(
129179 ( var_C, C ) ,
130180 ] ) ;
131181
132- relation. append_equation (
133- var_C,
134- [
135- ( var_secret_prover_blind, var_Q_2) ,
136- ( var_msg_1, var_J_1) ,
137- ( var_msg_2, var_J_2) ,
138- ( var_msg_3, var_J_3) ,
139- ] ,
140- ) ;
141-
142182 let witness = vec ! [ secret_prover_blind, msg_1, msg_2, msg_3] ;
143183
144184 assert ! ( vec![ C ] == relation. linear_map. evaluate( & witness) . unwrap( ) ) ;
0 commit comments