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