OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / vendor / github.com / btcsuite / btcd / btcec / bench_test.go
1 // Copyright 2013-2016 The btcsuite developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
4
5 package btcec
6
7 import "testing"
8
9 // BenchmarkAddJacobian benchmarks the secp256k1 curve addJacobian function with
10 // Z values of 1 so that the associated optimizations are used.
11 func BenchmarkAddJacobian(b *testing.B) {
12         b.StopTimer()
13         x1 := new(fieldVal).SetHex("34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6")
14         y1 := new(fieldVal).SetHex("0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232")
15         z1 := new(fieldVal).SetHex("1")
16         x2 := new(fieldVal).SetHex("34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6")
17         y2 := new(fieldVal).SetHex("0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232")
18         z2 := new(fieldVal).SetHex("1")
19         x3, y3, z3 := new(fieldVal), new(fieldVal), new(fieldVal)
20         curve := S256()
21         b.StartTimer()
22         for i := 0; i < b.N; i++ {
23                 curve.addJacobian(x1, y1, z1, x2, y2, z2, x3, y3, z3)
24         }
25 }
26
27 // BenchmarkAddJacobianNotZOne benchmarks the secp256k1 curve addJacobian
28 // function with Z values other than one so the optimizations associated with
29 // Z=1 aren't used.
30 func BenchmarkAddJacobianNotZOne(b *testing.B) {
31         b.StopTimer()
32         x1 := new(fieldVal).SetHex("d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718")
33         y1 := new(fieldVal).SetHex("5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190")
34         z1 := new(fieldVal).SetHex("2")
35         x2 := new(fieldVal).SetHex("91abba6a34b7481d922a4bd6a04899d5a686f6cf6da4e66a0cb427fb25c04bd4")
36         y2 := new(fieldVal).SetHex("03fede65e30b4e7576a2abefc963ddbf9fdccbf791b77c29beadefe49951f7d1")
37         z2 := new(fieldVal).SetHex("3")
38         x3, y3, z3 := new(fieldVal), new(fieldVal), new(fieldVal)
39         curve := S256()
40         b.StartTimer()
41         for i := 0; i < b.N; i++ {
42                 curve.addJacobian(x1, y1, z1, x2, y2, z2, x3, y3, z3)
43         }
44 }
45
46 // BenchmarkScalarBaseMult benchmarks the secp256k1 curve ScalarBaseMult
47 // function.
48 func BenchmarkScalarBaseMult(b *testing.B) {
49         k := fromHex("d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575")
50         curve := S256()
51         for i := 0; i < b.N; i++ {
52                 curve.ScalarBaseMult(k.Bytes())
53         }
54 }
55
56 // BenchmarkScalarBaseMultLarge benchmarks the secp256k1 curve ScalarBaseMult
57 // function with abnormally large k values.
58 func BenchmarkScalarBaseMultLarge(b *testing.B) {
59         k := fromHex("d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c005751111111011111110")
60         curve := S256()
61         for i := 0; i < b.N; i++ {
62                 curve.ScalarBaseMult(k.Bytes())
63         }
64 }
65
66 // BenchmarkScalarMult benchmarks the secp256k1 curve ScalarMult function.
67 func BenchmarkScalarMult(b *testing.B) {
68         x := fromHex("34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6")
69         y := fromHex("0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232")
70         k := fromHex("d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575")
71         curve := S256()
72         for i := 0; i < b.N; i++ {
73                 curve.ScalarMult(x, y, k.Bytes())
74         }
75 }
76
77 // BenchmarkNAF benchmarks the NAF function.
78 func BenchmarkNAF(b *testing.B) {
79         k := fromHex("d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575")
80         for i := 0; i < b.N; i++ {
81                 NAF(k.Bytes())
82         }
83 }
84
85 // BenchmarkSigVerify benchmarks how long it takes the secp256k1 curve to
86 // verify signatures.
87 func BenchmarkSigVerify(b *testing.B) {
88         b.StopTimer()
89         // Randomly generated keypair.
90         // Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d
91         pubKey := PublicKey{
92                 Curve: S256(),
93                 X:     fromHex("d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab"),
94                 Y:     fromHex("ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52"),
95         }
96
97         // Double sha256 of []byte{0x01, 0x02, 0x03, 0x04}
98         msgHash := fromHex("8de472e2399610baaa7f84840547cd409434e31f5d3bd71e4d947f283874f9c0")
99         sig := Signature{
100                 R: fromHex("fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c"),
101                 S: fromHex("d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f"),
102         }
103
104         if !sig.Verify(msgHash.Bytes(), &pubKey) {
105                 b.Errorf("Signature failed to verify")
106                 return
107         }
108         b.StartTimer()
109
110         for i := 0; i < b.N; i++ {
111                 sig.Verify(msgHash.Bytes(), &pubKey)
112         }
113 }
114
115 // BenchmarkFieldNormalize benchmarks how long it takes the internal field
116 // to perform normalization (which includes modular reduction).
117 func BenchmarkFieldNormalize(b *testing.B) {
118         // The normalize function is constant time so default value is fine.
119         f := new(fieldVal)
120         for i := 0; i < b.N; i++ {
121                 f.Normalize()
122         }
123 }