{"ast":null,"code":"'use strict';\n\nvar BN = require('bn.js');\n\nvar utils = require('../utils');\n\nvar getNAF = utils.getNAF;\nvar getJSF = utils.getJSF;\nvar assert = utils.assert;\n\nfunction BaseCurve(type, conf) {\n this.type = type;\n this.p = new BN(conf.p, 16); // Use Montgomery, when there is no fast reduction for the prime\n\n this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); // Useful for many curves\n\n this.zero = new BN(0).toRed(this.red);\n this.one = new BN(1).toRed(this.red);\n this.two = new BN(2).toRed(this.red); // Curve configuration, optional\n\n this.n = conf.n && new BN(conf.n, 16);\n this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); // Temporary arrays\n\n this._wnafT1 = new Array(4);\n this._wnafT2 = new Array(4);\n this._wnafT3 = new Array(4);\n this._wnafT4 = new Array(4);\n this._bitLength = this.n ? this.n.bitLength() : 0; // Generalized Greg Maxwell's trick\n\n var adjustCount = this.n && this.p.div(this.n);\n\n if (!adjustCount || adjustCount.cmpn(100) > 0) {\n this.redN = null;\n } else {\n this._maxwellTrick = true;\n this.redN = this.n.toRed(this.red);\n }\n}\n\nmodule.exports = BaseCurve;\n\nBaseCurve.prototype.point = function point() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype.validate = function validate() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n assert(p.precomputed);\n\n var doubles = p._getDoubles();\n\n var naf = getNAF(k, 1, this._bitLength);\n var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);\n I /= 3; // Translate into more windowed form\n\n var repr = [];\n var j;\n var nafW;\n\n for (j = 0; j < naf.length; j += doubles.step) {\n nafW = 0;\n\n for (var l = j + doubles.step - 1; l >= j; l--) nafW = (nafW << 1) + naf[l];\n\n repr.push(nafW);\n }\n\n var a = this.jpoint(null, null, null);\n var b = this.jpoint(null, null, null);\n\n for (var i = I; i > 0; i--) {\n for (j = 0; j < repr.length; j++) {\n nafW = repr[j];\n if (nafW === i) b = b.mixedAdd(doubles.points[j]);else if (nafW === -i) b = b.mixedAdd(doubles.points[j].neg());\n }\n\n a = a.add(b);\n }\n\n return a.toP();\n};\n\nBaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n var w = 4; // Precompute window\n\n var nafPoints = p._getNAFPoints(w);\n\n w = nafPoints.wnd;\n var wnd = nafPoints.points; // Get NAF form\n\n var naf = getNAF(k, w, this._bitLength); // Add `this`*(N+1) for every w-NAF index\n\n var acc = this.jpoint(null, null, null);\n\n for (var i = naf.length - 1; i >= 0; i--) {\n // Count zeroes\n for (var l = 0; i >= 0 && naf[i] === 0; i--) l++;\n\n if (i >= 0) l++;\n acc = acc.dblp(l);\n if (i < 0) break;\n var z = naf[i];\n assert(z !== 0);\n\n if (p.type === 'affine') {\n // J +- P\n if (z > 0) acc = acc.mixedAdd(wnd[z - 1 >> 1]);else acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());\n } else {\n // J +- J\n if (z > 0) acc = acc.add(wnd[z - 1 >> 1]);else acc = acc.add(wnd[-z - 1 >> 1].neg());\n }\n }\n\n return p.type === 'affine' ? acc.toP() : acc;\n};\n\nBaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {\n var wndWidth = this._wnafT1;\n var wnd = this._wnafT2;\n var naf = this._wnafT3; // Fill all arrays\n\n var max = 0;\n var i;\n var j;\n var p;\n\n for (i = 0; i < len; i++) {\n p = points[i];\n\n var nafPoints = p._getNAFPoints(defW);\n\n wndWidth[i] = nafPoints.wnd;\n wnd[i] = nafPoints.points;\n } // Comb small window NAFs\n\n\n for (i = len - 1; i >= 1; i -= 2) {\n var a = i - 1;\n var b = i;\n\n if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);\n naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);\n max = Math.max(naf[a].length, max);\n max = Math.max(naf[b].length, max);\n continue;\n }\n\n var comb = [points[a],\n /* 1 */\n null,\n /* 3 */\n null,\n /* 5 */\n points[b]\n /* 7 */\n ]; // Try to avoid Projective points, if possible\n\n if (points[a].y.cmp(points[b].y) === 0) {\n comb[1] = points[a].add(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].add(points[b].neg());\n } else {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n }\n\n var index = [-3,\n /* -1 -1 */\n -1,\n /* -1 0 */\n -5,\n /* -1 1 */\n -7,\n /* 0 -1 */\n 0,\n /* 0 0 */\n 7,\n /* 0 1 */\n 5,\n /* 1 -1 */\n 1,\n /* 1 0 */\n 3\n /* 1 1 */\n ];\n var jsf = getJSF(coeffs[a], coeffs[b]);\n max = Math.max(jsf[0].length, max);\n naf[a] = new Array(max);\n naf[b] = new Array(max);\n\n for (j = 0; j < max; j++) {\n var ja = jsf[0][j] | 0;\n var jb = jsf[1][j] | 0;\n naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n naf[b][j] = 0;\n wnd[a] = comb;\n }\n }\n\n var acc = this.jpoint(null, null, null);\n var tmp = this._wnafT4;\n\n for (i = max; i >= 0; i--) {\n var k = 0;\n\n while (i >= 0) {\n var zero = true;\n\n for (j = 0; j < len; j++) {\n tmp[j] = naf[j][i] | 0;\n if (tmp[j] !== 0) zero = false;\n }\n\n if (!zero) break;\n k++;\n i--;\n }\n\n if (i >= 0) k++;\n acc = acc.dblp(k);\n if (i < 0) break;\n\n for (j = 0; j < len; j++) {\n var z = tmp[j];\n p;\n if (z === 0) continue;else if (z > 0) p = wnd[j][z - 1 >> 1];else if (z < 0) p = wnd[j][-z - 1 >> 1].neg();\n if (p.type === 'affine') acc = acc.mixedAdd(p);else acc = acc.add(p);\n }\n } // Zeroify references\n\n\n for (i = 0; i < len; i++) wnd[i] = null;\n\n if (jacobianResult) return acc;else return acc.toP();\n};\n\nfunction BasePoint(curve, type) {\n this.curve = curve;\n this.type = type;\n this.precomputed = null;\n}\n\nBaseCurve.BasePoint = BasePoint;\n\nBasePoint.prototype.eq = function eq() {\n throw new Error('Not implemented');\n};\n\nBasePoint.prototype.validate = function validate() {\n return this.curve.validate(this);\n};\n\nBaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n bytes = utils.toArray(bytes, enc);\n var len = this.p.byteLength(); // uncompressed, hybrid-odd, hybrid-even\n\n if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) && bytes.length - 1 === 2 * len) {\n if (bytes[0] === 0x06) assert(bytes[bytes.length - 1] % 2 === 0);else if (bytes[0] === 0x07) assert(bytes[bytes.length - 1] % 2 === 1);\n var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));\n return res;\n } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && bytes.length - 1 === len) {\n return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03);\n }\n\n throw new Error('Unknown point format');\n};\n\nBasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n return this.encode(enc, true);\n};\n\nBasePoint.prototype._encode = function _encode(compact) {\n var len = this.curve.p.byteLength();\n var x = this.getX().toArray('be', len);\n if (compact) return [this.getY().isEven() ? 0x02 : 0x03].concat(x);\n return [0x04].concat(x, this.getY().toArray('be', len));\n};\n\nBasePoint.prototype.encode = function encode(enc, compact) {\n return utils.encode(this._encode(compact), enc);\n};\n\nBasePoint.prototype.precompute = function precompute(power) {\n if (this.precomputed) return this;\n var precomputed = {\n doubles: null,\n naf: null,\n beta: null\n };\n precomputed.naf = this._getNAFPoints(8);\n precomputed.doubles = this._getDoubles(4, power);\n precomputed.beta = this._getBeta();\n this.precomputed = precomputed;\n return this;\n};\n\nBasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n if (!this.precomputed) return false;\n var doubles = this.precomputed.doubles;\n if (!doubles) return false;\n return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n};\n\nBasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n if (this.precomputed && this.precomputed.doubles) return this.precomputed.doubles;\n var doubles = [this];\n var acc = this;\n\n for (var i = 0; i < power; i += step) {\n for (var j = 0; j < step; j++) acc = acc.dbl();\n\n doubles.push(acc);\n }\n\n return {\n step: step,\n points: doubles\n };\n};\n\nBasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n if (this.precomputed && this.precomputed.naf) return this.precomputed.naf;\n var res = [this];\n var max = (1 << wnd) - 1;\n var dbl = max === 1 ? null : this.dbl();\n\n for (var i = 1; i < max; i++) res[i] = res[i - 1].add(dbl);\n\n return {\n wnd: wnd,\n points: res\n };\n};\n\nBasePoint.prototype._getBeta = function _getBeta() {\n return null;\n};\n\nBasePoint.prototype.dblp = function dblp(k) {\n var r = this;\n\n for (var i = 0; i < k; i++) r = r.dbl();\n\n return r;\n};","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/elliptic/lib/elliptic/curve/base.js"],"names":["BN","require","utils","getNAF","getJSF","assert","BaseCurve","type","conf","p","red","prime","mont","zero","toRed","one","two","n","g","pointFromJSON","gRed","_wnafT1","Array","_wnafT2","_wnafT3","_wnafT4","_bitLength","bitLength","adjustCount","div","cmpn","redN","_maxwellTrick","module","exports","prototype","point","Error","validate","_fixedNafMul","k","precomputed","doubles","_getDoubles","naf","I","step","repr","j","nafW","length","l","push","a","jpoint","b","i","mixedAdd","points","neg","add","toP","_wnafMul","w","nafPoints","_getNAFPoints","wnd","acc","dblp","z","_wnafMulAdd","defW","coeffs","len","jacobianResult","wndWidth","max","Math","comb","y","cmp","toJ","redNeg","index","jsf","ja","jb","tmp","BasePoint","curve","eq","decodePoint","bytes","enc","toArray","byteLength","res","slice","pointFromX","encodeCompressed","encode","_encode","compact","x","getX","getY","isEven","concat","precompute","power","beta","_getBeta","_hasDoubles","ceil","dbl","r"],"mappings":"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","sourcesContent":["'use strict';\n\nvar BN = require('bn.js');\nvar utils = require('../utils');\nvar getNAF = utils.getNAF;\nvar getJSF = utils.getJSF;\nvar assert = utils.assert;\n\nfunction BaseCurve(type, conf) {\n this.type = type;\n this.p = new BN(conf.p, 16);\n\n // Use Montgomery, when there is no fast reduction for the prime\n this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);\n\n // Useful for many curves\n this.zero = new BN(0).toRed(this.red);\n this.one = new BN(1).toRed(this.red);\n this.two = new BN(2).toRed(this.red);\n\n // Curve configuration, optional\n this.n = conf.n && new BN(conf.n, 16);\n this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);\n\n // Temporary arrays\n this._wnafT1 = new Array(4);\n this._wnafT2 = new Array(4);\n this._wnafT3 = new Array(4);\n this._wnafT4 = new Array(4);\n\n this._bitLength = this.n ? this.n.bitLength() : 0;\n\n // Generalized Greg Maxwell's trick\n var adjustCount = this.n && this.p.div(this.n);\n if (!adjustCount || adjustCount.cmpn(100) > 0) {\n this.redN = null;\n } else {\n this._maxwellTrick = true;\n this.redN = this.n.toRed(this.red);\n }\n}\nmodule.exports = BaseCurve;\n\nBaseCurve.prototype.point = function point() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype.validate = function validate() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n assert(p.precomputed);\n var doubles = p._getDoubles();\n\n var naf = getNAF(k, 1, this._bitLength);\n var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1);\n I /= 3;\n\n // Translate into more windowed form\n var repr = [];\n var j;\n var nafW;\n for (j = 0; j < naf.length; j += doubles.step) {\n nafW = 0;\n for (var l = j + doubles.step - 1; l >= j; l--)\n nafW = (nafW << 1) + naf[l];\n repr.push(nafW);\n }\n\n var a = this.jpoint(null, null, null);\n var b = this.jpoint(null, null, null);\n for (var i = I; i > 0; i--) {\n for (j = 0; j < repr.length; j++) {\n nafW = repr[j];\n if (nafW === i)\n b = b.mixedAdd(doubles.points[j]);\n else if (nafW === -i)\n b = b.mixedAdd(doubles.points[j].neg());\n }\n a = a.add(b);\n }\n return a.toP();\n};\n\nBaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n var w = 4;\n\n // Precompute window\n var nafPoints = p._getNAFPoints(w);\n w = nafPoints.wnd;\n var wnd = nafPoints.points;\n\n // Get NAF form\n var naf = getNAF(k, w, this._bitLength);\n\n // Add `this`*(N+1) for every w-NAF index\n var acc = this.jpoint(null, null, null);\n for (var i = naf.length - 1; i >= 0; i--) {\n // Count zeroes\n for (var l = 0; i >= 0 && naf[i] === 0; i--)\n l++;\n if (i >= 0)\n l++;\n acc = acc.dblp(l);\n\n if (i < 0)\n break;\n var z = naf[i];\n assert(z !== 0);\n if (p.type === 'affine') {\n // J +- P\n if (z > 0)\n acc = acc.mixedAdd(wnd[(z - 1) >> 1]);\n else\n acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg());\n } else {\n // J +- J\n if (z > 0)\n acc = acc.add(wnd[(z - 1) >> 1]);\n else\n acc = acc.add(wnd[(-z - 1) >> 1].neg());\n }\n }\n return p.type === 'affine' ? acc.toP() : acc;\n};\n\nBaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW,\n points,\n coeffs,\n len,\n jacobianResult) {\n var wndWidth = this._wnafT1;\n var wnd = this._wnafT2;\n var naf = this._wnafT3;\n\n // Fill all arrays\n var max = 0;\n var i;\n var j;\n var p;\n for (i = 0; i < len; i++) {\n p = points[i];\n var nafPoints = p._getNAFPoints(defW);\n wndWidth[i] = nafPoints.wnd;\n wnd[i] = nafPoints.points;\n }\n\n // Comb small window NAFs\n for (i = len - 1; i >= 1; i -= 2) {\n var a = i - 1;\n var b = i;\n if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);\n naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);\n max = Math.max(naf[a].length, max);\n max = Math.max(naf[b].length, max);\n continue;\n }\n\n var comb = [\n points[a], /* 1 */\n null, /* 3 */\n null, /* 5 */\n points[b], /* 7 */\n ];\n\n // Try to avoid Projective points, if possible\n if (points[a].y.cmp(points[b].y) === 0) {\n comb[1] = points[a].add(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].add(points[b].neg());\n } else {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n }\n\n var index = [\n -3, /* -1 -1 */\n -1, /* -1 0 */\n -5, /* -1 1 */\n -7, /* 0 -1 */\n 0, /* 0 0 */\n 7, /* 0 1 */\n 5, /* 1 -1 */\n 1, /* 1 0 */\n 3, /* 1 1 */\n ];\n\n var jsf = getJSF(coeffs[a], coeffs[b]);\n max = Math.max(jsf[0].length, max);\n naf[a] = new Array(max);\n naf[b] = new Array(max);\n for (j = 0; j < max; j++) {\n var ja = jsf[0][j] | 0;\n var jb = jsf[1][j] | 0;\n\n naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n naf[b][j] = 0;\n wnd[a] = comb;\n }\n }\n\n var acc = this.jpoint(null, null, null);\n var tmp = this._wnafT4;\n for (i = max; i >= 0; i--) {\n var k = 0;\n\n while (i >= 0) {\n var zero = true;\n for (j = 0; j < len; j++) {\n tmp[j] = naf[j][i] | 0;\n if (tmp[j] !== 0)\n zero = false;\n }\n if (!zero)\n break;\n k++;\n i--;\n }\n if (i >= 0)\n k++;\n acc = acc.dblp(k);\n if (i < 0)\n break;\n\n for (j = 0; j < len; j++) {\n var z = tmp[j];\n p;\n if (z === 0)\n continue;\n else if (z > 0)\n p = wnd[j][(z - 1) >> 1];\n else if (z < 0)\n p = wnd[j][(-z - 1) >> 1].neg();\n\n if (p.type === 'affine')\n acc = acc.mixedAdd(p);\n else\n acc = acc.add(p);\n }\n }\n // Zeroify references\n for (i = 0; i < len; i++)\n wnd[i] = null;\n\n if (jacobianResult)\n return acc;\n else\n return acc.toP();\n};\n\nfunction BasePoint(curve, type) {\n this.curve = curve;\n this.type = type;\n this.precomputed = null;\n}\nBaseCurve.BasePoint = BasePoint;\n\nBasePoint.prototype.eq = function eq(/*other*/) {\n throw new Error('Not implemented');\n};\n\nBasePoint.prototype.validate = function validate() {\n return this.curve.validate(this);\n};\n\nBaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n bytes = utils.toArray(bytes, enc);\n\n var len = this.p.byteLength();\n\n // uncompressed, hybrid-odd, hybrid-even\n if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) &&\n bytes.length - 1 === 2 * len) {\n if (bytes[0] === 0x06)\n assert(bytes[bytes.length - 1] % 2 === 0);\n else if (bytes[0] === 0x07)\n assert(bytes[bytes.length - 1] % 2 === 1);\n\n var res = this.point(bytes.slice(1, 1 + len),\n bytes.slice(1 + len, 1 + 2 * len));\n\n return res;\n } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) &&\n bytes.length - 1 === len) {\n return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03);\n }\n throw new Error('Unknown point format');\n};\n\nBasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n return this.encode(enc, true);\n};\n\nBasePoint.prototype._encode = function _encode(compact) {\n var len = this.curve.p.byteLength();\n var x = this.getX().toArray('be', len);\n\n if (compact)\n return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x);\n\n return [ 0x04 ].concat(x, this.getY().toArray('be', len));\n};\n\nBasePoint.prototype.encode = function encode(enc, compact) {\n return utils.encode(this._encode(compact), enc);\n};\n\nBasePoint.prototype.precompute = function precompute(power) {\n if (this.precomputed)\n return this;\n\n var precomputed = {\n doubles: null,\n naf: null,\n beta: null,\n };\n precomputed.naf = this._getNAFPoints(8);\n precomputed.doubles = this._getDoubles(4, power);\n precomputed.beta = this._getBeta();\n this.precomputed = precomputed;\n\n return this;\n};\n\nBasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n if (!this.precomputed)\n return false;\n\n var doubles = this.precomputed.doubles;\n if (!doubles)\n return false;\n\n return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n};\n\nBasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n if (this.precomputed && this.precomputed.doubles)\n return this.precomputed.doubles;\n\n var doubles = [ this ];\n var acc = this;\n for (var i = 0; i < power; i += step) {\n for (var j = 0; j < step; j++)\n acc = acc.dbl();\n doubles.push(acc);\n }\n return {\n step: step,\n points: doubles,\n };\n};\n\nBasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n if (this.precomputed && this.precomputed.naf)\n return this.precomputed.naf;\n\n var res = [ this ];\n var max = (1 << wnd) - 1;\n var dbl = max === 1 ? null : this.dbl();\n for (var i = 1; i < max; i++)\n res[i] = res[i - 1].add(dbl);\n return {\n wnd: wnd,\n points: res,\n };\n};\n\nBasePoint.prototype._getBeta = function _getBeta() {\n return null;\n};\n\nBasePoint.prototype.dblp = function dblp(k) {\n var r = this;\n for (var i = 0; i < k; i++)\n r = r.dbl();\n return r;\n};\n"]},"metadata":{},"sourceType":"script"}