Skip to content

Commit cd788e3

Browse files
committed
Add sampling of non-zero scalars.
1 parent ecf8ad1 commit cd788e3

File tree

5 files changed

+38
-17
lines changed

5 files changed

+38
-17
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ go 1.15
44

55
require (
66
github.com/bwesterb/go-ristretto v1.2.1
7-
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
8-
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac
7+
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871
8+
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881
99
)

go.sum

+7-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
github.com/bwesterb/go-ristretto v1.2.0 h1:xxWOVbN5m8NNKiSDZXE1jtZvZnC6JSJ9cYFADiZcWtw=
2-
github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
31
github.com/bwesterb/go-ristretto v1.2.1 h1:Xd9ZXmjKE2aY8Ub7+4bX7tXsIPsV1pIZaUlJUjI1toE=
42
github.com/bwesterb/go-ristretto v1.2.1/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
5-
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
6-
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
7-
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
3+
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 h1:/pEO3GD/ABYAjuakUS6xSEmmlyVS4kxBNkeA9tLJiTI=
4+
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
5+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
86
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
98
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
10-
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw=
11-
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
9+
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc=
10+
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1211
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
13-
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
12+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
1413
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

group/group.go

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type Group interface {
2323
Order() Scalar
2424
RandomElement(io.Reader) Element
2525
RandomScalar(io.Reader) Scalar
26+
RandomNonZeroScalar(io.Reader) Scalar
2627
HashToElement(data, dst []byte) Element
2728
HashToElementNonUniform(b, dst []byte) Element
2829
HashToScalar(data, dst []byte) Scalar

group/ristretto255.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package group
33
import (
44
"crypto"
55
_ "crypto/sha512" // to link libraries
6+
"fmt"
67
"io"
78

89
r255 "github.com/bwesterb/go-ristretto"
@@ -76,13 +77,22 @@ func (g ristrettoGroup) RandomElement(r io.Reader) Element {
7677
}
7778
}
7879

79-
func (g ristrettoGroup) RandomScalar(r io.Reader) Scalar {
80+
func (g ristrettoGroup) RandomScalar(io.Reader) Scalar {
8081
var x r255.Scalar
8182
x.Rand()
8283
return &ristrettoScalar{
8384
s: x,
8485
}
8586
}
87+
func (g ristrettoGroup) RandomNonZeroScalar(io.Reader) Scalar {
88+
var s r255.Scalar
89+
for {
90+
s.Rand()
91+
if s.IsNonZeroI() == 1 {
92+
return &ristrettoScalar{s}
93+
}
94+
}
95+
}
8696
func (g ristrettoGroup) HashToElementNonUniform(b, dst []byte) Element {
8797
return g.HashToElement(b, dst)
8898
}
@@ -146,6 +156,7 @@ func (e *ristrettoElement) UnmarshalBinary(data []byte) error {
146156
return e.p.UnmarshalBinary(data)
147157
}
148158

159+
func (s *ristrettoScalar) String() string { return fmt.Sprintf("0x%x", s.s.Bytes()) }
149160
func (s *ristrettoScalar) SetUint64(n uint64) { s.s.SetUint64(n) }
150161

151162
func (s *ristrettoScalar) IsEqual(x Scalar) bool {

group/short.go

+16-6
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (g wG) String() string { return g.c.Params().Name }
2929
func (g wG) NewElement() Element { return g.zeroElement() }
3030
func (g wG) NewScalar() Scalar { return g.zeroScalar() }
3131
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)} }
3333
func (g wG) zeroElement() *wElt { return &wElt{g, new(big.Int), new(big.Int)} }
3434
func (g wG) Generator() Element { return &wElt{g, g.c.Params().Gx, g.c.Params().Gy} }
3535
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 {
4747
}
4848
return g.HashToScalar(b, nil)
4949
}
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+
}
5059
func (g wG) cvtElt(e Element) *wElt {
5160
if e == nil {
5261
return g.zeroElement()
@@ -205,35 +214,36 @@ func (s *wScl) IsEqual(a Scalar) bool {
205214
return subtle.ConstantTimeCompare(s.k, aa.k) == 1
206215
}
207216
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 {
209219
panic(err)
210220
}
211221
}
212222
func (s *wScl) Add(a, b Scalar) Scalar {
213223
aa, bb := s.cvtScl(a), s.cvtScl(b)
214224
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))
216226
s.fromBig(r)
217227
return s
218228
}
219229
func (s *wScl) Sub(a, b Scalar) Scalar {
220230
aa, bb := s.cvtScl(a), s.cvtScl(b)
221231
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))
223233
s.fromBig(r)
224234
return s
225235
}
226236
func (s *wScl) Mul(a, b Scalar) Scalar {
227237
aa, bb := s.cvtScl(a), s.cvtScl(b)
228238
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))
230240
s.fromBig(r)
231241
return s
232242
}
233243
func (s *wScl) Neg(a Scalar) Scalar {
234244
aa := s.cvtScl(a)
235245
r := new(big.Int)
236-
r.SetBytes(aa.k).Neg(r).Mod(r, s.c.Params().N)
246+
r.SetBytes(aa.k).Neg(r)
237247
s.fromBig(r)
238248
return s
239249
}

0 commit comments

Comments
 (0)