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  }