@@ -30,7 +30,7 @@ func (g wG) String() string { return g.c.Params().Name }
30
30
func (g wG ) NewElement () Element { return g .zeroElement () }
31
31
func (g wG ) NewScalar () Scalar { return g .zeroScalar () }
32
32
func (g wG ) Identity () Element { return g .zeroElement () }
33
- func (g wG ) zeroScalar () * wScl { return & wScl {g , nil } }
33
+ func (g wG ) zeroScalar () * wScl { return & wScl {g , make ([] byte , ( g . c . Params (). BitSize + 7 ) / 8 ) } }
34
34
func (g wG ) zeroElement () * wElt { return & wElt {g , new (big.Int ), new (big.Int )} }
35
35
func (g wG ) Generator () Element { return & wElt {g , g .c .Params ().Gx , g .c .Params ().Gy } }
36
36
func (g wG ) Order () Scalar { s := & wScl {g , nil }; s .fromBig (g .c .Params ().N ); return s }
@@ -44,6 +44,15 @@ func (g wG) RandomScalar(rd io.Reader) Scalar {
44
44
mustReadFull (rd , b )
45
45
return g .HashToScalar (b , nil )
46
46
}
47
+ func (g wG ) RandomNonZeroScalar (rd io.Reader ) Scalar {
48
+ zero := g .zeroScalar ()
49
+ for {
50
+ s := g .RandomScalar (rd )
51
+ if ! s .IsEqual (zero ) {
52
+ return s
53
+ }
54
+ }
55
+ }
47
56
func (g wG ) cvtElt (e Element ) * wElt {
48
57
if e == nil {
49
58
return g .zeroElement ()
@@ -202,35 +211,36 @@ func (s *wScl) IsEqual(a Scalar) bool {
202
211
return subtle .ConstantTimeCompare (s .k , aa .k ) == 1
203
212
}
204
213
func (s * wScl ) fromBig (b * big.Int ) {
205
- if err := s .UnmarshalBinary (b .Bytes ()); err != nil {
214
+ k := new (big.Int ).Mod (b , s .c .Params ().N )
215
+ if err := s .UnmarshalBinary (k .Bytes ()); err != nil {
206
216
panic (err )
207
217
}
208
218
}
209
219
func (s * wScl ) Add (a , b Scalar ) Scalar {
210
220
aa , bb := s .cvtScl (a ), s .cvtScl (b )
211
221
r := new (big.Int )
212
- r .SetBytes (aa .k ).Add (r , new (big.Int ).SetBytes (bb .k )). Mod ( r , s . c . Params (). N )
222
+ r .SetBytes (aa .k ).Add (r , new (big.Int ).SetBytes (bb .k ))
213
223
s .fromBig (r )
214
224
return s
215
225
}
216
226
func (s * wScl ) Sub (a , b Scalar ) Scalar {
217
227
aa , bb := s .cvtScl (a ), s .cvtScl (b )
218
228
r := new (big.Int )
219
- r .SetBytes (aa .k ).Sub (r , new (big.Int ).SetBytes (bb .k )). Mod ( r , s . c . Params (). N )
229
+ r .SetBytes (aa .k ).Sub (r , new (big.Int ).SetBytes (bb .k ))
220
230
s .fromBig (r )
221
231
return s
222
232
}
223
233
func (s * wScl ) Mul (a , b Scalar ) Scalar {
224
234
aa , bb := s .cvtScl (a ), s .cvtScl (b )
225
235
r := new (big.Int )
226
- r .SetBytes (aa .k ).Mul (r , new (big.Int ).SetBytes (bb .k )). Mod ( r , s . c . Params (). N )
236
+ r .SetBytes (aa .k ).Mul (r , new (big.Int ).SetBytes (bb .k ))
227
237
s .fromBig (r )
228
238
return s
229
239
}
230
240
func (s * wScl ) Neg (a Scalar ) Scalar {
231
241
aa := s .cvtScl (a )
232
242
r := new (big.Int )
233
- r .SetBytes (aa .k ).Neg (r ). Mod ( r , s . c . Params (). N )
243
+ r .SetBytes (aa .k ).Neg (r )
234
244
s .fromBig (r )
235
245
return s
236
246
}
0 commit comments