github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/crypto/bn256/cloudflare/bn256_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  package bn256
    10  
    11  import (
    12  	"bytes"
    13  	"crypto/rand"
    14  	"testing"
    15  )
    16  
    17  func TestG1Marshal(t *testing.T) {
    18  	_, Ga, err := RandomG1(rand.Reader)
    19  	if err != nil {
    20  		t.Fatal(err)
    21  	}
    22  	ma := Ga.Marshal()
    23  
    24  	Gb := new(G1)
    25  	_, err = Gb.Unmarshal(ma)
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  	mb := Gb.Marshal()
    30  
    31  	if !bytes.Equal(ma, mb) {
    32  		t.Fatal("bytes are different")
    33  	}
    34  }
    35  
    36  func TestG2Marshal(t *testing.T) {
    37  	_, Ga, err := RandomG2(rand.Reader)
    38  	if err != nil {
    39  		t.Fatal(err)
    40  	}
    41  	ma := Ga.Marshal()
    42  
    43  	Gb := new(G2)
    44  	_, err = Gb.Unmarshal(ma)
    45  	if err != nil {
    46  		t.Fatal(err)
    47  	}
    48  	mb := Gb.Marshal()
    49  
    50  	if !bytes.Equal(ma, mb) {
    51  		t.Fatal("bytes are different")
    52  	}
    53  }
    54  
    55  func TestBilinearity(t *testing.T) {
    56  	for i := 0; i < 2; i++ {
    57  		a, p1, _ := RandomG1(rand.Reader)
    58  		b, p2, _ := RandomG2(rand.Reader)
    59  		e1 := Pair(p1, p2)
    60  
    61  		e2 := Pair(&G1{curveGen}, &G2{twistGen})
    62  		e2.ScalarMult(e2, a)
    63  		e2.ScalarMult(e2, b)
    64  
    65  		if *e1.p != *e2.p {
    66  			t.Fatalf("bad pairing result: %s", e1)
    67  		}
    68  	}
    69  }
    70  
    71  func TestTripartiteDiffieHellman(t *testing.T) {
    72  	a, _ := rand.Int(rand.Reader, Order)
    73  	b, _ := rand.Int(rand.Reader, Order)
    74  	c, _ := rand.Int(rand.Reader, Order)
    75  
    76  	pa, pb, pc := new(G1), new(G1), new(G1)
    77  	qa, qb, qc := new(G2), new(G2), new(G2)
    78  
    79  	pa.Unmarshal(new(G1).ScalarBaseMult(a).Marshal())
    80  	qa.Unmarshal(new(G2).ScalarBaseMult(a).Marshal())
    81  	pb.Unmarshal(new(G1).ScalarBaseMult(b).Marshal())
    82  	qb.Unmarshal(new(G2).ScalarBaseMult(b).Marshal())
    83  	pc.Unmarshal(new(G1).ScalarBaseMult(c).Marshal())
    84  	qc.Unmarshal(new(G2).ScalarBaseMult(c).Marshal())
    85  
    86  	k1 := Pair(pb, qc)
    87  	k1.ScalarMult(k1, a)
    88  	k1Bytes := k1.Marshal()
    89  
    90  	k2 := Pair(pc, qa)
    91  	k2.ScalarMult(k2, b)
    92  	k2Bytes := k2.Marshal()
    93  
    94  	k3 := Pair(pa, qb)
    95  	k3.ScalarMult(k3, c)
    96  	k3Bytes := k3.Marshal()
    97  
    98  	if !bytes.Equal(k1Bytes, k2Bytes) || !bytes.Equal(k2Bytes, k3Bytes) {
    99  		t.Errorf("keys didn't agree")
   100  	}
   101  }
   102  
   103  func BenchmarkG1(b *testing.B) {
   104  	x, _ := rand.Int(rand.Reader, Order)
   105  	b.ResetTimer()
   106  
   107  	for i := 0; i < b.N; i++ {
   108  		new(G1).ScalarBaseMult(x)
   109  	}
   110  }
   111  
   112  func BenchmarkG2(b *testing.B) {
   113  	x, _ := rand.Int(rand.Reader, Order)
   114  	b.ResetTimer()
   115  
   116  	for i := 0; i < b.N; i++ {
   117  		new(G2).ScalarBaseMult(x)
   118  	}
   119  }
   120  func BenchmarkPairing(b *testing.B) {
   121  	for i := 0; i < b.N; i++ {
   122  		Pair(&G1{curveGen}, &G2{twistGen})
   123  	}
   124  }