44#![ allow( non_snake_case) ]
55#![ deny( missing_docs) ]
66
7- // XXX we should use Sha3 everywhere
8- use sha2:: { Digest , Sha512 } ;
9-
107use curve25519_dalek:: ristretto:: RistrettoPoint ;
118use curve25519_dalek:: scalar:: Scalar ;
129use curve25519_dalek:: traits:: MultiscalarMul ;
1310
11+ use digest:: { ExtendableOutput , Input , XofReader } ;
12+ use sha3:: { Sha3XofReader , Shake256 } ;
13+
1414/// The `GeneratorsChain` creates an arbitrary-long sequence of orthogonal generators.
1515/// The sequence can be deterministically produced starting with an arbitrary point.
1616struct GeneratorsChain {
17- next_point : RistrettoPoint ,
17+ reader : Sha3XofReader ,
1818}
1919
2020impl GeneratorsChain {
2121 /// Creates a chain of generators, determined by the hash of `label`.
2222 fn new ( label : & [ u8 ] ) -> Self {
23- let mut hash = Sha512 :: default ( ) ;
24- hash. input ( b"GeneratorsChainInit" ) ;
25- hash. input ( label) ;
26- let next_point = RistrettoPoint :: from_hash ( hash) ;
27- GeneratorsChain { next_point }
23+ let mut shake = Shake256 :: default ( ) ;
24+ shake. process ( b"GeneratorsChain" ) ;
25+ shake. process ( label) ;
26+
27+ GeneratorsChain {
28+ reader : shake. xof_result ( ) ,
29+ }
2830 }
2931}
3032
@@ -36,13 +38,16 @@ impl Default for GeneratorsChain {
3638
3739impl Iterator for GeneratorsChain {
3840 type Item = RistrettoPoint ;
41+
3942 fn next ( & mut self ) -> Option < Self :: Item > {
40- let current_point = self . next_point ;
41- let mut hash = Sha512 :: default ( ) ;
42- hash. input ( b"GeneratorsChainNext" ) ;
43- hash. input ( current_point. compress ( ) . as_bytes ( ) ) ;
44- self . next_point = RistrettoPoint :: from_hash ( hash) ;
45- Some ( current_point)
43+ let mut uniform_bytes = [ 0u8 ; 64 ] ;
44+ self . reader . read ( & mut uniform_bytes) ;
45+
46+ Some ( RistrettoPoint :: from_uniform_bytes ( & uniform_bytes) )
47+ }
48+
49+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
50+ ( usize:: max_value ( ) , None )
4651 }
4752}
4853
@@ -55,7 +60,7 @@ pub struct Generators {
5560 /// Number of values or parties
5661 pub m : usize ,
5762 /// Bases for Pedersen commitments
58- pub pedersen_generators : PedersenGenerators ,
63+ pub pedersen_gens : PedersenGenerators ,
5964 /// Per-bit generators for the bit values
6065 pub G : Vec < RistrettoPoint > ,
6166 /// Per-bit generators for the bit blinding factors
@@ -70,7 +75,7 @@ pub struct Generators {
7075#[ derive( Copy , Clone ) ]
7176pub struct GeneratorsView < ' a > {
7277 /// Bases for Pedersen commitments
73- pub pedersen_generators : & ' a PedersenGenerators ,
78+ pub pedersen_gens : & ' a PedersenGenerators ,
7479 /// Per-bit generators for the bit values
7580 pub G : & ' a [ RistrettoPoint ] ,
7681 /// Per-bit generators for the bit blinding factors
@@ -109,16 +114,31 @@ impl Default for PedersenGenerators {
109114
110115impl Generators {
111116 /// Creates generators for `m` range proofs of `n` bits each.
112- pub fn new ( pedersen_generators : PedersenGenerators , n : usize , m : usize ) -> Self {
113- let G = GeneratorsChain :: new ( pedersen_generators. B . compress ( ) . as_bytes ( ) )
114- . take ( n * m)
117+ pub fn new ( pedersen_gens : PedersenGenerators , n : usize , m : usize ) -> Self {
118+ use byteorder:: { ByteOrder , LittleEndian } ;
119+
120+ let G = ( 0 ..m)
121+ . flat_map ( |i| {
122+ let party_index = i as u32 ;
123+ let mut label = [ b'G' , 0 , 0 , 0 , 0 ] ;
124+ LittleEndian :: write_u32 ( & mut label[ 1 ..5 ] , party_index) ;
125+
126+ GeneratorsChain :: new ( & label) . take ( n)
127+ } )
115128 . collect ( ) ;
116- let H = GeneratorsChain :: new ( pedersen_generators. B_blinding . compress ( ) . as_bytes ( ) )
117- . take ( n * m)
129+
130+ let H = ( 0 ..m)
131+ . flat_map ( |i| {
132+ let party_index = i as u32 ;
133+ let mut label = [ b'H' , 0 , 0 , 0 , 0 ] ;
134+ LittleEndian :: write_u32 ( & mut label[ 1 ..5 ] , party_index) ;
135+
136+ GeneratorsChain :: new ( & label) . take ( n)
137+ } )
118138 . collect ( ) ;
119139
120140 Generators {
121- pedersen_generators ,
141+ pedersen_gens ,
122142 n,
123143 m,
124144 G ,
@@ -132,7 +152,7 @@ impl Generators {
132152 let lower = self . n * j;
133153 let upper = self . n * ( j + 1 ) ;
134154 GeneratorsView {
135- pedersen_generators : & self . pedersen_generators ,
155+ pedersen_gens : & self . pedersen_gens ,
136156 G : & self . G [ lower..upper] ,
137157 H : & self . H [ lower..upper] ,
138158 }
0 commit comments