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