280 lines
5.0 KiB
Go
280 lines
5.0 KiB
Go
package bn256
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"bytes"
|
|
"crypto/rand"
|
|
)
|
|
|
|
// // return x,y
|
|
// func coordinates(e *G1) (*big.Int, *big.Int) {
|
|
// e.p.MakeAffine()
|
|
// temp := &gfP{}
|
|
// b := make([]byte, 32)
|
|
// montDecode(temp, &e.p.x)
|
|
// temp.Marshal(b)
|
|
// x := new(big.Int).SetBytes(b)
|
|
// montDecode(temp, &e.p.y)
|
|
// temp.Marshal(b)
|
|
// y := new(big.Int).SetBytes(b)
|
|
// return x, y
|
|
// }
|
|
|
|
func TestG1(t *testing.T) {
|
|
k, Ga, err := RandomG1(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ma := Ga.Marshal()
|
|
|
|
Gb := new(G1).ScalarBaseMult(k)
|
|
mb := Gb.Marshal()
|
|
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal("bytes are different")
|
|
}
|
|
}
|
|
|
|
func TestG1UnmarshalCompressed(t *testing.T) {
|
|
for i := 0; i < 10000; i++ {
|
|
_, e1, err := RandomG1(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := e1.Marshal()
|
|
e2, err := (&G1{}).UnmarshalCompressed(b[:32], b[len(b)-1]&1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !e1.p.Equal(&e2.p) {
|
|
t.Fatal()
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestG2UnmarshalCompressed(t *testing.T) {
|
|
for i := 0; i < 10000; i++ {
|
|
_, e1, err := RandomG2(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := e1.Marshal()
|
|
e2, err := (&G2{}).UnmarshalCompressed(b[:32], b[32:64], b[len(b)-1]&1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !e1.p.Equal(&e2.p) {
|
|
t.Fatal()
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestG2FromX(t *testing.T) {
|
|
n := newGFp(2)
|
|
gfpNeg(n, n)
|
|
for i := 0; i < 4; i++ {
|
|
fmt.Printf("%x\n", n[i])
|
|
}
|
|
}
|
|
|
|
func TestG1Marshal(t *testing.T) {
|
|
_, Ga, err := RandomG1(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ma := Ga.Marshal()
|
|
|
|
Gb := new(G1)
|
|
_, err = Gb.Unmarshal(ma)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
mb := Gb.Marshal()
|
|
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal("bytes are different")
|
|
}
|
|
}
|
|
|
|
func TestG2(t *testing.T) {
|
|
k, Ga, err := RandomG2(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ma := Ga.Marshal()
|
|
|
|
Gb := new(G2).ScalarBaseMult(k)
|
|
mb := Gb.Marshal()
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal()
|
|
}
|
|
}
|
|
|
|
func TestG2Marshal(t *testing.T) {
|
|
_, Ga, err := RandomG2(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ma := Ga.Marshal()
|
|
|
|
Gb := new(G2)
|
|
_, err = Gb.Unmarshal(ma)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
mb := Gb.Marshal()
|
|
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal("bytes are different")
|
|
}
|
|
}
|
|
|
|
func TestGT(t *testing.T) {
|
|
k, Ga, err := RandomGT(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ma := Ga.Marshal()
|
|
|
|
Gb := new(GT).ScalarBaseMult(k)
|
|
mb := Gb.Marshal()
|
|
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal()
|
|
}
|
|
}
|
|
|
|
func TestGTMarshal(t *testing.T) {
|
|
_, Ga, err := RandomGT(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ma := Ga.Marshal()
|
|
|
|
Gb := new(GT)
|
|
_, err = Gb.Unmarshal(ma)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
mb := Gb.Marshal()
|
|
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal("bytes are different")
|
|
}
|
|
}
|
|
|
|
func TestBilinearity(t *testing.T) {
|
|
for i := 0; i < 2; i++ {
|
|
a, p1, _ := RandomG1(rand.Reader)
|
|
b, p2, _ := RandomG2(rand.Reader)
|
|
e1 := Pair(p1, p2)
|
|
|
|
e2 := Pair(&G1{*curveGen}, &G2{*twistGen})
|
|
e2.ScalarMult(e2, a)
|
|
e2.ScalarMult(e2, b)
|
|
|
|
if e1.p != e2.p {
|
|
t.Log(e1)
|
|
t.Log(e2)
|
|
t.Fatalf("bad pairing result: %s", e1)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestTripartiteDiffieHellman(t *testing.T) {
|
|
a, _ := rand.Int(rand.Reader, N)
|
|
b, _ := rand.Int(rand.Reader, N)
|
|
c, _ := rand.Int(rand.Reader, N)
|
|
|
|
pa, pb, pc := new(G1), new(G1), new(G1)
|
|
qa, qb, qc := new(G2), new(G2), new(G2)
|
|
|
|
_, _ = pa.Unmarshal(new(G1).ScalarBaseMult(a).Marshal())
|
|
_, _ = qa.Unmarshal(new(G2).ScalarBaseMult(a).Marshal())
|
|
_, _ = pb.Unmarshal(new(G1).ScalarBaseMult(b).Marshal())
|
|
_, _ = qb.Unmarshal(new(G2).ScalarBaseMult(b).Marshal())
|
|
_, _ = pc.Unmarshal(new(G1).ScalarBaseMult(c).Marshal())
|
|
_, _ = qc.Unmarshal(new(G2).ScalarBaseMult(c).Marshal())
|
|
|
|
k1 := Pair(pb, qc)
|
|
k1.ScalarMult(k1, a)
|
|
k1Bytes := k1.Marshal()
|
|
|
|
k2 := Pair(pc, qa)
|
|
k2.ScalarMult(k2, b)
|
|
k2Bytes := k2.Marshal()
|
|
|
|
k3 := Pair(pa, qb)
|
|
k3.ScalarMult(k3, c)
|
|
k3Bytes := k3.Marshal()
|
|
|
|
if !bytes.Equal(k1Bytes, k2Bytes) || !bytes.Equal(k2Bytes, k3Bytes) {
|
|
t.Errorf("keys didn't agree")
|
|
}
|
|
}
|
|
|
|
func TestSelfAddG1(t *testing.T) {
|
|
_, Ga, err := RandomG1(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
Gb := &G1{*curveGen}
|
|
Gb.p.Double(&Ga.p)
|
|
mb := Gb.Marshal()
|
|
|
|
Ga.Add(Ga, Ga)
|
|
ma := Ga.Marshal()
|
|
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal("bytes are different")
|
|
}
|
|
}
|
|
|
|
func TestSelfAddG2(t *testing.T) {
|
|
_, Ga, err := RandomG2(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
Gb := &G2{*twistGen}
|
|
Gb.p.Double(&Ga.p)
|
|
mb := Gb.Marshal()
|
|
|
|
Ga.Add(Ga, Ga)
|
|
ma := Ga.Marshal()
|
|
|
|
if !bytes.Equal(ma, mb) {
|
|
t.Fatal("bytes are different")
|
|
}
|
|
}
|
|
|
|
func TestDirtyUnmarshal(t *testing.T) {
|
|
_, Ga, err := RandomG2(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ma := Ga.Marshal()
|
|
|
|
if _, err := Ga.Unmarshal(ma); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestPairing(T *testing.T) {
|
|
begin := time.Now()
|
|
total := 1
|
|
|
|
for i := 0; i < total; i++ {
|
|
e := Pair(&G1{*curveGen}, &G2{*twistGen})
|
|
// fmt.Println("e:", gfP12Decode(e.p))
|
|
_ = e
|
|
}
|
|
elaspe := time.Since(begin)
|
|
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
|
|
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
|
|
}
|