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 }