github.com/BlockABC/godash@v0.0.0-20191112120524-f4aa3a32c566/btcec/btcec_test.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Copyright 2011 ThePiachu. All rights reserved.
     3  // Copyright 2013-2014 The btcsuite developers
     4  // Copyright (c) 2016 The Dash developers
     5  // Use of this source code is governed by an ISC
     6  // license that can be found in the LICENSE file.
     7  
     8  package btcec_test
     9  
    10  import (
    11  	"crypto/rand"
    12  	"crypto/sha1"
    13  	"encoding/hex"
    14  	"fmt"
    15  	"math/big"
    16  	"testing"
    17  
    18  	"github.com/BlockABC/godash/btcec"
    19  )
    20  
    21  // TestAddJacobian tests addition of points projected in Jacobian coordinates.
    22  func TestAddJacobian(t *testing.T) {
    23  	tests := []struct {
    24  		x1, y1, z1 string // Coordinates (in hex) of first point to add
    25  		x2, y2, z2 string // Coordinates (in hex) of second point to add
    26  		x3, y3, z3 string // Coordinates (in hex) of expected point
    27  	}{
    28  		// Addition with a point at infinity (left hand side).
    29  		// ∞ + P = P
    30  		{
    31  			"0",
    32  			"0",
    33  			"0",
    34  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
    35  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
    36  			"1",
    37  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
    38  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
    39  			"1",
    40  		},
    41  		// Addition with a point at infinity (right hand side).
    42  		// P + ∞ = P
    43  		{
    44  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
    45  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
    46  			"1",
    47  			"0",
    48  			"0",
    49  			"0",
    50  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
    51  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
    52  			"1",
    53  		},
    54  
    55  		// Addition with z1=z2=1 different x values.
    56  		{
    57  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
    58  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
    59  			"1",
    60  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
    61  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
    62  			"1",
    63  			"0cfbc7da1e569b334460788faae0286e68b3af7379d5504efc25e4dba16e46a6",
    64  			"e205f79361bbe0346b037b4010985dbf4f9e1e955e7d0d14aca876bfa79aad87",
    65  			"44a5646b446e3877a648d6d381370d9ef55a83b666ebce9df1b1d7d65b817b2f",
    66  		},
    67  		// Addition with z1=z2=1 same x opposite y.
    68  		// P(x, y, z) + P(x, -y, z) = infinity
    69  		{
    70  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
    71  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
    72  			"1",
    73  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
    74  			"f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd",
    75  			"1",
    76  			"0",
    77  			"0",
    78  			"0",
    79  		},
    80  		// Addition with z1=z2=1 same point.
    81  		// P(x, y, z) + P(x, y, z) = 2P
    82  		{
    83  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
    84  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
    85  			"1",
    86  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
    87  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
    88  			"1",
    89  			"ec9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee64f87c50c27",
    90  			"b082b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd0755c8f2a",
    91  			"16e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c1e594464",
    92  		},
    93  
    94  		// Addition with z1=z2 (!=1) different x values.
    95  		{
    96  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
    97  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
    98  			"2",
    99  			"5d2fe112c21891d440f65a98473cb626111f8a234d2cd82f22172e369f002147",
   100  			"98e3386a0a622a35c4561ffb32308d8e1c6758e10ebb1b4ebd3d04b4eb0ecbe8",
   101  			"2",
   102  			"cfbc7da1e569b334460788faae0286e68b3af7379d5504efc25e4dba16e46a60",
   103  			"817de4d86ef80d1ac0ded00426176fd3e787a5579f43452b2a1db021e6ac3778",
   104  			"129591ad11b8e1de99235b4e04dc367bd56a0ed99baf3a77c6c75f5a6e05f08d",
   105  		},
   106  		// Addition with z1=z2 (!=1) same x opposite y.
   107  		// P(x, y, z) + P(x, -y, z) = infinity
   108  		{
   109  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   110  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   111  			"2",
   112  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   113  			"a470ab21467813b6e0496d2c2b70c11446bab4fcbc9a52b7f225f30e869aea9f",
   114  			"2",
   115  			"0",
   116  			"0",
   117  			"0",
   118  		},
   119  		// Addition with z1=z2 (!=1) same point.
   120  		// P(x, y, z) + P(x, y, z) = 2P
   121  		{
   122  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   123  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   124  			"2",
   125  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   126  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   127  			"2",
   128  			"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac",
   129  			"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988",
   130  			"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11",
   131  		},
   132  
   133  		// Addition with z1!=z2 and z2=1 different x values.
   134  		{
   135  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   136  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   137  			"2",
   138  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
   139  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
   140  			"1",
   141  			"3ef1f68795a6ccd1181e23eab80a1b9a2cebdcde755413bf097936eb5b91b4f3",
   142  			"0bef26c377c068d606f6802130bb7e9f3c3d2abcfa1a295950ed81133561cb04",
   143  			"252b235a2371c3bd3246b69c09b86cf7aad41db3375e74ef8d8ebeb4dc0be11a",
   144  		},
   145  		// Addition with z1!=z2 and z2=1 same x opposite y.
   146  		// P(x, y, z) + P(x, -y, z) = infinity
   147  		{
   148  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   149  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   150  			"2",
   151  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   152  			"f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd",
   153  			"1",
   154  			"0",
   155  			"0",
   156  			"0",
   157  		},
   158  		// Addition with z1!=z2 and z2=1 same point.
   159  		// P(x, y, z) + P(x, y, z) = 2P
   160  		{
   161  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   162  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   163  			"2",
   164  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   165  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
   166  			"1",
   167  			"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac",
   168  			"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988",
   169  			"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11",
   170  		},
   171  
   172  		// Addition with z1!=z2 and z2!=1 different x values.
   173  		// P(x, y, z) + P(x, y, z) = 2P
   174  		{
   175  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   176  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   177  			"2",
   178  			"91abba6a34b7481d922a4bd6a04899d5a686f6cf6da4e66a0cb427fb25c04bd4",
   179  			"03fede65e30b4e7576a2abefc963ddbf9fdccbf791b77c29beadefe49951f7d1",
   180  			"3",
   181  			"3f07081927fd3f6dadd4476614c89a09eba7f57c1c6c3b01fa2d64eac1eef31e",
   182  			"949166e04ebc7fd95a9d77e5dfd88d1492ecffd189792e3944eb2b765e09e031",
   183  			"eb8cba81bcffa4f44d75427506737e1f045f21e6d6f65543ee0e1d163540c931",
   184  		}, // Addition with z1!=z2 and z2!=1 same x opposite y.
   185  		// P(x, y, z) + P(x, -y, z) = infinity
   186  		{
   187  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   188  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   189  			"2",
   190  			"dcc3768780c74a0325e2851edad0dc8a566fa61a9e7fc4a34d13dcb509f99bc7",
   191  			"cafc41904dd5428934f7d075129c8ba46eb622d4fc88d72cd1401452664add18",
   192  			"3",
   193  			"0",
   194  			"0",
   195  			"0",
   196  		},
   197  		// Addition with z1!=z2 and z2!=1 same point.
   198  		// P(x, y, z) + P(x, y, z) = 2P
   199  		{
   200  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   201  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   202  			"2",
   203  			"dcc3768780c74a0325e2851edad0dc8a566fa61a9e7fc4a34d13dcb509f99bc7",
   204  			"3503be6fb22abd76cb082f8aed63745b9149dd2b037728d32ebfebac99b51f17",
   205  			"3",
   206  			"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac",
   207  			"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988",
   208  			"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11",
   209  		},
   210  	}
   211  
   212  	t.Logf("Running %d tests", len(tests))
   213  	for i, test := range tests {
   214  		// Convert hex to field values.
   215  		x1 := btcec.NewFieldVal().SetHex(test.x1)
   216  		y1 := btcec.NewFieldVal().SetHex(test.y1)
   217  		z1 := btcec.NewFieldVal().SetHex(test.z1)
   218  		x2 := btcec.NewFieldVal().SetHex(test.x2)
   219  		y2 := btcec.NewFieldVal().SetHex(test.y2)
   220  		z2 := btcec.NewFieldVal().SetHex(test.z2)
   221  		x3 := btcec.NewFieldVal().SetHex(test.x3)
   222  		y3 := btcec.NewFieldVal().SetHex(test.y3)
   223  		z3 := btcec.NewFieldVal().SetHex(test.z3)
   224  
   225  		// Ensure the test data is using points that are actually on
   226  		// the curve (or the point at infinity).
   227  		if !z1.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x1, y1, z1) {
   228  			t.Errorf("#%d first point is not on the curve -- "+
   229  				"invalid test data", i)
   230  			continue
   231  		}
   232  		if !z2.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x2, y2, z2) {
   233  			t.Errorf("#%d second point is not on the curve -- "+
   234  				"invalid test data", i)
   235  			continue
   236  		}
   237  		if !z3.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x3, y3, z3) {
   238  			t.Errorf("#%d expected point is not on the curve -- "+
   239  				"invalid test data", i)
   240  			continue
   241  		}
   242  
   243  		// Add the two points.
   244  		rx, ry, rz := btcec.NewFieldVal(), btcec.NewFieldVal(), btcec.NewFieldVal()
   245  		btcec.S256().TstAddJacobian(x1, y1, z1, x2, y2, z2, rx, ry, rz)
   246  
   247  		// Ensure result matches expected.
   248  		if !rx.Equals(x3) || !ry.Equals(y3) || !rz.Equals(z3) {
   249  			t.Errorf("#%d wrong result\ngot: (%v, %v, %v)\n"+
   250  				"want: (%v, %v, %v)", i, rx, ry, rz, x3, y3, z3)
   251  			continue
   252  		}
   253  	}
   254  }
   255  
   256  // TestAddAffine tests addition of points in affine coordinates.
   257  func TestAddAffine(t *testing.T) {
   258  	tests := []struct {
   259  		x1, y1 string // Coordinates (in hex) of first point to add
   260  		x2, y2 string // Coordinates (in hex) of second point to add
   261  		x3, y3 string // Coordinates (in hex) of expected point
   262  	}{
   263  		// Addition with a point at infinity (left hand side).
   264  		// ∞ + P = P
   265  		{
   266  			"0",
   267  			"0",
   268  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
   269  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
   270  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
   271  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
   272  		},
   273  		// Addition with a point at infinity (right hand side).
   274  		// P + ∞ = P
   275  		{
   276  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
   277  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
   278  			"0",
   279  			"0",
   280  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
   281  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
   282  		},
   283  
   284  		// Addition with different x values.
   285  		{
   286  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   287  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
   288  			"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575",
   289  			"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d",
   290  			"fd5b88c21d3143518d522cd2796f3d726793c88b3e05636bc829448e053fed69",
   291  			"21cf4f6a5be5ff6380234c50424a970b1f7e718f5eb58f68198c108d642a137f",
   292  		},
   293  		// Addition with same x opposite y.
   294  		// P(x, y) + P(x, -y) = infinity
   295  		{
   296  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   297  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
   298  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   299  			"f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd",
   300  			"0",
   301  			"0",
   302  		},
   303  		// Addition with same point.
   304  		// P(x, y) + P(x, y) = 2P
   305  		{
   306  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   307  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
   308  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   309  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
   310  			"59477d88ae64a104dbb8d31ec4ce2d91b2fe50fa628fb6a064e22582196b365b",
   311  			"938dc8c0f13d1e75c987cb1a220501bd614b0d3dd9eb5c639847e1240216e3b6",
   312  		},
   313  	}
   314  
   315  	t.Logf("Running %d tests", len(tests))
   316  	for i, test := range tests {
   317  		// Convert hex to field values.
   318  		x1, y1 := fromHex(test.x1), fromHex(test.y1)
   319  		x2, y2 := fromHex(test.x2), fromHex(test.y2)
   320  		x3, y3 := fromHex(test.x3), fromHex(test.y3)
   321  
   322  		// Ensure the test data is using points that are actually on
   323  		// the curve (or the point at infinity).
   324  		if !(x1.Sign() == 0 && y1.Sign() == 0) && !btcec.S256().IsOnCurve(x1, y1) {
   325  			t.Errorf("#%d first point is not on the curve -- "+
   326  				"invalid test data", i)
   327  			continue
   328  		}
   329  		if !(x2.Sign() == 0 && y2.Sign() == 0) && !btcec.S256().IsOnCurve(x2, y2) {
   330  			t.Errorf("#%d second point is not on the curve -- "+
   331  				"invalid test data", i)
   332  			continue
   333  		}
   334  		if !(x3.Sign() == 0 && y3.Sign() == 0) && !btcec.S256().IsOnCurve(x3, y3) {
   335  			t.Errorf("#%d expected point is not on the curve -- "+
   336  				"invalid test data", i)
   337  			continue
   338  		}
   339  
   340  		// Add the two points.
   341  		rx, ry := btcec.S256().Add(x1, y1, x2, y2)
   342  
   343  		// Ensure result matches expected.
   344  		if rx.Cmp(x3) != 00 || ry.Cmp(y3) != 0 {
   345  			t.Errorf("#%d wrong result\ngot: (%x, %x)\n"+
   346  				"want: (%x, %x)", i, rx, ry, x3, y3)
   347  			continue
   348  		}
   349  	}
   350  }
   351  
   352  // TestDoubleJacobian tests doubling of points projected in Jacobian
   353  // coordinates.
   354  func TestDoubleJacobian(t *testing.T) {
   355  	tests := []struct {
   356  		x1, y1, z1 string // Coordinates (in hex) of point to double
   357  		x3, y3, z3 string // Coordinates (in hex) of expected point
   358  	}{
   359  		// Doubling a point at infinity is still infinity.
   360  		{
   361  			"0",
   362  			"0",
   363  			"0",
   364  			"0",
   365  			"0",
   366  			"0",
   367  		},
   368  		// Doubling with z1=1.
   369  		{
   370  			"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6",
   371  			"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232",
   372  			"1",
   373  			"ec9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee64f87c50c27",
   374  			"b082b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd0755c8f2a",
   375  			"16e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c1e594464",
   376  		},
   377  		// Doubling with z1!=1.
   378  		{
   379  			"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718",
   380  			"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190",
   381  			"2",
   382  			"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac",
   383  			"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988",
   384  			"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11",
   385  		},
   386  	}
   387  
   388  	t.Logf("Running %d tests", len(tests))
   389  	for i, test := range tests {
   390  		// Convert hex to field values.
   391  		x1 := btcec.NewFieldVal().SetHex(test.x1)
   392  		y1 := btcec.NewFieldVal().SetHex(test.y1)
   393  		z1 := btcec.NewFieldVal().SetHex(test.z1)
   394  		x3 := btcec.NewFieldVal().SetHex(test.x3)
   395  		y3 := btcec.NewFieldVal().SetHex(test.y3)
   396  		z3 := btcec.NewFieldVal().SetHex(test.z3)
   397  
   398  		// Ensure the test data is using points that are actually on
   399  		// the curve (or the point at infinity).
   400  		if !z1.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x1, y1, z1) {
   401  			t.Errorf("#%d first point is not on the curve -- "+
   402  				"invalid test data", i)
   403  			continue
   404  		}
   405  		if !z3.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x3, y3, z3) {
   406  			t.Errorf("#%d expected point is not on the curve -- "+
   407  				"invalid test data", i)
   408  			continue
   409  		}
   410  
   411  		// Double the point.
   412  		rx, ry, rz := btcec.NewFieldVal(), btcec.NewFieldVal(), btcec.NewFieldVal()
   413  		btcec.S256().TstDoubleJacobian(x1, y1, z1, rx, ry, rz)
   414  
   415  		// Ensure result matches expected.
   416  		if !rx.Equals(x3) || !ry.Equals(y3) || !rz.Equals(z3) {
   417  			t.Errorf("#%d wrong result\ngot: (%v, %v, %v)\n"+
   418  				"want: (%v, %v, %v)", i, rx, ry, rz, x3, y3, z3)
   419  			continue
   420  		}
   421  	}
   422  }
   423  
   424  // TestDoubleAffine tests doubling of points in affine coordinates.
   425  func TestDoubleAffine(t *testing.T) {
   426  	tests := []struct {
   427  		x1, y1 string // Coordinates (in hex) of point to double
   428  		x3, y3 string // Coordinates (in hex) of expected point
   429  	}{
   430  		// Doubling a point at infinity is still infinity.
   431  		// 2*∞ = ∞ (point at infinity)
   432  
   433  		{
   434  			"0",
   435  			"0",
   436  			"0",
   437  			"0",
   438  		},
   439  
   440  		// Random points.
   441  		{
   442  			"e41387ffd8baaeeb43c2faa44e141b19790e8ac1f7ff43d480dc132230536f86",
   443  			"1b88191d430f559896149c86cbcb703193105e3cf3213c0c3556399836a2b899",
   444  			"88da47a089d333371bd798c548ef7caae76e737c1980b452d367b3cfe3082c19",
   445  			"3b6f659b09a362821dfcfefdbfbc2e59b935ba081b6c249eb147b3c2100b1bc1",
   446  		},
   447  		{
   448  			"b3589b5d984f03ef7c80aeae444f919374799edf18d375cab10489a3009cff0c",
   449  			"c26cf343875b3630e15bccc61202815b5d8f1fd11308934a584a5babe69db36a",
   450  			"e193860172998751e527bb12563855602a227fc1f612523394da53b746bb2fb1",
   451  			"2bfcf13d2f5ab8bb5c611fab5ebbed3dc2f057062b39a335224c22f090c04789",
   452  		},
   453  		{
   454  			"2b31a40fbebe3440d43ac28dba23eee71c62762c3fe3dbd88b4ab82dc6a82340",
   455  			"9ba7deb02f5c010e217607fd49d58db78ec273371ea828b49891ce2fd74959a1",
   456  			"2c8d5ef0d343b1a1a48aa336078eadda8481cb048d9305dc4fdf7ee5f65973a2",
   457  			"bb4914ac729e26d3cd8f8dc8f702f3f4bb7e0e9c5ae43335f6e94c2de6c3dc95",
   458  		},
   459  		{
   460  			"61c64b760b51981fab54716d5078ab7dffc93730b1d1823477e27c51f6904c7a",
   461  			"ef6eb16ea1a36af69d7f66524c75a3a5e84c13be8fbc2e811e0563c5405e49bd",
   462  			"5f0dcdd2595f5ad83318a0f9da481039e36f135005420393e72dfca985b482f4",
   463  			"a01c849b0837065c1cb481b0932c441f49d1cab1b4b9f355c35173d93f110ae0",
   464  		},
   465  	}
   466  
   467  	t.Logf("Running %d tests", len(tests))
   468  	for i, test := range tests {
   469  		// Convert hex to field values.
   470  		x1, y1 := fromHex(test.x1), fromHex(test.y1)
   471  		x3, y3 := fromHex(test.x3), fromHex(test.y3)
   472  
   473  		// Ensure the test data is using points that are actually on
   474  		// the curve (or the point at infinity).
   475  		if !(x1.Sign() == 0 && y1.Sign() == 0) && !btcec.S256().IsOnCurve(x1, y1) {
   476  			t.Errorf("#%d first point is not on the curve -- "+
   477  				"invalid test data", i)
   478  			continue
   479  		}
   480  		if !(x3.Sign() == 0 && y3.Sign() == 0) && !btcec.S256().IsOnCurve(x3, y3) {
   481  			t.Errorf("#%d expected point is not on the curve -- "+
   482  				"invalid test data", i)
   483  			continue
   484  		}
   485  
   486  		// Double the point.
   487  		rx, ry := btcec.S256().Double(x1, y1)
   488  
   489  		// Ensure result matches expected.
   490  		if rx.Cmp(x3) != 00 || ry.Cmp(y3) != 0 {
   491  			t.Errorf("#%d wrong result\ngot: (%x, %x)\n"+
   492  				"want: (%x, %x)", i, rx, ry, x3, y3)
   493  			continue
   494  		}
   495  	}
   496  }
   497  
   498  func TestOnCurve(t *testing.T) {
   499  	s256 := btcec.S256()
   500  	if !s256.IsOnCurve(s256.Params().Gx, s256.Params().Gy) {
   501  		t.Errorf("FAIL S256")
   502  	}
   503  }
   504  
   505  type baseMultTest struct {
   506  	k    string
   507  	x, y string
   508  }
   509  
   510  //TODO: add more test vectors
   511  var s256BaseMultTests = []baseMultTest{
   512  	{
   513  		"AA5E28D6A97A2479A65527F7290311A3624D4CC0FA1578598EE3C2613BF99522",
   514  		"34F9460F0E4F08393D192B3C5133A6BA099AA0AD9FD54EBCCFACDFA239FF49C6",
   515  		"B71EA9BD730FD8923F6D25A7A91E7DD7728A960686CB5A901BB419E0F2CA232",
   516  	},
   517  	{
   518  		"7E2B897B8CEBC6361663AD410835639826D590F393D90A9538881735256DFAE3",
   519  		"D74BF844B0862475103D96A611CF2D898447E288D34B360BC885CB8CE7C00575",
   520  		"131C670D414C4546B88AC3FF664611B1C38CEB1C21D76369D7A7A0969D61D97D",
   521  	},
   522  	{
   523  		"6461E6DF0FE7DFD05329F41BF771B86578143D4DD1F7866FB4CA7E97C5FA945D",
   524  		"E8AECC370AEDD953483719A116711963CE201AC3EB21D3F3257BB48668C6A72F",
   525  		"C25CAF2F0EBA1DDB2F0F3F47866299EF907867B7D27E95B3873BF98397B24EE1",
   526  	},
   527  	{
   528  		"376A3A2CDCD12581EFFF13EE4AD44C4044B8A0524C42422A7E1E181E4DEECCEC",
   529  		"14890E61FCD4B0BD92E5B36C81372CA6FED471EF3AA60A3E415EE4FE987DABA1",
   530  		"297B858D9F752AB42D3BCA67EE0EB6DCD1C2B7B0DBE23397E66ADC272263F982",
   531  	},
   532  	{
   533  		"1B22644A7BE026548810C378D0B2994EEFA6D2B9881803CB02CEFF865287D1B9",
   534  		"F73C65EAD01C5126F28F442D087689BFA08E12763E0CEC1D35B01751FD735ED3",
   535  		"F449A8376906482A84ED01479BD18882B919C140D638307F0C0934BA12590BDE",
   536  	},
   537  }
   538  
   539  //TODO: test different curves as well?
   540  func TestBaseMult(t *testing.T) {
   541  	s256 := btcec.S256()
   542  	for i, e := range s256BaseMultTests {
   543  		k, ok := new(big.Int).SetString(e.k, 16)
   544  		if !ok {
   545  			t.Errorf("%d: bad value for k: %s", i, e.k)
   546  		}
   547  		x, y := s256.ScalarBaseMult(k.Bytes())
   548  		if fmt.Sprintf("%X", x) != e.x || fmt.Sprintf("%X", y) != e.y {
   549  			t.Errorf("%d: bad output for k=%s: got (%X, %X), want (%s, %s)", i, e.k, x, y, e.x, e.y)
   550  		}
   551  		if testing.Short() && i > 5 {
   552  			break
   553  		}
   554  	}
   555  }
   556  
   557  func TestBaseMultVerify(t *testing.T) {
   558  	s256 := btcec.S256()
   559  	for bytes := 1; bytes < 40; bytes++ {
   560  		for i := 0; i < 30; i++ {
   561  			data := make([]byte, bytes)
   562  			_, err := rand.Read(data)
   563  			if err != nil {
   564  				t.Errorf("failed to read random data for %d", i)
   565  				continue
   566  			}
   567  			x, y := s256.ScalarBaseMult(data)
   568  			xWant, yWant := s256.ScalarMult(s256.Gx, s256.Gy, data)
   569  			if x.Cmp(xWant) != 0 || y.Cmp(yWant) != 0 {
   570  				t.Errorf("%d: bad output for %X: got (%X, %X), want (%X, %X)", i, data, x, y, xWant, yWant)
   571  			}
   572  			if testing.Short() && i > 2 {
   573  				break
   574  			}
   575  		}
   576  	}
   577  }
   578  
   579  func TestScalarMult(t *testing.T) {
   580  	// Strategy for this test:
   581  	// Get a random exponent from the generator point at first
   582  	// This creates a new point which is used in the next iteration
   583  	// Use another random exponent on the new point.
   584  	// We use BaseMult to verify by multiplying the previous exponent
   585  	// and the new random exponent together (mod N)
   586  	s256 := btcec.S256()
   587  	x, y := s256.Gx, s256.Gy
   588  	exponent := big.NewInt(1)
   589  	for i := 0; i < 1024; i++ {
   590  		data := make([]byte, 32)
   591  		_, err := rand.Read(data)
   592  		if err != nil {
   593  			t.Fatalf("failed to read random data at %d", i)
   594  			break
   595  		}
   596  		x, y = s256.ScalarMult(x, y, data)
   597  		exponent.Mul(exponent, new(big.Int).SetBytes(data))
   598  		xWant, yWant := s256.ScalarBaseMult(exponent.Bytes())
   599  		if x.Cmp(xWant) != 0 || y.Cmp(yWant) != 0 {
   600  			t.Fatalf("%d: bad output for %X: got (%X, %X), want (%X, %X)", i, data, x, y, xWant, yWant)
   601  			break
   602  		}
   603  	}
   604  }
   605  
   606  // Test this curve's usage with the ecdsa package.
   607  
   608  func testKeyGeneration(t *testing.T, c *btcec.KoblitzCurve, tag string) {
   609  	priv, err := btcec.NewPrivateKey(c)
   610  	if err != nil {
   611  		t.Errorf("%s: error: %s", tag, err)
   612  		return
   613  	}
   614  	if !c.IsOnCurve(priv.PublicKey.X, priv.PublicKey.Y) {
   615  		t.Errorf("%s: public key invalid: %s", tag, err)
   616  	}
   617  }
   618  
   619  func TestKeyGeneration(t *testing.T) {
   620  	testKeyGeneration(t, btcec.S256(), "S256")
   621  }
   622  
   623  func testSignAndVerify(t *testing.T, c *btcec.KoblitzCurve, tag string) {
   624  	priv, _ := btcec.NewPrivateKey(c)
   625  	pub := priv.PubKey()
   626  
   627  	hashed := []byte("testing")
   628  	sig, err := priv.Sign(hashed)
   629  	if err != nil {
   630  		t.Errorf("%s: error signing: %s", tag, err)
   631  		return
   632  	}
   633  
   634  	if !sig.Verify(hashed, pub) {
   635  		t.Errorf("%s: Verify failed", tag)
   636  	}
   637  
   638  	hashed[0] ^= 0xff
   639  	if sig.Verify(hashed, pub) {
   640  		t.Errorf("%s: Verify always works!", tag)
   641  	}
   642  }
   643  
   644  func TestSignAndVerify(t *testing.T) {
   645  	testSignAndVerify(t, btcec.S256(), "S256")
   646  }
   647  
   648  func TestNAF(t *testing.T) {
   649  	negOne := big.NewInt(-1)
   650  	one := big.NewInt(1)
   651  	two := big.NewInt(2)
   652  	for i := 0; i < 1024; i++ {
   653  		data := make([]byte, 32)
   654  		_, err := rand.Read(data)
   655  		if err != nil {
   656  			t.Fatalf("failed to read random data at %d", i)
   657  			break
   658  		}
   659  		nafPos, nafNeg := btcec.NAF(data)
   660  		want := new(big.Int).SetBytes(data)
   661  		got := big.NewInt(0)
   662  		// Check that the NAF representation comes up with the right number
   663  		for i := 0; i < len(nafPos); i++ {
   664  			bytePos := nafPos[i]
   665  			byteNeg := nafNeg[i]
   666  			for j := 7; j >= 0; j-- {
   667  				got.Mul(got, two)
   668  				if bytePos&0x80 == 0x80 {
   669  					got.Add(got, one)
   670  				} else if byteNeg&0x80 == 0x80 {
   671  					got.Add(got, negOne)
   672  				}
   673  				bytePos <<= 1
   674  				byteNeg <<= 1
   675  			}
   676  		}
   677  		if got.Cmp(want) != 0 {
   678  			t.Errorf("%d: Failed NAF got %X want %X", i, got, want)
   679  		}
   680  	}
   681  }
   682  
   683  func fromHex(s string) *big.Int {
   684  	r, ok := new(big.Int).SetString(s, 16)
   685  	if !ok {
   686  		panic("bad hex")
   687  	}
   688  	return r
   689  }
   690  
   691  // These test vectors were taken from
   692  //   http://csrc.nist.gov/groups/STM/cavp/documents/dss/ecdsatestvectors.zip
   693  var testVectors = []struct {
   694  	msg    string
   695  	Qx, Qy string
   696  	r, s   string
   697  	ok     bool
   698  }{
   699  /*
   700   * All of these tests are disabled since they are for P224, not sec256k1.
   701   * they are left here as an example of test vectors for when some *real*
   702   * vectors may be found.
   703   * - oga@conformal.com
   704  	{
   705  		"09626b45493672e48f3d1226a3aff3201960e577d33a7f72c7eb055302db8fe8ed61685dd036b554942a5737cd1512cdf811ee0c00e6dd2f08c69f08643be396e85dafda664801e772cdb7396868ac47b172245b41986aa2648cb77fbbfa562581be06651355a0c4b090f9d17d8f0ab6cced4e0c9d386cf465a516630f0231bd",
   706  		"9504b5b82d97a264d8b3735e0568decabc4b6ca275bc53cbadfc1c40",
   707  		"03426f80e477603b10dee670939623e3da91a94267fc4e51726009ed",
   708  		"81d3ac609f9575d742028dd496450a58a60eea2dcf8b9842994916e1",
   709  		"96a8c5f382c992e8f30ccce9af120b067ec1d74678fa8445232f75a5",
   710  		false,
   711  	},
   712  	{
   713  		"96b2b6536f6df29be8567a72528aceeaccbaa66c66c534f3868ca9778b02faadb182e4ed34662e73b9d52ecbe9dc8e875fc05033c493108b380689ebf47e5b062e6a0cdb3dd34ce5fe347d92768d72f7b9b377c20aea927043b509c078ed2467d7113405d2ddd458811e6faf41c403a2a239240180f1430a6f4330df5d77de37",
   714  		"851e3100368a22478a0029353045ae40d1d8202ef4d6533cfdddafd8",
   715  		"205302ac69457dd345e86465afa72ee8c74ca97e2b0b999aec1f10c2",
   716  		"4450c2d38b697e990721aa2dbb56578d32b4f5aeb3b9072baa955ee0",
   717  		"e26d4b589166f7b4ba4b1c8fce823fa47aad22f8c9c396b8c6526e12",
   718  		false,
   719  	},
   720  	{
   721  		"86778dbb4a068a01047a8d245d632f636c11d2ad350740b36fad90428b454ad0f120cb558d12ea5c8a23db595d87543d06d1ef489263d01ee529871eb68737efdb8ff85bc7787b61514bed85b7e01d6be209e0a4eb0db5c8df58a5c5bf706d76cb2bdf7800208639e05b89517155d11688236e6a47ed37d8e5a2b1e0adea338e",
   722  		"ad5bda09d319a717c1721acd6688d17020b31b47eef1edea57ceeffc",
   723  		"c8ce98e181770a7c9418c73c63d01494b8b80a41098c5ea50692c984",
   724  		"de5558c257ab4134e52c19d8db3b224a1899cbd08cc508ce8721d5e9",
   725  		"745db7af5a477e5046705c0a5eff1f52cb94a79d481f0c5a5e108ecd",
   726  		true,
   727  	},
   728  	{
   729  		"4bc6ef1958556686dab1e39c3700054a304cbd8f5928603dcd97fafd1f29e69394679b638f71c9344ce6a535d104803d22119f57b5f9477e253817a52afa9bfbc9811d6cc8c8be6b6566c6ef48b439bbb532abe30627548c598867f3861ba0b154dc1c3deca06eb28df8efd28258554b5179883a36fbb1eecf4f93ee19d41e3d",
   730  		"cc5eea2edf964018bdc0504a3793e4d2145142caa09a72ac5fb8d3e8",
   731  		"a48d78ae5d08aa725342773975a00d4219cf7a8029bb8cf3c17c374a",
   732  		"67b861344b4e416d4094472faf4272f6d54a497177fbc5f9ef292836",
   733  		"1d54f3fcdad795bf3b23408ecbac3e1321d1d66f2e4e3d05f41f7020",
   734  		false,
   735  	},
   736  	{
   737  		"bb658732acbf3147729959eb7318a2058308b2739ec58907dd5b11cfa3ecf69a1752b7b7d806fe00ec402d18f96039f0b78dbb90a59c4414fb33f1f4e02e4089de4122cd93df5263a95be4d7084e2126493892816e6a5b4ed123cb705bf930c8f67af0fb4514d5769232a9b008a803af225160ce63f675bd4872c4c97b146e5e",
   738  		"6234c936e27bf141fc7534bfc0a7eedc657f91308203f1dcbd642855",
   739  		"27983d87ca785ef4892c3591ef4a944b1deb125dd58bd351034a6f84",
   740  		"e94e05b42d01d0b965ffdd6c3a97a36a771e8ea71003de76c4ecb13f",
   741  		"1dc6464ffeefbd7872a081a5926e9fc3e66d123f1784340ba17737e9",
   742  		false,
   743  	},
   744  	{
   745  		"7c00be9123bfa2c4290be1d8bc2942c7f897d9a5b7917e3aabd97ef1aab890f148400a89abd554d19bec9d8ed911ce57b22fbcf6d30ca2115f13ce0a3f569a23bad39ee645f624c49c60dcfc11e7d2be24de9c905596d8f23624d63dc46591d1f740e46f982bfae453f107e80db23545782be23ce43708245896fc54e1ee5c43",
   746  		"9f3f037282aaf14d4772edffff331bbdda845c3f65780498cde334f1",
   747  		"8308ee5a16e3bcb721b6bc30000a0419bc1aaedd761be7f658334066",
   748  		"6381d7804a8808e3c17901e4d283b89449096a8fba993388fa11dc54",
   749  		"8e858f6b5b253686a86b757bad23658cda53115ac565abca4e3d9f57",
   750  		false,
   751  	},
   752  	{
   753  		"cffc122a44840dc705bb37130069921be313d8bde0b66201aebc48add028ca131914ef2e705d6bedd19dc6cf9459bbb0f27cdfe3c50483808ffcdaffbeaa5f062e097180f07a40ef4ab6ed03fe07ed6bcfb8afeb42c97eafa2e8a8df469de07317c5e1494c41547478eff4d8c7d9f0f484ad90fedf6e1c35ee68fa73f1691601",
   754  		"a03b88a10d930002c7b17ca6af2fd3e88fa000edf787dc594f8d4fd4",
   755  		"e0cf7acd6ddc758e64847fe4df9915ebda2f67cdd5ec979aa57421f5",
   756  		"387b84dcf37dc343c7d2c5beb82f0bf8bd894b395a7b894565d296c1",
   757  		"4adc12ce7d20a89ce3925e10491c731b15ddb3f339610857a21b53b4",
   758  		false,
   759  	},
   760  	{
   761  		"26e0e0cafd85b43d16255908ccfd1f061c680df75aba3081246b337495783052ba06c60f4a486c1591a4048bae11b4d7fec4f161d80bdc9a7b79d23e44433ed625eab280521a37f23dd3e1bdc5c6a6cfaa026f3c45cf703e76dab57add93fe844dd4cda67dc3bddd01f9152579e49df60969b10f09ce9372fdd806b0c7301866",
   762  		"9a8983c42f2b5a87c37a00458b5970320d247f0c8a88536440173f7d",
   763  		"15e489ec6355351361900299088cfe8359f04fe0cab78dde952be80c",
   764  		"929a21baa173d438ec9f28d6a585a2f9abcfc0a4300898668e476dc0",
   765  		"59a853f046da8318de77ff43f26fe95a92ee296fa3f7e56ce086c872",
   766  		true,
   767  	},
   768  	{
   769  		"1078eac124f48ae4f807e946971d0de3db3748dd349b14cca5c942560fb25401b2252744f18ad5e455d2d97ed5ae745f55ff509c6c8e64606afe17809affa855c4c4cdcaf6b69ab4846aa5624ed0687541aee6f2224d929685736c6a23906d974d3c257abce1a3fb8db5951b89ecb0cda92b5207d93f6618fd0f893c32cf6a6e",
   770  		"d6e55820bb62c2be97650302d59d667a411956138306bd566e5c3c2b",
   771  		"631ab0d64eaf28a71b9cbd27a7a88682a2167cee6251c44e3810894f",
   772  		"65af72bc7721eb71c2298a0eb4eed3cec96a737cc49125706308b129",
   773  		"bd5a987c78e2d51598dbd9c34a9035b0069c580edefdacee17ad892a",
   774  		false,
   775  	},
   776  	{
   777  		"919deb1fdd831c23481dfdb2475dcbe325b04c34f82561ced3d2df0b3d749b36e255c4928973769d46de8b95f162b53cd666cad9ae145e7fcfba97919f703d864efc11eac5f260a5d920d780c52899e5d76f8fe66936ff82130761231f536e6a3d59792f784902c469aa897aabf9a0678f93446610d56d5e0981e4c8a563556b",
   778  		"269b455b1024eb92d860a420f143ac1286b8cce43031562ae7664574",
   779  		"baeb6ca274a77c44a0247e5eb12ca72bdd9a698b3f3ae69c9f1aaa57",
   780  		"cb4ec2160f04613eb0dfe4608486091a25eb12aa4dec1afe91cfb008",
   781  		"40b01d8cd06589481574f958b98ca08ade9d2a8fe31024375c01bb40",
   782  		false,
   783  	},
   784  	{
   785  		"6e012361250dacf6166d2dd1aa7be544c3206a9d43464b3fcd90f3f8cf48d08ec099b59ba6fe7d9bdcfaf244120aed1695d8be32d1b1cd6f143982ab945d635fb48a7c76831c0460851a3d62b7209c30cd9c2abdbe3d2a5282a9fcde1a6f418dd23c409bc351896b9b34d7d3a1a63bbaf3d677e612d4a80fa14829386a64b33f",
   786  		"6d2d695efc6b43b13c14111f2109608f1020e3e03b5e21cfdbc82fcd",
   787  		"26a4859296b7e360b69cf40be7bd97ceaffa3d07743c8489fc47ca1b",
   788  		"9a8cb5f2fdc288b7183c5b32d8e546fc2ed1ca4285eeae00c8b572ad",
   789  		"8c623f357b5d0057b10cdb1a1593dab57cda7bdec9cf868157a79b97",
   790  		true,
   791  	},
   792  	{
   793  		"bf6bd7356a52b234fe24d25557200971fc803836f6fec3cade9642b13a8e7af10ab48b749de76aada9d8927f9b12f75a2c383ca7358e2566c4bb4f156fce1fd4e87ef8c8d2b6b1bdd351460feb22cdca0437ac10ca5e0abbbce9834483af20e4835386f8b1c96daaa41554ceee56730aac04f23a5c765812efa746051f396566",
   794  		"14250131b2599939cf2d6bc491be80ddfe7ad9de644387ee67de2d40",
   795  		"b5dc473b5d014cd504022043c475d3f93c319a8bdcb7262d9e741803",
   796  		"4f21642f2201278a95339a80f75cc91f8321fcb3c9462562f6cbf145",
   797  		"452a5f816ea1f75dee4fd514fa91a0d6a43622981966c59a1b371ff8",
   798  		false,
   799  	},
   800  	{
   801  		"0eb7f4032f90f0bd3cf9473d6d9525d264d14c031a10acd31a053443ed5fe919d5ac35e0be77813071b4062f0b5fdf58ad5f637b76b0b305aec18f82441b6e607b44cdf6e0e3c7c57f24e6fd565e39430af4a6b1d979821ed0175fa03e3125506847654d7e1ae904ce1190ae38dc5919e257bdac2db142a6e7cd4da6c2e83770",
   802  		"d1f342b7790a1667370a1840255ac5bbbdc66f0bc00ae977d99260ac",
   803  		"76416cabae2de9a1000b4646338b774baabfa3db4673790771220cdb",
   804  		"bc85e3fc143d19a7271b2f9e1c04b86146073f3fab4dda1c3b1f35ca",
   805  		"9a5c70ede3c48d5f43307a0c2a4871934424a3303b815df4bb0f128e",
   806  		false,
   807  	},
   808  	{
   809  		"5cc25348a05d85e56d4b03cec450128727bc537c66ec3a9fb613c151033b5e86878632249cba83adcefc6c1e35dcd31702929c3b57871cda5c18d1cf8f9650a25b917efaed56032e43b6fc398509f0d2997306d8f26675f3a8683b79ce17128e006aa0903b39eeb2f1001be65de0520115e6f919de902b32c38d691a69c58c92",
   810  		"7e49a7abf16a792e4c7bbc4d251820a2abd22d9f2fc252a7bf59c9a6",
   811  		"44236a8fb4791c228c26637c28ae59503a2f450d4cfb0dc42aa843b9",
   812  		"084461b4050285a1a85b2113be76a17878d849e6bc489f4d84f15cd8",
   813  		"079b5bddcc4d45de8dbdfd39f69817c7e5afa454a894d03ee1eaaac3",
   814  		false,
   815  	},
   816  	{
   817  		"1951533ce33afb58935e39e363d8497a8dd0442018fd96dff167b3b23d7206a3ee182a3194765df4768a3284e23b8696c199b4686e670d60c9d782f08794a4bccc05cffffbd1a12acd9eb1cfa01f7ebe124da66ecff4599ea7720c3be4bb7285daa1a86ebf53b042bd23208d468c1b3aa87381f8e1ad63e2b4c2ba5efcf05845",
   818  		"31945d12ebaf4d81f02be2b1768ed80784bf35cf5e2ff53438c11493",
   819  		"a62bebffac987e3b9d3ec451eb64c462cdf7b4aa0b1bbb131ceaa0a4",
   820  		"bc3c32b19e42b710bca5c6aaa128564da3ddb2726b25f33603d2af3c",
   821  		"ed1a719cc0c507edc5239d76fe50e2306c145ad252bd481da04180c0",
   822  		false,
   823  	},
   824  */
   825  }
   826  
   827  func TestVectors(t *testing.T) {
   828  	sha := sha1.New()
   829  
   830  	for i, test := range testVectors {
   831  		pub := btcec.PublicKey{
   832  			Curve: btcec.S256(),
   833  			X:     fromHex(test.Qx),
   834  			Y:     fromHex(test.Qy),
   835  		}
   836  		msg, _ := hex.DecodeString(test.msg)
   837  		sha.Reset()
   838  		sha.Write(msg)
   839  		hashed := sha.Sum(nil)
   840  		sig := btcec.Signature{R: fromHex(test.r), S: fromHex(test.s)}
   841  		if fuck := sig.Verify(hashed, &pub); fuck != test.ok {
   842  			//t.Errorf("%d: bad result %v %v", i, pub, hashed)
   843  			t.Errorf("%d: bad result %v instead of %v", i, fuck,
   844  				test.ok)
   845  		}
   846  		if testing.Short() {
   847  			break
   848  		}
   849  	}
   850  }