aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/bn256/cloudflare/bn256_test.go
blob: 369a3edaac0b65f738b20dd01353a87488b28fcd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// +build amd64,!appengine,!gccgo

package bn256

import (
    "bytes"
    "crypto/rand"
    "testing"
)

func TestG1Marshal(t *testing.T) {
    _, Ga, err := RandomG1(rand.Reader)
    if err != nil {
        t.Fatal(err)
    }
    ma := Ga.Marshal()

    Gb := new(G1)
    _, err = Gb.Unmarshal(ma)
    if err != nil {
        t.Fatal(err)
    }
    mb := Gb.Marshal()

    if !bytes.Equal(ma, mb) {
        t.Fatal("bytes are different")
    }
}

func TestG2Marshal(t *testing.T) {
    _, Ga, err := RandomG2(rand.Reader)
    if err != nil {
        t.Fatal(err)
    }
    ma := Ga.Marshal()

    Gb := new(G2)
    _, err = Gb.Unmarshal(ma)
    if err != nil {
        t.Fatal(err)
    }
    mb := Gb.Marshal()

    if !bytes.Equal(ma, mb) {
        t.Fatal("bytes are different")
    }
}

func TestBilinearity(t *testing.T) {
    for i := 0; i < 2; i++ {
        a, p1, _ := RandomG1(rand.Reader)
        b, p2, _ := RandomG2(rand.Reader)
        e1 := Pair(p1, p2)

        e2 := Pair(&G1{curveGen}, &G2{twistGen})
        e2.ScalarMult(e2, a)
        e2.ScalarMult(e2, b)

        if *e1.p != *e2.p {
            t.Fatalf("bad pairing result: %s", e1)
        }
    }
}

func TestTripartiteDiffieHellman(t *testing.T) {
    a, _ := rand.Int(rand.Reader, Order)
    b, _ := rand.Int(rand.Reader, Order)
    c, _ := rand.Int(rand.Reader, Order)

    pa, pb, pc := new(G1), new(G1), new(G1)
    qa, qb, qc := new(G2), new(G2), new(G2)

    pa.Unmarshal(new(G1).ScalarBaseMult(a).Marshal())
    qa.Unmarshal(new(G2).ScalarBaseMult(a).Marshal())
    pb.Unmarshal(new(G1).ScalarBaseMult(b).Marshal())
    qb.Unmarshal(new(G2).ScalarBaseMult(b).Marshal())
    pc.Unmarshal(new(G1).ScalarBaseMult(c).Marshal())
    qc.Unmarshal(new(G2).ScalarBaseMult(c).Marshal())

    k1 := Pair(pb, qc)
    k1.ScalarMult(k1, a)
    k1Bytes := k1.Marshal()

    k2 := Pair(pc, qa)
    k2.ScalarMult(k2, b)
    k2Bytes := k2.Marshal()

    k3 := Pair(pa, qb)
    k3.ScalarMult(k3, c)
    k3Bytes := k3.Marshal()

    if !bytes.Equal(k1Bytes, k2Bytes) || !bytes.Equal(k2Bytes, k3Bytes) {
        t.Errorf("keys didn't agree")
    }
}

func BenchmarkG1(b *testing.B) {
    x, _ := rand.Int(rand.Reader, Order)
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
        new(G1).ScalarBaseMult(x)
    }
}

func BenchmarkG2(b *testing.B) {
    x, _ := rand.Int(rand.Reader, Order)
    b.ResetTimer()

    for i := 0; i < b.N; i++ {
        new(G2).ScalarBaseMult(x)
    }
}
func BenchmarkPairing(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Pair(&G1{curveGen}, &G2{twistGen})
    }
}