Skip to content

Commit 020b59f

Browse files
committed
Merging master
2 parents c19eb6d + a5d64f6 commit 020b59f

File tree

15 files changed

+1029
-22
lines changed

15 files changed

+1029
-22
lines changed

go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ module github.com/drand/kyber
33
go 1.18
44

55
require (
6+
github.com/cloudflare/circl v1.3.7
67
github.com/drand/kyber-bls12381 v0.3.1
7-
github.com/jonboulle/clockwork v0.3.0
8-
github.com/stretchr/testify v1.8.2
8+
github.com/jonboulle/clockwork v0.4.0
9+
github.com/stretchr/testify v1.9.0
910
go.dedis.ch/fixbuf v1.0.3
1011
go.dedis.ch/protobuf v1.0.11
11-
golang.org/x/crypto v0.7.0
12-
golang.org/x/sys v0.6.0
12+
golang.org/x/crypto v0.21.0
13+
golang.org/x/sys v0.18.0
1314
)
1415

1516
require (

go.sum

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
1+
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
2+
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
13
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
24
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
35
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4-
github.com/drand/kyber-bls12381 v0.2.5 h1:4ugiCmXQsvgAuylSk929rK49WGFxCxT/7ArH2vw6Tlg=
5-
github.com/drand/kyber-bls12381 v0.2.5/go.mod h1:8fm2tmRaAdYRGMTh5tjF7qrGHywC+rmM5hrUFL+9fCI=
66
github.com/drand/kyber-bls12381 v0.3.1 h1:KWb8l/zYTP5yrvKTgvhOrk2eNPscbMiUOIeWBnmUxGo=
77
github.com/drand/kyber-bls12381 v0.3.1/go.mod h1:H4y9bLPu7KZA/1efDg+jtJ7emKx+ro3PU7/jWUVt140=
8-
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
9-
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
8+
github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
9+
github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
1010
github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4=
1111
github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig=
1212
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1313
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1414
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
15-
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
16-
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
1715
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
18-
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
19-
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
20-
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
21-
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
16+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
17+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
2218
go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs=
2319
go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw=
2420
go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
@@ -29,14 +25,13 @@ go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI
2925
go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo=
3026
go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4=
3127
golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
32-
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
33-
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
28+
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
29+
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
3430
golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
3531
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
36-
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
37-
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
32+
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
33+
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
3834
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
3935
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
40-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
4136
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
4237
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

pairing/circl_bls12381/adapter.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package circl_bls12381
2+
3+
import (
4+
"github.com/drand/kyber"
5+
)
6+
7+
// SuiteBLS12381 is an adapter that implements the suites.Suite interface so that
8+
// bls12381 can be used as a common suite to generate key pairs for instance but
9+
// still preserves the properties of the pairing (e.g. the Pair function).
10+
//
11+
// It's important to note that the Point function will generate a point
12+
// compatible with public keys only (group G2) where the signature must be
13+
// used as a point from the group G1.
14+
type SuiteBLS12381 struct {
15+
Suite
16+
kyber.Group
17+
}
18+
19+
// NewSuiteBLS12381 makes a new BN256 suite
20+
func NewSuiteBLS12381() *SuiteBLS12381 {
21+
return &SuiteBLS12381{}
22+
}
23+
24+
// Point generates a point from the G2 group that can only be used
25+
// for public keys
26+
func (s *SuiteBLS12381) Point() kyber.Point {
27+
return s.G2().Point()
28+
}
29+
30+
// PointLen returns the length of a G2 point
31+
func (s *SuiteBLS12381) PointLen() int {
32+
return s.G2().PointLen()
33+
}
34+
35+
// Scalar generates a scalar
36+
func (s *SuiteBLS12381) Scalar() kyber.Scalar {
37+
return s.G1().Scalar()
38+
}
39+
40+
// ScalarLen returns the lenght of a scalar
41+
func (s *SuiteBLS12381) ScalarLen() int {
42+
return s.G1().ScalarLen()
43+
}
44+
45+
// String returns the name of the suite
46+
func (s *SuiteBLS12381) String() string {
47+
return "bls12381.adapter"
48+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package circl_bls12381
2+
3+
import (
4+
"testing"
5+
6+
"github.com/drand/kyber/util/key"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestAdapter_SuiteBLS12381(t *testing.T) {
11+
suite := NewSuiteBLS12381()
12+
13+
pair := key.NewKeyPair(suite)
14+
pubkey, err := pair.Public.MarshalBinary()
15+
require.Nil(t, err)
16+
privkey, err := pair.Private.MarshalBinary()
17+
require.Nil(t, err)
18+
19+
pubhex := suite.Point()
20+
err = pubhex.UnmarshalBinary(pubkey)
21+
require.Nil(t, err)
22+
23+
privhex := suite.Scalar()
24+
err = privhex.UnmarshalBinary(privkey)
25+
require.Nil(t, err)
26+
27+
require.Equal(t, "bls12381.adapter", suite.String())
28+
}

pairing/circl_bls12381/g1.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package circl_bls12381
2+
3+
import (
4+
"crypto/cipher"
5+
"io"
6+
7+
circl "github.com/cloudflare/circl/ecc/bls12381"
8+
"github.com/drand/kyber"
9+
)
10+
11+
var _ kyber.SubGroupElement = &G1Elt{}
12+
13+
type G1Elt struct{ inner circl.G1 }
14+
15+
func (p *G1Elt) MarshalBinary() (data []byte, err error) { return p.inner.BytesCompressed(), nil }
16+
17+
func (p *G1Elt) UnmarshalBinary(data []byte) error { return p.inner.SetBytes(data) }
18+
19+
func (p *G1Elt) String() string { return p.inner.String() }
20+
21+
func (p *G1Elt) MarshalSize() int { return circl.G1SizeCompressed }
22+
23+
func (p *G1Elt) MarshalTo(w io.Writer) (int, error) {
24+
buf, err := p.MarshalBinary()
25+
if err != nil {
26+
return 0, err
27+
}
28+
return w.Write(buf)
29+
}
30+
31+
func (p *G1Elt) UnmarshalFrom(r io.Reader) (int, error) {
32+
buf := make([]byte, p.MarshalSize())
33+
n, err := io.ReadFull(r, buf)
34+
if err != nil {
35+
return n, err
36+
}
37+
return n, p.UnmarshalBinary(buf)
38+
}
39+
40+
func (p *G1Elt) Equal(p2 kyber.Point) bool { x := p2.(*G1Elt); return p.inner.IsEqual(&x.inner) }
41+
42+
func (p *G1Elt) Null() kyber.Point { p.inner.SetIdentity(); return p }
43+
44+
func (p *G1Elt) Base() kyber.Point { p.inner = *circl.G1Generator(); return p }
45+
46+
func (p *G1Elt) Pick(rand cipher.Stream) kyber.Point {
47+
var buf [32]byte
48+
rand.XORKeyStream(buf[:], buf[:])
49+
p.inner.Hash(buf[:], nil)
50+
return p
51+
}
52+
53+
func (p *G1Elt) Set(p2 kyber.Point) kyber.Point { p.inner = p2.(*G1Elt).inner; return p }
54+
55+
func (p *G1Elt) Clone() kyber.Point { return new(G1Elt).Set(p) }
56+
57+
func (p *G1Elt) EmbedLen() int {
58+
panic("bls12-381: unsupported operation")
59+
}
60+
61+
func (p *G1Elt) Embed(data []byte, r cipher.Stream) kyber.Point {
62+
panic("bls12-381: unsupported operation")
63+
}
64+
65+
func (p *G1Elt) Data() ([]byte, error) {
66+
panic("bls12-381: unsupported operation")
67+
}
68+
69+
func (p *G1Elt) Add(a, b kyber.Point) kyber.Point {
70+
aa, bb := a.(*G1Elt), b.(*G1Elt)
71+
p.inner.Add(&aa.inner, &bb.inner)
72+
return p
73+
}
74+
75+
func (p *G1Elt) Sub(a, b kyber.Point) kyber.Point { return p.Add(a, new(G1Elt).Neg(b)) }
76+
77+
func (p *G1Elt) Neg(a kyber.Point) kyber.Point {
78+
p.Set(a)
79+
p.inner.Neg()
80+
return p
81+
}
82+
83+
func (p *G1Elt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point {
84+
if q == nil {
85+
q = new(G1Elt).Base()
86+
}
87+
ss, qq := s.(*Scalar), q.(*G1Elt)
88+
p.inner.ScalarMult(&ss.inner, &qq.inner)
89+
return p
90+
}
91+
92+
func (p *G1Elt) IsInCorrectGroup() bool { return p.inner.IsOnG1() }
93+
94+
func (p *G1Elt) Hash(msg []byte) kyber.Point { p.inner.Hash(msg, nil); return p }
95+
func (p *G1Elt) Hash2(msg, dst []byte) kyber.Point { p.inner.Hash(msg, dst); return p }

pairing/circl_bls12381/g2.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package circl_bls12381
2+
3+
import (
4+
"crypto/cipher"
5+
"io"
6+
7+
circl "github.com/cloudflare/circl/ecc/bls12381"
8+
"github.com/drand/kyber"
9+
)
10+
11+
var _ kyber.SubGroupElement = &G2Elt{}
12+
13+
type G2Elt struct{ inner circl.G2 }
14+
15+
func (p *G2Elt) MarshalBinary() (data []byte, err error) { return p.inner.BytesCompressed(), nil }
16+
17+
func (p *G2Elt) UnmarshalBinary(data []byte) error { return p.inner.SetBytes(data) }
18+
19+
func (p *G2Elt) String() string { return p.inner.String() }
20+
21+
func (p *G2Elt) MarshalSize() int { return circl.G2SizeCompressed }
22+
23+
func (p *G2Elt) MarshalTo(w io.Writer) (int, error) {
24+
buf, err := p.MarshalBinary()
25+
if err != nil {
26+
return 0, err
27+
}
28+
return w.Write(buf)
29+
}
30+
31+
func (p *G2Elt) UnmarshalFrom(r io.Reader) (int, error) {
32+
buf := make([]byte, p.MarshalSize())
33+
n, err := io.ReadFull(r, buf)
34+
if err != nil {
35+
return n, err
36+
}
37+
return n, p.UnmarshalBinary(buf)
38+
}
39+
40+
func (p *G2Elt) Equal(p2 kyber.Point) bool { x := p2.(*G2Elt); return p.inner.IsEqual(&x.inner) }
41+
42+
func (p *G2Elt) Null() kyber.Point { p.inner.SetIdentity(); return p }
43+
44+
func (p *G2Elt) Base() kyber.Point { p.inner = *circl.G2Generator(); return p }
45+
46+
func (p *G2Elt) Pick(rand cipher.Stream) kyber.Point {
47+
var buf [32]byte
48+
rand.XORKeyStream(buf[:], buf[:])
49+
p.inner.Hash(buf[:], nil)
50+
return p
51+
}
52+
53+
func (p *G2Elt) Set(p2 kyber.Point) kyber.Point { p.inner = p2.(*G2Elt).inner; return p }
54+
55+
func (p *G2Elt) Clone() kyber.Point { return new(G2Elt).Set(p) }
56+
57+
func (p *G2Elt) EmbedLen() int {
58+
panic("bls12-381: unsupported operation")
59+
}
60+
61+
func (p *G2Elt) Embed(data []byte, r cipher.Stream) kyber.Point {
62+
panic("bls12-381: unsupported operation")
63+
}
64+
65+
func (p *G2Elt) Data() ([]byte, error) {
66+
panic("bls12-381: unsupported operation")
67+
}
68+
69+
func (p *G2Elt) Add(a, b kyber.Point) kyber.Point {
70+
aa, bb := a.(*G2Elt), b.(*G2Elt)
71+
p.inner.Add(&aa.inner, &bb.inner)
72+
return p
73+
}
74+
75+
func (p *G2Elt) Sub(a, b kyber.Point) kyber.Point { return p.Add(a, new(G2Elt).Neg(b)) }
76+
77+
func (p *G2Elt) Neg(a kyber.Point) kyber.Point {
78+
p.Set(a)
79+
p.inner.Neg()
80+
return p
81+
}
82+
83+
func (p *G2Elt) Mul(s kyber.Scalar, q kyber.Point) kyber.Point {
84+
if q == nil {
85+
q = new(G2Elt).Base()
86+
}
87+
ss, qq := s.(*Scalar), q.(*G2Elt)
88+
p.inner.ScalarMult(&ss.inner, &qq.inner)
89+
return p
90+
}
91+
92+
func (p *G2Elt) IsInCorrectGroup() bool { return p.inner.IsOnG2() }
93+
94+
func (p *G2Elt) Hash(msg []byte) kyber.Point { p.inner.Hash(msg, nil); return p }
95+
func (p *G2Elt) Hash2(msg, dst []byte) kyber.Point { p.inner.Hash(msg, dst); return p }

pairing/circl_bls12381/group.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package circl_bls12381
2+
3+
import (
4+
circl "github.com/cloudflare/circl/ecc/bls12381"
5+
"github.com/drand/kyber"
6+
)
7+
8+
var (
9+
G1 kyber.Group = &groupBls{name: "bls12-381.G1", newPoint: func() kyber.Point { return new(G1Elt).Null() }}
10+
G2 kyber.Group = &groupBls{name: "bls12-381.G2", newPoint: func() kyber.Point { return new(G2Elt).Null() }}
11+
GT kyber.Group = &groupBls{name: "bls12-381.GT", newPoint: func() kyber.Point { return new(GTElt).Null() }}
12+
)
13+
14+
type groupBls struct {
15+
name string
16+
newPoint func() kyber.Point
17+
}
18+
19+
func (g groupBls) String() string { return g.name }
20+
func (g groupBls) ScalarLen() int { return circl.ScalarSize }
21+
func (g groupBls) Scalar() kyber.Scalar { return new(Scalar).SetInt64(0) }
22+
func (g groupBls) PointLen() int { return g.newPoint().MarshalSize() }
23+
func (g groupBls) Point() kyber.Point { return g.newPoint() }

0 commit comments

Comments
 (0)