{"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 EdwardsCurve(conf) {\n // NOTE: Important as we are creating point in Base.call()\n this.twisted = (conf.a | 0) !== 1;\n this.mOneA = this.twisted && (conf.a | 0) === -1;\n this.extended = this.mOneA;\n Base.call(this, 'edwards', conf);\n this.a = new BN(conf.a, 16).umod(this.red.m);\n this.a = this.a.toRed(this.red);\n this.c = new BN(conf.c, 16).toRed(this.red);\n this.c2 = this.c.redSqr();\n this.d = new BN(conf.d, 16).toRed(this.red);\n this.dd = this.d.redAdd(this.d);\n assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n this.oneC = (conf.c | 0) === 1;\n}\n\ninherits(EdwardsCurve, Base);\nmodule.exports = EdwardsCurve;\n\nEdwardsCurve.prototype._mulA = function _mulA(num) {\n if (this.mOneA) return num.redNeg();else return this.a.redMul(num);\n};\n\nEdwardsCurve.prototype._mulC = function _mulC(num) {\n if (this.oneC) return num;else return this.c.redMul(num);\n}; // Just for compatibility with Short curve\n\n\nEdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n return this.point(x, y, z, t);\n};\n\nEdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red) x = x.toRed(this.red);\n var x2 = x.redSqr();\n var rhs = this.c2.redSub(this.a.redMul(x2));\n var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n var y2 = rhs.redMul(lhs.redInvm());\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point');\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd) y = y.redNeg();\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n y = new BN(y, 16);\n if (!y.red) y = y.toRed(this.red); // x^2 = (y^2 - c^2) / (c^2 d y^2 - a)\n\n var y2 = y.redSqr();\n var lhs = y2.redSub(this.c2);\n var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n var x2 = lhs.redMul(rhs.redInvm());\n\n if (x2.cmp(this.zero) === 0) {\n if (odd) throw new Error('invalid point');else return this.point(this.zero, y);\n }\n\n var x = x2.redSqrt();\n if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) throw new Error('invalid point');\n if (x.fromRed().isOdd() !== odd) x = x.redNeg();\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.validate = function validate(point) {\n if (point.isInfinity()) return true; // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2)\n\n point.normalize();\n var x2 = point.x.redSqr();\n var y2 = point.y.redSqr();\n var lhs = x2.redMul(this.a).redAdd(y2);\n var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n return lhs.cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, y, z, t) {\n Base.BasePoint.call(this, curve, 'projective');\n\n if (x === null && y === null && z === null) {\n this.x = this.curve.zero;\n this.y = this.curve.one;\n this.z = this.curve.one;\n this.t = this.curve.zero;\n this.zOne = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = z ? new BN(z, 16) : this.curve.one;\n this.t = t && new BN(t, 16);\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 if (this.t && !this.t.red) this.t = this.t.toRed(this.curve.red);\n this.zOne = this.z === this.curve.one; // Use extended coordinates\n\n if (this.curve.extended && !this.t) {\n this.t = this.x.redMul(this.y);\n if (!this.zOne) this.t = this.t.redMul(this.z.redInvm());\n }\n }\n}\n\ninherits(Point, Base.BasePoint);\n\nEdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nEdwardsCurve.prototype.point = function point(x, y, z, t) {\n return new Point(this, x, y, z, t);\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1], obj[2]);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity()) return '';\n return '';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);\n};\n\nPoint.prototype._extDbl = function _extDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #doubling-dbl-2008-hwcd\n // 4M + 4S\n // A = X1^2\n var a = this.x.redSqr(); // B = Y1^2\n\n var b = this.y.redSqr(); // C = 2 * Z1^2\n\n var c = this.z.redSqr();\n c = c.redIAdd(c); // D = a * A\n\n var d = this.curve._mulA(a); // E = (X1 + Y1)^2 - A - B\n\n\n var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); // G = D + B\n\n var g = d.redAdd(b); // F = G - C\n\n var f = g.redSub(c); // H = D - B\n\n var h = d.redSub(b); // X3 = E * F\n\n var nx = e.redMul(f); // Y3 = G * H\n\n var ny = g.redMul(h); // T3 = E * H\n\n var nt = e.redMul(h); // Z3 = F * G\n\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projDbl = function _projDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #doubling-dbl-2008-bbjlp\n // #doubling-dbl-2007-bl\n // and others\n // Generally 3M + 4S or 2M + 4S\n // B = (X1 + Y1)^2\n var b = this.x.redAdd(this.y).redSqr(); // C = X1^2\n\n var c = this.x.redSqr(); // D = Y1^2\n\n var d = this.y.redSqr();\n var nx;\n var ny;\n var nz;\n var e;\n var h;\n var j;\n\n if (this.curve.twisted) {\n // E = a * C\n e = this.curve._mulA(c); // F = E + D\n\n var f = e.redAdd(d);\n\n if (this.zOne) {\n // X3 = (B - C - D) * (F - 2)\n nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); // Y3 = F * (E - D)\n\n ny = f.redMul(e.redSub(d)); // Z3 = F^2 - 2 * F\n\n nz = f.redSqr().redSub(f).redSub(f);\n } else {\n // H = Z1^2\n h = this.z.redSqr(); // J = F - 2 * H\n\n j = f.redSub(h).redISub(h); // X3 = (B-C-D)*J\n\n nx = b.redSub(c).redISub(d).redMul(j); // Y3 = F * (E - D)\n\n ny = f.redMul(e.redSub(d)); // Z3 = F * J\n\n nz = f.redMul(j);\n }\n } else {\n // E = C + D\n e = c.redAdd(d); // H = (c * Z1)^2\n\n h = this.curve._mulC(this.z).redSqr(); // J = E - 2 * H\n\n j = e.redSub(h).redSub(h); // X3 = c * (B - E) * J\n\n nx = this.curve._mulC(b.redISub(e)).redMul(j); // Y3 = c * E * (C - D)\n\n ny = this.curve._mulC(e).redMul(c.redISub(d)); // Z3 = E * J\n\n nz = e.redMul(j);\n }\n\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.isInfinity()) return this; // Double in extended coordinates\n\n if (this.curve.extended) return this._extDbl();else return this._projDbl();\n};\n\nPoint.prototype._extAdd = function _extAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #addition-add-2008-hwcd-3\n // 8M\n // A = (Y1 - X1) * (Y2 - X2)\n var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); // B = (Y1 + X1) * (Y2 + X2)\n\n var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); // C = T1 * k * T2\n\n var c = this.t.redMul(this.curve.dd).redMul(p.t); // D = Z1 * 2 * Z2\n\n var d = this.z.redMul(p.z.redAdd(p.z)); // E = B - A\n\n var e = b.redSub(a); // F = D - C\n\n var f = d.redSub(c); // G = D + C\n\n var g = d.redAdd(c); // H = B + A\n\n var h = b.redAdd(a); // X3 = E * F\n\n var nx = e.redMul(f); // Y3 = G * H\n\n var ny = g.redMul(h); // T3 = E * H\n\n var nt = e.redMul(h); // Z3 = F * G\n\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projAdd = function _projAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #addition-add-2008-bbjlp\n // #addition-add-2007-bl\n // 10M + 1S\n // A = Z1 * Z2\n var a = this.z.redMul(p.z); // B = A^2\n\n var b = a.redSqr(); // C = X1 * X2\n\n var c = this.x.redMul(p.x); // D = Y1 * Y2\n\n var d = this.y.redMul(p.y); // E = d * C * D\n\n var e = this.curve.d.redMul(c).redMul(d); // F = B - E\n\n var f = b.redSub(e); // G = B + E\n\n var g = b.redAdd(e); // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D)\n\n var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n var nx = a.redMul(f).redMul(tmp);\n var ny;\n var nz;\n\n if (this.curve.twisted) {\n // Y3 = A * G * (D - a * C)\n ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); // Z3 = F * G\n\n nz = f.redMul(g);\n } else {\n // Y3 = A * G * (D - C)\n ny = a.redMul(g).redMul(d.redSub(c)); // Z3 = c * F * G\n\n nz = this.curve._mulC(f).redMul(g);\n }\n\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.add = function add(p) {\n if (this.isInfinity()) return p;\n if (p.isInfinity()) return this;\n if (this.curve.extended) return this._extAdd(p);else return this._projAdd(p);\n};\n\nPoint.prototype.mul = function mul(k) {\n if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k);else return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);\n};\n\nPoint.prototype.normalize = function normalize() {\n if (this.zOne) return this; // Normalize coordinates\n\n var zi = this.z.redInvm();\n this.x = this.x.redMul(zi);\n this.y = this.y.redMul(zi);\n if (this.t) this.t = this.t.redMul(zi);\n this.z = this.curve.one;\n this.zOne = true;\n return this;\n};\n\nPoint.prototype.neg = function neg() {\n return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());\n};\n\nPoint.prototype.getX = function getX() {\n this.normalize();\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n this.normalize();\n return this.y.fromRed();\n};\n\nPoint.prototype.eq = function eq(other) {\n return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;\n};\n\nPoint.prototype.eqXToP = function eqXToP(x) {\n var rx = x.toRed(this.curve.red).redMul(this.z);\n if (this.x.cmp(rx) === 0) return true;\n var xc = x.clone();\n var t = this.curve.redN.redMul(this.z);\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}; // Compatibility with BaseCurve\n\n\nPoint.prototype.toP = Point.prototype.normalize;\nPoint.prototype.mixedAdd = Point.prototype.add;","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/elliptic/lib/elliptic/curve/edwards.js"],"names":["utils","require","BN","inherits","Base","assert","EdwardsCurve","conf","twisted","a","mOneA","extended","call","umod","red","m","toRed","c","c2","redSqr","d","dd","redAdd","fromRed","cmpn","oneC","module","exports","prototype","_mulA","num","redNeg","redMul","_mulC","jpoint","x","y","z","t","point","pointFromX","odd","x2","rhs","redSub","lhs","one","y2","redInvm","redSqrt","cmp","zero","Error","isOdd","pointFromY","validate","isInfinity","normalize","Point","curve","BasePoint","zOne","pointFromJSON","obj","fromJSON","inspect","toString","_extDbl","b","redIAdd","e","redISub","g","f","h","nx","ny","nt","nz","_projDbl","j","two","dbl","_extAdd","p","_projAdd","tmp","add","mul","k","_hasDoubles","_fixedNafMul","_wnafMul","mulAdd","k1","k2","_wnafMulAdd","jmulAdd","zi","neg","getX","getY","eq","other","eqXToP","rx","xc","clone","redN","iadd","n","toP","mixedAdd"],"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 EdwardsCurve(conf) {\n // NOTE: Important as we are creating point in Base.call()\n this.twisted = (conf.a | 0) !== 1;\n this.mOneA = this.twisted && (conf.a | 0) === -1;\n this.extended = this.mOneA;\n\n Base.call(this, 'edwards', conf);\n\n this.a = new BN(conf.a, 16).umod(this.red.m);\n this.a = this.a.toRed(this.red);\n this.c = new BN(conf.c, 16).toRed(this.red);\n this.c2 = this.c.redSqr();\n this.d = new BN(conf.d, 16).toRed(this.red);\n this.dd = this.d.redAdd(this.d);\n\n assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n this.oneC = (conf.c | 0) === 1;\n}\ninherits(EdwardsCurve, Base);\nmodule.exports = EdwardsCurve;\n\nEdwardsCurve.prototype._mulA = function _mulA(num) {\n if (this.mOneA)\n return num.redNeg();\n else\n return this.a.redMul(num);\n};\n\nEdwardsCurve.prototype._mulC = function _mulC(num) {\n if (this.oneC)\n return num;\n else\n return this.c.redMul(num);\n};\n\n// Just for compatibility with Short curve\nEdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n return this.point(x, y, z, t);\n};\n\nEdwardsCurve.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 x2 = x.redSqr();\n var rhs = this.c2.redSub(this.a.redMul(x2));\n var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n\n var y2 = rhs.redMul(lhs.redInvm());\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\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\nEdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n y = new BN(y, 16);\n if (!y.red)\n y = y.toRed(this.red);\n\n // x^2 = (y^2 - c^2) / (c^2 d y^2 - a)\n var y2 = y.redSqr();\n var lhs = y2.redSub(this.c2);\n var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n var x2 = lhs.redMul(rhs.redInvm());\n\n if (x2.cmp(this.zero) === 0) {\n if (odd)\n throw new Error('invalid point');\n else\n return this.point(this.zero, y);\n }\n\n var x = x2.redSqrt();\n if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n if (x.fromRed().isOdd() !== odd)\n x = x.redNeg();\n\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.validate = function validate(point) {\n if (point.isInfinity())\n return true;\n\n // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2)\n point.normalize();\n\n var x2 = point.x.redSqr();\n var y2 = point.y.redSqr();\n var lhs = x2.redMul(this.a).redAdd(y2);\n var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n\n return lhs.cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, y, z, t) {\n Base.BasePoint.call(this, curve, 'projective');\n if (x === null && y === null && z === null) {\n this.x = this.curve.zero;\n this.y = this.curve.one;\n this.z = this.curve.one;\n this.t = this.curve.zero;\n this.zOne = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = z ? new BN(z, 16) : this.curve.one;\n this.t = t && new BN(t, 16);\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 if (this.t && !this.t.red)\n this.t = this.t.toRed(this.curve.red);\n this.zOne = this.z === this.curve.one;\n\n // Use extended coordinates\n if (this.curve.extended && !this.t) {\n this.t = this.x.redMul(this.y);\n if (!this.zOne)\n this.t = this.t.redMul(this.z.redInvm());\n }\n }\n}\ninherits(Point, Base.BasePoint);\n\nEdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nEdwardsCurve.prototype.point = function point(x, y, z, t) {\n return new Point(this, x, y, z, t);\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1], obj[2]);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '';\n return '';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.x.cmpn(0) === 0 &&\n (this.y.cmp(this.z) === 0 ||\n (this.zOne && this.y.cmp(this.curve.c) === 0));\n};\n\nPoint.prototype._extDbl = function _extDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #doubling-dbl-2008-hwcd\n // 4M + 4S\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = 2 * Z1^2\n var c = this.z.redSqr();\n c = c.redIAdd(c);\n // D = a * A\n var d = this.curve._mulA(a);\n // E = (X1 + Y1)^2 - A - B\n var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);\n // G = D + B\n var g = d.redAdd(b);\n // F = G - C\n var f = g.redSub(c);\n // H = D - B\n var h = d.redSub(b);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projDbl = function _projDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #doubling-dbl-2008-bbjlp\n // #doubling-dbl-2007-bl\n // and others\n // Generally 3M + 4S or 2M + 4S\n\n // B = (X1 + Y1)^2\n var b = this.x.redAdd(this.y).redSqr();\n // C = X1^2\n var c = this.x.redSqr();\n // D = Y1^2\n var d = this.y.redSqr();\n\n var nx;\n var ny;\n var nz;\n var e;\n var h;\n var j;\n if (this.curve.twisted) {\n // E = a * C\n e = this.curve._mulA(c);\n // F = E + D\n var f = e.redAdd(d);\n if (this.zOne) {\n // X3 = (B - C - D) * (F - 2)\n nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F^2 - 2 * F\n nz = f.redSqr().redSub(f).redSub(f);\n } else {\n // H = Z1^2\n h = this.z.redSqr();\n // J = F - 2 * H\n j = f.redSub(h).redISub(h);\n // X3 = (B-C-D)*J\n nx = b.redSub(c).redISub(d).redMul(j);\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F * J\n nz = f.redMul(j);\n }\n } else {\n // E = C + D\n e = c.redAdd(d);\n // H = (c * Z1)^2\n h = this.curve._mulC(this.z).redSqr();\n // J = E - 2 * H\n j = e.redSub(h).redSub(h);\n // X3 = c * (B - E) * J\n nx = this.curve._mulC(b.redISub(e)).redMul(j);\n // Y3 = c * E * (C - D)\n ny = this.curve._mulC(e).redMul(c.redISub(d));\n // Z3 = E * J\n nz = e.redMul(j);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n // Double in extended coordinates\n if (this.curve.extended)\n return this._extDbl();\n else\n return this._projDbl();\n};\n\nPoint.prototype._extAdd = function _extAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #addition-add-2008-hwcd-3\n // 8M\n\n // A = (Y1 - X1) * (Y2 - X2)\n var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));\n // B = (Y1 + X1) * (Y2 + X2)\n var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));\n // C = T1 * k * T2\n var c = this.t.redMul(this.curve.dd).redMul(p.t);\n // D = Z1 * 2 * Z2\n var d = this.z.redMul(p.z.redAdd(p.z));\n // E = B - A\n var e = b.redSub(a);\n // F = D - C\n var f = d.redSub(c);\n // G = D + C\n var g = d.redAdd(c);\n // H = B + A\n var h = b.redAdd(a);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projAdd = function _projAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #addition-add-2008-bbjlp\n // #addition-add-2007-bl\n // 10M + 1S\n\n // A = Z1 * Z2\n var a = this.z.redMul(p.z);\n // B = A^2\n var b = a.redSqr();\n // C = X1 * X2\n var c = this.x.redMul(p.x);\n // D = Y1 * Y2\n var d = this.y.redMul(p.y);\n // E = d * C * D\n var e = this.curve.d.redMul(c).redMul(d);\n // F = B - E\n var f = b.redSub(e);\n // G = B + E\n var g = b.redAdd(e);\n // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D)\n var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n var nx = a.redMul(f).redMul(tmp);\n var ny;\n var nz;\n if (this.curve.twisted) {\n // Y3 = A * G * (D - a * C)\n ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));\n // Z3 = F * G\n nz = f.redMul(g);\n } else {\n // Y3 = A * G * (D - C)\n ny = a.redMul(g).redMul(d.redSub(c));\n // Z3 = c * F * G\n nz = this.curve._mulC(f).redMul(g);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.add = function add(p) {\n if (this.isInfinity())\n return p;\n if (p.isInfinity())\n return this;\n\n if (this.curve.extended)\n return this._extAdd(p);\n else\n return this._projAdd(p);\n};\n\nPoint.prototype.mul = function mul(k) {\n if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true);\n};\n\nPoint.prototype.normalize = function normalize() {\n if (this.zOne)\n return this;\n\n // Normalize coordinates\n var zi = this.z.redInvm();\n this.x = this.x.redMul(zi);\n this.y = this.y.redMul(zi);\n if (this.t)\n this.t = this.t.redMul(zi);\n this.z = this.curve.one;\n this.zOne = true;\n return this;\n};\n\nPoint.prototype.neg = function neg() {\n return this.curve.point(this.x.redNeg(),\n this.y,\n this.z,\n this.t && this.t.redNeg());\n};\n\nPoint.prototype.getX = function getX() {\n this.normalize();\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n this.normalize();\n return this.y.fromRed();\n};\n\nPoint.prototype.eq = function eq(other) {\n return this === other ||\n this.getX().cmp(other.getX()) === 0 &&\n this.getY().cmp(other.getY()) === 0;\n};\n\nPoint.prototype.eqXToP = function eqXToP(x) {\n var rx = x.toRed(this.curve.red).redMul(this.z);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(this.z);\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\n// Compatibility with BaseCurve\nPoint.prototype.toP = Point.prototype.normalize;\nPoint.prototype.mixedAdd = Point.prototype.add;\n"]},"metadata":{},"sourceType":"script"}