1 line
84 KiB
JSON
1 line
84 KiB
JSON
{"ast":null,"code":"'use strict';\n\nvar utils = require('../utils');\n\nvar BN = require('bn.js');\n\nvar inherits = require('inherits');\n\nvar Base = require('./base');\n\nvar assert = utils.assert;\n\nfunction ShortCurve(conf) {\n Base.call(this, 'short', conf);\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.tinv = this.two.redInvm();\n this.zeroA = this.a.fromRed().cmpn(0) === 0;\n this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; // If the curve is endomorphic, precalculate beta and lambda\n\n this.endo = this._getEndomorphism(conf);\n this._endoWnafT1 = new Array(4);\n this._endoWnafT2 = new Array(4);\n}\n\ninherits(ShortCurve, Base);\nmodule.exports = ShortCurve;\n\nShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n // No efficient endomorphism\n if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) return; // Compute beta and lambda, that lambda * P = (beta * Px; Py)\n\n var beta;\n var lambda;\n\n if (conf.beta) {\n beta = new BN(conf.beta, 16).toRed(this.red);\n } else {\n var betas = this._getEndoRoots(this.p); // Choose the smallest beta\n\n\n beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n beta = beta.toRed(this.red);\n }\n\n if (conf.lambda) {\n lambda = new BN(conf.lambda, 16);\n } else {\n // Choose the lambda that is matching selected beta\n var lambdas = this._getEndoRoots(this.n);\n\n if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n lambda = lambdas[0];\n } else {\n lambda = lambdas[1];\n assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n }\n } // Get basis vectors, used for balanced length-two representation\n\n\n var basis;\n\n if (conf.basis) {\n basis = conf.basis.map(function (vec) {\n return {\n a: new BN(vec.a, 16),\n b: new BN(vec.b, 16)\n };\n });\n } else {\n basis = this._getEndoBasis(lambda);\n }\n\n return {\n beta: beta,\n lambda: lambda,\n basis: basis\n };\n};\n\nShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n // Find roots of for x^2 + x + 1 in F\n // Root = (-1 +- Sqrt(-3)) / 2\n //\n var red = num === this.p ? this.red : BN.mont(num);\n var tinv = new BN(2).toRed(red).redInvm();\n var ntinv = tinv.redNeg();\n var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n var l1 = ntinv.redAdd(s).fromRed();\n var l2 = ntinv.redSub(s).fromRed();\n return [l1, l2];\n};\n\nShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n // aprxSqrt >= sqrt(this.n)\n var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); // 3.74\n // Run EGCD, until r(L + 1) < aprxSqrt\n\n var u = lambda;\n var v = this.n.clone();\n var x1 = new BN(1);\n var y1 = new BN(0);\n var x2 = new BN(0);\n var y2 = new BN(1); // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n)\n\n var a0;\n var b0; // First vector\n\n var a1;\n var b1; // Second vector\n\n var a2;\n var b2;\n var prevR;\n var i = 0;\n var r;\n var x;\n\n while (u.cmpn(0) !== 0) {\n var q = v.div(u);\n r = v.sub(q.mul(u));\n x = x2.sub(q.mul(x1));\n var y = y2.sub(q.mul(y1));\n\n if (!a1 && r.cmp(aprxSqrt) < 0) {\n a0 = prevR.neg();\n b0 = x1;\n a1 = r.neg();\n b1 = x;\n } else if (a1 && ++i === 2) {\n break;\n }\n\n prevR = r;\n v = u;\n u = r;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n }\n\n a2 = r.neg();\n b2 = x;\n var len1 = a1.sqr().add(b1.sqr());\n var len2 = a2.sqr().add(b2.sqr());\n\n if (len2.cmp(len1) >= 0) {\n a2 = a0;\n b2 = b0;\n } // Normalize signs\n\n\n if (a1.negative) {\n a1 = a1.neg();\n b1 = b1.neg();\n }\n\n if (a2.negative) {\n a2 = a2.neg();\n b2 = b2.neg();\n }\n\n return [{\n a: a1,\n b: b1\n }, {\n a: a2,\n b: b2\n }];\n};\n\nShortCurve.prototype._endoSplit = function _endoSplit(k) {\n var basis = this.endo.basis;\n var v1 = basis[0];\n var v2 = basis[1];\n var c1 = v2.b.mul(k).divRound(this.n);\n var c2 = v1.b.neg().mul(k).divRound(this.n);\n var p1 = c1.mul(v1.a);\n var p2 = c2.mul(v2.a);\n var q1 = c1.mul(v1.b);\n var q2 = c2.mul(v2.b); // Calculate answer\n\n var k1 = k.sub(p1).sub(p2);\n var k2 = q1.add(q2).neg();\n return {\n k1: k1,\n k2: k2\n };\n};\n\nShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red) x = x.toRed(this.red);\n var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point'); // XXX Is there any way to tell if the number is odd without converting it\n // to non-red form?\n\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd) y = y.redNeg();\n return this.point(x, y);\n};\n\nShortCurve.prototype.validate = function validate(point) {\n if (point.inf) return true;\n var x = point.x;\n var y = point.y;\n var ax = this.a.redMul(x);\n var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n return y.redSqr().redISub(rhs).cmpn(0) === 0;\n};\n\nShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n var npoints = this._endoWnafT1;\n var ncoeffs = this._endoWnafT2;\n\n for (var i = 0; i < points.length; i++) {\n var split = this._endoSplit(coeffs[i]);\n\n var p = points[i];\n\n var beta = p._getBeta();\n\n if (split.k1.negative) {\n split.k1.ineg();\n p = p.neg(true);\n }\n\n if (split.k2.negative) {\n split.k2.ineg();\n beta = beta.neg(true);\n }\n\n npoints[i * 2] = p;\n npoints[i * 2 + 1] = beta;\n ncoeffs[i * 2] = split.k1;\n ncoeffs[i * 2 + 1] = split.k2;\n }\n\n var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); // Clean-up references to points and coefficients\n\n\n for (var j = 0; j < i * 2; j++) {\n npoints[j] = null;\n ncoeffs[j] = null;\n }\n\n return res;\n};\n\nfunction Point(curve, x, y, isRed) {\n Base.BasePoint.call(this, curve, 'affine');\n\n if (x === null && y === null) {\n this.x = null;\n this.y = null;\n this.inf = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16); // Force redgomery representation when loading from JSON\n\n if (isRed) {\n this.x.forceRed(this.curve.red);\n this.y.forceRed(this.curve.red);\n }\n\n if (!this.x.red) this.x = this.x.toRed(this.curve.red);\n if (!this.y.red) this.y = this.y.toRed(this.curve.red);\n this.inf = false;\n }\n}\n\ninherits(Point, Base.BasePoint);\n\nShortCurve.prototype.point = function point(x, y, isRed) {\n return new Point(this, x, y, isRed);\n};\n\nShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n return Point.fromJSON(this, obj, red);\n};\n\nPoint.prototype._getBeta = function _getBeta() {\n if (!this.curve.endo) return;\n var pre = this.precomputed;\n if (pre && pre.beta) return pre.beta;\n var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n\n if (pre) {\n var curve = this.curve;\n\n var endoMul = function (p) {\n return curve.point(p.x.redMul(curve.endo.beta), p.y);\n };\n\n pre.beta = beta;\n beta.precomputed = {\n beta: null,\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(endoMul)\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(endoMul)\n }\n };\n }\n\n return beta;\n};\n\nPoint.prototype.toJSON = function toJSON() {\n if (!this.precomputed) return [this.x, this.y];\n return [this.x, this.y, this.precomputed && {\n doubles: this.precomputed.doubles && {\n step: this.precomputed.doubles.step,\n points: this.precomputed.doubles.points.slice(1)\n },\n naf: this.precomputed.naf && {\n wnd: this.precomputed.naf.wnd,\n points: this.precomputed.naf.points.slice(1)\n }\n }];\n};\n\nPoint.fromJSON = function fromJSON(curve, obj, red) {\n if (typeof obj === 'string') obj = JSON.parse(obj);\n var res = curve.point(obj[0], obj[1], red);\n if (!obj[2]) return res;\n\n function obj2point(obj) {\n return curve.point(obj[0], obj[1], red);\n }\n\n var pre = obj[2];\n res.precomputed = {\n beta: null,\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: [res].concat(pre.doubles.points.map(obj2point))\n },\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: [res].concat(pre.naf.points.map(obj2point))\n }\n };\n return res;\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity()) return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) + ' y: ' + this.y.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n return this.inf;\n};\n\nPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.inf) return p; // P + O = P\n\n if (p.inf) return this; // P + P = 2P\n\n if (this.eq(p)) return this.dbl(); // P + (-P) = O\n\n if (this.neg().eq(p)) return this.curve.point(null, null); // P + Q = O\n\n if (this.x.cmp(p.x) === 0) return this.curve.point(null, null);\n var c = this.y.redSub(p.y);\n if (c.cmpn(0) !== 0) c = c.redMul(this.x.redSub(p.x).redInvm());\n var nx = c.redSqr().redISub(this.x).redISub(p.x);\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.inf) return this; // 2P = O\n\n var ys1 = this.y.redAdd(this.y);\n if (ys1.cmpn(0) === 0) return this.curve.point(null, null);\n var a = this.curve.a;\n var x2 = this.x.redSqr();\n var dyinv = ys1.redInvm();\n var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.getX = function getX() {\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n return this.y.fromRed();\n};\n\nPoint.prototype.mul = function mul(k) {\n k = new BN(k, 16);\n if (this.isInfinity()) return this;else if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k);else if (this.curve.endo) return this.curve._endoWnafMulAdd([this], [k]);else return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n var points = [this, p2];\n var coeffs = [k1, k2];\n if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs);else return this.curve._wnafMulAdd(1, points, coeffs, 2);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n var points = [this, p2];\n var coeffs = [k1, k2];\n if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs, true);else return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n};\n\nPoint.prototype.eq = function eq(p) {\n return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n};\n\nPoint.prototype.neg = function neg(_precompute) {\n if (this.inf) return this;\n var res = this.curve.point(this.x, this.y.redNeg());\n\n if (_precompute && this.precomputed) {\n var pre = this.precomputed;\n\n var negate = function (p) {\n return p.neg();\n };\n\n res.precomputed = {\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(negate)\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(negate)\n }\n };\n }\n\n return res;\n};\n\nPoint.prototype.toJ = function toJ() {\n if (this.inf) return this.curve.jpoint(null, null, null);\n var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n return res;\n};\n\nfunction JPoint(curve, x, y, z) {\n Base.BasePoint.call(this, curve, 'jacobian');\n\n if (x === null && y === null && z === null) {\n this.x = this.curve.one;\n this.y = this.curve.one;\n this.z = new BN(0);\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = new BN(z, 16);\n }\n\n if (!this.x.red) this.x = this.x.toRed(this.curve.red);\n if (!this.y.red) this.y = this.y.toRed(this.curve.red);\n if (!this.z.red) this.z = this.z.toRed(this.curve.red);\n this.zOne = this.z === this.curve.one;\n}\n\ninherits(JPoint, Base.BasePoint);\n\nShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n return new JPoint(this, x, y, z);\n};\n\nJPoint.prototype.toP = function toP() {\n if (this.isInfinity()) return this.curve.point(null, null);\n var zinv = this.z.redInvm();\n var zinv2 = zinv.redSqr();\n var ax = this.x.redMul(zinv2);\n var ay = this.y.redMul(zinv2).redMul(zinv);\n return this.curve.point(ax, ay);\n};\n\nJPoint.prototype.neg = function neg() {\n return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n};\n\nJPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.isInfinity()) return p; // P + O = P\n\n if (p.isInfinity()) return this; // 12M + 4S + 7A\n\n var pz2 = p.z.redSqr();\n var z2 = this.z.redSqr();\n var u1 = this.x.redMul(pz2);\n var u2 = p.x.redMul(z2);\n var s1 = this.y.redMul(pz2.redMul(p.z));\n var s2 = p.y.redMul(z2.redMul(this.z));\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null);else return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(p.z).redMul(h);\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mixedAdd = function mixedAdd(p) {\n // O + P = P\n if (this.isInfinity()) return p.toJ(); // P + O = P\n\n if (p.isInfinity()) return this; // 8M + 3S + 7A\n\n var z2 = this.z.redSqr();\n var u1 = this.x;\n var u2 = p.x.redMul(z2);\n var s1 = this.y;\n var s2 = p.y.redMul(z2).redMul(this.z);\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null);else return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(h);\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.dblp = function dblp(pow) {\n if (pow === 0) return this;\n if (this.isInfinity()) return this;\n if (!pow) return this.dbl();\n var i;\n\n if (this.curve.zeroA || this.curve.threeA) {\n var r = this;\n\n for (i = 0; i < pow; i++) r = r.dbl();\n\n return r;\n } // 1M + 2S + 1A + N * (4S + 5M + 8A)\n // N = 1 => 6M + 6S + 9A\n\n\n var a = this.curve.a;\n var tinv = this.curve.tinv;\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr(); // Reuse results\n\n var jyd = jy.redAdd(jy);\n\n for (i = 0; i < pow; i++) {\n var jx2 = jx.redSqr();\n var jyd2 = jyd.redSqr();\n var jyd4 = jyd2.redSqr();\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n var t1 = jx.redMul(jyd2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n var dny = c.redMul(t2);\n dny = dny.redIAdd(dny).redISub(jyd4);\n var nz = jyd.redMul(jz);\n if (i + 1 < pow) jz4 = jz4.redMul(jyd4);\n jx = nx;\n jz = nz;\n jyd = dny;\n }\n\n return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n};\n\nJPoint.prototype.dbl = function dbl() {\n if (this.isInfinity()) return this;\n if (this.curve.zeroA) return this._zeroDbl();else if (this.curve.threeA) return this._threeDbl();else return this._dbl();\n};\n\nJPoint.prototype._zeroDbl = function _zeroDbl() {\n var nx;\n var ny;\n var nz; // Z = 1\n\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 14A\n // XX = X1^2\n var xx = this.x.redSqr(); // YY = Y1^2\n\n var yy = this.y.redSqr(); // YYYY = YY^2\n\n var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s); // M = 3 * XX + a; a = 0\n\n var m = xx.redAdd(xx).redIAdd(xx); // T = M ^ 2 - 2*S\n\n var t = m.redSqr().redISub(s).redISub(s); // 8 * YYYY\n\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8); // X3 = T\n\n nx = t; // Y3 = M * (S - T) - 8 * YYYY\n\n ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2*Y1\n\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-dbl-2009-l\n // 2M + 5S + 13A\n // A = X1^2\n var a = this.x.redSqr(); // B = Y1^2\n\n var b = this.y.redSqr(); // C = B^2\n\n var c = b.redSqr(); // D = 2 * ((X1 + B)^2 - A - C)\n\n var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n d = d.redIAdd(d); // E = 3 * A\n\n var e = a.redAdd(a).redIAdd(a); // F = E^2\n\n var f = e.redSqr(); // 8 * C\n\n var c8 = c.redIAdd(c);\n c8 = c8.redIAdd(c8);\n c8 = c8.redIAdd(c8); // X3 = F - 2 * D\n\n nx = f.redISub(d).redISub(d); // Y3 = E * (D - X3) - 8 * C\n\n ny = e.redMul(d.redISub(nx)).redISub(c8); // Z3 = 2 * Y1 * Z1\n\n nz = this.y.redMul(this.z);\n nz = nz.redIAdd(nz);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._threeDbl = function _threeDbl() {\n var nx;\n var ny;\n var nz; // Z = 1\n\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 15A\n // XX = X1^2\n var xx = this.x.redSqr(); // YY = Y1^2\n\n var yy = this.y.redSqr(); // YYYY = YY^2\n\n var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s); // M = 3 * XX + a\n\n var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); // T = M^2 - 2 * S\n\n var t = m.redSqr().redISub(s).redISub(s); // X3 = T\n\n nx = t; // Y3 = M * (S - T) - 8 * YYYY\n\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2 * Y1\n\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b\n // 3M + 5S\n // delta = Z1^2\n var delta = this.z.redSqr(); // gamma = Y1^2\n\n var gamma = this.y.redSqr(); // beta = X1 * gamma\n\n var beta = this.x.redMul(gamma); // alpha = 3 * (X1 - delta) * (X1 + delta)\n\n var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n alpha = alpha.redAdd(alpha).redIAdd(alpha); // X3 = alpha^2 - 8 * beta\n\n var beta4 = beta.redIAdd(beta);\n beta4 = beta4.redIAdd(beta4);\n var beta8 = beta4.redAdd(beta4);\n nx = alpha.redSqr().redISub(beta8); // Z3 = (Y1 + Z1)^2 - gamma - delta\n\n nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2\n\n var ggamma8 = gamma.redSqr();\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._dbl = function _dbl() {\n var a = this.curve.a; // 4M + 6S + 10A\n\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n var jx2 = jx.redSqr();\n var jy2 = jy.redSqr();\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n var jxd4 = jx.redAdd(jx);\n jxd4 = jxd4.redIAdd(jxd4);\n var t1 = jxd4.redMul(jy2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n var jyd8 = jy2.redSqr();\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n var ny = c.redMul(t2).redISub(jyd8);\n var nz = jy.redAdd(jy).redMul(jz);\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.trpl = function trpl() {\n if (!this.curve.zeroA) return this.dbl().add(this); // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl\n // 5M + 10S + ...\n // XX = X1^2\n\n var xx = this.x.redSqr(); // YY = Y1^2\n\n var yy = this.y.redSqr(); // ZZ = Z1^2\n\n var zz = this.z.redSqr(); // YYYY = YY^2\n\n var yyyy = yy.redSqr(); // M = 3 * XX + a * ZZ2; a = 0\n\n var m = xx.redAdd(xx).redIAdd(xx); // MM = M^2\n\n var mm = m.redSqr(); // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM\n\n var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n e = e.redIAdd(e);\n e = e.redAdd(e).redIAdd(e);\n e = e.redISub(mm); // EE = E^2\n\n var ee = e.redSqr(); // T = 16*YYYY\n\n var t = yyyy.redIAdd(yyyy);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n t = t.redIAdd(t); // U = (M + E)^2 - MM - EE - T\n\n var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); // X3 = 4 * (X1 * EE - 4 * YY * U)\n\n var yyu4 = yy.redMul(u);\n yyu4 = yyu4.redIAdd(yyu4);\n yyu4 = yyu4.redIAdd(yyu4);\n var nx = this.x.redMul(ee).redISub(yyu4);\n nx = nx.redIAdd(nx);\n nx = nx.redIAdd(nx); // Y3 = 8 * Y1 * (U * (T - U) - E * EE)\n\n var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny); // Z3 = (Z1 + E)^2 - ZZ - EE\n\n var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mul = function mul(k, kbase) {\n k = new BN(k, kbase);\n return this.curve._wnafMul(this, k);\n};\n\nJPoint.prototype.eq = function eq(p) {\n if (p.type === 'affine') return this.eq(p.toJ());\n if (this === p) return true; // x1 * z2^2 == x2 * z1^2\n\n var z2 = this.z.redSqr();\n var pz2 = p.z.redSqr();\n if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) return false; // y1 * z2^3 == y2 * z1^3\n\n var z3 = z2.redMul(this.z);\n var pz3 = pz2.redMul(p.z);\n return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n};\n\nJPoint.prototype.eqXToP = function eqXToP(x) {\n var zs = this.z.redSqr();\n var rx = x.toRed(this.curve.red).redMul(zs);\n if (this.x.cmp(rx) === 0) return true;\n var xc = x.clone();\n var t = this.curve.redN.redMul(zs);\n\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0) return false;\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0) return true;\n }\n};\n\nJPoint.prototype.inspect = function inspect() {\n if (this.isInfinity()) return '<EC JPoint Infinity>';\n return '<EC JPoint x: ' + this.x.toString(16, 2) + ' y: ' + this.y.toString(16, 2) + ' z: ' + this.z.toString(16, 2) + '>';\n};\n\nJPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/elliptic/lib/elliptic/curve/short.js"],"names":["utils","require","BN","inherits","Base","assert","ShortCurve","conf","call","a","toRed","red","b","tinv","two","redInvm","zeroA","fromRed","cmpn","threeA","sub","p","endo","_getEndomorphism","_endoWnafT1","Array","_endoWnafT2","module","exports","prototype","g","n","modn","beta","lambda","betas","_getEndoRoots","cmp","lambdas","mul","x","redMul","basis","map","vec","_getEndoBasis","num","mont","ntinv","redNeg","s","redSqrt","l1","redAdd","l2","redSub","aprxSqrt","ushrn","Math","floor","bitLength","u","v","clone","x1","y1","x2","y2","a0","b0","a1","b1","a2","b2","prevR","i","r","q","div","y","neg","len1","sqr","add","len2","negative","_endoSplit","k","v1","v2","c1","divRound","c2","p1","p2","q1","q2","k1","k2","pointFromX","odd","redSqr","redIAdd","zero","Error","isOdd","point","validate","inf","ax","rhs","redISub","_endoWnafMulAdd","points","coeffs","jacobianResult","npoints","ncoeffs","length","split","_getBeta","ineg","res","_wnafMulAdd","j","Point","curve","isRed","BasePoint","forceRed","pointFromJSON","obj","fromJSON","pre","precomputed","endoMul","naf","wnd","doubles","step","toJSON","slice","JSON","parse","obj2point","concat","inspect","isInfinity","toString","eq","dbl","c","nx","ny","ys1","dyinv","getX","getY","_hasDoubles","_fixedNafMul","_wnafMul","mulAdd","jmulAdd","_precompute","negate","toJ","jpoint","one","JPoint","z","zOne","toP","zinv","zinv2","ay","pz2","z2","u1","u2","s1","s2","h","h2","h3","nz","mixedAdd","dblp","pow","jx","jy","jz","jz4","jyd","jx2","jyd2","jyd4","t1","t2","dny","_zeroDbl","_threeDbl","_dbl","xx","yy","yyyy","m","t","yyyy8","d","e","f","c8","delta","gamma","alpha","beta4","beta8","ggamma8","jy2","jxd4","jyd8","trpl","zz","mm","ee","yyu4","kbase","type","z3","pz3","eqXToP","zs","rx","xc","redN","iadd"],"mappings":"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","sourcesContent":["'use strict';\n\nvar utils = require('../utils');\nvar BN = require('bn.js');\nvar inherits = require('inherits');\nvar Base = require('./base');\n\nvar assert = utils.assert;\n\nfunction ShortCurve(conf) {\n Base.call(this, 'short', conf);\n\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.tinv = this.two.redInvm();\n\n this.zeroA = this.a.fromRed().cmpn(0) === 0;\n this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;\n\n // If the curve is endomorphic, precalculate beta and lambda\n this.endo = this._getEndomorphism(conf);\n this._endoWnafT1 = new Array(4);\n this._endoWnafT2 = new Array(4);\n}\ninherits(ShortCurve, Base);\nmodule.exports = ShortCurve;\n\nShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n // No efficient endomorphism\n if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)\n return;\n\n // Compute beta and lambda, that lambda * P = (beta * Px; Py)\n var beta;\n var lambda;\n if (conf.beta) {\n beta = new BN(conf.beta, 16).toRed(this.red);\n } else {\n var betas = this._getEndoRoots(this.p);\n // Choose the smallest beta\n beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n beta = beta.toRed(this.red);\n }\n if (conf.lambda) {\n lambda = new BN(conf.lambda, 16);\n } else {\n // Choose the lambda that is matching selected beta\n var lambdas = this._getEndoRoots(this.n);\n if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n lambda = lambdas[0];\n } else {\n lambda = lambdas[1];\n assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n }\n }\n\n // Get basis vectors, used for balanced length-two representation\n var basis;\n if (conf.basis) {\n basis = conf.basis.map(function(vec) {\n return {\n a: new BN(vec.a, 16),\n b: new BN(vec.b, 16),\n };\n });\n } else {\n basis = this._getEndoBasis(lambda);\n }\n\n return {\n beta: beta,\n lambda: lambda,\n basis: basis,\n };\n};\n\nShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n // Find roots of for x^2 + x + 1 in F\n // Root = (-1 +- Sqrt(-3)) / 2\n //\n var red = num === this.p ? this.red : BN.mont(num);\n var tinv = new BN(2).toRed(red).redInvm();\n var ntinv = tinv.redNeg();\n\n var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n\n var l1 = ntinv.redAdd(s).fromRed();\n var l2 = ntinv.redSub(s).fromRed();\n return [ l1, l2 ];\n};\n\nShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n // aprxSqrt >= sqrt(this.n)\n var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));\n\n // 3.74\n // Run EGCD, until r(L + 1) < aprxSqrt\n var u = lambda;\n var v = this.n.clone();\n var x1 = new BN(1);\n var y1 = new BN(0);\n var x2 = new BN(0);\n var y2 = new BN(1);\n\n // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n)\n var a0;\n var b0;\n // First vector\n var a1;\n var b1;\n // Second vector\n var a2;\n var b2;\n\n var prevR;\n var i = 0;\n var r;\n var x;\n while (u.cmpn(0) !== 0) {\n var q = v.div(u);\n r = v.sub(q.mul(u));\n x = x2.sub(q.mul(x1));\n var y = y2.sub(q.mul(y1));\n\n if (!a1 && r.cmp(aprxSqrt) < 0) {\n a0 = prevR.neg();\n b0 = x1;\n a1 = r.neg();\n b1 = x;\n } else if (a1 && ++i === 2) {\n break;\n }\n prevR = r;\n\n v = u;\n u = r;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n }\n a2 = r.neg();\n b2 = x;\n\n var len1 = a1.sqr().add(b1.sqr());\n var len2 = a2.sqr().add(b2.sqr());\n if (len2.cmp(len1) >= 0) {\n a2 = a0;\n b2 = b0;\n }\n\n // Normalize signs\n if (a1.negative) {\n a1 = a1.neg();\n b1 = b1.neg();\n }\n if (a2.negative) {\n a2 = a2.neg();\n b2 = b2.neg();\n }\n\n return [\n { a: a1, b: b1 },\n { a: a2, b: b2 },\n ];\n};\n\nShortCurve.prototype._endoSplit = function _endoSplit(k) {\n var basis = this.endo.basis;\n var v1 = basis[0];\n var v2 = basis[1];\n\n var c1 = v2.b.mul(k).divRound(this.n);\n var c2 = v1.b.neg().mul(k).divRound(this.n);\n\n var p1 = c1.mul(v1.a);\n var p2 = c2.mul(v2.a);\n var q1 = c1.mul(v1.b);\n var q2 = c2.mul(v2.b);\n\n // Calculate answer\n var k1 = k.sub(p1).sub(p2);\n var k2 = q1.add(q2).neg();\n return { k1: k1, k2: k2 };\n};\n\nShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red)\n x = x.toRed(this.red);\n\n var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n // XXX Is there any way to tell if the number is odd without converting it\n // to non-red form?\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd)\n y = y.redNeg();\n\n return this.point(x, y);\n};\n\nShortCurve.prototype.validate = function validate(point) {\n if (point.inf)\n return true;\n\n var x = point.x;\n var y = point.y;\n\n var ax = this.a.redMul(x);\n var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n return y.redSqr().redISub(rhs).cmpn(0) === 0;\n};\n\nShortCurve.prototype._endoWnafMulAdd =\n function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n var npoints = this._endoWnafT1;\n var ncoeffs = this._endoWnafT2;\n for (var i = 0; i < points.length; i++) {\n var split = this._endoSplit(coeffs[i]);\n var p = points[i];\n var beta = p._getBeta();\n\n if (split.k1.negative) {\n split.k1.ineg();\n p = p.neg(true);\n }\n if (split.k2.negative) {\n split.k2.ineg();\n beta = beta.neg(true);\n }\n\n npoints[i * 2] = p;\n npoints[i * 2 + 1] = beta;\n ncoeffs[i * 2] = split.k1;\n ncoeffs[i * 2 + 1] = split.k2;\n }\n var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);\n\n // Clean-up references to points and coefficients\n for (var j = 0; j < i * 2; j++) {\n npoints[j] = null;\n ncoeffs[j] = null;\n }\n return res;\n };\n\nfunction Point(curve, x, y, isRed) {\n Base.BasePoint.call(this, curve, 'affine');\n if (x === null && y === null) {\n this.x = null;\n this.y = null;\n this.inf = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n // Force redgomery representation when loading from JSON\n if (isRed) {\n this.x.forceRed(this.curve.red);\n this.y.forceRed(this.curve.red);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n this.inf = false;\n }\n}\ninherits(Point, Base.BasePoint);\n\nShortCurve.prototype.point = function point(x, y, isRed) {\n return new Point(this, x, y, isRed);\n};\n\nShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n return Point.fromJSON(this, obj, red);\n};\n\nPoint.prototype._getBeta = function _getBeta() {\n if (!this.curve.endo)\n return;\n\n var pre = this.precomputed;\n if (pre && pre.beta)\n return pre.beta;\n\n var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n if (pre) {\n var curve = this.curve;\n var endoMul = function(p) {\n return curve.point(p.x.redMul(curve.endo.beta), p.y);\n };\n pre.beta = beta;\n beta.precomputed = {\n beta: null,\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(endoMul),\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(endoMul),\n },\n };\n }\n return beta;\n};\n\nPoint.prototype.toJSON = function toJSON() {\n if (!this.precomputed)\n return [ this.x, this.y ];\n\n return [ this.x, this.y, this.precomputed && {\n doubles: this.precomputed.doubles && {\n step: this.precomputed.doubles.step,\n points: this.precomputed.doubles.points.slice(1),\n },\n naf: this.precomputed.naf && {\n wnd: this.precomputed.naf.wnd,\n points: this.precomputed.naf.points.slice(1),\n },\n } ];\n};\n\nPoint.fromJSON = function fromJSON(curve, obj, red) {\n if (typeof obj === 'string')\n obj = JSON.parse(obj);\n var res = curve.point(obj[0], obj[1], red);\n if (!obj[2])\n return res;\n\n function obj2point(obj) {\n return curve.point(obj[0], obj[1], red);\n }\n\n var pre = obj[2];\n res.precomputed = {\n beta: null,\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: [ res ].concat(pre.doubles.points.map(obj2point)),\n },\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: [ res ].concat(pre.naf.points.map(obj2point)),\n },\n };\n return res;\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' y: ' + this.y.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n return this.inf;\n};\n\nPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.inf)\n return p;\n\n // P + O = P\n if (p.inf)\n return this;\n\n // P + P = 2P\n if (this.eq(p))\n return this.dbl();\n\n // P + (-P) = O\n if (this.neg().eq(p))\n return this.curve.point(null, null);\n\n // P + Q = O\n if (this.x.cmp(p.x) === 0)\n return this.curve.point(null, null);\n\n var c = this.y.redSub(p.y);\n if (c.cmpn(0) !== 0)\n c = c.redMul(this.x.redSub(p.x).redInvm());\n var nx = c.redSqr().redISub(this.x).redISub(p.x);\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.inf)\n return this;\n\n // 2P = O\n var ys1 = this.y.redAdd(this.y);\n if (ys1.cmpn(0) === 0)\n return this.curve.point(null, null);\n\n var a = this.curve.a;\n\n var x2 = this.x.redSqr();\n var dyinv = ys1.redInvm();\n var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n\n var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.getX = function getX() {\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n return this.y.fromRed();\n};\n\nPoint.prototype.mul = function mul(k) {\n k = new BN(k, 16);\n if (this.isInfinity())\n return this;\n else if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else if (this.curve.endo)\n return this.curve._endoWnafMulAdd([ this ], [ k ]);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs, true);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n};\n\nPoint.prototype.eq = function eq(p) {\n return this === p ||\n this.inf === p.inf &&\n (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n};\n\nPoint.prototype.neg = function neg(_precompute) {\n if (this.inf)\n return this;\n\n var res = this.curve.point(this.x, this.y.redNeg());\n if (_precompute && this.precomputed) {\n var pre = this.precomputed;\n var negate = function(p) {\n return p.neg();\n };\n res.precomputed = {\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(negate),\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(negate),\n },\n };\n }\n return res;\n};\n\nPoint.prototype.toJ = function toJ() {\n if (this.inf)\n return this.curve.jpoint(null, null, null);\n\n var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n return res;\n};\n\nfunction JPoint(curve, x, y, z) {\n Base.BasePoint.call(this, curve, 'jacobian');\n if (x === null && y === null && z === null) {\n this.x = this.curve.one;\n this.y = this.curve.one;\n this.z = new BN(0);\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = new BN(z, 16);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n\n this.zOne = this.z === this.curve.one;\n}\ninherits(JPoint, Base.BasePoint);\n\nShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n return new JPoint(this, x, y, z);\n};\n\nJPoint.prototype.toP = function toP() {\n if (this.isInfinity())\n return this.curve.point(null, null);\n\n var zinv = this.z.redInvm();\n var zinv2 = zinv.redSqr();\n var ax = this.x.redMul(zinv2);\n var ay = this.y.redMul(zinv2).redMul(zinv);\n\n return this.curve.point(ax, ay);\n};\n\nJPoint.prototype.neg = function neg() {\n return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n};\n\nJPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.isInfinity())\n return p;\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 12M + 4S + 7A\n var pz2 = p.z.redSqr();\n var z2 = this.z.redSqr();\n var u1 = this.x.redMul(pz2);\n var u2 = p.x.redMul(z2);\n var s1 = this.y.redMul(pz2.redMul(p.z));\n var s2 = p.y.redMul(z2.redMul(this.z));\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(p.z).redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mixedAdd = function mixedAdd(p) {\n // O + P = P\n if (this.isInfinity())\n return p.toJ();\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 8M + 3S + 7A\n var z2 = this.z.redSqr();\n var u1 = this.x;\n var u2 = p.x.redMul(z2);\n var s1 = this.y;\n var s2 = p.y.redMul(z2).redMul(this.z);\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.dblp = function dblp(pow) {\n if (pow === 0)\n return this;\n if (this.isInfinity())\n return this;\n if (!pow)\n return this.dbl();\n\n var i;\n if (this.curve.zeroA || this.curve.threeA) {\n var r = this;\n for (i = 0; i < pow; i++)\n r = r.dbl();\n return r;\n }\n\n // 1M + 2S + 1A + N * (4S + 5M + 8A)\n // N = 1 => 6M + 6S + 9A\n var a = this.curve.a;\n var tinv = this.curve.tinv;\n\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n // Reuse results\n var jyd = jy.redAdd(jy);\n for (i = 0; i < pow; i++) {\n var jx2 = jx.redSqr();\n var jyd2 = jyd.redSqr();\n var jyd4 = jyd2.redSqr();\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var t1 = jx.redMul(jyd2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n var dny = c.redMul(t2);\n dny = dny.redIAdd(dny).redISub(jyd4);\n var nz = jyd.redMul(jz);\n if (i + 1 < pow)\n jz4 = jz4.redMul(jyd4);\n\n jx = nx;\n jz = nz;\n jyd = dny;\n }\n\n return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n};\n\nJPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n if (this.curve.zeroA)\n return this._zeroDbl();\n else if (this.curve.threeA)\n return this._threeDbl();\n else\n return this._dbl();\n};\n\nJPoint.prototype._zeroDbl = function _zeroDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 14A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // T = M ^ 2 - 2*S\n var t = m.redSqr().redISub(s).redISub(s);\n\n // 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2*Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-dbl-2009-l\n // 2M + 5S + 13A\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = B^2\n var c = b.redSqr();\n // D = 2 * ((X1 + B)^2 - A - C)\n var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n d = d.redIAdd(d);\n // E = 3 * A\n var e = a.redAdd(a).redIAdd(a);\n // F = E^2\n var f = e.redSqr();\n\n // 8 * C\n var c8 = c.redIAdd(c);\n c8 = c8.redIAdd(c8);\n c8 = c8.redIAdd(c8);\n\n // X3 = F - 2 * D\n nx = f.redISub(d).redISub(d);\n // Y3 = E * (D - X3) - 8 * C\n ny = e.redMul(d.redISub(nx)).redISub(c8);\n // Z3 = 2 * Y1 * Z1\n nz = this.y.redMul(this.z);\n nz = nz.redIAdd(nz);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._threeDbl = function _threeDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 15A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a\n var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);\n // T = M^2 - 2 * S\n var t = m.redSqr().redISub(s).redISub(s);\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2 * Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b\n // 3M + 5S\n\n // delta = Z1^2\n var delta = this.z.redSqr();\n // gamma = Y1^2\n var gamma = this.y.redSqr();\n // beta = X1 * gamma\n var beta = this.x.redMul(gamma);\n // alpha = 3 * (X1 - delta) * (X1 + delta)\n var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n alpha = alpha.redAdd(alpha).redIAdd(alpha);\n // X3 = alpha^2 - 8 * beta\n var beta4 = beta.redIAdd(beta);\n beta4 = beta4.redIAdd(beta4);\n var beta8 = beta4.redAdd(beta4);\n nx = alpha.redSqr().redISub(beta8);\n // Z3 = (Y1 + Z1)^2 - gamma - delta\n nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);\n // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2\n var ggamma8 = gamma.redSqr();\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._dbl = function _dbl() {\n var a = this.curve.a;\n\n // 4M + 6S + 10A\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n var jx2 = jx.redSqr();\n var jy2 = jy.redSqr();\n\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var jxd4 = jx.redAdd(jx);\n jxd4 = jxd4.redIAdd(jxd4);\n var t1 = jxd4.redMul(jy2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n\n var jyd8 = jy2.redSqr();\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n var ny = c.redMul(t2).redISub(jyd8);\n var nz = jy.redAdd(jy).redMul(jz);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.trpl = function trpl() {\n if (!this.curve.zeroA)\n return this.dbl().add(this);\n\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl\n // 5M + 10S + ...\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // ZZ = Z1^2\n var zz = this.z.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // M = 3 * XX + a * ZZ2; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // MM = M^2\n var mm = m.redSqr();\n // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM\n var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n e = e.redIAdd(e);\n e = e.redAdd(e).redIAdd(e);\n e = e.redISub(mm);\n // EE = E^2\n var ee = e.redSqr();\n // T = 16*YYYY\n var t = yyyy.redIAdd(yyyy);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n // U = (M + E)^2 - MM - EE - T\n var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);\n // X3 = 4 * (X1 * EE - 4 * YY * U)\n var yyu4 = yy.redMul(u);\n yyu4 = yyu4.redIAdd(yyu4);\n yyu4 = yyu4.redIAdd(yyu4);\n var nx = this.x.redMul(ee).redISub(yyu4);\n nx = nx.redIAdd(nx);\n nx = nx.redIAdd(nx);\n // Y3 = 8 * Y1 * (U * (T - U) - E * EE)\n var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n // Z3 = (Z1 + E)^2 - ZZ - EE\n var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mul = function mul(k, kbase) {\n k = new BN(k, kbase);\n\n return this.curve._wnafMul(this, k);\n};\n\nJPoint.prototype.eq = function eq(p) {\n if (p.type === 'affine')\n return this.eq(p.toJ());\n\n if (this === p)\n return true;\n\n // x1 * z2^2 == x2 * z1^2\n var z2 = this.z.redSqr();\n var pz2 = p.z.redSqr();\n if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)\n return false;\n\n // y1 * z2^3 == y2 * z1^3\n var z3 = z2.redMul(this.z);\n var pz3 = pz2.redMul(p.z);\n return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n};\n\nJPoint.prototype.eqXToP = function eqXToP(x) {\n var zs = this.z.redSqr();\n var rx = x.toRed(this.curve.red).redMul(zs);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(zs);\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0)\n return false;\n\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0)\n return true;\n }\n};\n\nJPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC JPoint Infinity>';\n return '<EC JPoint x: ' + this.x.toString(16, 2) +\n ' y: ' + this.y.toString(16, 2) +\n ' z: ' + this.z.toString(16, 2) + '>';\n};\n\nJPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};\n"]},"metadata":{},"sourceType":"script"} |