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 }