github.com/dashpay/godash@v0.0.0-20160726055534-e038a21e0e3d/btcec/btcec.go (about)

     1  // Copyright 2010 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
     9  
    10  // References:
    11  //   [SECG]: Recommended Elliptic Curve Domain Parameters
    12  //     http://www.secg.org/sec2-v2.pdf
    13  //
    14  //   [GECC]: Guide to Elliptic Curve Cryptography (Hankerson, Menezes, Vanstone)
    15  
    16  // This package operates, internally, on Jacobian coordinates. For a given
    17  // (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1)
    18  // where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole
    19  // calculation can be performed within the transform (as in ScalarMult and
    20  // ScalarBaseMult). But even for Add and Double, it's faster to apply and
    21  // reverse the transform than to operate in affine coordinates.
    22  
    23  import (
    24  	"crypto/elliptic"
    25  	"math/big"
    26  	"sync"
    27  )
    28  
    29  var (
    30  	// fieldOne is simply the integer 1 in field representation.  It is
    31  	// used to avoid needing to create it multiple times during the internal
    32  	// arithmetic.
    33  	fieldOne = new(fieldVal).SetInt(1)
    34  )
    35  
    36  // KoblitzCurve supports a koblitz curve implementation that fits the ECC Curve
    37  // interface from crypto/elliptic.
    38  type KoblitzCurve struct {
    39  	*elliptic.CurveParams
    40  	q *big.Int
    41  	H int // cofactor of the curve.
    42  
    43  	// byteSize is simply the bit size / 8 and is provided for convenience
    44  	// since it is calculated repeatedly.
    45  	byteSize int
    46  
    47  	// bytePoints
    48  	bytePoints *[32][256][3]fieldVal
    49  
    50  	// The next 6 values are used specifically for endomorphism
    51  	// optimizations in ScalarMult.
    52  
    53  	// lambda must fulfill lambda^3 = 1 mod N where N is the order of G.
    54  	lambda *big.Int
    55  
    56  	// beta must fulfill beta^3 = 1 mod P where P is the prime field of the
    57  	// curve.
    58  	beta *fieldVal
    59  
    60  	// See the EndomorphismVectors in gensecp256k1.go to see how these are
    61  	// derived.
    62  	a1 *big.Int
    63  	b1 *big.Int
    64  	a2 *big.Int
    65  	b2 *big.Int
    66  }
    67  
    68  // Params returns the parameters for the curve.
    69  func (curve *KoblitzCurve) Params() *elliptic.CurveParams {
    70  	return curve.CurveParams
    71  }
    72  
    73  // bigAffineToField takes an affine point (x, y) as big integers and converts
    74  // it to an affine point as field values.
    75  func (curve *KoblitzCurve) bigAffineToField(x, y *big.Int) (*fieldVal, *fieldVal) {
    76  	x3, y3 := new(fieldVal), new(fieldVal)
    77  	x3.SetByteSlice(x.Bytes())
    78  	y3.SetByteSlice(y.Bytes())
    79  
    80  	return x3, y3
    81  }
    82  
    83  // fieldJacobianToBigAffine takes a Jacobian point (x, y, z) as field values and
    84  // converts it to an affine point as big integers.
    85  func (curve *KoblitzCurve) fieldJacobianToBigAffine(x, y, z *fieldVal) (*big.Int, *big.Int) {
    86  	// Inversions are expensive and both point addition and point doubling
    87  	// are faster when working with points that have a z value of one.  So,
    88  	// if the point needs to be converted to affine, go ahead and normalize
    89  	// the point itself at the same time as the calculation is the same.
    90  	var zInv, tempZ fieldVal
    91  	zInv.Set(z).Inverse()   // zInv = Z^-1
    92  	tempZ.SquareVal(&zInv)  // tempZ = Z^-2
    93  	x.Mul(&tempZ)           // X = X/Z^2 (mag: 1)
    94  	y.Mul(tempZ.Mul(&zInv)) // Y = Y/Z^3 (mag: 1)
    95  	z.SetInt(1)             // Z = 1 (mag: 1)
    96  
    97  	// Normalize the x and y values.
    98  	x.Normalize()
    99  	y.Normalize()
   100  
   101  	// Convert the field values for the now affine point to big.Ints.
   102  	x3, y3 := new(big.Int), new(big.Int)
   103  	x3.SetBytes(x.Bytes()[:])
   104  	y3.SetBytes(y.Bytes()[:])
   105  	return x3, y3
   106  }
   107  
   108  // IsOnCurve returns boolean if the point (x,y) is on the curve.
   109  // Part of the elliptic.Curve interface. This function differs from the
   110  // crypto/elliptic algorithm since a = 0 not -3.
   111  func (curve *KoblitzCurve) IsOnCurve(x, y *big.Int) bool {
   112  	// Convert big ints to field values for faster arithmetic.
   113  	fx, fy := curve.bigAffineToField(x, y)
   114  
   115  	// Elliptic curve equation for secp256k1 is: y^2 = x^3 + 7
   116  	y2 := new(fieldVal).SquareVal(fy).Normalize()
   117  	result := new(fieldVal).SquareVal(fx).Mul(fx).AddInt(7).Normalize()
   118  	return y2.Equals(result)
   119  }
   120  
   121  // addZ1AndZ2EqualsOne adds two Jacobian points that are already known to have
   122  // z values of 1 and stores the result in (x3, y3, z3).  That is to say
   123  // (x1, y1, 1) + (x2, y2, 1) = (x3, y3, z3).  It performs faster addition than
   124  // the generic add routine since less arithmetic is needed due to the ability to
   125  // avoid the z value multiplications.
   126  func (curve *KoblitzCurve) addZ1AndZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) {
   127  	// To compute the point addition efficiently, this implementation splits
   128  	// the equation into intermediate elements which are used to minimize
   129  	// the number of field multiplications using the method shown at:
   130  	// http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-mmadd-2007-bl
   131  	//
   132  	// In particular it performs the calculations using the following:
   133  	// H = X2-X1, HH = H^2, I = 4*HH, J = H*I, r = 2*(Y2-Y1), V = X1*I
   134  	// X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*Y1*J, Z3 = 2*H
   135  	//
   136  	// This results in a cost of 4 field multiplications, 2 field squarings,
   137  	// 6 field additions, and 5 integer multiplications.
   138  
   139  	// When the x coordinates are the same for two points on the curve, the
   140  	// y coordinates either must be the same, in which case it is point
   141  	// doubling, or they are opposite and the result is the point at
   142  	// infinity per the group law for elliptic curve cryptography.
   143  	x1.Normalize()
   144  	y1.Normalize()
   145  	x2.Normalize()
   146  	y2.Normalize()
   147  	if x1.Equals(x2) {
   148  		if y1.Equals(y2) {
   149  			// Since x1 == x2 and y1 == y2, point doubling must be
   150  			// done, otherwise the addition would end up dividing
   151  			// by zero.
   152  			curve.doubleJacobian(x1, y1, z1, x3, y3, z3)
   153  			return
   154  		}
   155  
   156  		// Since x1 == x2 and y1 == -y2, the sum is the point at
   157  		// infinity per the group law.
   158  		x3.SetInt(0)
   159  		y3.SetInt(0)
   160  		z3.SetInt(0)
   161  		return
   162  	}
   163  
   164  	// Calculate X3, Y3, and Z3 according to the intermediate elements
   165  	// breakdown above.
   166  	var h, i, j, r, v fieldVal
   167  	var negJ, neg2V, negX3 fieldVal
   168  	h.Set(x1).Negate(1).Add(x2)                // H = X2-X1 (mag: 3)
   169  	i.SquareVal(&h).MulInt(4)                  // I = 4*H^2 (mag: 4)
   170  	j.Mul2(&h, &i)                             // J = H*I (mag: 1)
   171  	r.Set(y1).Negate(1).Add(y2).MulInt(2)      // r = 2*(Y2-Y1) (mag: 6)
   172  	v.Mul2(x1, &i)                             // V = X1*I (mag: 1)
   173  	negJ.Set(&j).Negate(1)                     // negJ = -J (mag: 2)
   174  	neg2V.Set(&v).MulInt(2).Negate(2)          // neg2V = -(2*V) (mag: 3)
   175  	x3.Set(&r).Square().Add(&negJ).Add(&neg2V) // X3 = r^2-J-2*V (mag: 6)
   176  	negX3.Set(x3).Negate(6)                    // negX3 = -X3 (mag: 7)
   177  	j.Mul(y1).MulInt(2).Negate(2)              // J = -(2*Y1*J) (mag: 3)
   178  	y3.Set(&v).Add(&negX3).Mul(&r).Add(&j)     // Y3 = r*(V-X3)-2*Y1*J (mag: 4)
   179  	z3.Set(&h).MulInt(2)                       // Z3 = 2*H (mag: 6)
   180  
   181  	// Normalize the resulting field values to a magnitude of 1 as needed.
   182  	x3.Normalize()
   183  	y3.Normalize()
   184  	z3.Normalize()
   185  }
   186  
   187  // addZ1EqualsZ2 adds two Jacobian points that are already known to have the
   188  // same z value and stores the result in (x3, y3, z3).  That is to say
   189  // (x1, y1, z1) + (x2, y2, z1) = (x3, y3, z3).  It performs faster addition than
   190  // the generic add routine since less arithmetic is needed due to the known
   191  // equivalence.
   192  func (curve *KoblitzCurve) addZ1EqualsZ2(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) {
   193  	// To compute the point addition efficiently, this implementation splits
   194  	// the equation into intermediate elements which are used to minimize
   195  	// the number of field multiplications using a slightly modified version
   196  	// of the method shown at:
   197  	// http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-mmadd-2007-bl
   198  	//
   199  	// In particular it performs the calculations using the following:
   200  	// A = X2-X1, B = A^2, C=Y2-Y1, D = C^2, E = X1*B, F = X2*B
   201  	// X3 = D-E-F, Y3 = C*(E-X3)-Y1*(F-E), Z3 = Z1*A
   202  	//
   203  	// This results in a cost of 5 field multiplications, 2 field squarings,
   204  	// 9 field additions, and 0 integer multiplications.
   205  
   206  	// When the x coordinates are the same for two points on the curve, the
   207  	// y coordinates either must be the same, in which case it is point
   208  	// doubling, or they are opposite and the result is the point at
   209  	// infinity per the group law for elliptic curve cryptography.
   210  	x1.Normalize()
   211  	y1.Normalize()
   212  	x2.Normalize()
   213  	y2.Normalize()
   214  	if x1.Equals(x2) {
   215  		if y1.Equals(y2) {
   216  			// Since x1 == x2 and y1 == y2, point doubling must be
   217  			// done, otherwise the addition would end up dividing
   218  			// by zero.
   219  			curve.doubleJacobian(x1, y1, z1, x3, y3, z3)
   220  			return
   221  		}
   222  
   223  		// Since x1 == x2 and y1 == -y2, the sum is the point at
   224  		// infinity per the group law.
   225  		x3.SetInt(0)
   226  		y3.SetInt(0)
   227  		z3.SetInt(0)
   228  		return
   229  	}
   230  
   231  	// Calculate X3, Y3, and Z3 according to the intermediate elements
   232  	// breakdown above.
   233  	var a, b, c, d, e, f fieldVal
   234  	var negX1, negY1, negE, negX3 fieldVal
   235  	negX1.Set(x1).Negate(1)                // negX1 = -X1 (mag: 2)
   236  	negY1.Set(y1).Negate(1)                // negY1 = -Y1 (mag: 2)
   237  	a.Set(&negX1).Add(x2)                  // A = X2-X1 (mag: 3)
   238  	b.SquareVal(&a)                        // B = A^2 (mag: 1)
   239  	c.Set(&negY1).Add(y2)                  // C = Y2-Y1 (mag: 3)
   240  	d.SquareVal(&c)                        // D = C^2 (mag: 1)
   241  	e.Mul2(x1, &b)                         // E = X1*B (mag: 1)
   242  	negE.Set(&e).Negate(1)                 // negE = -E (mag: 2)
   243  	f.Mul2(x2, &b)                         // F = X2*B (mag: 1)
   244  	x3.Add2(&e, &f).Negate(3).Add(&d)      // X3 = D-E-F (mag: 5)
   245  	negX3.Set(x3).Negate(5).Normalize()    // negX3 = -X3 (mag: 1)
   246  	y3.Set(y1).Mul(f.Add(&negE)).Negate(3) // Y3 = -(Y1*(F-E)) (mag: 4)
   247  	y3.Add(e.Add(&negX3).Mul(&c))          // Y3 = C*(E-X3)+Y3 (mag: 5)
   248  	z3.Mul2(z1, &a)                        // Z3 = Z1*A (mag: 1)
   249  
   250  	// Normalize the resulting field values to a magnitude of 1 as needed.
   251  	x3.Normalize()
   252  	y3.Normalize()
   253  }
   254  
   255  // addZ2EqualsOne adds two Jacobian points when the second point is already
   256  // known to have a z value of 1 (and the z value for the first point is not 1)
   257  // and stores the result in (x3, y3, z3).  That is to say (x1, y1, z1) +
   258  // (x2, y2, 1) = (x3, y3, z3).  It performs faster addition than the generic
   259  // add routine since less arithmetic is needed due to the ability to avoid
   260  // multiplications by the second point's z value.
   261  func (curve *KoblitzCurve) addZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) {
   262  	// To compute the point addition efficiently, this implementation splits
   263  	// the equation into intermediate elements which are used to minimize
   264  	// the number of field multiplications using the method shown at:
   265  	// http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-madd-2007-bl
   266  	//
   267  	// In particular it performs the calculations using the following:
   268  	// Z1Z1 = Z1^2, U2 = X2*Z1Z1, S2 = Y2*Z1*Z1Z1, H = U2-X1, HH = H^2,
   269  	// I = 4*HH, J = H*I, r = 2*(S2-Y1), V = X1*I
   270  	// X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*Y1*J, Z3 = (Z1+H)^2-Z1Z1-HH
   271  	//
   272  	// This results in a cost of 7 field multiplications, 4 field squarings,
   273  	// 9 field additions, and 4 integer multiplications.
   274  
   275  	// When the x coordinates are the same for two points on the curve, the
   276  	// y coordinates either must be the same, in which case it is point
   277  	// doubling, or they are opposite and the result is the point at
   278  	// infinity per the group law for elliptic curve cryptography.  Since
   279  	// any number of Jacobian coordinates can represent the same affine
   280  	// point, the x and y values need to be converted to like terms.  Due to
   281  	// the assumption made for this function that the second point has a z
   282  	// value of 1 (z2=1), the first point is already "converted".
   283  	var z1z1, u2, s2 fieldVal
   284  	x1.Normalize()
   285  	y1.Normalize()
   286  	z1z1.SquareVal(z1)                        // Z1Z1 = Z1^2 (mag: 1)
   287  	u2.Set(x2).Mul(&z1z1).Normalize()         // U2 = X2*Z1Z1 (mag: 1)
   288  	s2.Set(y2).Mul(&z1z1).Mul(z1).Normalize() // S2 = Y2*Z1*Z1Z1 (mag: 1)
   289  	if x1.Equals(&u2) {
   290  		if y1.Equals(&s2) {
   291  			// Since x1 == x2 and y1 == y2, point doubling must be
   292  			// done, otherwise the addition would end up dividing
   293  			// by zero.
   294  			curve.doubleJacobian(x1, y1, z1, x3, y3, z3)
   295  			return
   296  		}
   297  
   298  		// Since x1 == x2 and y1 == -y2, the sum is the point at
   299  		// infinity per the group law.
   300  		x3.SetInt(0)
   301  		y3.SetInt(0)
   302  		z3.SetInt(0)
   303  		return
   304  	}
   305  
   306  	// Calculate X3, Y3, and Z3 according to the intermediate elements
   307  	// breakdown above.
   308  	var h, hh, i, j, r, rr, v fieldVal
   309  	var negX1, negY1, negX3 fieldVal
   310  	negX1.Set(x1).Negate(1)                // negX1 = -X1 (mag: 2)
   311  	h.Add2(&u2, &negX1)                    // H = U2-X1 (mag: 3)
   312  	hh.SquareVal(&h)                       // HH = H^2 (mag: 1)
   313  	i.Set(&hh).MulInt(4)                   // I = 4 * HH (mag: 4)
   314  	j.Mul2(&h, &i)                         // J = H*I (mag: 1)
   315  	negY1.Set(y1).Negate(1)                // negY1 = -Y1 (mag: 2)
   316  	r.Set(&s2).Add(&negY1).MulInt(2)       // r = 2*(S2-Y1) (mag: 6)
   317  	rr.SquareVal(&r)                       // rr = r^2 (mag: 1)
   318  	v.Mul2(x1, &i)                         // V = X1*I (mag: 1)
   319  	x3.Set(&v).MulInt(2).Add(&j).Negate(3) // X3 = -(J+2*V) (mag: 4)
   320  	x3.Add(&rr)                            // X3 = r^2+X3 (mag: 5)
   321  	negX3.Set(x3).Negate(5)                // negX3 = -X3 (mag: 6)
   322  	y3.Set(y1).Mul(&j).MulInt(2).Negate(2) // Y3 = -(2*Y1*J) (mag: 3)
   323  	y3.Add(v.Add(&negX3).Mul(&r))          // Y3 = r*(V-X3)+Y3 (mag: 4)
   324  	z3.Add2(z1, &h).Square()               // Z3 = (Z1+H)^2 (mag: 1)
   325  	z3.Add(z1z1.Add(&hh).Negate(2))        // Z3 = Z3-(Z1Z1+HH) (mag: 4)
   326  
   327  	// Normalize the resulting field values to a magnitude of 1 as needed.
   328  	x3.Normalize()
   329  	y3.Normalize()
   330  	z3.Normalize()
   331  }
   332  
   333  // addGeneric adds two Jacobian points (x1, y1, z1) and (x2, y2, z2) without any
   334  // assumptions about the z values of the two points and stores the result in
   335  // (x3, y3, z3).  That is to say (x1, y1, z1) + (x2, y2, z2) = (x3, y3, z3).  It
   336  // is the slowest of the add routines due to requiring the most arithmetic.
   337  func (curve *KoblitzCurve) addGeneric(x1, y1, z1, x2, y2, z2, x3, y3, z3 *fieldVal) {
   338  	// To compute the point addition efficiently, this implementation splits
   339  	// the equation into intermediate elements which are used to minimize
   340  	// the number of field multiplications using the method shown at:
   341  	// http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl
   342  	//
   343  	// In particular it performs the calculations using the following:
   344  	// Z1Z1 = Z1^2, Z2Z2 = Z2^2, U1 = X1*Z2Z2, U2 = X2*Z1Z1, S1 = Y1*Z2*Z2Z2
   345  	// S2 = Y2*Z1*Z1Z1, H = U2-U1, I = (2*H)^2, J = H*I, r = 2*(S2-S1)
   346  	// V = U1*I
   347  	// X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*S1*J, Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2)*H
   348  	//
   349  	// This results in a cost of 11 field multiplications, 5 field squarings,
   350  	// 9 field additions, and 4 integer multiplications.
   351  
   352  	// When the x coordinates are the same for two points on the curve, the
   353  	// y coordinates either must be the same, in which case it is point
   354  	// doubling, or they are opposite and the result is the point at
   355  	// infinity.  Since any number of Jacobian coordinates can represent the
   356  	// same affine point, the x and y values need to be converted to like
   357  	// terms.
   358  	var z1z1, z2z2, u1, u2, s1, s2 fieldVal
   359  	z1z1.SquareVal(z1)                        // Z1Z1 = Z1^2 (mag: 1)
   360  	z2z2.SquareVal(z2)                        // Z2Z2 = Z2^2 (mag: 1)
   361  	u1.Set(x1).Mul(&z2z2).Normalize()         // U1 = X1*Z2Z2 (mag: 1)
   362  	u2.Set(x2).Mul(&z1z1).Normalize()         // U2 = X2*Z1Z1 (mag: 1)
   363  	s1.Set(y1).Mul(&z2z2).Mul(z2).Normalize() // S1 = Y1*Z2*Z2Z2 (mag: 1)
   364  	s2.Set(y2).Mul(&z1z1).Mul(z1).Normalize() // S2 = Y2*Z1*Z1Z1 (mag: 1)
   365  	if u1.Equals(&u2) {
   366  		if s1.Equals(&s2) {
   367  			// Since x1 == x2 and y1 == y2, point doubling must be
   368  			// done, otherwise the addition would end up dividing
   369  			// by zero.
   370  			curve.doubleJacobian(x1, y1, z1, x3, y3, z3)
   371  			return
   372  		}
   373  
   374  		// Since x1 == x2 and y1 == -y2, the sum is the point at
   375  		// infinity per the group law.
   376  		x3.SetInt(0)
   377  		y3.SetInt(0)
   378  		z3.SetInt(0)
   379  		return
   380  	}
   381  
   382  	// Calculate X3, Y3, and Z3 according to the intermediate elements
   383  	// breakdown above.
   384  	var h, i, j, r, rr, v fieldVal
   385  	var negU1, negS1, negX3 fieldVal
   386  	negU1.Set(&u1).Negate(1)               // negU1 = -U1 (mag: 2)
   387  	h.Add2(&u2, &negU1)                    // H = U2-U1 (mag: 3)
   388  	i.Set(&h).MulInt(2).Square()           // I = (2*H)^2 (mag: 2)
   389  	j.Mul2(&h, &i)                         // J = H*I (mag: 1)
   390  	negS1.Set(&s1).Negate(1)               // negS1 = -S1 (mag: 2)
   391  	r.Set(&s2).Add(&negS1).MulInt(2)       // r = 2*(S2-S1) (mag: 6)
   392  	rr.SquareVal(&r)                       // rr = r^2 (mag: 1)
   393  	v.Mul2(&u1, &i)                        // V = U1*I (mag: 1)
   394  	x3.Set(&v).MulInt(2).Add(&j).Negate(3) // X3 = -(J+2*V) (mag: 4)
   395  	x3.Add(&rr)                            // X3 = r^2+X3 (mag: 5)
   396  	negX3.Set(x3).Negate(5)                // negX3 = -X3 (mag: 6)
   397  	y3.Mul2(&s1, &j).MulInt(2).Negate(2)   // Y3 = -(2*S1*J) (mag: 3)
   398  	y3.Add(v.Add(&negX3).Mul(&r))          // Y3 = r*(V-X3)+Y3 (mag: 4)
   399  	z3.Add2(z1, z2).Square()               // Z3 = (Z1+Z2)^2 (mag: 1)
   400  	z3.Add(z1z1.Add(&z2z2).Negate(2))      // Z3 = Z3-(Z1Z1+Z2Z2) (mag: 4)
   401  	z3.Mul(&h)                             // Z3 = Z3*H (mag: 1)
   402  
   403  	// Normalize the resulting field values to a magnitude of 1 as needed.
   404  	x3.Normalize()
   405  	y3.Normalize()
   406  }
   407  
   408  // addJacobian adds the passed Jacobian points (x1, y1, z1) and (x2, y2, z2)
   409  // together and stores the result in (x3, y3, z3).
   410  func (curve *KoblitzCurve) addJacobian(x1, y1, z1, x2, y2, z2, x3, y3, z3 *fieldVal) {
   411  	// A point at infinity is the identity according to the group law for
   412  	// elliptic curve cryptography.  Thus, ∞ + P = P and P + ∞ = P.
   413  	if (x1.IsZero() && y1.IsZero()) || z1.IsZero() {
   414  		x3.Set(x2)
   415  		y3.Set(y2)
   416  		z3.Set(z2)
   417  		return
   418  	}
   419  	if (x2.IsZero() && y2.IsZero()) || z2.IsZero() {
   420  		x3.Set(x1)
   421  		y3.Set(y1)
   422  		z3.Set(z1)
   423  		return
   424  	}
   425  
   426  	// Faster point addition can be achieved when certain assumptions are
   427  	// met.  For example, when both points have the same z value, arithmetic
   428  	// on the z values can be avoided.  This section thus checks for these
   429  	// conditions and calls an appropriate add function which is accelerated
   430  	// by using those assumptions.
   431  	z1.Normalize()
   432  	z2.Normalize()
   433  	isZ1One := z1.Equals(fieldOne)
   434  	isZ2One := z2.Equals(fieldOne)
   435  	switch {
   436  	case isZ1One && isZ2One:
   437  		curve.addZ1AndZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3)
   438  		return
   439  	case z1.Equals(z2):
   440  		curve.addZ1EqualsZ2(x1, y1, z1, x2, y2, x3, y3, z3)
   441  		return
   442  	case isZ2One:
   443  		curve.addZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3)
   444  		return
   445  	}
   446  
   447  	// None of the above assumptions are true, so fall back to generic
   448  	// point addition.
   449  	curve.addGeneric(x1, y1, z1, x2, y2, z2, x3, y3, z3)
   450  }
   451  
   452  // Add returns the sum of (x1,y1) and (x2,y2). Part of the elliptic.Curve
   453  // interface.
   454  func (curve *KoblitzCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) {
   455  	// A point at infinity is the identity according to the group law for
   456  	// elliptic curve cryptography.  Thus, ∞ + P = P and P + ∞ = P.
   457  	if x1.Sign() == 0 && y1.Sign() == 0 {
   458  		return x2, y2
   459  	}
   460  	if x2.Sign() == 0 && y2.Sign() == 0 {
   461  		return x1, y1
   462  	}
   463  
   464  	// Convert the affine coordinates from big integers to field values
   465  	// and do the point addition in Jacobian projective space.
   466  	fx1, fy1 := curve.bigAffineToField(x1, y1)
   467  	fx2, fy2 := curve.bigAffineToField(x2, y2)
   468  	fx3, fy3, fz3 := new(fieldVal), new(fieldVal), new(fieldVal)
   469  	fOne := new(fieldVal).SetInt(1)
   470  	curve.addJacobian(fx1, fy1, fOne, fx2, fy2, fOne, fx3, fy3, fz3)
   471  
   472  	// Convert the Jacobian coordinate field values back to affine big
   473  	// integers.
   474  	return curve.fieldJacobianToBigAffine(fx3, fy3, fz3)
   475  }
   476  
   477  // doubleZ1EqualsOne performs point doubling on the passed Jacobian point
   478  // when the point is already known to have a z value of 1 and stores
   479  // the result in (x3, y3, z3).  That is to say (x3, y3, z3) = 2*(x1, y1, 1).  It
   480  // performs faster point doubling than the generic routine since less arithmetic
   481  // is needed due to the ability to avoid multiplication by the z value.
   482  func (curve *KoblitzCurve) doubleZ1EqualsOne(x1, y1, x3, y3, z3 *fieldVal) {
   483  	// This function uses the assumptions that z1 is 1, thus the point
   484  	// doubling formulas reduce to:
   485  	//
   486  	// X3 = (3*X1^2)^2 - 8*X1*Y1^2
   487  	// Y3 = (3*X1^2)*(4*X1*Y1^2 - X3) - 8*Y1^4
   488  	// Z3 = 2*Y1
   489  	//
   490  	// To compute the above efficiently, this implementation splits the
   491  	// equation into intermediate elements which are used to minimize the
   492  	// number of field multiplications in favor of field squarings which
   493  	// are roughly 35% faster than field multiplications with the current
   494  	// implementation at the time this was written.
   495  	//
   496  	// This uses a slightly modified version of the method shown at:
   497  	// http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-mdbl-2007-bl
   498  	//
   499  	// In particular it performs the calculations using the following:
   500  	// A = X1^2, B = Y1^2, C = B^2, D = 2*((X1+B)^2-A-C)
   501  	// E = 3*A, F = E^2, X3 = F-2*D, Y3 = E*(D-X3)-8*C
   502  	// Z3 = 2*Y1
   503  	//
   504  	// This results in a cost of 1 field multiplication, 5 field squarings,
   505  	// 6 field additions, and 5 integer multiplications.
   506  	var a, b, c, d, e, f fieldVal
   507  	z3.Set(y1).MulInt(2)                     // Z3 = 2*Y1 (mag: 2)
   508  	a.SquareVal(x1)                          // A = X1^2 (mag: 1)
   509  	b.SquareVal(y1)                          // B = Y1^2 (mag: 1)
   510  	c.SquareVal(&b)                          // C = B^2 (mag: 1)
   511  	b.Add(x1).Square()                       // B = (X1+B)^2 (mag: 1)
   512  	d.Set(&a).Add(&c).Negate(2)              // D = -(A+C) (mag: 3)
   513  	d.Add(&b).MulInt(2)                      // D = 2*(B+D)(mag: 8)
   514  	e.Set(&a).MulInt(3)                      // E = 3*A (mag: 3)
   515  	f.SquareVal(&e)                          // F = E^2 (mag: 1)
   516  	x3.Set(&d).MulInt(2).Negate(16)          // X3 = -(2*D) (mag: 17)
   517  	x3.Add(&f)                               // X3 = F+X3 (mag: 18)
   518  	f.Set(x3).Negate(18).Add(&d).Normalize() // F = D-X3 (mag: 1)
   519  	y3.Set(&c).MulInt(8).Negate(8)           // Y3 = -(8*C) (mag: 9)
   520  	y3.Add(f.Mul(&e))                        // Y3 = E*F+Y3 (mag: 10)
   521  
   522  	// Normalize the field values back to a magnitude of 1.
   523  	x3.Normalize()
   524  	y3.Normalize()
   525  	z3.Normalize()
   526  }
   527  
   528  // doubleGeneric performs point doubling on the passed Jacobian point without
   529  // any assumptions about the z value and stores the result in (x3, y3, z3).
   530  // That is to say (x3, y3, z3) = 2*(x1, y1, z1).  It is the slowest of the point
   531  // doubling routines due to requiring the most arithmetic.
   532  func (curve *KoblitzCurve) doubleGeneric(x1, y1, z1, x3, y3, z3 *fieldVal) {
   533  	// Point doubling formula for Jacobian coordinates for the secp256k1
   534  	// curve:
   535  	// X3 = (3*X1^2)^2 - 8*X1*Y1^2
   536  	// Y3 = (3*X1^2)*(4*X1*Y1^2 - X3) - 8*Y1^4
   537  	// Z3 = 2*Y1*Z1
   538  	//
   539  	// To compute the above efficiently, this implementation splits the
   540  	// equation into intermediate elements which are used to minimize the
   541  	// number of field multiplications in favor of field squarings which
   542  	// are roughly 35% faster than field multiplications with the current
   543  	// implementation at the time this was written.
   544  	//
   545  	// This uses a slightly modified version of the method shown at:
   546  	// http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
   547  	//
   548  	// In particular it performs the calculations using the following:
   549  	// A = X1^2, B = Y1^2, C = B^2, D = 2*((X1+B)^2-A-C)
   550  	// E = 3*A, F = E^2, X3 = F-2*D, Y3 = E*(D-X3)-8*C
   551  	// Z3 = 2*Y1*Z1
   552  	//
   553  	// This results in a cost of 1 field multiplication, 5 field squarings,
   554  	// 6 field additions, and 5 integer multiplications.
   555  	var a, b, c, d, e, f fieldVal
   556  	z3.Mul2(y1, z1).MulInt(2)                // Z3 = 2*Y1*Z1 (mag: 2)
   557  	a.SquareVal(x1)                          // A = X1^2 (mag: 1)
   558  	b.SquareVal(y1)                          // B = Y1^2 (mag: 1)
   559  	c.SquareVal(&b)                          // C = B^2 (mag: 1)
   560  	b.Add(x1).Square()                       // B = (X1+B)^2 (mag: 1)
   561  	d.Set(&a).Add(&c).Negate(2)              // D = -(A+C) (mag: 3)
   562  	d.Add(&b).MulInt(2)                      // D = 2*(B+D)(mag: 8)
   563  	e.Set(&a).MulInt(3)                      // E = 3*A (mag: 3)
   564  	f.SquareVal(&e)                          // F = E^2 (mag: 1)
   565  	x3.Set(&d).MulInt(2).Negate(16)          // X3 = -(2*D) (mag: 17)
   566  	x3.Add(&f)                               // X3 = F+X3 (mag: 18)
   567  	f.Set(x3).Negate(18).Add(&d).Normalize() // F = D-X3 (mag: 1)
   568  	y3.Set(&c).MulInt(8).Negate(8)           // Y3 = -(8*C) (mag: 9)
   569  	y3.Add(f.Mul(&e))                        // Y3 = E*F+Y3 (mag: 10)
   570  
   571  	// Normalize the field values back to a magnitude of 1.
   572  	x3.Normalize()
   573  	y3.Normalize()
   574  	z3.Normalize()
   575  }
   576  
   577  // doubleJacobian doubles the passed Jacobian point (x1, y1, z1) and stores the
   578  // result in (x3, y3, z3).
   579  func (curve *KoblitzCurve) doubleJacobian(x1, y1, z1, x3, y3, z3 *fieldVal) {
   580  	// Doubling a point at infinity is still infinity.
   581  	if y1.IsZero() || z1.IsZero() {
   582  		x3.SetInt(0)
   583  		y3.SetInt(0)
   584  		z3.SetInt(0)
   585  		return
   586  	}
   587  
   588  	// Slightly faster point doubling can be achieved when the z value is 1
   589  	// by avoiding the multiplication on the z value.  This section calls
   590  	// a point doubling function which is accelerated by using that
   591  	// assumption when possible.
   592  	if z1.Normalize().Equals(fieldOne) {
   593  		curve.doubleZ1EqualsOne(x1, y1, x3, y3, z3)
   594  		return
   595  	}
   596  
   597  	// Fall back to generic point doubling which works with arbitrary z
   598  	// values.
   599  	curve.doubleGeneric(x1, y1, z1, x3, y3, z3)
   600  }
   601  
   602  // Double returns 2*(x1,y1). Part of the elliptic.Curve interface.
   603  func (curve *KoblitzCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) {
   604  	if y1.Sign() == 0 {
   605  		return new(big.Int), new(big.Int)
   606  	}
   607  
   608  	// Convert the affine coordinates from big integers to field values
   609  	// and do the point doubling in Jacobian projective space.
   610  	fx1, fy1 := curve.bigAffineToField(x1, y1)
   611  	fx3, fy3, fz3 := new(fieldVal), new(fieldVal), new(fieldVal)
   612  	fOne := new(fieldVal).SetInt(1)
   613  	curve.doubleJacobian(fx1, fy1, fOne, fx3, fy3, fz3)
   614  
   615  	// Convert the Jacobian coordinate field values back to affine big
   616  	// integers.
   617  	return curve.fieldJacobianToBigAffine(fx3, fy3, fz3)
   618  }
   619  
   620  // splitK returns a balanced length-two representation of k and their signs.
   621  // This is algorithm 3.74 from [GECC].
   622  //
   623  // One thing of note about this algorithm is that no matter what c1 and c2 are,
   624  // the final equation of k = k1 + k2 * lambda (mod n) will hold.  This is
   625  // provable mathematically due to how a1/b1/a2/b2 are computed.
   626  //
   627  // c1 and c2 are chosen to minimize the max(k1,k2).
   628  func (curve *KoblitzCurve) splitK(k []byte) ([]byte, []byte, int, int) {
   629  	// All math here is done with big.Int, which is slow.
   630  	// At some point, it might be useful to write something similar to
   631  	// fieldVal but for N instead of P as the prime field if this ends up
   632  	// being a bottleneck.
   633  	bigIntK := new(big.Int)
   634  	c1, c2 := new(big.Int), new(big.Int)
   635  	tmp1, tmp2 := new(big.Int), new(big.Int)
   636  	k1, k2 := new(big.Int), new(big.Int)
   637  
   638  	bigIntK.SetBytes(k)
   639  	// c1 = round(b2 * k / n) from step 4.
   640  	// Rounding isn't really necessary and costs too much, hence skipped
   641  	c1.Mul(curve.b2, bigIntK)
   642  	c1.Div(c1, curve.N)
   643  	// c2 = round(b1 * k / n) from step 4 (sign reversed to optimize one step)
   644  	// Rounding isn't really necessary and costs too much, hence skipped
   645  	c2.Mul(curve.b1, bigIntK)
   646  	c2.Div(c2, curve.N)
   647  	// k1 = k - c1 * a1 - c2 * a2 from step 5 (note c2's sign is reversed)
   648  	tmp1.Mul(c1, curve.a1)
   649  	tmp2.Mul(c2, curve.a2)
   650  	k1.Sub(bigIntK, tmp1)
   651  	k1.Add(k1, tmp2)
   652  	// k2 = - c1 * b1 - c2 * b2 from step 5 (note c2's sign is reversed)
   653  	tmp1.Mul(c1, curve.b1)
   654  	tmp2.Mul(c2, curve.b2)
   655  	k2.Sub(tmp2, tmp1)
   656  
   657  	// Note Bytes() throws out the sign of k1 and k2. This matters
   658  	// since k1 and/or k2 can be negative. Hence, we pass that
   659  	// back separately.
   660  	return k1.Bytes(), k2.Bytes(), k1.Sign(), k2.Sign()
   661  }
   662  
   663  // moduloReduce reduces k from more than 32 bytes to 32 bytes and under.  This
   664  // is done by doing a simple modulo curve.N.  We can do this since G^N = 1 and
   665  // thus any other valid point on the elliptic curve has the same order.
   666  func (curve *KoblitzCurve) moduloReduce(k []byte) []byte {
   667  	// Since the order of G is curve.N, we can use a much smaller number
   668  	// by doing modulo curve.N
   669  	if len(k) > curve.byteSize {
   670  		// Reduce k by performing modulo curve.N.
   671  		tmpK := new(big.Int).SetBytes(k)
   672  		tmpK.Mod(tmpK, curve.N)
   673  		return tmpK.Bytes()
   674  	}
   675  
   676  	return k
   677  }
   678  
   679  // NAF takes a positive integer k and returns the Non-Adjacent Form (NAF) as two
   680  // byte slices.  The first is where 1s will be.  The second is where -1s will
   681  // be.  NAF is convenient in that on average, only 1/3rd of its values are
   682  // non-zero.  This is algorithm 3.30 from [GECC].
   683  //
   684  // Essentially, this makes it possible to minimize the number of operations
   685  // since the resulting ints returned will be at least 50% 0s.
   686  func NAF(k []byte) ([]byte, []byte) {
   687  	// The essence of this algorithm is that whenever we have consecutive 1s
   688  	// in the binary, we want to put a -1 in the lowest bit and get a bunch
   689  	// of 0s up to the highest bit of consecutive 1s.  This is due to this
   690  	// identity:
   691  	// 2^n + 2^(n-1) + 2^(n-2) + ... + 2^(n-k) = 2^(n+1) - 2^(n-k)
   692  	//
   693  	// The algorithm thus may need to go 1 more bit than the length of the
   694  	// bits we actually have, hence bits being 1 bit longer than was
   695  	// necessary.  Since we need to know whether adding will cause a carry,
   696  	// we go from right-to-left in this addition.
   697  	var carry, curIsOne, nextIsOne bool
   698  	// these default to zero
   699  	retPos := make([]byte, len(k)+1)
   700  	retNeg := make([]byte, len(k)+1)
   701  	for i := len(k) - 1; i >= 0; i-- {
   702  		curByte := k[i]
   703  		for j := uint(0); j < 8; j++ {
   704  			curIsOne = curByte&1 == 1
   705  			if j == 7 {
   706  				if i == 0 {
   707  					nextIsOne = false
   708  				} else {
   709  					nextIsOne = k[i-1]&1 == 1
   710  				}
   711  			} else {
   712  				nextIsOne = curByte&2 == 2
   713  			}
   714  			if carry {
   715  				if curIsOne {
   716  					// This bit is 1, so continue to carry
   717  					// and don't need to do anything.
   718  				} else {
   719  					// We've hit a 0 after some number of
   720  					// 1s.
   721  					if nextIsOne {
   722  						// Start carrying again since
   723  						// a new sequence of 1s is
   724  						// starting.
   725  						retNeg[i+1] += 1 << j
   726  					} else {
   727  						// Stop carrying since 1s have
   728  						// stopped.
   729  						carry = false
   730  						retPos[i+1] += 1 << j
   731  					}
   732  				}
   733  			} else if curIsOne {
   734  				if nextIsOne {
   735  					// If this is the start of at least 2
   736  					// consecutive 1s, set the current one
   737  					// to -1 and start carrying.
   738  					retNeg[i+1] += 1 << j
   739  					carry = true
   740  				} else {
   741  					// This is a singleton, not consecutive
   742  					// 1s.
   743  					retPos[i+1] += 1 << j
   744  				}
   745  			}
   746  			curByte >>= 1
   747  		}
   748  	}
   749  	if carry {
   750  		retPos[0] = 1
   751  	}
   752  
   753  	return retPos, retNeg
   754  }
   755  
   756  // ScalarMult returns k*(Bx, By) where k is a big endian integer.
   757  // Part of the elliptic.Curve interface.
   758  func (curve *KoblitzCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) {
   759  	// Point Q = ∞ (point at infinity).
   760  	qx, qy, qz := new(fieldVal), new(fieldVal), new(fieldVal)
   761  
   762  	// Decompose K into k1 and k2 in order to halve the number of EC ops.
   763  	// See Algorithm 3.74 in [GECC].
   764  	k1, k2, signK1, signK2 := curve.splitK(curve.moduloReduce(k))
   765  
   766  	// The main equation here to remember is:
   767  	//   k * P = k1 * P + k2 * ϕ(P)
   768  	//
   769  	// P1 below is P in the equation, P2 below is ϕ(P) in the equation
   770  	p1x, p1y := curve.bigAffineToField(Bx, By)
   771  	p1yNeg := new(fieldVal).NegateVal(p1y, 1)
   772  	p1z := new(fieldVal).SetInt(1)
   773  
   774  	// NOTE: ϕ(x,y) = (βx,y).  The Jacobian z coordinate is 1, so this math
   775  	// goes through.
   776  	p2x := new(fieldVal).Mul2(p1x, curve.beta)
   777  	p2y := new(fieldVal).Set(p1y)
   778  	p2yNeg := new(fieldVal).NegateVal(p2y, 1)
   779  	p2z := new(fieldVal).SetInt(1)
   780  
   781  	// Flip the positive and negative values of the points as needed
   782  	// depending on the signs of k1 and k2.  As mentioned in the equation
   783  	// above, each of k1 and k2 are multiplied by the respective point.
   784  	// Since -k * P is the same thing as k * -P, and the group law for
   785  	// elliptic curves states that P(x, y) = -P(x, -y), it's faster and
   786  	// simplifies the code to just make the point negative.
   787  	if signK1 == -1 {
   788  		p1y, p1yNeg = p1yNeg, p1y
   789  	}
   790  	if signK2 == -1 {
   791  		p2y, p2yNeg = p2yNeg, p2y
   792  	}
   793  
   794  	// NAF versions of k1 and k2 should have a lot more zeros.
   795  	//
   796  	// The Pos version of the bytes contain the +1s and the Neg versions
   797  	// contain the -1s.
   798  	k1PosNAF, k1NegNAF := NAF(k1)
   799  	k2PosNAF, k2NegNAF := NAF(k2)
   800  	k1Len := len(k1PosNAF)
   801  	k2Len := len(k2PosNAF)
   802  
   803  	m := k1Len
   804  	if m < k2Len {
   805  		m = k2Len
   806  	}
   807  
   808  	// Add left-to-right using the NAF optimization.  See algorithm 3.77
   809  	// from [GECC].  This should be faster overall since there will be a lot
   810  	// more instances of 0, hence reducing the number of Jacobian additions
   811  	// at the cost of 1 possible extra doubling.
   812  	var k1BytePos, k1ByteNeg, k2BytePos, k2ByteNeg byte
   813  	for i := 0; i < m; i++ {
   814  		// Since we're going left-to-right, pad the front with 0s.
   815  		if i < m-k1Len {
   816  			k1BytePos = 0
   817  			k1ByteNeg = 0
   818  		} else {
   819  			k1BytePos = k1PosNAF[i-(m-k1Len)]
   820  			k1ByteNeg = k1NegNAF[i-(m-k1Len)]
   821  		}
   822  		if i < m-k2Len {
   823  			k2BytePos = 0
   824  			k2ByteNeg = 0
   825  		} else {
   826  			k2BytePos = k2PosNAF[i-(m-k2Len)]
   827  			k2ByteNeg = k2NegNAF[i-(m-k2Len)]
   828  		}
   829  
   830  		for j := 7; j >= 0; j-- {
   831  			// Q = 2 * Q
   832  			curve.doubleJacobian(qx, qy, qz, qx, qy, qz)
   833  
   834  			if k1BytePos&0x80 == 0x80 {
   835  				curve.addJacobian(qx, qy, qz, p1x, p1y, p1z,
   836  					qx, qy, qz)
   837  			} else if k1ByteNeg&0x80 == 0x80 {
   838  				curve.addJacobian(qx, qy, qz, p1x, p1yNeg, p1z,
   839  					qx, qy, qz)
   840  			}
   841  
   842  			if k2BytePos&0x80 == 0x80 {
   843  				curve.addJacobian(qx, qy, qz, p2x, p2y, p2z,
   844  					qx, qy, qz)
   845  			} else if k2ByteNeg&0x80 == 0x80 {
   846  				curve.addJacobian(qx, qy, qz, p2x, p2yNeg, p2z,
   847  					qx, qy, qz)
   848  			}
   849  			k1BytePos <<= 1
   850  			k1ByteNeg <<= 1
   851  			k2BytePos <<= 1
   852  			k2ByteNeg <<= 1
   853  		}
   854  	}
   855  
   856  	// Convert the Jacobian coordinate field values back to affine big.Ints.
   857  	return curve.fieldJacobianToBigAffine(qx, qy, qz)
   858  }
   859  
   860  // ScalarBaseMult returns k*G where G is the base point of the group and k is a
   861  // big endian integer.
   862  // Part of the elliptic.Curve interface.
   863  func (curve *KoblitzCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) {
   864  	newK := curve.moduloReduce(k)
   865  	diff := len(curve.bytePoints) - len(newK)
   866  
   867  	// Point Q = ∞ (point at infinity).
   868  	qx, qy, qz := new(fieldVal), new(fieldVal), new(fieldVal)
   869  
   870  	// curve.bytePoints has all 256 byte points for each 8-bit window. The
   871  	// strategy is to add up the byte points. This is best understood by
   872  	// expressing k in base-256 which it already sort of is.
   873  	// Each "digit" in the 8-bit window can be looked up using bytePoints
   874  	// and added together.
   875  	for i, byteVal := range newK {
   876  		p := curve.bytePoints[diff+i][byteVal]
   877  		curve.addJacobian(qx, qy, qz, &p[0], &p[1], &p[2], qx, qy, qz)
   878  	}
   879  	return curve.fieldJacobianToBigAffine(qx, qy, qz)
   880  }
   881  
   882  // QPlus1Div4 returns the Q+1/4 constant for the curve for use in calculating
   883  // square roots via exponention.
   884  func (curve *KoblitzCurve) QPlus1Div4() *big.Int {
   885  	return curve.q
   886  }
   887  
   888  var initonce sync.Once
   889  var secp256k1 KoblitzCurve
   890  
   891  func initAll() {
   892  	initS256()
   893  }
   894  
   895  // fromHex converts the passed hex string into a big integer pointer and will
   896  // panic is there is an error.  This is only provided for the hard-coded
   897  // constants so errors in the source code can bet detected. It will only (and
   898  // must only) be called for initialization purposes.
   899  func fromHex(s string) *big.Int {
   900  	r, ok := new(big.Int).SetString(s, 16)
   901  	if !ok {
   902  		panic("invalid hex in source file: " + s)
   903  	}
   904  	return r
   905  }
   906  
   907  func initS256() {
   908  	// Curve parameters taken from [SECG] section 2.4.1.
   909  	secp256k1.CurveParams = new(elliptic.CurveParams)
   910  	secp256k1.P = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F")
   911  	secp256k1.N = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141")
   912  	secp256k1.B = fromHex("0000000000000000000000000000000000000000000000000000000000000007")
   913  	secp256k1.Gx = fromHex("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798")
   914  	secp256k1.Gy = fromHex("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8")
   915  	secp256k1.BitSize = 256
   916  	secp256k1.H = 1
   917  	secp256k1.q = new(big.Int).Div(new(big.Int).Add(secp256k1.P,
   918  		big.NewInt(1)), big.NewInt(4))
   919  
   920  	// Provided for convenience since this gets computed repeatedly.
   921  	secp256k1.byteSize = secp256k1.BitSize / 8
   922  
   923  	// Deserialize and set the pre-computed table used to accelerate scalar
   924  	// base multiplication.  This is hard-coded data, so any errors are
   925  	// panics because it means something is wrong in the source code.
   926  	if err := loadS256BytePoints(); err != nil {
   927  		panic(err)
   928  	}
   929  
   930  	// Next 6 constants are from Hal Finney's bitcointalk.org post:
   931  	// https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565
   932  	// May he rest in peace.
   933  	//
   934  	// They have also been independently derived from the code in the
   935  	// EndomorphismVectors function in gensecp256k1.go.
   936  	secp256k1.lambda = fromHex("5363AD4CC05C30E0A5261C028812645A122E22EA20816678DF02967C1B23BD72")
   937  	secp256k1.beta = new(fieldVal).SetHex("7AE96A2B657C07106E64479EAC3434E99CF0497512F58995C1396C28719501EE")
   938  	secp256k1.a1 = fromHex("3086D221A7D46BCDE86C90E49284EB15")
   939  	secp256k1.b1 = fromHex("-E4437ED6010E88286F547FA90ABFE4C3")
   940  	secp256k1.a2 = fromHex("114CA50F7A8E2F3F657C1108D9D44CFD8")
   941  	secp256k1.b2 = fromHex("3086D221A7D46BCDE86C90E49284EB15")
   942  
   943  	// Alternatively, we can use the parameters below, however, they seem
   944  	//  to be about 8% slower.
   945  	// secp256k1.lambda = fromHex("AC9C52B33FA3CF1F5AD9E3FD77ED9BA4A880B9FC8EC739C2E0CFC810B51283CE")
   946  	// secp256k1.beta = new(fieldVal).SetHex("851695D49A83F8EF919BB86153CBCB16630FB68AED0A766A3EC693D68E6AFA40")
   947  	// secp256k1.a1 = fromHex("E4437ED6010E88286F547FA90ABFE4C3")
   948  	// secp256k1.b1 = fromHex("-3086D221A7D46BCDE86C90E49284EB15")
   949  	// secp256k1.a2 = fromHex("3086D221A7D46BCDE86C90E49284EB15")
   950  	// secp256k1.b2 = fromHex("114CA50F7A8E2F3F657C1108D9D44CFD8")
   951  }
   952  
   953  // S256 returns a Curve which implements secp256k1.
   954  func S256() *KoblitzCurve {
   955  	initonce.Do(initAll)
   956  	return &secp256k1
   957  }