Socket
Socket
Sign inDemoInstall

elliptic

Package Overview
Dependencies
0
Maintainers
1
Versions
82
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.1.0 to 0.2.0

2.js

54

1.js

@@ -0,21 +1,41 @@

var assert = require('assert');
var elliptic = require('./');
var curve = new elliptic.curve({
p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ' +
'fffffc2f',
a: '0',
b: '7'
});
console.time('curve load');
var curve = elliptic.nist.secp256k1;
assert(curve);
console.timeEnd('curve load');
var p = curve.point(
'79be667e f9dcbbac 55a06295 ce870b07 029bfcdb 2dce28d9 59f2815b 16f81798',
'483ada77 26a3c465 5da4fbfc 0e1108a8 fd17b448 a6855419 9c47d08f fb10d4b8'
);
p.precompute(256);
require('fs').writeFileSync('/tmp/1.json', JSON.stringify(p));
var ecdsa = new elliptic.ecdsa(curve);
console.time('gen key');
var keys = ecdsa.genKeyPair();
console.timeEnd('gen key');
console.log(keys);
var msg = new elliptic.bn('deadbeef', 16);
console.time();
for (var i = 0; i < 1000; i++)
p = p.dbl();
console.timeEnd();
console.log(p.validate());
console.time('validate');
var v = ecdsa.validateKey(keys.pub);
assert(v.result, v.reason);
console.timeEnd('validate');
// Sign and verify
console.time('sign');
var signature = ecdsa.sign(msg, keys.priv);
console.timeEnd('sign');
console.time('verify');
assert(ecdsa.verify(msg, signature, keys.pub));
console.timeEnd('verify');
// Wrong public key
console.time('get key 2');
var keys = ecdsa.genKeyPair();
console.timeEnd('get key 2');
console.time('verify 2');
assert(!ecdsa.verify(msg, signature, keys.pub));
console.timeEnd('verify 2');
// Just a benchmark
console.time('verify 3');
for (var i = 0; i < 80; i++)
assert(!ecdsa.verify(msg, signature, keys.pub));
console.timeEnd('verify 3');
var elliptic = exports;
elliptic.utils = require('./elliptic/utils');
elliptic.bn = require('./elliptic/bn');
elliptic.rand = require('./elliptic/rand');
elliptic.hash = require('./elliptic/hash');
elliptic.hmac = require('./elliptic/hmac');
elliptic.hmacDRBG = require('./elliptic/hmac-drbg');
elliptic.curve = require('./elliptic/curve');
elliptic.nist = require('./elliptic/nist');
elliptic.ecdsa = require('./elliptic/ecdsa');
var assert = require('assert');
var elliptic = require('../elliptic');
var utils = elliptic.utils;

@@ -13,8 +15,12 @@ function BN(number, base) {

this.length = 0;
// Montgomery context
this.mont = null;
if (number !== null)
this.init(number || 0, base || 10);
this._init(number || 0, base || 10);
}
module.exports = BN;
BN.prototype.init = function init(number, base) {
BN.prototype._init = function init(number, base) {
if (typeof number === 'number') {

@@ -25,5 +31,25 @@ if (number < 0) {

}
this.words = [ number & 0xffff ];
this.words = [ number & 0xffffff ];
this.length = 1;
return;
} else if (typeof number === 'object') {
// Perhaps a Uint8Array
assert(typeof number.length === 'number');
this.length = Math.ceil(number.length / 3);
this.words = new Array(this.length);
if (base === 'little' || base === 'le') {
for (var i = 0; i < this.length; i++) {
this.words[this.length - i - 1] = number[i * 3 + 2] |
(number[i * 3 + 1] << 8) |
(number[i * 3] << 16);
}
} else {
for (var i = 0; i < this.length; i++) {
this.words[i] = number[i * 3] |
(number[i * 3 + 1] << 8) |
(number[i * 3 + 2] << 16);
}
}
return;
}

@@ -59,4 +85,4 @@ assert(base <= 16);

if (q > 0xfff) {
assert(q <= 0xffff);
if (q > 0xfffff) {
assert(q <= 0xffffff);
if (!bigQ)

@@ -84,2 +110,3 @@ bigQ = new BN(q);

dest.sign = this.sign;
dest.mont = this.mont;
};

@@ -93,5 +120,6 @@

// Remove leading `0` from `this`
BN.prototype.strip = function strip() {
while (this.words.length > 1 && this.words[this.words.length - 1] === 0)
this.words.pop();
this.words.length--;
this.length = this.words.length;

@@ -104,12 +132,5 @@ // -0 = 0

function zero4(word) {
if (word.length === 3)
return '0' + word;
else if (word.length === 2)
return '00' + word;
else if (word.length === 1)
return '000' + word;
else
return word;
}
BN.prototype.inspect = function inspect() {
return (this.mont ? '<BN-M: ' : '<BN: ') + this.toString(16) + '>';
};

@@ -123,3 +144,3 @@ BN.prototype.toString = function toString(base) {

if (i !== this.length - 1)
out += zero4(word);
out += utils.zero6(word);
else

@@ -134,7 +155,7 @@ out += word;

while (c.cmp(0) !== 0) {
var r = c.mod(10000);
c = c.div(10000);
var r = c.mod(1000000);
c = c.div(1000000);
assert.equal(r.length, 1);
if (c.cmp(0) !== 0)
out = zero4(r.words[0] + '') + out;
out = utils.zero6(r.words[0] + '') + out;
else

@@ -157,2 +178,39 @@ out = r.words[0] + out;

BN.prototype.toArray = function toArray() {
this.strip();
var res = new Array(Math.ceil(this.bitLength() / 8));
res[0] = 0;
var q = this.clone();
for (var i = 0; q.cmp(0) !== 0; i++) {
res[i] = q.andl(0xff);
q.ishr(8);
}
return res;
};
function genCountBits(bits) {
var arr = [];
for (var i = bits - 1; i >= 0; i--) {
var bit = '0x' + (1 << i).toString(16);
arr.push('(w & ' + bit + ') === ' + bit + ' ? ' + (i + 1));
}
return new Function('w', 'return ' + arr.join(':\n') + ':\n0;');
};
BN.prototype._countBits = genCountBits(24);
// Return number of used bits in a BN
BN.prototype.bitLength = function bitLength() {
this.strip();
var hi = 0;
var w = this.words[this.length - 1];
var hi = this._countBits(w);
return (this.length - 1) * 24 + hi;
};
// Return negative clone of `this`
BN.prototype.neg = function neg() {

@@ -164,2 +222,3 @@ var r = this.clone();

// Add `num` to `this`
BN.prototype.add = function add(num, base) {

@@ -186,4 +245,4 @@ if (!(num instanceof BN))

var r = a + b + carry;
result.words[i] = r & 0xffff;
carry = r >> 16;
result.words[i] = r & 0xffffff;
carry = r >> 24;
}

@@ -198,2 +257,3 @@ if (carry) {

// Subtract `num` from `this`
BN.prototype.sub = function sub(num, base) {

@@ -225,3 +285,3 @@ if (!(num instanceof BN))

if (r < 0) {
r += 0x10000;
r += 0x1000000;
carry = 1;

@@ -247,2 +307,3 @@ } else {

// Multiply `this` by `num`
BN.prototype.mul = function mul(num, base) {

@@ -267,8 +328,8 @@ if (!(num instanceof BN))

var lo = r & 0xffff;
var carry = (r - lo) / 0x10000;
var lo = r & 0xffffff;
var carry = (r - lo) / 0x1000000;
if (result.words[k]) {
lo = result.words[k] + lo;
result.words[k] = lo & 0xffff;
carry += lo >> 16;
result.words[k] = lo & 0xffffff;
carry += lo >> 24;
} else {

@@ -280,8 +341,8 @@ result.words[k] = lo;

k++;
assert(carry <= 0xffff);
assert(carry <= 0xffffff);
for (; carry !== 0; k++) {
if (result.words[k]) {
carry = result.words[k] + carry;
result.words[k] = carry & 0xffff;
carry >>= 16;
carry += result.words[k];
result.words[k] = carry & 0xffffff;
carry >>= 24;
} else {

@@ -299,2 +360,3 @@ result.words[k] = carry;

// `this` * `this`
BN.prototype.sqr = function sqr() {

@@ -310,17 +372,17 @@ var res = new BN(null);

var uv = a * b;
var v = uv & 0xffff;
var u = (uv - v) / 0x10000;
var v = uv & 0xffffff;
var u = (uv - v) / 0x1000000;
if (i < j) {
u <<= 1;
r2 += u >> 16;
r2 += u >> 24;
v <<= 1;
u |= v >> 16;
u &= 0xffff;
v &= 0xffff;
u |= v >> 24;
u &= 0xffffff;
v &= 0xffffff;
}
r0 += v;
r1 += u + (r0 >> 16);
r2 += r1 >> 16;
r0 &= 0xffff;
r1 &= 0xffff;
r1 += u + (r0 >> 24);
r2 += r1 >> 24;
r0 &= 0xffffff;
r1 &= 0xffffff;
}

@@ -337,6 +399,8 @@ res.words[k] = r0;

// Shift-left in-place
BN.prototype.ishl = function ishl(bits) {
assert(typeof bits === 'number');
var r = bits % 16;
var s = bits >> 4;
var r = bits % 24;
var s = (bits - r) / 24;
var carryMask = (0xffffff >> (24 - r)) << (24 - r);

@@ -346,5 +410,6 @@ if (r !== 0) {

for (var i = 0; i < this.length; i++) {
var c = this.words[i] << r;
this.words[i] = (c & 0xffff) | carry;
carry = c >> 16;
var newCarry = this.words[i] & carryMask;
var c = (this.words[i] - newCarry) << r;
this.words[i] = c | carry;
carry = newCarry >> (24 - r);
}

@@ -368,10 +433,18 @@ if (carry) {

BN.prototype.ishr = function ishr(bits) {
// Shift-right in-place
// NOTE: `hint` is a lowest bit before trailing zeroes
BN.prototype.ishr = function ishr(bits, hint) {
assert(typeof bits === 'number');
var r = bits % 16;
var s = bits >> 4;
if (!hint)
hint = 0;
else
hint = (hint - (hint % 24)) / 24;
var mask = 0xffff ^ ((0xffff >> r) << r);
var r = bits % 24;
var s = (bits - r) / 24;
var mask = 0xffffff ^ ((0xffffff >> r) << r);
if (s !== 0) {
hint -= s;
hint = Math.max(0, hint);
for (var i = 0; i < s; i++)

@@ -384,5 +457,5 @@ this.words.shift();

var carry = 0;
for (var i = this.length - 1; i >= 0; i--) {
for (var i = this.length - 1; i >= 0 && (carry !== 0 || i >= hint); i--) {
var word = this.words[i];
this.words[i] = (carry << (16 - r)) | (this.words[i] >> r);
this.words[i] = (carry << (24 - r)) | (this.words[i] >> r);
carry = word & mask;

@@ -400,2 +473,3 @@ }

// Shift-left
BN.prototype.shl = function shl(bits) {

@@ -405,2 +479,3 @@ return this.clone().ishl(bits);

// Shift-right
BN.prototype.shr = function shr(bits) {

@@ -410,5 +485,50 @@ return this.clone().ishr(bits);

// Return only lowers bits of number (in-place)
BN.prototype.imask = function imask(bits) {
assert(typeof bits === 'number');
var r = bits % 24;
var s = (bits - r) / 24;
assert(!this.sign, 'imask works only with positive numbers');
this.words.length = Math.min(s + 1, this.words.length);
this.length = this.words.length;
var mask = 0xffffff ^ ((0xffffff >> r) << r);
this.words[this.words.length - 1] &= mask;
return this.strip();
};
// Return only lowers bits of number
BN.prototype.mask = function mask(bits) {
return this.clone().imask(bits);
};
// Add plain number `num` to `this`
BN.prototype.iadd = function iadd(num) {
assert(typeof num === 'number');
if (num < 0)
return this.isub(num);
this.words[0] += num;
// Carry
for (var i = 0; i < this.length && this.words[i] >= 0x1000000; i++) {
this.words[i] -= 0x1000000;
if (i == this.length - 1)
this.words[i + 1] = 1;
else
this.words[i + 1]++;
}
this.length = this.words.length;
return this;
};
// Subtract plain number `num` from `this`
BN.prototype.isub = function isub(num) {
assert(typeof num === 'number');
assert(this.cmp(num) >= 0, 'Sign change is not supported in isub');
if (num < 0)
return this.iadd(-num);
this.words[0] -= num;

@@ -418,3 +538,3 @@

for (var i = 0; i < this.length && this.words[i] < 0; i++) {
this.words[i] += 0x10000;
this.words[i] += 0x1000000;
this.words[i + 1] -= 1;

@@ -426,38 +546,2 @@ }

function findShift(a, b, minShift, maxShift) {
var shift = minShift;
var q = new BN(1).ishl(shift);
var max = b.shl(shift);
var i = 0;
// Use binary search to determine proper amount of shift
while (true) {
var next;
var c = a.cmp(max);
i++;
if (c < 0) {
next = shift >> 1;
maxShift = shift;
q.ishr(shift - next);
max.ishr(shift - next);
} else if (c > 0) {
next = (maxShift + shift) >> 1;
minShift = shift;
q.ishl(next - shift);
max.ishl(next - shift);
} else if (c === 0)
break;
if (shift === next)
break;
shift = next;
}
if (c < 0 && shift >= 0) {
shift--;
q.ishr(1);
max.ishr(1);
}
return { q: q, max: max, shift: shift };
}
BN.prototype._div = function _div(num, base) {

@@ -489,7 +573,9 @@ if (!(num instanceof BN))

// Find maximum Q, Q * num <= this
var delta = this.length - num.length;
var f = findShift(this, num, delta * 16, delta * 16 + 17);
var shift = f.shift;
var q = f.q;
var max = f.max;
var shift = Math.max(0, this.bitLength() - num.bitLength());
var max = num.shl(shift);
if (shift > 0 && this.cmp(max) < 0) {
max.ishr(1, shift);
shift--;
}
var maxLen = max.bitLength();

@@ -502,7 +588,6 @@ var c = this;

c = c.sub(max);
r = r.add(q);
r = r.binc(shift);
}
q.ishr(1);
max.ishr(1);
shift--;
max.ishr(1, shift);
shift -= 1;
}

@@ -512,2 +597,3 @@ return { mod: c, div: r };

// Find `this` / `num`
BN.prototype.div = function div(num, base) {

@@ -517,2 +603,3 @@ return this._div(num, base).div;

// Find `this` % `num`
BN.prototype.mod = function mod(num, base) {

@@ -522,13 +609,5 @@ return this._div(num, base).mod;

BN.prototype.divm = function divm(num0, base0, num1, base1) {
if (typeof base0 !== 'number') {
var x1 = new BN(num0);
var p = new BN(base0, num1);
} else {
var x1 = new BN(num0, base0);
var p = new BN(num1, base1);
}
BN.prototype._egcd = function _egcd(x1, p) {
assert(!p.sign);
assert(!p.sign && p.isOdd());
var a = this;

@@ -541,6 +620,5 @@ var b = p;

a = a.clone();
x1 = x1.clone();
assert(a.cmp(0) !== 0);
x1 = x1.clone();
var x2 = new BN(0);

@@ -576,4 +654,7 @@ while (a.cmp(1) !== 0 && b.cmp(1) !== 0) {

// Invert number in the field F(num)
BN.prototype.invm = function invm(num, base) {
return this.divm(1, num, base);
if (!(num instanceof BN))
num = new BN(num, base);
return this._egcd(new BN(1), num);
};

@@ -589,2 +670,3 @@

// And first word and num
BN.prototype.andl = function andl(num) {

@@ -594,2 +676,35 @@ return this.words[0] & num;

// Increment at the bit position in-line
BN.prototype.binc = function binc(bit) {
assert(typeof bit === 'number');
var r = bit % 24;
var s = (bit - r) / 24;
var q = 1 << r;
// Fast case: bit is much higher than all existing words
if (this.length <= s) {
for (var i = this.length; i < s + 1; i++)
this.words[i] = 0;
this.words[s] |= q;
this.length = this.words.length;
return this;
}
// Add bit and propagate, if needed
var carry = q;
for (var i = s; carry != 0; i++) {
var w = i < this.length ? this.words[i] : 0;
w += carry;
carry = w >> 24;
w &= 0xffffff;
this.words[i] = w;
}
this.length = this.words.length;
return this;
};
// Compare two numbers and return:
// 1 - if `this` > `num`
// 0 - if `this` == `num`
// -1 - if `this` < `num`
BN.prototype.cmp = function cmp(num, base) {

@@ -601,3 +716,3 @@ // Fast number checks

num = -num;
num &= 0xffff;
num &= 0xffffff;
this.strip();

@@ -657,1 +772,125 @@

};
BN.prototype.forceMont = function forceMont(ctx) {
assert(!this.mont, 'Already a montgomery number');
this.mont = ctx;
return this;
};
BN.prototype.toMont = function toMont(ctx) {
assert(!this.mont, 'Already a montgomery number');
assert(!this.sign, 'mont works only with positives');
var res = this.shl(ctx.shift).mod(ctx.m);
res.mont = ctx;
return res;
};
BN.prototype.fromMont = function fromMont() {
assert(this.mont, 'fromMont works only with mont numbers');
var ctx = this.mont;
return this.mul(ctx.rinv).mod(ctx.m);
};
BN.prototype.montAdd = function montAdd(num, base) {
if (!(num instanceof BN))
num = new BN(num, base).toMont(this.mont);
assert(!this.sign && !num.sign, 'mont works only with positives');
assert(this.mont && this.mont === num.mont,
'montAdd works only with mont numbers');
var mont = this.mont;
var res = this.add(num);
if (res.cmp(mont.m) >= 0)
res = res.sub(mont.m);
res.mont = mont;
return res;
};
BN.prototype.montSub = function montSub(num, base) {
if (!(num instanceof BN))
num = new BN(num, base).toMont(this.mont);
assert(!this.sign && !num.sign, 'mont works only with positives');
assert(this.mont && this.mont === num.mont,
'montSub works only with mont numbers');
var mont = this.mont;
var res = this.sub(num);
if (res.cmp(0) < 0)
res = res.add(mont.m);
res.mont = mont;
return res;
};
BN.prototype.montShl = function montShl(num) {
assert(!this.sign, 'mont works only with positives');
assert(this.mont, 'montShl works only with mont numbers');
var mont = this.mont;
var res = this.shl(num).mod(mont.m);
res.mont = mont;
return res;
};
BN.prototype.montMul = function montMul(num, base) {
if (!(num instanceof BN))
num = new BN(num, base).toMont(this.mont);
assert(!this.sign && !num.sign, 'mont works only with positives');
assert(this.mont && this.mont === num.mont,
'montMul works only with mont numbers');
var mont = this.mont;
var t = this.mul(num);
var c = t.mul(mont.minv).imask(mont.shift).mul(mont.m);
var u = t.sub(c).ishr(mont.shift);
var res = u;
if (u.cmp(mont.m) >= 0)
res = u.sub(mont.m);
else if (u.cmp(0) < 0)
res = u.add(mont.m);
res.mont = mont;
return res;
};
BN.prototype.montSqr = function montSqr() {
return this.montMul(this);
};
BN.prototype.montInvm = function montInvm() {
assert(!this.sign, 'mont works only with positives');
assert(this.mont, 'montInvm works only with mont numbers');
// (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
var res = this.invm(this.mont.m).mul(this.mont.r2).mod(this.mont.m);
res.mont = this.mont;
return res;
};
// Return negative clone of `this` % `mont modulo`
BN.prototype.montNeg = function montNeg() {
assert(!this.sign, 'mont works only with positives');
assert(this.mont, 'montNeg works only with mont numbers');
var r = this.clone();
r.sign = !this.sign;
r = r.add(this.mont.m);
r.mont = this.mont;
return r;
};
BN.mont = function mont(num, base) {
return new Mont(num, base);
};
function Mont(num, base) {
this.m = new BN(num, base);
this.shift = this.m.bitLength();
if (this.shift % 24 !== 0)
this.shift += 24 - (this.shift % 24);
this.r = new BN(1).ishl(this.shift);
this.r2 = this.r.sqr().mod(this.m);
this.rinv = this.r.invm(this.m);
// TODO(indutny): simplify it
this.minv = this.rinv.mul(this.r).sub(1).div(this.m).neg().mod(this.r);
}

@@ -7,9 +7,10 @@ var assert = require('assert');

this.p = new BN(conf.p, 16);
this.a = new BN(conf.a, 16);
this.b = new BN(conf.b, 16);
this.mont = BN.mont(this.p);
this.a = new BN(conf.a, 16).toMont(this.mont);
this.b = new BN(conf.b, 16).toMont(this.mont);
}
module.exports = Curve;
Curve.prototype.point = function point(x, y) {
return new Point(this, x, y);
Curve.prototype.point = function point(x, y, isMont) {
return new Point(this, x, y, isMont);
};

@@ -21,2 +22,6 @@

Curve.prototype.pointFromJSON = function pointFromJSON(obj) {
return Point.fromJSON(this, obj);
};
Curve.prototype.validate = function validate(point) {

@@ -29,7 +34,58 @@ if (point.inf)

var rhs = x.mul(x).mul(x).add(this.a.mul(x)).add(this.b);
return y.mul(y).sub(rhs).mod(this.p).cmp(0) === 0;
var ax = this.a.montMul(x);
var rhs = x.montSqr().montMul(x).montAdd(ax).montAdd(this.b);
return y.montSqr().montSub(rhs).cmp(0) === 0;
};
function Point(curve, x, y) {
Curve.prototype._nafMul = function _nafMul(p, k) {
var naf = getNAF(k, 2);
var acc = this.point(null, null);
var q = p;
for (var i = 0; i < naf.length; i++, q = q.dbl()) {
var z = naf[i];
if (z === 1)
acc = acc.add(q);
else if (z === -1)
acc = acc.add(q.neg());
else
continue;
}
return acc;
};
Curve.prototype._wnafMul = function _wnafMul(p, k) {
var w = 4;
var naf = getNAF(k, w);
// Precompute window
var wnd = [ p ];
var dbl;
for (var i = 1; i < (1 << (w - 1)); i++) {
if (!dbl)
dbl = p.dbl();
wnd[i] = wnd[i - 1].add(dbl);
}
// Convert everything to J, if needed
if (p instanceof Point)
for (var i = 0; i < wnd.length; i++)
wnd[i] = wnd[i].toJ();
// Add `this`*(N+1) for every w-NAF index
var acc = this.jpoint(null, null, null);
for (var i = naf.length - 1; i >= 0; i--) {
var z = naf[i];
acc = acc.dbl();
if (z === 0)
continue;
if (z > 0)
acc = acc.add(wnd[(z - 1) >> 1]);
else
acc = acc.add(wnd[(-z - 1) >> 1].neg());
}
return p instanceof Point ? acc.toP() : acc;
};
function Point(curve, x, y, isMont) {
this.curve = curve;

@@ -43,2 +99,11 @@ if (x === null && y === null) {

this.y = new BN(y, 16);
// Force montgomery representation when loading from JSON
if (isMont) {
this.x.forceMont(this.curve.mont);
this.y.forceMont(this.curve.mont);
}
if (!this.x.mont)
this.x = this.x.toMont(this.curve.mont);
if (!this.y.mont)
this.y = this.y.toMont(this.curve.mont);
this.inf = false;

@@ -54,6 +119,6 @@ }

Point.prototype.precompute = function precompute(power) {
this.precomputed = [];
var q = this;
for (var i = 0; i < power; i++) {
q = q.dbl();
if (!this.precomputed)
this.precomputed = [];
for (var i = this.precomputed.length; i < power; i++) {
var q = (i === 0 ? this : this.precomputed[i - 1]).dbl();
this.precomputed.push(q);

@@ -68,2 +133,26 @@ }

Point.fromJSON = function fromJSON(curve, obj) {
if (typeof obj === 'string')
obj = JSON.parse(obj);
var res = curve.point(obj[0], obj[1], true);
if (!obj[2])
return res;
res.precomputed = obj[2].map(function(obj) {
return curve.point(obj[0], obj[1], true);
});
return res;
};
Point.prototype.inspect = function inspect() {
if (this.isInfinity())
return '<EC Point Infinity>';
return '<EC Point x: ' + this.x.fromMont().toString(16) +
' y: ' + this.y.fromMont().toString(16) +
' pc: ' + (this.precomputed && this.precomputed.length || 0) + '>';
};
Point.prototype.isInfinity = function isInfinity() {
return this.inf;
};
Point.prototype.add = function add(p) {

@@ -90,6 +179,9 @@ // Mixed addition

var m = this.curve.p;
var c = this.y.sub(p.y).mul(this.x.sub(p.x).invm(m));
var nx = c.sqr().sub(this.x).sub(p.x).mod(m);
var ny = c.mul(this.x.sub(nx)).sub(this.y).mod(m);
// P + Q = O
if (this.x.cmp(p.x) === 0)
return this.curve.point(null, null);
var c = this.y.montSub(p.y).montMul(this.x.montSub(p.x).montInvm());
var nx = c.montSqr().montSub(this.x).montSub(p.x);
var ny = c.montMul(this.x.montSub(nx)).montSub(this.y);
return this.curve.point(nx, ny);

@@ -99,2 +191,4 @@ };

Point.prototype.dbl = function dbl() {
if (this.inf)
return this;
if (this.precomputed && this.precomputed.length) {

@@ -107,25 +201,40 @@ var cached = this.precomputed[0];

}
// 2P = O
var ys1 = this.y.montShl(1);
if (ys1.cmp(0) === 0)
return this.curve.point(null, null);
var a = this.curve.a;
var p = this.curve.p;
var x2 = this.x.sqr();
var dyinv = this.y.shl(1).invm(p);
var c = x2.mul(3).add(a).mul(dyinv);
var x2 = this.x.montSqr();
var dyinv = ys1.montInvm();
var c = x2.montMul(3).montAdd(a).montMul(dyinv);
var nx = c.sqr().sub(this.x.shl(1)).mod(p);
var ny = c.mul(this.x.sub(nx)).sub(this.y).mod(p);
var nx = c.montSqr().montSub(this.x.montShl(1));
var ny = c.montMul(this.x.montSub(nx)).montSub(this.y);
return this.curve.point(nx, ny);
};
Point.prototype.mul = function mul(k, kbase) {
if (!(k instanceof BN))
k = new BN(k, kbase);
Point.prototype.getX = function getX() {
return this.x.fromMont();
};
// Represent k in a NAF form
Point.prototype.getY = function getY() {
return this.y.fromMont();
};
function getNAF(num, w) {
// Represent k in a w-NAF form
var naf = [];
k = k.clone();
while (k.cmp(0) !== 0) {
var ws = 1 << w;
var k = num.clone();
while (k.cmp(1) >= 0) {
var z;
if (k.isOdd()) {
z = 2 - k.andl(3);
var mod = k.andl(ws - 1);
if (mod > (ws >> 1) - 1)
z = (ws >> 1) - mod;
else
z = mod;
k.isub(z);

@@ -136,18 +245,21 @@ } else {

naf.push(z);
k.ishr(1);
// Optimization, shift by word if possible
var shift = (k.cmp(0) !== 0 && k.andl(ws - 1) === 0) ? w : 1;
for (var i = 1; i < shift; i++)
naf.push(0);
k.ishr(shift);
}
// Add powers of two one-by-one
var acc = this.curve.point(null, null);
var q = this;
for (var i = 0; i < naf.length; i++, q = q.dbl()) {
var z = naf[i];
if (z === 1)
acc = acc.add(q);
else if (z === -1)
acc = acc.add(q.neg());
else
continue;
}
return acc;
return naf;
}
Point.prototype.mul = function mul(k, kbase) {
if (!(k instanceof BN))
k = new BN(k, kbase);
if (this.precomputed && this.precomputed.length)
return this.curve._nafMul(this, k);
else
return this.curve._wnafMul(this, k);
};

@@ -162,3 +274,3 @@

Point.prototype.neg = function neg() {
return this.curve.point(this.x, this.y.neg());
return this.curve.point(this.x, this.y.montNeg());
};

@@ -168,5 +280,7 @@

if (this.inf)
return this.curve.jpoint(new BN(1), new BN(1), new BN(0));
return this.curve.jpoint(null, null, null);
return this.curve.jpoint(this.x, this.y, new BN(1));
var res = this.curve.jpoint(this.x, this.y, new BN(1));
res.precomputed = this.precomputed;
return res;
};

@@ -185,13 +299,19 @@

}
if (!this.x.mont)
this.x = this.x.toMont(this.curve.mont);
if (!this.y.mont)
this.y = this.y.toMont(this.curve.mont);
if (!this.z.mont)
this.z = this.z.toMont(this.curve.mont);
this.precomputed = null;
};
JPoint.prototype.toP = function toP() {
if (this.z.cmp(0) === 0)
if (this.isInfinity())
return this.curve.point(null, null);
var p = this.curve.p;
var zinv = this.z.invm(p);
var zinv2 = zinv.sqr();
var ax = this.x.mul(zinv2).mod(p);
var ay = this.y.mul(zinv2).mul(zinv).mod(p);
var zinv = this.z.montInvm();
var zinv2 = zinv.montSqr();
var ax = this.x.montMul(zinv2);
var ay = this.y.montMul(zinv2).montMul(zinv);

@@ -202,3 +322,3 @@ return this.curve.point(ax, ay);

JPoint.prototype.neg = function neg() {
return this.curve.jpoint(this.x, this.y.neg(), this.z);
return this.curve.jpoint(this.x, this.y.montNeg(), this.z);
};

@@ -212,7 +332,7 @@

// O + P = P
if (this.z.cmp(0) === 0)
if (this.isInfinity())
return p;
// P + O = P
if (p.z.cmp(0) === 0)
if (p.isInfinity())
return this;

@@ -223,18 +343,18 @@

var pz2 = p.z.sqr();
var z2 = this.z.sqr();
var pz2 = p.z.montSqr();
var z2 = this.z.montSqr();
var s1 = this.y.mul(pz2.mul(p.z));
var s2 = p.y.mul(z2.mul(this.z));
var u1 = this.x.mul(pz2);
var u2 = p.x.mul(z2);
var r = s1.sub(s2);
var h = u1.sub(u2);
var h2 = h.sqr();
var g = h2.mul(h);
var v = u1.mul(h2);
var s1 = this.y.montMul(pz2.montMul(p.z));
var s2 = p.y.montMul(z2.montMul(this.z));
var u1 = this.x.montMul(pz2);
var u2 = p.x.montMul(z2);
var r = s1.montSub(s2);
var h = u1.montSub(u2);
var h2 = h.montSqr();
var g = h2.montMul(h);
var v = u1.montMul(h2);
var nx = r.sqr().add(g).sub(v.shl(1)).mod(this.curve.p);
var ny = r.mul(v.sub(nx)).sub(s1.mul(g)).mod(this.curve.p);
var nz = this.z.mul(p.z).mul(h).mod(this.curve.p);
var nx = r.montSqr().montAdd(g).montSub(v.montShl(1));
var ny = r.montMul(v.montSub(nx)).montSub(s1.montMul(g));
var nz = this.z.montMul(p.z).montMul(h);

@@ -249,3 +369,12 @@ return this.curve.jpoint(nx, ny, nz);

JPoint.prototype.dbl = function dbl() {
var p = this.curve.p;
if (this.isInfinity())
return this;
if (this.precomputed && this.precomputed.length) {
var cached = this.precomputed[0];
var res = this.curve.point(cached.x, cached.y);
if (this.precomputed.length > 1)
res.precomputed = this.precomputed.slice(1);
return res.toJ();
}
var a = this.curve.a;

@@ -257,14 +386,23 @@

var jx2 = jx.sqr();
var jy2 = jy.sqr();
var jz4 = jz.sqr().sqr();
var c = jx2.mul(3).add(a.mul(jz4));
var jx2 = jx.montSqr();
var jy2 = jy.montSqr();
var jz4 = jz.montSqr().montSqr();
var c = jx2.montMul(3).montAdd(a.montMul(jz4));
var nx = c.sqr().sub(jx.shl(3).mul(jy2));
var ny = c.mul(jx.shl(2).mul(jy2).sub(nx)).sub(jy2.sqr().shl(3));
var nz = jy.shl(1).mul(jz);
var t1 = jx.montShl(2).montMul(jy2);
var nx = c.montSqr().montSub(t1.montShl(1));
var t2 = t1.montSub(nx);
var ny = c.montMul(t2).montSub(jy2.montSqr().montShl(3));
var nz = jy.montShl(1).montMul(jz);
return this.curve.jpoint(nx.mod(p), ny.mod(p), nz.mod(p));
return this.curve.jpoint(nx, ny, nz);
};
JPoint.prototype.mul = function mul(k, kbase) {
if (!(k instanceof BN))
k = new BN(k, kbase);
return this.curve._wnafMul(this, k);
};
JPoint.prototype.eq = function eq(p) {

@@ -283,1 +421,13 @@ if (p instanceof Point)

};
JPoint.prototype.inspect = function inspect() {
if (this.isInfinity())
return '<EC JPoint Infinity>';
return '<EC JPoint x: ' + this.x.toString(16) +
' y: ' + this.y.toString(16) +
' z: ' + this.z.toString(16) + '>';
};
JPoint.prototype.isInfinity = function isInfinity() {
return this.z.cmp(0) === 0;
};

@@ -0,143 +1,1075 @@

var nist = exports;
var assert = require('assert');
var util = require('util');
var elliptic = require('../elliptic');
var BN = elliptic.bn;
// Just a common base for instance of check
function NIST() {
this.p = null;
}
module.exports = NIST;
function NISTCurve(options) {
this.curve = new elliptic.curve(options);
this.g = this.curve.pointFromJSON(options.g);
this.n = new elliptic.bn(options.n, 16);
this.h = new elliptic.bn(options.h, 16);
this.hash = options.hash;
function w2b32(indices, n) {
var src = [];
for (var i = indices.length - 1; i >= 0; i--) {
var index = indices[i];
if (index === -1)
src.push('0', '0');
else
src.push('w[' + index * 2 + ']', 'w[' + (index * 2 + 1) + ']');
}
src = 'return new BN([ ' + src.join(', ') + ' ]);';
var fn = new Function('w', 'BN', src);
fn.name = n;
return fn;
assert(this.g.validate(), 'Invalid NIST curve');
assert(this.g.mul(this.n).isInfinity(), 'Invalid NIST curve, G*N != O');
}
nist.NISTCurve = NISTCurve;
function w2b64(indices, n) {
var src = [];
for (var i = indices.length - 1; i >= 0; i--) {
var index = indices[i];
if (index === -1)
src.push('0', '0', '0', '0');
else
src.push('w[' + index * 4 + ']',
'w[' + (index * 4 + 1) + ']',
'w[' + (index * 4 + 2) + ']',
'w[' + (index * 4 + 3) + ']');
}
src = 'return new BN([ ' + src.join(', ') + ' ]);';
var fn = new Function('w', 'BN', src);
fn.name = n;
return fn;
function defineCurve(name, options) {
Object.defineProperty(nist, name, {
configurable: true,
enumerable: true,
get: function() {
var curve = new NISTCurve(options);
Object.defineProperty(nist, name, {
configurable: true,
enumerable: true,
value: curve
});
return curve;
}
});
}
var p192 = new BN('fffffffffffffffffffffffffffffffeffffffffffffffff', 16);
var p192_2 = p192.mul(p192);
defineCurve('secp256k1', {
p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',
a: '0',
b: '7',
n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',
h: '1',
hash: elliptic.hash.sha256,
var p256 = new BN(
'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',
16);
var p256_2 = p256.mul(p256);
function P192() {
NIST.call(this);
this.p = p192;
this.p2 = p192_2;
}
util.inherits(P192, NIST);
NIST.p192 = P192;
P192.prototype.t = w2b64([ 2, 1, 0 ], 't_192');
P192.prototype.s1 = w2b64([ -1, 3, 3 ], 's1_192');
P192.prototype.s2 = w2b64([ 4, 4, -1 ], 's2_192');
P192.prototype.s3 = w2b64([ 5, 5, 5 ], 's3_192');
P192.prototype.mod = function mod(a) {
a.strip();
assert(a.length <= 24);
// a should be <= p^2
if (a.cmp(this.p2) > 0)
return a.mod(this.p);
var cmp = a.cmp(this.p);
if (cmp === 0)
return new BN(0);
else if (cmp < 0)
return a.clone();
var w = a.words.slice();
for (var i = 0; i < 24; i++)
w[i] |= 0;
var t = this.t(w, BN);
var s1 = this.s1(w, BN);
var s2 = this.s2(w, BN);
var s3 = this.s3(w, BN);
var r = t.add(s1).add(s2).add(s3);
return r.mod(this.p);
};
function P256() {
NIST.call(this);
this.p = p256;
this.p2 = p256_2;
}
util.inherits(P256, NIST);
NIST.p256 = P256;
P256.prototype.t = w2b32([ 7, 6, 5, 4, 3, 2, 1, 0 ], 't_256');
P256.prototype.s1 = w2b32([ 15, 14, 13, 12, 11, -1, -1, -1 ], 's1_256');
P256.prototype.s2 = w2b32([ -1, 15, 14, 13, 12, -1, -1, -1 ], 's2_256');
P256.prototype.s3 = w2b32([ 15, 14, -1, -1, -1, 10, 9, 8 ], 's3_256');
P256.prototype.s4 = w2b32([ 8, 13, 15, 14, 13, 11, 10, 9 ], 's4_256');
P256.prototype.d1 = w2b32([ 10, 8, -1, -1, -1, 13, 12, 11 ], 'd1_256');
P256.prototype.d2 = w2b32([ 11, 9, -1, -1, 15, 14, 13, 12 ], 'd2_256');
P256.prototype.d3 = w2b32([ 12, -1, 10, 9, 8, 15, 14, 13 ], 'd3_256');
P256.prototype.d4 = w2b32([ 13, -1, 11, 10, 9, -1, 15, 14 ], 'd4_256');
P256.prototype.mod = function mod(a) {
a.strip();
assert(a.length <= 32);
// a should be <= p^2
if (a.cmp(this.p2) > 0)
return a.mod(this.p);
var cmp = a.cmp(this.p);
if (cmp === 0)
return new BN(0);
else if (cmp < 0)
return a.clone();
var w = a.words.slice();
for (var i = 0; i < 32; i++)
w[i] |= 0;
var t = this.t(w, BN);
var s1 = this.s1(w, BN);
var s2 = this.s2(w, BN);
var s3 = this.s3(w, BN);
var s4 = this.s4(w, BN);
var d1 = this.d1(w, BN);
var d2 = this.d2(w, BN);
var d3 = this.d3(w, BN);
var d4 = this.d4(w, BN);
var r = t.add(s1.add(s2).shl(1)).add(s3).add(s4)
.sub(d1).sub(d2).sub(d3).sub(d4);
return r.mod(this.p);
};
// Point and precomputed 2^N powers of it in Montgomery representation
// x: '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
// y: '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',
g: [
'81e643e9089f48979f48c033fd129c231e295329bc66dbd7362e5ae17e22dee9',
'3f851fd4a582d670b6b59aac19c1368dfc5d5d1f1dc64db15ea6d3a2dbaef7ff',
[
[
'18623ccba0ee23ce0b62e1e014040471354afc88b285a04e0640ca7a0490e249',
'7f7712157b93134b3a0f64bda2cc6584fd25167dc75ce17d12d6233bacd0a3fc'
],
[
'57e6951ca769b7de9fbe79f9b379e037571e4d3b9b132f3daa13e8c86a0c5c69',
'9a2dbb209e02b9c3e5bac23d6a1839746dd1bf9400d1361372e87ea7f5ec0b0c'
],
[
'88630cfa83a8c376af358ab408c8b7a060c0bfa606728f2316207010b4b8d33',
'b43f997949086075193c47f1ea48b27b292c94ece7dd34ceb03c71ca2c2ef695'
],
[
'f2007d526d9948952ed69488f3f45a78d77162cf43dec541a38519a6e24ab567',
'6b9ec0f2e973c0e6e1d02ce631ad7535538b908855c928b252bfb8db528997e4'
],
[
'd1c0e47be6cf2393e19cc4fe000a29acc8229d708ed2437c2cd2b5e56a3f7518',
'734a1a4359aeab408bc0f94e530eb07674374a341f8cab7d04a2a0123f3abf4d'
],
[
'8bbcf71f86167c317b23fa350f79dcad6f0e400a1a959cd8c0c00c51c5e3a9e4',
'5413fb651654589117a04bde169768dba32df911f6a91f8a4e4fb78f8d62864c'
],
[
'530b36ceacef824de65a27831fe18424baa6dda27cf329eda00fa6313b00c355',
'92c43520968b2f8cdaad292cd58757a15e982da1c18ac5bee2fc9ab0b46d91de'
],
[
'79cef38ff606e4c31c9d2f4edff79f1835086b7c2024c94cfcb4bdc410757935',
'512c3a42dfcd74e023b6f049955153627c2be007e10df3b48c82cee71b19f40b'
],
[
'18b94b4713f604867081c61d838e774aad02f81775f1000bfe04a93854817fac',
'1b6e9b27763e717fe3818474c34d950be67ab5ef0dd49ee154230edd749947a3'
],
[
'f5a0f4033b7e89cb9f68786a0679a18668fe168ddbbeaadb47b9e1bb2a40dc0',
'530cc3e4dc133b6190f9094db5f974f227ec0293549ddc215ebe7d2ce18a5f5'
],
[
'c2f19024b2b7b7a908234a2b3f43716d395846aaadd62f7de2cebe0798367478',
'dc4b14168e68f122a165029cbf6ea0e11536a3d7adab7e52b72395319a03c5c2'
],
[
'9c0bde99755bf7919bd70b4a6e9f8aa001a156834431ed116c76885bc21a63a0',
'307be489bce3f59658dc8daad44dabfe233422662644c34714b6ca8f90f66554'
],
[
'5df455e6f0c5c9663940c4be7b2361c03325d7b4b720bd80ffeb1a76f0adc933',
'72f60db0067652861e5afbf991aaed980cd80bf0a4cc8a6ca7dfd97e3f151b21'
],
[
'624ceaeda196b06c39f5e0f89a609f28d321824861c6c0749f73b1682ac9958d',
'2e7ce8d09ae8893ab968eb37aae611324cd765629f2067875485b0a3a47fb12c'
],
[
'd4c6a641ee668cc8e8a1edb3e5216e993ff46b1930d6a46b260bbfa6757d7a00',
'8f9f7804862d3efe18ecda874d8d5468b15374a4b5047f273938fafe808a0950'
],
[
'a5c6c230aecdacb3e4b0ac7afd029c1c45ee21fc87d728472e39690a33ea65c8',
'ae9d2208a0867e1f22f9382ceb7a9b21a5ec7a4bc742b043b7f34ffde4685ba0'
],
[
'eb1f6c1fd6a297097ddc650598761ba39fa521b63549ad1d910ba6e677c26002',
'95e1cf76e99c7a4d8e8d733ff90728c6b0f39b86090af18a2ea43e6ef8bafd02'
],
[
'e3321a2331559245eef966d467dd29b2573c15b709812c4198dc506ad556ab4d',
'd3daf8a9add060a647d9ca97e169539615d43ea05e9a8257f5392f107d25fcab'
],
[
'c561e9c579b1bdb3f1ca5e1840794d46e632ebddc4127d95cdc2c706a850bacc',
'4227aa0ec7c8ff13a5eeac1b63f97770d106284f4631f6ca6f7ed12d7f4d7757'
],
[
'99a71b1bac7deb7a4d9d08b3b5828cbcff12d439515ff5d53d5d056aed76f778',
'37dbe3c16011241ed24e35f6d343520d85465e5e7f89ab6137eef321436deb17'
],
[
'6116f0fede8ed970c880eaa01dd4b01fdccac2a7c4e3d6d063ff057809fb351d',
'bf0f02c1dad6a634e1c988a732a8bf4c40f2a9a609996d4f9b552d83aca15a53'
],
[
'98e204dd2d59c14bd3094f73b0e729231930a8b707ee22d0c2419fd28616bd75',
'ae09c8c8340d9057c84a68fe361ea7d5d9825428f01f753fc65a245c72d5abef'
],
[
'84c6248b822a9a37122fcda4748fbd1cc32b8e0f98986b078f84b15102b097f2',
'e3dfab25acf4eb9f1b455c8ea94210768b4d38574501694477516032bb3142b1'
],
[
'9ff060a70bfc59172e66b4dffb9e311108822731948505f1f30e548d61d2c70f',
'508fb2b42b5e11ffbd8d2b1faa21c5ae3d6b90b7bcb26d4e514b1ede7f9a9f26'
],
[
'19cbb4be645868b6209e17ed7811954e2372d71c023806dac9fee0a5fdb5156d',
'aa7d33db261a6cd08bdaa15fe866661f15380220f5184ed00d02b2c367eea0a0'
],
[
'360a8ac855f8ec6c14a14278e145c62c48e9c9271f3aa8807c4992d51085f361',
'c6b8dadc0b1203103d39c73b8a239a3e4db0f1fe99621f5aca2af7ecc3522051'
],
[
'ced3f21f2c9af358ddd8297a2176cc422d0c1be5c66fadac9e378fbad4d06e29',
'92efdae73a0fdc604ac7f2998a199ce2b707f1c785fadf6a271698d37fafa172'
],
[
'22cee0955924a75ae11d44a2d18bfaa1dcd50a06ad9e0af4f0250e34b6e5be4d',
'e1ad45e9f40c0138aa2a3125fdaf3fca473ec3798d3edc7336db5f0e23308ea1'
],
[
'a31d0483ee9338b3636741b29a523f119280b9c05e6183ae863d1b09b2ded0bb',
'c0d59743bc15edb69c6b48740fdc53d3266e189203414ca782e9db7dc6a8a71e'
],
[
'91ddae7912926ac023d28604cc2dade6b946d4af1ba09ab097726a6b37693d99',
'72ab52a6474b56ff8ef73cb4f4f9e3f810acca720ddc70564db45f15f90e29ae'
],
[
'ba5efd9a10d36100e771b626da4ac215c3ebada129b871b4028f92e27b041e04',
'1325161d621df1a9030fc62e29b81b2cd7fec6334b9d0e93982e7a894b5bf1b5'
],
[
'b436f386109b4e9ef9133702cd5d56af4095525fe1d2dd9f30222bfa476c2223',
'2479a7c394b50998f120c4a670b81d349b5f127619927f0b4f8ebadb8dc0bf5f'
],
[
'1d3f188bff86c24cc3fc6e16e0251dbaa506d8bb30cff5f9065b1856fb2d2f6f',
'f17da77f0001710aa7081db3b87f92c63f14011a233126d33d0392198b07c102'
],
[
'3672681533aaa6aa34cc99e731d4c353842d74695921e6c7829ea525f20fe15b',
'f6563844506fc9651aed2de269adbea8dcb67db62f9483c620d21a37570b03ed'
],
[
'17e81a4530aacd51f71ff256f595a04f80e557b4613386257cbb5b08920cecde',
'af6ee9bca94409791e48de6b1e9af8abd27708d3065a364750d6df6f8a384756'
],
[
'a558161ac906f6f6a154cc23a0a78aa2bdd58a729aed26c3f3edf59b2471004f',
'24a09c39ec4c70799f90a5a917fb59609b54e610b5662f43a53c195b8626f1d3'
],
[
'7a7bd0b087b69ccfd8ae5fe0adbbe890d6557dfaf02439c27978609419197db3',
'f419a334d84e59c1b14459e07b67ae608be925a7ee104702c7ad93d74da3c48f'
],
[
'19286cd8c4e5a5c05647c3d28aaff052f846d64c46858ad65476fdae61e1e356',
'22abba66be4dc0c8a026c48b282577ada62460ae4880845a07a7082ce4c6cc9f'
],
[
'cee032905523d53cf9d9868a8e0a61f41e2341c2ea9b825410fd7e184f91fa08',
'12d02d59044ba53e47846c9acbd7c3c8f503a954b36dc899e18cbfcd500f3ecd'
],
[
'7e206f5f040b8b24942a08955bbf75753e44ad81a39a40b4cbe1f9c61d9eed93',
'b2db2a4267c78e1436c2e876ca47b851296c3fb66b0f39463c8a16f13e0ee917'
],
[
'6f94a4503f65132f9b0b1ebcd49f67cb5e512eb0d786ad768a66de2590c7178',
'db3f73bd703bc2dfc7db252b5d1585b57ec65d9f86dc68054b980511dbdec9e5'
],
[
'f113c2e1db2c4153ccf567db487d1a4289b0a50d5137d97ab495bc4a29574e59',
'b7f694c0f893f4137b2a603dbac5ba5a1d2e66fa691934b690faa5ebd1e87afd'
],
[
'8f6db65f6034364c8277be19c46f7f9d4309f36eca3cf15c205af91f412402fe',
'9cff57869396af83eb828b2aee808e322f8a8b8eaf049d852871f059402b9a37'
],
[
'a106b32602649495ed09e9952038466885d7d5b186da90fbb078b0b2f3a663f6',
'bd8145ee9146fa2490613ccfa9b0c41056d98b63c51375197f54badbbfd6946'
],
[
'8b1bdb750e7dac18fe61276df7a88c1b96f6d669473bdf91018dec6c7fa8bb15',
'c554ac610987cfe29b0dbc4b1a54fe55ed7c610dbc3ff87fb0ce1c0c1a3298b9'
],
[
'c1b8e06b323296e75bc57f39433bd4b5738e4c08453c118ab509c21c53159735',
'f397f3f3697af9e8a4304ae166ace1e59d1de93c447acf5fe6c386d23bb3efa8'
],
[
'2735ee32f4295ff2531ea132b77e29cc7f5c07e0fbd94329a703ad2f987aa001',
'76ac3d75e0e134381526cbcbd8796df720f228ecbc8ab4dc2a83581ee527823c'
],
[
'f354d265a85a7d3bd453bf4619fa9d88b68810434ea2e8b6be30d7ec690ccb34',
'46640ced889ed1ccadedeaa81c00a8ae770d165317107e91c6edb84854c843c6'
],
[
'b769ac6317768717895b4053ae34399e51a80bd00a39ab4fe0a88c5935fc27f5',
'4d7901ddc8491b5e37ee83a65e949af3cdff35e863840b24d814a48419f8ed4'
],
[
'69b5afa18ce64f544c3e23ae1eb36190ad3d8a0a9b4a8751950cbb52c470ddb2',
'542c046baf45dc63f33d45f1a3d771ce3beee93d717c65584bed45539ac27cc9'
],
[
'33931af490e761f04aa20bf0d108646dd0e3f756cd6c6b30d315523c27197be',
'36a029abea7bcae3d0578336fc35b23e9249eaf1407a4133ef88a2ab161a052'
],
[
'd30dc90a3c3c7ffc2b420f22c654ebb73df5ee9b99db729ff47ea6f3491459e9',
'6af64fc944a199ec5a5d57cc17b85488840754a82c9b1edc38d58bf560cc5ed6'
],
[
'df46c894c45f3001591591b6aeff8049f1efed5253ccec6f4ef69968ff6d4ce8',
'ba8d9ac64b362479a8615e29be22f6096f8e5eb11e3ae47bfafb21c19148b9d7'
],
[
'3526281ec3e3d8e237f9af86274217af089305f874c06d7409cae0168d8529a3',
'327c5fa48ff343fa21fdc1cabe1ab254bf72f7e36af1665e1d7ec61cfd7a2ba9'
],
[
'9a00270c215642e02d49fad3feb4c4b2d11755973362e25c92d1967a29244e8d',
'525b9be537c812ebc4ede69daa90023090e7cdb8e81d80d06976a311ccfe3b63'
],
[
'15457989fb31e86b766e52094a50e14595b420413a74f6f459f7b4dc25a96324',
'98eaa14c9519a8080c953d28afd08c33e40fb4e2f5450f45e46b804680e16e85'
],
[
'735f36e783aa3dc6acf7b90e35bf5b1d6219dbcade03d02479b1ed5e9e9aaef',
'6fd6412ea0ecf13ba028b995846d7a5d3dc1be5897d9aa393fc3995dbaa9c118'
],
[
'5909eb601f9913897633b13c66d4406d8b643c27da179a519bf552a42ef563f',
'5e37dbb00980d76845bb2299fc2341d33124163ed0a6ea2c6a65372bc3fc082e'
],
[
'9d2919cc47f615c8385ff71007fe8cc6a9cff570e0b4866dd33d8642faa81054',
'6ccf8f65643257f0ac589583e96d6f52baf59e82d6827f9c32c8efa7a797c9aa'
],
[
'74d8d85ec25f80ef334ff50d656e1ee7688f8881beda938b651ce6328cfd3713',
'a61f17823f531088deb51df6e90c26af5831c18d4dab3c9e13eae400c03a1c37'
],
[
'210cb3f6efb30ca8b52594b17c9baefab69b8d1d01759d6db7491f69e3ec4f16',
'e006bf8999648fe7642e69c7f87caa5ee71cdb2df60ba8c5545b12739502a894'
],
[
'8acecbbddaa65f8c3ea2e0055dbf4164a5d28a4ac99446866ea46e4cf21a5d53',
'6d543ce387405282e6ac2da26eadf6626bb951bc3f0465f1802eee82632cf91c'
],
[
'3a69558ae0bb1d2439a6d5c8ddb9cf350bc0e9d69311685752669df4c4fa3ed6',
'71178186192cb2dd94fc99243a2f9f96658df6eb98b4eecbe2cbc42fd3e8091f'
],
[
'276680ccc851a39cdd9c462ef8a9cf3fe27c6a195edbf5b6b50eda732e98730c',
'1a49b77f23719cdced315c48b8fa3e614800006b0ba84cc8e079a5000aa11c61'
],
[
'4ee6847710d86defd5d6f24cc5d6e0ad363af24d4b0c6f9c2dc74b052ccaab2f',
'bccfdc730e783a7ee58462dd69d7983d90a19d760b044fac77740c0a836cb0e5'
],
[
'4542a637260eae19642255cbc346592072d143f676d4e407723822fffc160449',
'f471e116ea53bf88ae06b995c119183127e5f14c89f1e778312ef6100a4c881e'
],
[
'd4037b60c19a0ecc3adc4f0caa7d42d2dfe2626d02cbaaa8ad365615cbc05c67',
'b52933cd943161bccfa0820e1184f336af5ad4db28bfdaf348a376950f5e56d1'
],
[
'a18196426f1eaec3cdb311d3b2a63e1361f201978659cd8906b35984caefaf0c',
'750ed2b0d1d8f288285a2c7a68e76541341af13c7eced29fc1bb42cdf66a93ca'
],
[
'3337d6265e61a30e5951245e4be7791885861059bbcc7c70082bfeeeb19f8d1c',
'2debe0b554e5b3fc84e2840ac9ca064f5363e112257611991c276b3dbc7323d2'
],
[
'ac699d5c131aa213c3796cc6066192bdd078523400758e60c5ef28fec46f6036',
'498df131a1d3d30929ab49a82244a3dbd7486c1b30f5e09eb3fa4b925d050586'
],
[
'3f63051a8cd005de65db0ab3204b5d42d4373e7366aabf4886cbe661198ecfbb',
'8eef27aa50fe8973a4816f3785c5192265e993b4a71f08dd738b5a006af8dd19'
],
[
'bc62745779456e067cc69da5b14d827c2c8213c6272451d6903021d38bd13059',
'f8657ee1acc93507dbe881f77b27f5f0272347ca2bc9d3491003d037e5c15a57'
],
[
'7d2ab7a53f5c0f621709d51e0e6b599459b268a8f8a441d48ee6e7a5cc299e56',
'1d3e43d3817bdfef0469d2a9e82a379371372eb94143830c5185aa0dae661f9'
],
[
'50f46037867b0cf892307f20caebff6289d15365b855b06359301499f4b7dc3',
'eaa17e87266395896bc119ccc8c6db9f5a7cff0c764963cd9f8831f601026a5a'
],
[
'ff59f0a9009a45c1a421b7ee6678eaaefcbd5dc8f779734a74e34ffd59e7ecb',
'424c986e792bb2a261f6f3284db8dfa18f977731f0fcc3d34b5f918e80351e42'
],
[
'8c157dd0a5374187eb0a1d7c124c106080c2cb1b65007269d56560b4747a0009',
'e48336bf5a070b6480c758a8d2c2524ff17b1579ac26918236452dc6d5e857e9'
],
[
'4624803b6a34d1228dad14acc8df2bfbd125de0953c76a0122b6fac7718f4269',
'441fd9ff0ec046a3890cf028c9e6d3a9d7f08bb2ace072101d67011bdadbe385'
],
[
'e71551a8d50c7638f79232c9225e84613b633ccffebd31f441a4d65ee99c8427',
'2440eae5b044efe90b60842a79f78c0c05d4d6e874dfff4eaaa477a9b6df8abc'
],
[
'43bd659b1b8d24690b57339915c0c57e6ea0c173075ec50d8d301588548d7adb',
'b819879b6aa0a78a449724da747467f4b15edb0c43866c0f314caaf88c3ad5ad'
],
[
'153f53004fca400dc602351925e578a95ccd098a8b68debe0b2579aa0233ce52',
'13b77bfbf58688fcfc4ef6f075a443a5327909a0246beeb025456c2266622db0'
],
[
'116505d1db396f3270f90a66c91c053944f9e5f65ccbab0cee895867b48486b4',
'8d24c5a774015fd41b157b1e52b2cd35b467d8a3b158f9b862a96e150c17bfd3'
],
[
'61fad6321904c5c4aaf9dc9c96d5d35fa794be31e71c1affe0dfed9480606dad',
'c0e2f1b7e78a0f9010f1829c1da5507e1fd96e570ba1d3219a6524f2a93b9b7d'
],
[
'1ae127ac2f427bc735fc201b8c060c29c45d0695d9900d654b904b44a2f888cc',
'9f646a59ea850c7b37a5ef62585591e67e9e310eb1664fc8ef4afb61135d4db4'
],
[
'2abd039449df4613486a950061cf3ad655b14e47fefa01fb5b141a94c39dbf50',
'7e2382eb6d9157cb745d746cd72bf921f47a9b2794ab12c7b8ea6f7aafdc15de'
],
[
'ba1305ef6c3c44c89c449c188d13e7fc612134a33914a9d073880e61f698c4a0',
'3d0f2edb54982820de0c62e1f50810870828aae44e4ed32aad7b742a2100d44c'
],
[
'15a660e05e7cfc9b50ee21d60ef87040accf21880aaabd3669804b61661ba505',
'de8964f3dbb6ffdf340f723f2dff04fa4a50cf38f949aca8a0f6341afc247604'
],
[
'950690d755a273562447d2348874557294b18121ff10302204dc4a0a72b635dd',
'834781f22f4e263c546f47ac40622e793b9c068739e6b35ae7245c9412332a12'
],
[
'a51ef6a4e00e0fd0aa44b2d1d46db1ca523f5334696a94c75fed662277b64a74',
'75caa651aee201df72f6017cfbea50b2677993d9612c492d9a298b39dd2682b8'
],
[
'b51b91e9f040246393a17f86c0b714652c421b3cfe5b5b373614fc25315dab56',
'e657c40475a25ffbac8e5d738e1e9f8bd01fbc257b708f7983229b81fa425677'
],
[
'3c7a7e72534cb1fd0bfceffc35a5c073d108a66ff59370d8c2b174ccaf8c35ef',
'70b14681f666da5e0ab41c85b373fdadf4bb553c07f69087848d099e4c9ed90d'
],
[
'41317b21d17bcb4f27eac0017cbd0df9224c4eca47906fc2fdd8ed8807843455',
'a134d357d24e9beda22a3ea8a0aacd22428dedddf12ac24917023b60d2836806'
],
[
'c62c6dcd9be21d8e1ed8f091e24d0825d126e5221d753f52e23a0ad2eeba39a2',
'a62b0d64c72a93c9aa988de1b7e65caf2fa26481a6c714bca978028532ad58f0'
],
[
'80efd26b0950f16375c396202f3505eb6d71757fa67e5f78945ac004286bb735',
'6c63a02c32843dea5a49bcc740544487919d890b14828f6b00f83cf39e478bd1'
],
[
'6d94219df22d27300bb0767ed8dac6f86063c3c4e1ac66572866933e2212de01',
'1a364a3b41de910052ca94258bdee7eb8fc052a44243a9f057605d82931e20a4'
],
[
'18fab47f841d759b6f29e51c9807134a8b3c0600eadbeb08288cb03d0e81e10c',
'7903dd0d803ccd5793df5594ff5b39c1b37d3acdcdb20e2a00bcac2d1397258e'
],
[
'f924bef72c1af90dd2b85686ed4060d9fc7c9e500a563f0f65f52b7512a43aba',
'b04144323a9634b54ab5de579f69b4e2efbf13a963708b3fdab095d96b212b0d'
],
[
'118dff45dc51631e65799b83cda41ed5770b8da078c1840a3018b0266f2d7853',
'756e323d6f219d2472de2cf9f0b18f3b38f0a86665941e18d705e96b4672613'
],
[
'36569d637303680a3b75b370092b54da8fd3b8227c64b6eceaf1b7a7325c4e2d',
'414e463067353fadd1bc16975e576e2138ce37bfc61362f9985c2daa101520f7'
],
[
'bdb56f09f55c62c5844342f04427121b48c768c393de8f91ee3f969218bba68b',
'b5475d1f338db2e434d5f8fd2accced28455a84c3833afacd5821fc74efff1c7'
],
[
'362c3dafdf8bbad527a2c607bdef0de340c4ae29207af95e0570b71b62387bab',
'40c279d15a2323ba7a6b7334124a7d147ce7591a2956b17b4fc2a9f95f0cd2fc'
],
[
'39c20628722591d59b1b55c689dc7390642c13a80c38d03f2f49143ad40ea37e',
'14b4d76462c2e0132eb88f8aa0f8d41c107c2720d89f983044180feab5cb5185'
],
[
'96df4f311cee67d1b0fcfeabd465cc28b9929d3e223774dd15e68a88daf56fb3',
'51e8b48edf3a998fe2c6bce68a4d528a90bd15b33b5d1fecb3aff415325d646c'
],
[
'fd477a7c975ea7712d06cc258387e7cdbe7bae9c37e6d86368c53bee1abbd834',
'454f467baa67e378677aec9096a77ef75a9d1b5a77b165ee2e034c44d2c89647'
],
[
'5c194b050a14d175512520360fd3217a5774f4ddc19852f1b75df7c7302470c3',
'3e63848ace3fd80d232cdcc9ecc58b56af0fd3fb80ae6e2c3ec10f33e00c6931'
],
[
'6d31426bfc58ea83ac877e0a93983d9f3d8f0837e532ea9446ad0acd850cb85e',
'37dc1eed053decc7cc8678449327e37f9f78281fdb0cee8ce87afcb24096d2c0'
],
[
'dcf48dc2535365626ccdb80144de37572b70b9b594c351648a1ff59e55702a4f',
'3afd8d641e93adfac3bee45d6a2534ebbd6857df5f36b027b7119a55e38cd29c'
],
[
'78d0dced390630729dcc0533db00fcf9729be33ce8a2f95397bda4cb8ebd3d3b',
'a35ce16cbe8a02af4a7dbfcf0291109c502dd58b4d49cba136eef006f216befa'
],
[
'd2e00c625802147f341b264eb89fa710ca4982bf923c8cfa7a7ca521e08649fa',
'352204d3ee3dcb4ba505d1846d4e4a9cadff5b3572b257f4431edc31dc810bec'
],
[
'9b647a128bb31fa85ecbe331cb7aa0090dbd12148e1882aabac3a07ae8139760',
'6544e2bf83cfa93656bcbc355a48896464115f1b018227bac0683a6730df89d1'
],
[
'81d57eb38a33df2bb1c7d369f1d26f8abcdb14639542c266f8ab1fa8b34a028f',
'bea15264764e0f1eee24aa827c7e3f04fb8aa50495e23a09ac2fe4333b81069a'
],
[
'3fb894bd1ad7852a0d7f9268dec2a0827e9dc538f58e69dc0933f4e51543b2b6',
'8393292baaaa7aa9ac1d6954e935812da1b2527bc9a0dc98514af5e728a86548'
],
[
'c4552e6f73484c6cdbef514a82737d920f9627c2aa04daf18e7aee27f43de8e4',
'9f23dbb5487724fe97658c8195822dd3dc3b6a879a4556d5746e8133d7106ba2'
],
[
'c07d6dea31b3d7ec506ec3a7ae15b32503f6ab850d3b04930cc9f7fbcd94d9ab',
'b14c768d876920e3124491719b38fa422e43faf88fc0517a3b5c09f653824c2e'
],
[
'3e53eec43c20e1c5d05f86c7a61f9476f3b8206a0a77d1a6e7de7cdff411f420',
'4890e1fe4b90f2e16f372a0ecfc4e5b9df4a57cd1e0306a0cfb1f9a53125b49a'
],
[
'bd30de5442d455effafc6704b7b23c046988d7a90cc9ca087707929c3cca1140',
'14737fd5c7b97e173942e9b86eaa821d1d9d41d94ffa00fb45dd2574fa8212e'
],
[
'dc0a927a85dcf2664a3cc47bee2c10d45385b45d569f45f39b64b9bfddfd3b68',
'8024a20f793d282e68030445354223bdbfd7c69b383fd9c52cb3b8cd9f308772'
],
[
'da1975f844faa69d28072a5b5e3864d89b5c9779d9852fb3b41b062c3c9307e2',
'49b5a476a28a3c886b0cf6f97fb64f1f657cd648a7736be79c48901c8fdeef21'
],
[
'73c3a21f0a91f95b031f2263dcb46044616839210d92c6db79ed3742e7170589',
'34558c6cef3a4285b1245085cb608f90e8b6d77415e7bae3a171c36bd1060cdc'
],
[
'246f5ddf7ad0f0436511603c42d1f747d37598cd530741ba072db1c1fb7e7336',
'afce4d991f4753d1c9cb04dbe872570d85d7a7349deadc8fb015ace0e484a0af'
],
[
'31020432c3b8e36746a7a8e9970a54195e96ff22de8830b37b0a33708de35b78',
'8e9c907f98d51e0992234575856adb552d969932e19cb58f88c4e5f6d78d701d'
],
[
'973c74f446dc7d79966be0e00351641b3f2bfae66c00b0f71b570e1bd2de1974',
'93648b48be0622b2ec85c56c64c70fbf2b50ccfa3d438ff5d6eb2604f54cf363'
],
[
'ac5b4fecdc8566d126568de0d8bab5db1c89891f133225ddd3edb56b7682edc5',
'ff90a1023ccb2a2fbb05c2aafa221f36c915e9f10be28c722ff7a0f73d90afe8'
],
[
'824a1596060347b0d510790ef0a6d5a6d3f368897f9d2f5eb45bc71e99abb731',
'a6ec7c35cd57c7c5655c7887c9b89c18f0d11430c72081ca274dc40eaafb103a'
],
[
'11fb6752b875272b2dce3d4600aeaea47f4d3c459344fc3fec6c68e620547eb0',
'c5eaf4400262a9ea091adecf457bd23a4d78bdb04b4e6e32935ec3c48a2b5c91'
],
[
'de8d9b6c5a26e09aec5c76435c04946a81357ffb60b0c42c441420a8bd80fd51',
'e69edf17fee1a0ce0a4697d0d19c370a064d0834a8f7724ee94721d799502dc7'
],
[
'8c5ffa9f2a826ac3c9a473cebddda5b2f45187d58ded63607d9ff52297e77025',
'9cb27b8b785dd210522cf960f2a870b77ff183fd9cdcdfb013c633b5926dd0ac'
],
[
'e682411d98c1b4efff0cb78744e2ba1a071d2c7836b6afb61c560c6d3e7d05a4',
'1b1e05608c2ed2187e10633be9fc7949ab8da44fbea5d6cd6960ebaf5b2266aa'
],
[
'e88d514ad0157ea68b3db0772fff7df1d4a4e11c8821fb0f9d275d7f9956d384',
'afb709cfdf1c7865939879278783b8be06c395cc8b83a330215fb654cd6caf42'
],
[
'8356b1204b9083db3cfdd8c65e8e9184ccee5ef569f77659e0e25f0d786d5dce',
'a2e3458cdf60c755cb76cd08e848ae85dffa611efe1b23542586a5dd352942c0'
],
[
'b88f81fb64fd083886e71d3ca0375246d343384878a57e4ded7eeabcfa7eced9',
'fc41aa5278f731fac7723385f9b49c59b5489f92395b9863b59d58ca1d00811a'
],
[
'345d52e3eca58340cdb35ef22ca374c32ead3445b80826bca63e9ac4b7230f63',
'8c3243806a8abf6f368183e1f8a6fba53937d5f9e6d29eb7ac89548bc9a6c52d'
],
[
'd0766c53d7671d6137bbb39f63213568a707c066e269768143df734d33b624cd',
'3d029377ae910254b05a758124e895f03b9577d36dda615911dd90e4e41e8cea'
],
[
'a0ead591977b661e7986cf67ece5e9a0c99e14ef252dad7ebb859b8e375077ed',
'2bb0c1afc17f8c726afe793200c5f4872a712d54749258a649c7441732725c6e'
],
[
'9e6eacc37256b6c712c46bbf4a949c3f726d9dda99164a9cd93b508cc1095bf5',
'8f05f38cf8ef331b89ff18afef02874651e3ee1273185515cd9bb1eb0f64f122'
],
[
'1ce36d6a25d515e72a038a3f2e6273dae4fcc28fae1141e94fe042cda02ebdba',
'53ff736f92d75c124656ac53b5a95f2211bd25172d5018153e8a2c5073b5e48'
],
[
'a85d1c081136bbbc213bc1037ab96c90ef4f98de1836bd627d47f1582f3e0be8',
'3dc0847e118e33789a1ba17b11b196a141225e9cc314d0118d94074341707e61'
],
[
'7ecdd912adfa1c5675e4b46c376e65978e8dffa6b4a84a72b4f82209c9961f0a',
'efea6ea4391e190486116b65982e035cf2d9d8ffc2525d2716fbfab25c666d81'
],
[
'21c86c3065d125a70613f2509587d0c8ff597fd42abaa6182edd86cb8fb82c1',
'9f5c66085c5509eb80c17347a2a271c223cd9bb1534643c2f6f6f225400e5d51'
],
[
'70a9d5d14d921d41b004a9df51c763486a41c6685428b5e38901804709f61978',
'63bc331d479e449d1b51dd70307904dc946697782140cdca0b73a4846971e48a'
],
[
'b61ebf9617507c880e9c1b88971bdf6d7848f8de2aef07196be23d0a975feda0',
'4b3db705b737b478bc5008a94fbc748e3eb39e27efe5db7881e1cccf58d1f63a'
],
[
'12d8b71c4951b8ecb43151c36ab664dcacde01f28742c97c5160a6a395b60e3f',
'75a733bfeb842e9e7f32d75e9d0611c1fca494e511db0c074e467b4df69962b1'
],
[
'945b97f86636edde2d71b08c1a63a2647e3c94424de0f4311570c2df730c720f',
'c9515440be2c16d9ee0e78153e74ab92f831226b52aae30baf127ba0e400f22d'
],
[
'd5088e821939e4979ec870a2f9ed58595ab16187f2da644edab1721ea9be0466',
'99fe2a1bf492b4fa9feacae37c7a09d3ee8fa2597b7d0e3ef8e78403e2774c1c'
],
[
'16659aab2dcd2c60f8e2afd51c0a1dc83d3ba418b8af1c2ea0d0e0fb01a5b8f3',
'34b7856a966271d9b384153f6b097efaa00a431ebaf2b4b17fe8de754916e548'
],
[
'533bb6fedc75e44ce06b7e2b0f5e325f679c3e13ec96e50e56c67b9d2f4e332a',
'2b336b851c1a2b1915c83409f7c1a0f4929faf3a6ddb00a0dd19b0fa80e017f7'
],
[
'3f13c4a1fe47318f50d741659aec4acbbf4f19cdbd9fe41b28f46d07196c249a',
'6a01d887d25258506bcd04be1922cab6b1f23a30bfbbc28b08f67e1348ebc927'
],
[
'23018b4758345195e83fd319b979a4df68b68a54824cab5e18deca987b5fe40e',
'b1d023c31d99f5eb3f361051c6410fda343eaaea7dd7f36d542cceebb1adbab7'
],
[
'a134214dec62b89a2a033020458bc9d38c0a2e76af5d639e286678df5dd90e4e',
'b950a4f5129f9062645cb5251f1165fa8ab7e4293f553ee3a3384a584ec29e14'
],
[
'fad5a529c0a50e2cd2e3facdb1d3cc64012727d6f02f6550f96b2a3efaaca34d',
'1f80ae6900c97a77e7be862cdd9e5c5b4af6d8e85b9cef39985ce1a9aaf27e07'
],
[
'bd4db75ae21e0ce8b03a5067a8efcd03eacc2d41dbe39ff3282b6bc87410202f',
'1e81db39e2058d2c0fab457b5ee4a90f18661e6cb67a4754cf603dafd0d8cc5b'
],
[
'4aa12bcdd212fcbb9e99f2e3dd2388767f663bbd4408d93a5c3e5c5840256267',
'cfd45e4a0c9ae03ecbcddfa88781523438d0006ab750b00fa6c247a8a3e81267'
],
[
'50ddfb89e17f8eca1f8047f86680a630916eab297072106fc1808052fe6a27c6',
'2f82f45c3dc6bad5fbc8dd1844b7eb660582f137aecea124d3b7f8dff54fe3a8'
],
[
'4b60ec1388c7bf55e3665c327b5f6cd9e995a72017c755aeb3ade5c3815933b4',
'13189759d03f59c82145145f33d488c400e8ef4d345685121ecdcb1a44ea57ea'
],
[
'c57893b9eeda56853bbeb02f0629267c8a5680c87a9bb4501fc8ebd8bdad4b23',
'877a3a1bbb6a212536745e215d6d0c59048816f5cc222c68cd4a7f80ca2008f5'
],
[
'92c017d7b631314393cae367cb8c57a71c274738cde737adf5f9e72c84927a4d',
'523175538403ee6d0c15bc9faccd59b583899cf50a93baa0a5af5ef12301f0d6'
],
[
'f88e1ae81d1dcc1b763c15b08f5466e3230237d731c69c4ea10ddae6686023df',
'f8686c0bca447d73341f148080c797b4874044fd0a4b0880727f9bab9ee43eb6'
],
[
'a4bf0951291a4393d66405cdc3bfd96ec12670897c7c4cc120e21c7124b186e1',
'638c025dbc7df2086e8f4381a53ce3e8fb0d9b0b8e9b95e03be947f2d3f92101'
],
[
'e2b02ad88eddbbb66f9bbbb1032834f599454e879bafd446b86f3e7d33409745',
'1eabd8e2be33f08810257b76486e82717980e5c6833313ae5260e6a977646574'
],
[
'c4e3514fb0ff8636039ed5e9be26525d02cd7db0d1bce9acd537a2177a0b2637',
'aff2f4ef1d851d46766072b55e569a3458a46204f13df99a081ba8ba751b5b83'
],
[
'3233b474f901c9c1545deb2349683007fdf0458db72e5bc75f9df69a89f50180',
'b396b1eb78bea3f7f04c199421e72f39bc7f2b6b2116a1b2f97be8798456dc56'
],
[
'65ad5853e08dcfff6e7a8cf18ee2ba305bb293ddc1d56cb503d27c1ba2545ae5',
'701299d0b136da48893aaace8ac62f65ba01fa6c260230865c7f6b593b57920f'
],
[
'917cac1f4c264da009aa6f5e22e2bef3dd5292b8fab9931f6ffbf5513350df18',
'7f6278c1b1805ae471e05925d35b50a9894e9c5df57243fe34e30430bceb9aa3'
],
[
'67bf939d3f6d97ff605874da6dec1b7d476867fd36f051af9463c33510d85aa7',
'387503bbfd259bc7ed87e251d0394da0189436ca4de3b9996d4bb95a9bf7bc5'
],
[
'30214c5938135492d92ed45ce8fb12485a4d3b01ae580579c7aa3d1cb47f91ea',
'3ae0efcd76882972b4780b5f9b5bca9b3f0cd1e63f4f807060e77d3cdb20987b'
],
[
'fcf8557bde6ebbeef18e17ebae29765a181aae98fb3e01cd5ea3ba077eedd3dd',
'ff3697add84e6255fa5bd0fc7d80d0e239f907508636c53bd9233ae4efcd580d'
],
[
'971a58a123f0a73c18dc9e6146ffa741617a46544c138eb9ef2df1f7216f9175',
'7e518e868d093ab89fc499591520f9b6b01d5d89e7d9fa8742256d422371ce7b'
],
[
'61043c282f693eb3c54da2ab894b9aab82996e18eb3ab10b3b54a34cde5a34c4',
'1f0acb18a7ec6a7d5d465450aa1526dcd2cf19ee26274776fdff0af64501c5e5'
],
[
'4bb18739ac3f8180bd9f33be5a617f3d9a8f7e350ded978ef75e0887bafeb5fe',
'c5ad45e6688201a4eabe7751b3119457e26af2431fad0c862f676db9d6037d13'
],
[
'345fce55e87cf391d83ced4c3c451a4c3c18627bf17a8e98578a3e5d870ca1c3',
'2daf419f9ab838d0323a57064a11a998f43f1963c9c1669fc74ceb0dbfc084e6'
],
[
'e4a0f24817d6ec23232c2fce07ce237e94f13642ae7264816a7516063928dbd1',
'b9bce3bebac0263731da85e18282f9fb48322f0d21ecee441a9b649420b00f48'
],
[
'5a1546d0b7b7a67898ca3ed125a428994f22aafcfa8eacbc71da82e05557d421',
'a45aa718530846c0fd26c3c94d52156ba81619a42a807f5a2683b6189bf60702'
],
[
'5631cb042f940f6abf274e8585f67834eb853ddb0e0ecdb7ff1e3c7fec263fdc',
'49fd9f34669720be768e51e8325e17e33fb504f646f4da9316062f797889d471'
],
[
'78698de1e94d49068259351894ef09665bd37c6bbce9fdcca2d240dc3fc79267',
'94ccdb9e93c4dd7e9c73cd5bd55565ff480ab33cf25ac5f73754545b00b06d7b'
],
[
'26aecf177625fcad4c2ad6f96fb010647c4281b3e50c95c41f39159dc3ac9512',
'4fa46a5c2a1d893d211ac9053d0710a03071cbb543a91d37ba555d9a607fdff6'
],
[
'fb39cb4199b1065dc7a6697576a121fabef0f2045fc580c04700ab1752ed9219',
'a212c71d9d4cb8302beabc5a6d666874602584bfb73909d32e50b5b8a265b316'
],
[
'19b770fddbccd296eef1a91959a233826e3e7d3bbe1a5a1e41e6c6f01997fcfa',
'f33491e624edd29cb08894e4d35acefe0a70e2717959f34ef2d04beb3ecfb597'
],
[
'1fad727438db4365cefeab2e78c65804ca1b18c17fa9c330050eabe6a9289704',
'7f3ed1f05d90654113b363461be3baf8f234322f231c8c325ed5feafe76b05cb'
],
[
'd5caf25b7ec20349e7b2a2c1d86e4105c8c37f86e8607811a6c18abd30bc4282',
'52695f4ee15b9e656d73419146034dbccfc175fb1996c39b2d14c8890bc45d0b'
],
[
'18a622097c7dd8265d11e855237dc78bd33e4c9bb3eb63129991cca850f64c0b',
'116a1ab25bf0c1c691c628a02937bf8a327174b46475dda70c971cbc82b646e0'
],
[
'ab1f28831092850f4f84e5b42038747b3ae5b73b3343e4ce5f7e05d92aa11cf',
'96281ad5c6c2ca32723384c21bdd1e0ae6cedd31ac2cba74ebb141202d1ec39f'
],
[
'a82291d3db51aec0457e1209e8a2b3a25898fb5ef06c048abe2721859eb42ee2',
'986b010b61315b6ca9c8709c7307f196c9d0d7821a7c54fa5694d79a8b68c70f'
],
[
'22f26d6219098cb6b0b7a898debc25ddcca61c9269a25600956ae7b114ce391d',
'76abcbd035cdd4ad753cfba7a5125c98bf1dcaa6bbf8abe68868163c5b0feed7'
],
[
'c353e384225ce8c80b3eb2c3dcb9e2687e1823f496bdba7ca7b846ffdec6576c',
'3a93c17e054eaed41d56846418c792f0e672bbad3cabcbe05e65dccc095b3eef'
],
[
'3e8009982c272eaa685dfc0bd30c3ecf67262bf1c8ddd643f6531224849ed25b',
'3e0a1e1c1efc86a4f3c6167756877fedff544c6bae8b875f17349ccfc77e7327'
],
[
'9f0686d7972b5845918654903689fd3573fd74da3bee6bad976b8352b9fe9fbb',
'cfe8e11ec23e298c0d5c2035f28ce4d1952ba06ec49cc0650da92c7b558ef22d'
],
[
'2c5de950758deca300a12e78d3b8be529ce99619d47356db16b9f53976cf6d1',
'3a27b3e4a6ee10903010b3a3a15fea39845b0864391219f5c942adf107d31004'
],
[
'd19dd74b6cab8ff7a4cba66cc6cbbe7333fdd0abd08b508cfefdef88aad182a3',
'9911070c22d827ebb3b4fa51545d57899359f8cb4027a0a68ae7fbd41a5674df'
],
[
'6494b59726b24e5237e1a8ef7b847f2f247995f810659fa9ac0ba98818fa90ab',
'7052422a6897396d999ebfbeae701e6b1746962524003409fe17bf43656847e'
],
[
'db9e3945bd18c1a306c2a10cae351787d7cbf247626e7a8804d814e56f5729a8',
'23e674c00648a8142afa423a80019125be281aab15c554a5fea55155ef3f3c74'
],
[
'431f9dd6243d766dbe2bb164d96d4ef48b71be71fef056b924c2098c187b7e89',
'4bef31cb7bbfc379f5e35026fa488ce0dbfa7e24947691a16ad3198db0fbc2ad'
],
[
'45aaab0f752c7019de13396209be191dc43436f7c1d9ccb578242be9dd9495f3',
'815119e8204c6d6e02958c49589ecf14d1bf6f5027b62232136355f5ef7973ca'
],
[
'f1f2c46eb36131ba22b299f78972926ce89abe40eb2caa9d45c63c962ebbd213',
'5f0315dde611488c1fdf17e9f9dae63e890c6787cb87da5f6431b24d6536dd5a'
],
[
'de72e9a4af14d8d9138da021c6c3c232d9097d2f563f006453ec224ee36562be',
'42ae09bd39ac083f5995b00aa1055b902a6718a1d8cb76f28778081f7e1216c0'
],
[
'cbf1258054bcea7410097328964fdcbd99f62269c875ffe4560927884f7fdd50',
'b58fe0eb747a39498a5c1f5eb0be15d3b877ff26a946c9353f31b70ba058bf15'
],
[
'50501b5091d4dbf8fd6e88302acaabd2522a65500a7de4fd2ee3a7d285ab2f56',
'7930ac644bb580a50c5f12777a784eed0f758f7c607061ed696481e5ce4990d7'
],
[
'5fd6437ee72ece1ca9e16a919dd1e0947326319e673ee1c3e68861b634614a1c',
'd16b233d95dba6c591ca98e557576313ce88849e412dd26cb9289e98132ed394'
],
[
'ac92731b9549058b490f102ae90a544c629bdd7073aca65d14b9465d23173290',
'f0ed703b876c0e7cf43e52ee6446d98efc0c934623ec1260d66e581e859a4ef2'
],
[
'a82a0b9b0b6cd565b9104fd877781dc3779d2387a00e57e129f0d77bc0fbe4d',
'b3d5a18c1af3513c225d8b53338b8eacb6ff06ac644c878d3441c23f00e9082e'
],
[
'86ed3684dfd5aacc7064c5fa0d31400dd8e724916a12056cf10c24869c8b1a2c',
'7f070a6029320af3ea668d7c6192a452f906bc5bd6ed9d76dce976387c7c83b1'
],
[
'918dc69ab69a1793670135f89feb018e20f42294545d45b173531fde5fdea8df',
'4e403f18c5efa9e51daab5e7bc3d42422f1da2a4265311f51bc728486ff3b178'
],
[
'5206ec9ffdbb38ed36735d668bec1d31640b0232d58c7d42fcabcdc52be66fa',
'4e5fe3f6a563354314cbbfddd1f6c5d9f700b79307e6c674a5690e2acc769de8'
],
[
'e679ec6f4d2c1a6d263d0a41f539ad851f6196af6c0a26b8f917286ce064239c',
'b5b403b60243e32b34720a203bea7f615b7e94d3b330cf7fc664e38ab72f4a28'
],
[
'497968c82c07ab4bbabbc84ba4834a59a923203036689173e4881f5f949043dc',
'4a9326e6768fb1215b5613e243b3b698cc656baf7707f8d0cd71319a15352003'
],
[
'b9498c5ef58c7f68e7c94ceb8dbfff73f3fba7fd7b3c8abceffd5d74981dd34e',
'4667fac1044c1eee5f63177f67ec7ce489153411fa76066a3030c5fb82cec9c5'
],
[
'9e8262e4f1762b8a0f6f18f8a905cb90cc24f8f6fe9c025a4eac4b0be9a84c1e',
'70ba905a880efbb4e8192fa17c0a34ba3e03880a6bc78c35576bfe31df098155'
],
[
'97a81aa0c59074ce4fc96831e8c6ee3e04d9725dbb9cb490dc63e2c8f926f77e',
'3638f689850a7c7215aa0e9805090aebb53fa6f8eb4b73b0155235163048b1fa'
],
[
'ff4e742f182c67d92e66ad6bf5efa3b8345c33d6fc4c474036f60b2c436cc403',
'5230bd7308f7622db290d6495f26f8d3fd11ac27c3cc5599ff20f711cafbc89f'
],
[
'535135b06a598cd90f73232b75c3ecb76de7e3c2e27942edaaadeba64ead625b',
'51bf638df7353b34911c450f34c8a5f12326b5bfe66081734cecd66bd7da9ac9'
],
[
'33b0a2d04f4da7ffb211a0027b825a61b2514bd3bb4e8e17c0461f008a490512',
'7499360c8ff33338d3eb339253f6966ae299b066164ce85a916ae093790af316'
],
[
'7196535cf7300bfbe4a77a63f4814eeaeb3ea4451072d2dc325eb82fcdcc33df',
'9a6edf11867896d53c7278209c1192d6bd64fac1b1eff8a5961c0d837918a414'
],
[
'd4f20138499dbfe9c42a0ac615ab9c457c5a6154894dcc1ba0afe675b69a03c2',
'a7be0eab0392061417e1e6a551302525d12924866be1bab1ec2a6d9ed095b126'
],
[
'9467e64f1b3cf27718717c31a6eefbaa750516bf750a24e70ccf9945f8790974',
'488ec1fe62445e094ce7cf9733549a96a8b796a7d9be3c7e8543cc30e067f7ad'
],
[
'b6cf6d33a6e0cf2b86b881b18ada64e49b74861ab412f4d0f1da3bcbf7b60cf3',
'b21e1bae2685a0bac706ffc059f9ef6fc89f6ce49a6dd93a954c94d513567693'
],
[
'79bd08eb1d4e91478310bc3a5735c604c77af98427bfe0b23f24e4f28ff84927',
'a4a64dcf6e237cbfdbf8ae6b043b58061b9beb214867a7549b94f4c7d65d68b3'
],
[
'd415283339d50249e3bdd1313b1e13e7db08e9728cdf90e18c97ff075dd5580b',
'1d3b0adcee4df2171040895828d7259e0e414d05d4cd427da926df59e8e0bb28'
],
[
'cf5ef7e760cdc4ef1b7f743b7b47724e222eb568545e9b96cf87dd28f81aea5',
'cabe71879e8025b5f5aae063eec85a574113a96c0055fd712b377af4589e8b0d'
],
[
'c4b5c334d187441e86f74d28e9ea106bb8f04b30b7b45e44c0d48516e5b9d633',
'15d26f594d6567f579e7ec06f9e2252fc9c9243d1fe201bf544b3bd4b9ba2823'
],
[
'971eba12c4e5abd35eae635ea5a87b68297f87875e499f58eff11615d1582b2a',
'161987d76aeab32c050b87970992ebebc94b224f2f393b42881bea74457af01d'
],
[
'7560d80b1b195132def0137cda369653a4b37ea8b7191b9019c6cd37c920482f',
'a3375cac528da855d3bb737df692644fa496b7f3de6f3ada88126742ca0edc83'
],
[
'4c0d91b2797e520308651061e240df9475450fd149e823fdba1119e22c4d7e6c',
'5e0c8db6c3c6a3e28d8a1e631bf262c9f2500993dfaa5707a9f04ecee2e8155a'
],
[
'bc618bdd36196f194b5bbc58f8274edcaadeb5d4b6b6bc995172ecb0e9fdecd7',
'27be701a87b1ec2deb4dd4cc6235cb042750f110369df12bf616d0b9f965a1a8'
],
[
'f106769e4de7ecaffebff2c634df504b5d7ec5f93bccb7f307596869d0da3d05',
'd7f4ce56c557ec0f088fd430f523a7cdeb6b7340b78910d7283b85ce65ad793'
],
[
'a91403e806a5e9ced27f1438308151c73d0d0f7d0d8fb97121a1bdbce1057433',
'a532856d060cfd48e5d2d78daa09b3560bdc675660a6ac61f97d946a1e0315e1'
],
[
'8532d4a7bcaff3afef1fffeb247a53a18cdcd5d7c445c662def7ee5e8c69e3c1',
'e6318f7c9186ec2a14242f2df3ef7da6d78326df5bae099d6b98bf7a28fc6878'
],
[
'a812c11300d5851f714602fe22b55dc83ca2fbe900492724e7be568795eb4626',
'de76ad255a91bdd7bfc2088af9df29809cd7eb0ed826f86d1c1509eba434d942'
],
[
'58f34328cba4b2c8a80826a462087b2e01d56c13682a88eead2ca8681f0de7bc',
'2a661a7d05ee45f50863c39b6b61a2850dbfa79ad618d88dd7c9f6f29a3c5e00'
],
[
'a970b0bfc8f384f68eca6d745003a1c57efeb9cb88cc2b1238b582dcf7470fb7',
'765986f3956a554994b3e813feac553443464d8b1f2c1c0bee944d6dcc258e3b'
],
[
'a4ac3fd8f96a7cfacc5c9636fe8309473288436a66bc955110960ea6374020ba',
'42220fdd26609439c22a22fd413a88682792202dc479125f9d0ebe07a42279a'
],
[
'b7c42755f6cb4865663fa76831b938bddd09757eb9e7215eb13209e815792814',
'98f3a7ba6a5e461d4451f68e82d7853ed79c3ada925c2e4b49a85e03d207aefd'
],
[
'4738dedb4bfa475f0cf0323f526d15179ce767ec57c2a431997616dad798ed06',
'55dc2e31b4f56103d62f07af518a12df159b4bb5d53ef325f639ce048deee175'
],
[
'd88e2edb9a43a750809c23662a1d49dd1451322ca3021cd2e9b319a41a8fea72',
'bf40c79fd1a16b0ec952544c77b84143c24579cc9eaa64fcb9c78e59f5b06251'
],
[
'8316e55ab6f7f5ea14340bf55abe2679509ec67cd0e7003f5ad0b1deb0c91b',
'498fa22e5ae0809585855763655ba86a6aee85bc0354d2f024a0fb414f6e476a'
],
[
'58ee8f6436993f52d4caa6616dc98c582af3d3bbbcfbb250a1938b6f5ad1e973',
'61479103af01552faa07b27dd63a7919963274ba1532341726fb40a2a229941a'
],
[
'b9e12dab068051a44ada9e1e3f0b7d9cd89803801039301b67aba07f6e088958',
'6e686cbb5a5124bcf11c37cbf26ab6f690324aed83fccc4b173f87e19b942285'
],
[
'6752300d5f0144fa436f8ce4e80fe305838cadabce43a2c733bd9a1d929aa609',
'bb533dc33009a65fb45d1d5d26c59deaa63a6b474d46f42e032b535823b661e2'
],
[
'a7fcf41039d167f0d2cb23df2f4c629f78296ac52c9e0c282d4dec2e9a51618',
'7988f09f48ed5acc8d9f847360d0d3e320e3fe1a1b85bc4db1b8c45b06b72400'
],
[
'2452adc36bab49cacf2e0c0572e1ce65542b91985eb32afc5b77708fc5b09272',
'62daae90b4bba6c3bd373ceeff57ddf3e0468c310d6ee626cd44dc4ce841f78d'
],
[
'b535107da26163b04a05b54df42da4fee47ad73b673480f864e88b8a2a6f77e7',
'4f4f019a751d6c3600dc14ea7ddb6270a2fa71142e67ae012aa5dcbed06af2d1'
],
[
'f4b899d1952cd7a0f75234f56a39fde262b782f6d15bb7c1dbd304ceb584ccf1',
'6a18bbc9d0eaf854bcd9baac6f43cef970466be5531d05a39cc4e870bb772fcb'
],
[
'c2bb30a611c3dda2f08a934368ae8f393a5462676a18402d63d3638ea8af9a16',
'd19021a6b8844654ab2b7e1921b4a8846ec4780fa19833701f8654764f6f9732'
],
[
'd6732748a805134810731cf028904a22a4e399855f07e6b97f1164d209de0b05',
'763ea7455bebe06db7c2d15e3b93de92011af04d56af2fec9ac3e12139881530'
],
[
'69fcc756818b686a5115a1452e0fc2ffbd761d272ecd9c65a09e5ab4f90084f0',
'30d853c6e9e195dc258d16e6ef01a60435d4fe3a361043d59b3e61af9fe7be06'
],
[
'f01d4629e52df071ef918327b5e5a175a2f4b1946d25365e6469a66a7b69b262',
'7907eb62ea2c7ffefc21c624c2a91fa5e2d300058097f70f28729ffef3e508f5'
],
[
'd8d4ee4e3c52e9173ca9800a87b7b8ee299d67ea69d91c14a623439c6375777f',
'c1b195d1906b6a871517ad9796c762f84535bd33c298923f63f286b55e99ca0a'
],
[
'6c00c2a20132b1fab5a955cee93bc7930697aacdaf0c3925682ef12ee6d965cc',
'700f390518566e04520c3a987713e4a111c6231ce8ad69eec6ca5287cfbe91d'
],
[
'852be6cd7f0d80c8dfe2a5effd19e7dc1a8163e2df1d8641c22ed74a2ceab1a1',
'1f40955be6c80ed5e6c50632d62effb5a8237a4c6b2d55a1d23f54aff401e046'
],
[
'c3e44fa0cd83613c06b9436f2528957aba671efbb823552a5f69ea9a7de6fd86',
'4296a00a4a149d75e9f54eadcfaeb80b11ad5682f838d0c6f187bed8fff5e975'
],
[
'585ddee8cbe756f137ac1878ac2a02e3544a1ef5d4355d337059fd7b2d604f0f',
'5411d502f740ca2bc7ddc6a603c7a052af123d6110ef25bd1cf0c04c7d31d121'
],
[
'5537c9b8e4b1a652cc6c39f0f61a266f09b405b6570363cc923794c643077a1b',
'f0fcfbe1e190269e9fae855878301b77717d8f1365808920c368bd263d04487a'
],
[
'5ea7171204ca961a2bd334b4cf46a4ce4b9a6ff8cbe95ba5ce7fe90641aca8b2',
'52592f46c9f47a716c7eb1d4951a8a60bc1ca40639deb74b514211151c64b7f0'
],
[
'ec5df2808e4168a8a674c2e61dfa896ffeb2aca380f2ecfbb2e4169ae8155898',
'9260276af46d9238393ffb008395c5981de86cb8222fe2180fe9f3b96b9dd577'
],
[
'dd23397e19efda2dac072dd6bba6656991275be3abb00ddf617ce403babe4b3a',
'190e2cb733468ea91d33635c4f8e129e4ec35e495527237219993725f58b3644'
],
[
'2c90ddcb9979bdf37f3a36cf8d48c28e4b2cc114885193d73c1384ab5ce7dc84',
'a3336af807aab976b296fde82ed04026e48da7765ffe2ba2287ab108286b0e8d'
],
[
'ea52f14e4bc0b3e7e34de04ac50c17d44a38a7262757f68e3f45362692ab3353',
'85ab6f117a3c534b7f17cd2bc7851dcf1b089238cb42c3d0a8a5575ac9ac839'
],
[
'f540a6aecddc61eb4ca6bc43bfaf7268f2776f6d23b3b02bcf5baefbf8710521',
'c22ed7802414cc3fa241d7d1f855a46fa1b2db83105534afbedc2c016b69e19f'
],
[
'2930bf115a732f75a16505bccf2ac06f7c22691decd76ab16dfa18fafd2d21b',
'ca5f208a027f8a75de6aac24d967b74a4baf0bd4c46a7fd44d58aeecbe8c7e99'
]
]
]
});
{
"name": "elliptic",
"version": "0.1.0",
"version": "0.2.0",
"description": "EC cryptography",

@@ -26,4 +26,5 @@ "main": "lib/elliptic.js",

"devDependencies": {
"browserify": "^3.44.2",
"mocha": "^1.18.2"
}
}

@@ -125,2 +125,19 @@ var assert = require('assert');

});
it('should support binc', function() {
assert.equal(elliptic.bn(0).binc(1).toString(16), '2');
assert.equal(elliptic.bn(2).binc(1).toString(16), '4');
assert.equal(elliptic.bn(0xffffff).binc(1).toString(16), '1000001');
});
it('should support montgomery operations', function() {
var p192 = elliptic.bn(
'fffffffffffffffffffffffffffffffeffffffffffffffff',
16);
var m = elliptic.bn.mont(p192);
var a = elliptic.bn(123);
var b = elliptic.bn(231);
var c = a.toMont(m).montMul(b.toMont(m)).fromMont();
assert(c.cmp(a.mul(b).mod(p192)) === 0);
});
});

@@ -12,5 +12,3 @@ var assert = require('assert');

var p = curve.point(
'18',
'16');
var p = curve.point('18', '16');
assert(p.validate());

@@ -17,0 +15,0 @@ assert(p.dbl().validate());

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc