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