Files
xgcl/sm/sm9/internal/bn256/bn256_test.go
T
2026-05-27 23:03:00 +08:00

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)
}