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