@@ -6,8 +6,6 @@ use crate::codec::Shake128DuplexSponge;
66use crate :: fiat_shamir:: Nizk ;
77use crate :: linear_relation:: { CanonicalLinearRelation , LinearRelation , Sum } ;
88
9- use crate :: group:: msm:: VariableMultiScalarMul ;
10-
119/// LinearMap for knowledge of a discrete logarithm relative to a fixed basepoint.
1210#[ allow( non_snake_case) ]
1311pub fn discrete_logarithm < G : PrimeGroup , R : rand:: RngCore > (
@@ -162,43 +160,6 @@ pub fn twisted_pedersen_commitment<G: PrimeGroup, R: RngCore>(
162160 ( instance, witness)
163161}
164162
165- /// LinearMap for knowledge of equal openings to two distinct Pedersen commitments.
166- #[ allow( non_snake_case) ]
167- pub fn pedersen_commitment_dleq < G : PrimeGroup , R : RngCore > (
168- rng : & mut R ,
169- ) -> ( CanonicalLinearRelation < G > , Vec < G :: Scalar > ) {
170- let generators = [
171- G :: random ( & mut * rng) ,
172- G :: random ( & mut * rng) ,
173- G :: random ( & mut * rng) ,
174- G :: random ( & mut * rng) ,
175- ] ;
176- let witness = [ G :: Scalar :: random ( & mut * rng) , G :: Scalar :: random ( & mut * rng) ] ;
177- let mut relation = LinearRelation :: new ( ) ;
178-
179- let X = G :: msm ( & witness, & [ generators[ 0 ] , generators[ 1 ] ] ) ;
180- let Y = G :: msm ( & witness, & [ generators[ 2 ] , generators[ 3 ] ] ) ;
181-
182- let [ var_x, var_r] = relation. allocate_scalars ( ) ;
183-
184- let var_Gs = relation. allocate_elements :: < 4 > ( ) ;
185- let var_X = relation. allocate_eq ( var_x * var_Gs[ 0 ] + var_r * var_Gs[ 1 ] ) ;
186- let var_Y = relation. allocate_eq ( var_x * var_Gs[ 2 ] + var_r * var_Gs[ 3 ] ) ;
187-
188- relation. set_elements ( [
189- ( var_Gs[ 0 ] , generators[ 0 ] ) ,
190- ( var_Gs[ 1 ] , generators[ 1 ] ) ,
191- ( var_Gs[ 2 ] , generators[ 2 ] ) ,
192- ( var_Gs[ 3 ] , generators[ 3 ] ) ,
193- ] ) ;
194- relation. set_elements ( [ ( var_X, X ) , ( var_Y, Y ) ] ) ;
195-
196- assert ! ( vec![ X , Y ] == relation. linear_map. evaluate( & witness) . unwrap( ) ) ;
197- let witness_vec = witness. to_vec ( ) ;
198- let instance = ( & relation) . try_into ( ) . unwrap ( ) ;
199- ( instance, witness_vec)
200- }
201-
202163/// Test that a Pedersen commitment is in the given range.
203164#[ allow( non_snake_case) ]
204165pub fn range_instance_generation < G : PrimeGroup , R : RngCore > (
@@ -498,6 +459,57 @@ fn nested_affine_relation<G: PrimeGroup, R: RngCore>(
498459 ( instance, witness)
499460}
500461
462+ fn pedersen_commitment_equality < G : PrimeGroup , R : RngCore > (
463+ rng : & mut R ,
464+ ) -> ( CanonicalLinearRelation < G > , Vec < G :: Scalar > ) {
465+ let mut instance = LinearRelation :: new ( ) ;
466+
467+ let [ m, r1, r2] = instance. allocate_scalars ( ) ;
468+ let [ var_G, var_H] = instance. allocate_elements ( ) ;
469+ // This relation is redundant and inefficient.
470+ instance. allocate_eq ( var_G * m + var_H * r1) ;
471+ instance. allocate_eq ( var_G * m + var_H * r2) ;
472+
473+ instance. set_elements ( [ ( var_G, G :: generator ( ) ) , ( var_H, G :: random ( & mut * rng) ) ] ) ;
474+
475+ let witness = vec ! [
476+ G :: Scalar :: from( 42 ) ,
477+ G :: Scalar :: random( & mut * rng) ,
478+ G :: Scalar :: random( & mut * rng) ,
479+ ] ;
480+ instance. compute_image ( & witness) . unwrap ( ) ;
481+
482+ ( instance. canonical ( ) . unwrap ( ) , witness)
483+ }
484+
485+ fn elgamal_subtraction < G : PrimeGroup , R : RngCore > (
486+ rng : & mut R ,
487+ ) -> ( CanonicalLinearRelation < G > , Vec < G :: Scalar > ) {
488+ let mut instance = LinearRelation :: new ( ) ;
489+ let [ dk, a, r] = instance. allocate_scalars ( ) ;
490+ let [ ek, C , D , H , G ] = instance. allocate_elements ( ) ;
491+ let v = G :: Scalar :: from ( 100 ) ;
492+
493+ instance. append_equation ( ek, dk * H ) ;
494+
495+ instance. append_equation ( D , r * H ) ;
496+ instance. append_equation ( C , r * ek + a * G ) ;
497+
498+ instance. append_equation ( C , G * v + dk * D + a * G ) ;
499+
500+ // set dk for testing to
501+ let witness = vec ! [
502+ G :: Scalar :: from( 4242 ) ,
503+ G :: Scalar :: from( 1000 ) ,
504+ G :: Scalar :: random( & mut * rng) ,
505+ ] ;
506+ let alt_gen = G :: random ( & mut * rng) ;
507+ instance. set_elements ( [ ( G , G :: generator ( ) ) , ( H , alt_gen) ] ) ;
508+ instance. compute_image ( & witness) . unwrap ( ) ;
509+
510+ ( instance. canonical ( ) . unwrap ( ) , witness)
511+ }
512+
501513#[ test]
502514fn test_cmz_wallet_with_fee ( ) {
503515 use group:: Group ;
@@ -556,14 +568,15 @@ fn test_relations() {
556568 ( "shifted_dleq" , & shifted_dleq) ,
557569 ( "pedersen_commitment" , & pedersen_commitment) ,
558570 ( "twisted_pedersen_commitment" , & twisted_pedersen_commitment) ,
559- ( "pedersen_commitment_dleq" , & pedersen_commitment_dleq ) ,
571+ ( "pedersen_commitment_dleq" , & pedersen_commitment_equality ) ,
560572 ( "bbs_blind_commitment" , & bbs_blind_commitment) ,
561573 ( "test_range" , & test_range) ,
562574 ( "weird_linear_combination" , & weird_linear_combination) ,
563575 ( "simple_subtractions" , & simple_subtractions) ,
564576 ( "subtractions_with_shift" , & subtractions_with_shift) ,
565577 ( "cmz_wallet_spend_relation" , & cmz_wallet_spend_relation) ,
566578 ( "nested_affine_relation" , & nested_affine_relation) ,
579+ ( "elgamal_public_subtract" , & elgamal_subtraction) ,
567580 ] ;
568581
569582 for ( relation_name, relation_sampler) in instance_generators. iter ( ) {
0 commit comments