github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/crypto/bn256/cloudflare/bn256_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:36</date>
    10  //</624342624504909824>
    11  
    12  package bn256
    13  
    14  import (
    15  	"bytes"
    16  	"crypto/rand"
    17  	"testing"
    18  )
    19  
    20  func TestG1Marshal(t *testing.T) {
    21  	_, Ga, err := RandomG1(rand.Reader)
    22  	if err != nil {
    23  		t.Fatal(err)
    24  	}
    25  	ma := Ga.Marshal()
    26  
    27  	Gb := new(G1)
    28  	_, err = Gb.Unmarshal(ma)
    29  	if err != nil {
    30  		t.Fatal(err)
    31  	}
    32  	mb := Gb.Marshal()
    33  
    34  	if !bytes.Equal(ma, mb) {
    35  		t.Fatal("bytes are different")
    36  	}
    37  }
    38  
    39  func TestG2Marshal(t *testing.T) {
    40  	_, Ga, err := RandomG2(rand.Reader)
    41  	if err != nil {
    42  		t.Fatal(err)
    43  	}
    44  	ma := Ga.Marshal()
    45  
    46  	Gb := new(G2)
    47  	_, err = Gb.Unmarshal(ma)
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	mb := Gb.Marshal()
    52  
    53  	if !bytes.Equal(ma, mb) {
    54  		t.Fatal("bytes are different")
    55  	}
    56  }
    57  
    58  func TestBilinearity(t *testing.T) {
    59  	for i := 0; i < 2; i++ {
    60  		a, p1, _ := RandomG1(rand.Reader)
    61  		b, p2, _ := RandomG2(rand.Reader)
    62  		e1 := Pair(p1, p2)
    63  
    64  		e2 := Pair(&G1{curveGen}, &G2{twistGen})
    65  		e2.ScalarMult(e2, a)
    66  		e2.ScalarMult(e2, b)
    67  
    68  		if *e1.p != *e2.p {
    69  			t.Fatalf("bad pairing result: %s", e1)
    70  		}
    71  	}
    72  }
    73  
    74  func TestTripartiteDiffieHellman(t *testing.T) {
    75  	a, _ := rand.Int(rand.Reader, Order)
    76  	b, _ := rand.Int(rand.Reader, Order)
    77  	c, _ := rand.Int(rand.Reader, Order)
    78  
    79  	pa, pb, pc := new(G1), new(G1), new(G1)
    80  	qa, qb, qc := new(G2), new(G2), new(G2)
    81  
    82  	pa.Unmarshal(new(G1).ScalarBaseMult(a).Marshal())
    83  	qa.Unmarshal(new(G2).ScalarBaseMult(a).Marshal())
    84  	pb.Unmarshal(new(G1).ScalarBaseMult(b).Marshal())
    85  	qb.Unmarshal(new(G2).ScalarBaseMult(b).Marshal())
    86  	pc.Unmarshal(new(G1).ScalarBaseMult(c).Marshal())
    87  	qc.Unmarshal(new(G2).ScalarBaseMult(c).Marshal())
    88  
    89  	k1 := Pair(pb, qc)
    90  	k1.ScalarMult(k1, a)
    91  	k1Bytes := k1.Marshal()
    92  
    93  	k2 := Pair(pc, qa)
    94  	k2.ScalarMult(k2, b)
    95  	k2Bytes := k2.Marshal()
    96  
    97  	k3 := Pair(pa, qb)
    98  	k3.ScalarMult(k3, c)
    99  	k3Bytes := k3.Marshal()
   100  
   101  	if !bytes.Equal(k1Bytes, k2Bytes) || !bytes.Equal(k2Bytes, k3Bytes) {
   102  		t.Errorf("keys didn't agree")
   103  	}
   104  }
   105  
   106  func BenchmarkG1(b *testing.B) {
   107  	x, _ := rand.Int(rand.Reader, Order)
   108  	b.ResetTimer()
   109  
   110  	for i := 0; i < b.N; i++ {
   111  		new(G1).ScalarBaseMult(x)
   112  	}
   113  }
   114  
   115  func BenchmarkG2(b *testing.B) {
   116  	x, _ := rand.Int(rand.Reader, Order)
   117  	b.ResetTimer()
   118  
   119  	for i := 0; i < b.N; i++ {
   120  		new(G2).ScalarBaseMult(x)
   121  	}
   122  }
   123  func BenchmarkPairing(b *testing.B) {
   124  	for i := 0; i < b.N; i++ {
   125  		Pair(&G1{curveGen}, &G2{twistGen})
   126  	}
   127  }
   128