@toruslabs/torus.js
Advanced tools
Comparing version 1.0.1 to 1.0.2
@@ -1,30 +0,64 @@ | ||
"use strict"; | ||
'use strict' | ||
Object.defineProperty(exports, "__esModule", { | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
exports.generateJsonRPCObject = exports.post = exports.promiseTimeout = void 0; | ||
}) | ||
exports.generateJsonRPCObject = exports.post = exports.promiseTimeout = void 0 | ||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object) | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object) | ||
if (enumerableOnly) | ||
symbols = symbols.filter(function(sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable | ||
}) | ||
keys.push.apply(keys, symbols) | ||
} | ||
return keys | ||
} | ||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } | ||
function _objectSpread(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {} | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function(key) { | ||
_defineProperty(target, key, source[key]) | ||
}) | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) | ||
} else { | ||
ownKeys(Object(source)).forEach(function(key) { | ||
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)) | ||
}) | ||
} | ||
} | ||
return target | ||
} | ||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }) | ||
} else { | ||
obj[key] = value | ||
} | ||
return obj | ||
} | ||
var promiseTimeout = function promiseTimeout(ms, promise) { | ||
var timeout = new Promise(function (resolve, reject) { | ||
var id = setTimeout(function () { | ||
clearTimeout(id); | ||
reject(new Error('Timed out in ' + ms + 'ms')); | ||
}, ms); | ||
}); | ||
return Promise.race([promise, timeout]); | ||
}; | ||
var timeout = new Promise(function(resolve, reject) { | ||
var id = setTimeout(function() { | ||
clearTimeout(id) | ||
reject(new Error('Timed out in ' + ms + 'ms')) | ||
}, ms) | ||
}) | ||
return Promise.race([promise, timeout]) | ||
} | ||
exports.promiseTimeout = promiseTimeout; | ||
exports.promiseTimeout = promiseTimeout | ||
var post = function post() { | ||
var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; | ||
var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; | ||
var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '' | ||
var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {} | ||
var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {} | ||
var defaultOptions = { | ||
@@ -37,16 +71,26 @@ mode: 'cors', | ||
body: JSON.stringify(data) | ||
}; | ||
} | ||
var options = _objectSpread({}, defaultOptions, {}, opts, {}, { | ||
method: 'POST' | ||
}); | ||
var options = _objectSpread( | ||
{}, | ||
defaultOptions, | ||
{}, | ||
opts, | ||
{}, | ||
{ | ||
method: 'POST' | ||
} | ||
) | ||
return promiseTimeout(12000, fetch(url, options).then(function (response) { | ||
if (response.ok) { | ||
return response.json(); | ||
} else throw new Error('Could not connect', response); | ||
})); | ||
}; | ||
return promiseTimeout( | ||
12000, | ||
fetch(url, options).then(function(response) { | ||
if (response.ok) { | ||
return response.json() | ||
} else throw new Error('Could not connect', response) | ||
}) | ||
) | ||
} | ||
exports.post = post; | ||
exports.post = post | ||
@@ -59,5 +103,5 @@ var generateJsonRPCObject = function generateJsonRPCObject(method, params) { | ||
params: params | ||
}; | ||
}; | ||
} | ||
} | ||
exports.generateJsonRPCObject = generateJsonRPCObject; | ||
exports.generateJsonRPCObject = generateJsonRPCObject |
@@ -1,35 +0,40 @@ | ||
"use strict"; | ||
'use strict' | ||
Object.defineProperty(exports, "__esModule", { | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
exports.Some = void 0; | ||
}) | ||
exports.Some = void 0 | ||
var Some = function Some(promises, predicate) { | ||
return new Promise(function (resolve, reject) { | ||
var finishedCount = 0; | ||
var resolved = false; | ||
var resultArr = new Array(promises.length).fill(undefined); | ||
promises.forEach(function (x, index) { | ||
x.then(function (resp) { | ||
resultArr[index] = resp; | ||
})["catch"](function (_) {})["finally"](function () { | ||
if (resolved) return; | ||
predicate(resultArr.slice(0)).then(function (data) { | ||
resolved = true; | ||
resolve(data); | ||
})["catch"](function (_) { | ||
return undefined; | ||
})["finally"](function (_) { | ||
finishedCount++; | ||
return new Promise(function(resolve, reject) { | ||
var finishedCount = 0 | ||
var resolved = false | ||
var resultArr = new Array(promises.length).fill(undefined) | ||
promises.forEach(function(x, index) { | ||
x.then(function(resp) { | ||
resultArr[index] = resp | ||
}) | ||
['catch'](function(_) {}) | ||
['finally'](function() { | ||
if (resolved) return | ||
predicate(resultArr.slice(0)) | ||
.then(function(data) { | ||
resolved = true | ||
resolve(data) | ||
}) | ||
['catch'](function(_) { | ||
return undefined | ||
}) | ||
['finally'](function(_) { | ||
finishedCount++ | ||
if (finishedCount === promises.length) { | ||
reject(new Error('Unable to resolve enough promises, responses: ' + JSON.stringify(resultArr))); | ||
} | ||
}); | ||
}); | ||
}); | ||
}); | ||
}; | ||
if (finishedCount === promises.length) { | ||
reject(new Error('Unable to resolve enough promises, responses: ' + JSON.stringify(resultArr))) | ||
} | ||
}) | ||
}) | ||
}) | ||
}) | ||
} | ||
exports.Some = Some; | ||
exports.Some = Some |
@@ -1,57 +0,138 @@ | ||
"use strict"; | ||
'use strict' | ||
Object.defineProperty(exports, "__esModule", { | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
}) | ||
exports['default'] = void 0 | ||
var _elliptic = require("elliptic"); | ||
var _elliptic = require('elliptic') | ||
var _eccrypto = _interopRequireDefault(require("eccrypto")); | ||
var _eccrypto = _interopRequireDefault(require('eccrypto')) | ||
var _web3Utils = require("web3-utils"); | ||
var _web3Utils = require('web3-utils') | ||
var _bn = _interopRequireDefault(require("bn.js")); | ||
var _bn = _interopRequireDefault(require('bn.js')) | ||
var _httpHelpers = require("./httpHelpers"); | ||
var _httpHelpers = require('./httpHelpers') | ||
var _some = require("./some"); | ||
var _some = require('./some') | ||
var _utils = require("./utils"); | ||
var _utils = require('./utils') | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : { default: obj } | ||
} | ||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } | ||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { | ||
try { | ||
var info = gen[key](arg) | ||
var value = info.value | ||
} catch (error) { | ||
reject(error) | ||
return | ||
} | ||
if (info.done) { | ||
resolve(value) | ||
} else { | ||
Promise.resolve(value).then(_next, _throw) | ||
} | ||
} | ||
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } | ||
function _asyncToGenerator(fn) { | ||
return function() { | ||
var self = this, | ||
args = arguments | ||
return new Promise(function(resolve, reject) { | ||
var gen = fn.apply(self, args) | ||
function _next(value) { | ||
asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'next', value) | ||
} | ||
function _throw(err) { | ||
asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'throw', err) | ||
} | ||
_next(undefined) | ||
}) | ||
} | ||
} | ||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object) | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object) | ||
if (enumerableOnly) | ||
symbols = symbols.filter(function(sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable | ||
}) | ||
keys.push.apply(keys, symbols) | ||
} | ||
return keys | ||
} | ||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } | ||
function _objectSpread(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {} | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function(key) { | ||
_defineProperty(target, key, source[key]) | ||
}) | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) | ||
} else { | ||
ownKeys(Object(source)).forEach(function(key) { | ||
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)) | ||
}) | ||
} | ||
} | ||
return target | ||
} | ||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }) | ||
} else { | ||
obj[key] = value | ||
} | ||
return obj | ||
} | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _classCallCheck(instance, Constructor) { | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError('Cannot call a class as a function') | ||
} | ||
} | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _defineProperties(target, props) { | ||
for (var i = 0; i < props.length; i++) { | ||
var descriptor = props[i] | ||
descriptor.enumerable = descriptor.enumerable || false | ||
descriptor.configurable = true | ||
if ('value' in descriptor) descriptor.writable = true | ||
Object.defineProperty(target, descriptor.key, descriptor) | ||
} | ||
} | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
function _createClass(Constructor, protoProps, staticProps) { | ||
if (protoProps) _defineProperties(Constructor.prototype, protoProps) | ||
if (staticProps) _defineProperties(Constructor, staticProps) | ||
return Constructor | ||
} | ||
var Torus = | ||
/*#__PURE__*/ | ||
function () { | ||
function Torus() { | ||
_classCallCheck(this, Torus); | ||
/*#__PURE__*/ | ||
(function() { | ||
function Torus() { | ||
_classCallCheck(this, Torus) | ||
this.ec = (0, _elliptic.ec)('secp256k1'); | ||
} | ||
this.ec = (0, _elliptic.ec)('secp256k1') | ||
} | ||
_createClass(Torus, [{ | ||
key: "retrieveShares", | ||
value: function retrieveShares(endpoints, indexes, verifier, verifierParams, idToken) { | ||
var _this = this; | ||
_createClass(Torus, [ | ||
{ | ||
key: 'retrieveShares', | ||
value: function retrieveShares(endpoints, indexes, verifier, verifierParams, idToken) { | ||
var _this = this | ||
return new Promise(function (resolve, reject) { | ||
var promiseArr = []; | ||
/* | ||
return new Promise(function(resolve, reject) { | ||
var promiseArr = [] | ||
/* | ||
CommitmentRequestParams struct { | ||
@@ -66,26 +147,29 @@ MessagePrefix string `json:"messageprefix"` | ||
*/ | ||
// generate temporary private and public key that is used to secure receive shares | ||
// generate temporary private and public key that is used to secure receive shares | ||
var tmpKey = _eccrypto["default"].generatePrivate(); | ||
var tmpKey = _eccrypto['default'].generatePrivate() | ||
var pubKey = _eccrypto["default"].getPublic(tmpKey).toString('hex'); | ||
var pubKey = _eccrypto['default'].getPublic(tmpKey).toString('hex') | ||
var pubKeyX = pubKey.slice(2, 66); | ||
var pubKeyY = pubKey.slice(66); | ||
var tokenCommitment = (0, _web3Utils.keccak256)(idToken); // make commitment requests to endpoints | ||
var pubKeyX = pubKey.slice(2, 66) | ||
var pubKeyY = pubKey.slice(66) | ||
var tokenCommitment = (0, _web3Utils.keccak256)(idToken) // make commitment requests to endpoints | ||
for (var i = 0; i < endpoints.length; i++) { | ||
var p = (0, _httpHelpers.post)(endpoints[i], (0, _httpHelpers.generateJsonRPCObject)('CommitmentRequest', { | ||
messageprefix: 'mug00', | ||
tokencommitment: tokenCommitment.slice(2), | ||
temppubx: pubKeyX, | ||
temppuby: pubKeyY, | ||
timestamp: (Date.now() - 2000).toString().slice(0, 10), | ||
verifieridentifier: verifier | ||
}))["catch"](function (_) { | ||
return undefined; | ||
}); | ||
promiseArr.push(p); | ||
} | ||
/* | ||
for (var i = 0; i < endpoints.length; i++) { | ||
var p = (0, _httpHelpers.post)( | ||
endpoints[i], | ||
(0, _httpHelpers.generateJsonRPCObject)('CommitmentRequest', { | ||
messageprefix: 'mug00', | ||
tokencommitment: tokenCommitment.slice(2), | ||
temppubx: pubKeyX, | ||
temppuby: pubKeyY, | ||
timestamp: (Date.now() - 2000).toString().slice(0, 10), | ||
verifieridentifier: verifier | ||
}) | ||
)['catch'](function(_) { | ||
return undefined | ||
}) | ||
promiseArr.push(p) | ||
} | ||
/* | ||
ShareRequestParams struct { | ||
@@ -112,51 +196,70 @@ Item []bijson.RawMessage `json:"item"` | ||
*/ | ||
// send share request once k + t number of commitment requests have completed | ||
// send share request once k + t number of commitment requests have completed | ||
;(0, _some.Some)(promiseArr, function(resultArr) { | ||
var completedRequests = resultArr.filter(function(x) { | ||
return x | ||
}) | ||
(0, _some.Some)(promiseArr, function (resultArr) { | ||
var completedRequests = resultArr.filter(function (x) { | ||
return x; | ||
}); | ||
if (completedRequests.length >= ~~(endpoints.length / 4) * 3 + 1) { | ||
return Promise.resolve(resultArr) | ||
} | ||
if (completedRequests.length >= ~~(endpoints.length / 4) * 3 + 1) { | ||
return Promise.resolve(resultArr); | ||
} | ||
return Promise.reject(new Error('invalid')) | ||
}) | ||
.then(function(responses) { | ||
var promiseArrRequest = [] | ||
var nodeSigs = [] | ||
return Promise.reject(new Error('invalid')); | ||
}).then(function (responses) { | ||
var promiseArrRequest = []; | ||
var nodeSigs = []; | ||
for (var _i = 0; _i < responses.length; _i++) { | ||
if (responses[_i]) nodeSigs.push(responses[_i].result) | ||
} | ||
for (var _i = 0; _i < responses.length; _i++) { | ||
if (responses[_i]) nodeSigs.push(responses[_i].result); | ||
} | ||
for (var _i2 = 0; _i2 < endpoints.length; _i2++) { | ||
var _p = (0, _httpHelpers.post)( | ||
endpoints[_i2], | ||
(0, _httpHelpers.generateJsonRPCObject)('ShareRequest', { | ||
encrypted: 'yes', | ||
item: [ | ||
_objectSpread({}, verifierParams, { | ||
idtoken: idToken, | ||
nodesignatures: nodeSigs, | ||
verifieridentifier: verifier | ||
}) | ||
] | ||
}) | ||
)['catch'](function(_) { | ||
return undefined | ||
}) | ||
for (var _i2 = 0; _i2 < endpoints.length; _i2++) { | ||
var _p = (0, _httpHelpers.post)(endpoints[_i2], (0, _httpHelpers.generateJsonRPCObject)('ShareRequest', { | ||
encrypted: 'yes', | ||
item: [_objectSpread({}, verifierParams, { | ||
idtoken: idToken, | ||
nodesignatures: nodeSigs, | ||
verifieridentifier: verifier | ||
})] | ||
}))["catch"](function (_) { | ||
return undefined; | ||
}); | ||
promiseArrRequest.push(_p) | ||
} | ||
promiseArrRequest.push(_p); | ||
} | ||
return (0, _some.Some)( | ||
promiseArrRequest, | ||
/*#__PURE__*/ | ||
(function() { | ||
var _ref = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
regeneratorRuntime.mark(function _callee(shareResponses) { | ||
var completedRequests, | ||
thresholdPublicKey, | ||
sharePromises, | ||
nodeIndex, | ||
i, | ||
metadata, | ||
sharesResolved, | ||
decryptedShares, | ||
allCombis, | ||
privateKey, | ||
_loop, | ||
j, | ||
_ret, | ||
ethAddress | ||
return (0, _some.Some)(promiseArrRequest, | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
regeneratorRuntime.mark(function _callee(shareResponses) { | ||
var completedRequests, thresholdPublicKey, sharePromises, nodeIndex, i, metadata, sharesResolved, decryptedShares, allCombis, privateKey, _loop, j, _ret, ethAddress; | ||
return regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
/* | ||
return regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch ((_context.prev = _context.next)) { | ||
case 0: | ||
/* | ||
ShareRequestResult struct { | ||
@@ -178,231 +281,264 @@ Keys []KeyAssignment | ||
*/ | ||
// check if threshold number of nodes have returned the same user public key | ||
completedRequests = shareResponses.filter(function (x) { | ||
return x; | ||
}); | ||
thresholdPublicKey = (0, _utils.thresholdSame)(shareResponses.map(function (x) { | ||
return x && x.result && x.result.keys[0].PublicKey; | ||
}), ~~(endpoints.length / 2) + 1); // optimistically run lagrange interpolation once threshold number of shares have been received | ||
// this is matched against the user public key to ensure that shares are consistent | ||
// check if threshold number of nodes have returned the same user public key | ||
completedRequests = shareResponses.filter(function(x) { | ||
return x | ||
}) | ||
thresholdPublicKey = (0, _utils.thresholdSame)( | ||
shareResponses.map(function(x) { | ||
return x && x.result && x.result.keys[0].PublicKey | ||
}), | ||
~~(endpoints.length / 2) + 1 | ||
) // optimistically run lagrange interpolation once threshold number of shares have been received | ||
// this is matched against the user public key to ensure that shares are consistent | ||
if (!(completedRequests.length >= ~~(endpoints.length / 2) + 1 && thresholdPublicKey)) { | ||
_context.next = 24; | ||
break; | ||
} | ||
if (!(completedRequests.length >= ~~(endpoints.length / 2) + 1 && thresholdPublicKey)) { | ||
_context.next = 24 | ||
break | ||
} | ||
sharePromises = []; | ||
nodeIndex = []; | ||
sharePromises = [] | ||
nodeIndex = [] | ||
for (i = 0; i < shareResponses.length; i++) { | ||
if (shareResponses[i] && shareResponses[i].result && shareResponses[i].result.keys && shareResponses[i].result.keys.length > 0) { | ||
shareResponses[i].result.keys.sort(function (a, b) { | ||
return new _bn["default"](a.Index, 16).cmp(new _bn["default"](b.Index, 16)); | ||
}); | ||
for (i = 0; i < shareResponses.length; i++) { | ||
if ( | ||
shareResponses[i] && | ||
shareResponses[i].result && | ||
shareResponses[i].result.keys && | ||
shareResponses[i].result.keys.length > 0 | ||
) { | ||
shareResponses[i].result.keys.sort(function(a, b) { | ||
return new _bn['default'](a.Index, 16).cmp(new _bn['default'](b.Index, 16)) | ||
}) | ||
if (shareResponses[i].result.keys[0].Metadata) { | ||
metadata = { | ||
ephemPublicKey: Buffer.from(shareResponses[i].result.keys[0].Metadata.ephemPublicKey, 'hex'), | ||
iv: Buffer.from(shareResponses[i].result.keys[0].Metadata.iv, 'hex'), | ||
mac: Buffer.from(shareResponses[i].result.keys[0].Metadata.mac, 'hex'), | ||
mode: Buffer.from(shareResponses[i].result.keys[0].Metadata.mode, 'hex') | ||
}; | ||
sharePromises.push(_eccrypto["default"].decrypt(tmpKey, _objectSpread({}, metadata, { | ||
ciphertext: Buffer.from(atob(shareResponses[i].result.keys[0].Share).padStart(64, '0'), 'hex') | ||
}))["catch"](function (_) { | ||
return undefined; | ||
})); | ||
} else { | ||
sharePromises.push(Promise.resolve(Buffer.from(shareResponses[i].result.keys[0].Share.padStart(64, '0'), 'hex'))); | ||
} | ||
} else { | ||
sharePromises.push(Promise.resolve(undefined)); | ||
} | ||
if (shareResponses[i].result.keys[0].Metadata) { | ||
metadata = { | ||
ephemPublicKey: Buffer.from(shareResponses[i].result.keys[0].Metadata.ephemPublicKey, 'hex'), | ||
iv: Buffer.from(shareResponses[i].result.keys[0].Metadata.iv, 'hex'), | ||
mac: Buffer.from(shareResponses[i].result.keys[0].Metadata.mac, 'hex'), | ||
mode: Buffer.from(shareResponses[i].result.keys[0].Metadata.mode, 'hex') | ||
} | ||
sharePromises.push( | ||
_eccrypto['default'] | ||
.decrypt( | ||
tmpKey, | ||
_objectSpread({}, metadata, { | ||
ciphertext: Buffer.from(atob(shareResponses[i].result.keys[0].Share).padStart(64, '0'), 'hex') | ||
}) | ||
) | ||
['catch'](function(_) { | ||
return undefined | ||
}) | ||
) | ||
} else { | ||
sharePromises.push( | ||
Promise.resolve(Buffer.from(shareResponses[i].result.keys[0].Share.padStart(64, '0'), 'hex')) | ||
) | ||
} | ||
} else { | ||
sharePromises.push(Promise.resolve(undefined)) | ||
} | ||
nodeIndex.push(new _bn["default"](indexes[i], 16)); | ||
} | ||
nodeIndex.push(new _bn['default'](indexes[i], 16)) | ||
} | ||
_context.next = 8; | ||
return Promise.all(sharePromises); | ||
_context.next = 8 | ||
return Promise.all(sharePromises) | ||
case 8: | ||
sharesResolved = _context.sent; | ||
decryptedShares = sharesResolved.reduce(function (acc, curr, index) { | ||
if (curr) acc.push({ | ||
index: nodeIndex[index], | ||
value: new _bn["default"](curr) | ||
}); | ||
return acc; | ||
}, []); // run lagrange interpolation on all subsets, faster in the optimistic scenario than berlekamp-welch due to early exit | ||
case 8: | ||
sharesResolved = _context.sent | ||
decryptedShares = sharesResolved.reduce(function(acc, curr, index) { | ||
if (curr) | ||
acc.push({ | ||
index: nodeIndex[index], | ||
value: new _bn['default'](curr) | ||
}) | ||
return acc | ||
}, []) // run lagrange interpolation on all subsets, faster in the optimistic scenario than berlekamp-welch due to early exit | ||
allCombis = (0, _utils.kCombinations)(decryptedShares.length, ~~(endpoints.length / 2) + 1); | ||
allCombis = (0, _utils.kCombinations)(decryptedShares.length, ~~(endpoints.length / 2) + 1) | ||
_loop = function _loop(j) { | ||
var currentCombi = allCombis[j]; | ||
var currentCombiShares = decryptedShares.filter(function (v, index) { | ||
return currentCombi.includes(index); | ||
}); | ||
var shares = currentCombiShares.map(function (x) { | ||
return x.value; | ||
}); | ||
var indices = currentCombiShares.map(function (x) { | ||
return x.index; | ||
}); | ||
_loop = function _loop(j) { | ||
var currentCombi = allCombis[j] | ||
var currentCombiShares = decryptedShares.filter(function(v, index) { | ||
return currentCombi.includes(index) | ||
}) | ||
var shares = currentCombiShares.map(function(x) { | ||
return x.value | ||
}) | ||
var indices = currentCombiShares.map(function(x) { | ||
return x.index | ||
}) | ||
var derivedPrivateKey = _this.lagrangeInterpolation(shares, indices); | ||
var derivedPrivateKey = _this.lagrangeInterpolation(shares, indices) | ||
var pubKey = _eccrypto["default"].getPublic(Buffer.from(derivedPrivateKey.toString(16, 64), 'hex')).toString('hex'); | ||
var pubKey = _eccrypto['default'].getPublic(Buffer.from(derivedPrivateKey.toString(16, 64), 'hex')).toString('hex') | ||
var pubKeyX = pubKey.slice(2, 66); | ||
var pubKeyY = pubKey.slice(66); | ||
var pubKeyX = pubKey.slice(2, 66) | ||
var pubKeyY = pubKey.slice(66) | ||
if (pubKeyX === thresholdPublicKey.X && pubKeyY === thresholdPublicKey.Y) { | ||
privateKey = derivedPrivateKey; | ||
return "break"; | ||
} | ||
}; | ||
if (pubKeyX === thresholdPublicKey.X && pubKeyY === thresholdPublicKey.Y) { | ||
privateKey = derivedPrivateKey | ||
return 'break' | ||
} | ||
} | ||
j = 0; | ||
j = 0 | ||
case 13: | ||
if (!(j < allCombis.length)) { | ||
_context.next = 20; | ||
break; | ||
} | ||
case 13: | ||
if (!(j < allCombis.length)) { | ||
_context.next = 20 | ||
break | ||
} | ||
_ret = _loop(j); | ||
_ret = _loop(j) | ||
if (!(_ret === "break")) { | ||
_context.next = 17; | ||
break; | ||
} | ||
if (!(_ret === 'break')) { | ||
_context.next = 17 | ||
break | ||
} | ||
return _context.abrupt("break", 20); | ||
return _context.abrupt('break', 20) | ||
case 17: | ||
j++; | ||
_context.next = 13; | ||
break; | ||
case 17: | ||
j++ | ||
_context.next = 13 | ||
break | ||
case 20: | ||
if (!(privateKey === undefined)) { | ||
_context.next = 22; | ||
break; | ||
} | ||
case 20: | ||
if (!(privateKey === undefined)) { | ||
_context.next = 22 | ||
break | ||
} | ||
throw new Error('could not derive private key'); | ||
throw new Error('could not derive private key') | ||
case 22: | ||
ethAddress = _this.generateAddressFromPrivKey(privateKey); // return reconstructed private key and ethereum address | ||
case 22: | ||
ethAddress = _this.generateAddressFromPrivKey(privateKey) // return reconstructed private key and ethereum address | ||
return _context.abrupt("return", { | ||
ethAddress: ethAddress, | ||
privKey: privateKey.toString('hex', 64) | ||
}); | ||
return _context.abrupt('return', { | ||
ethAddress: ethAddress, | ||
privKey: privateKey.toString('hex', 64) | ||
}) | ||
case 24: | ||
throw new Error('invalid'); | ||
case 24: | ||
throw new Error('invalid') | ||
case 25: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
case 25: | ||
case 'end': | ||
return _context.stop() | ||
} | ||
} | ||
}, _callee) | ||
}) | ||
) | ||
return function (_x) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}()); | ||
}).then(function (response) { | ||
resolve(response); | ||
})["catch"](function (err) { | ||
reject(err); | ||
}); | ||
}); | ||
} | ||
}, { | ||
key: "lagrangeInterpolation", | ||
value: function lagrangeInterpolation(shares, nodeIndex) { | ||
if (shares.length !== nodeIndex.length) { | ||
return null; | ||
} | ||
return function(_x) { | ||
return _ref.apply(this, arguments) | ||
} | ||
})() | ||
) | ||
}) | ||
.then(function(response) { | ||
resolve(response) | ||
}) | ||
['catch'](function(err) { | ||
reject(err) | ||
}) | ||
}) | ||
} | ||
}, | ||
{ | ||
key: 'lagrangeInterpolation', | ||
value: function lagrangeInterpolation(shares, nodeIndex) { | ||
if (shares.length !== nodeIndex.length) { | ||
return null | ||
} | ||
var secret = new _bn["default"](0); | ||
var secret = new _bn['default'](0) | ||
for (var i = 0; i < shares.length; i++) { | ||
var upper = new _bn["default"](1); | ||
var lower = new _bn["default"](1); | ||
for (var i = 0; i < shares.length; i++) { | ||
var upper = new _bn['default'](1) | ||
var lower = new _bn['default'](1) | ||
for (var j = 0; j < shares.length; j++) { | ||
if (i !== j) { | ||
upper = upper.mul(nodeIndex[j].neg()); | ||
upper = upper.umod(this.ec.curve.n); | ||
var temp = nodeIndex[i].sub(nodeIndex[j]); | ||
temp = temp.umod(this.ec.curve.n); | ||
lower = lower.mul(temp).umod(this.ec.curve.n); | ||
for (var j = 0; j < shares.length; j++) { | ||
if (i !== j) { | ||
upper = upper.mul(nodeIndex[j].neg()) | ||
upper = upper.umod(this.ec.curve.n) | ||
var temp = nodeIndex[i].sub(nodeIndex[j]) | ||
temp = temp.umod(this.ec.curve.n) | ||
lower = lower.mul(temp).umod(this.ec.curve.n) | ||
} | ||
} | ||
var delta = upper.mul(lower.invm(this.ec.curve.n)).umod(this.ec.curve.n) | ||
delta = delta.mul(shares[i]).umod(this.ec.curve.n) | ||
secret = secret.add(delta) | ||
} | ||
return secret.umod(this.ec.curve.n) | ||
} | ||
}, | ||
{ | ||
key: 'generateAddressFromPrivKey', | ||
value: function generateAddressFromPrivKey(privateKey) { | ||
var key = this.ec.keyFromPrivate(privateKey.toString('hex', 64), 'hex') | ||
var publicKey = key | ||
.getPublic() | ||
.encode('hex') | ||
.slice(2) | ||
var ethAddressLower = '0x' + (0, _web3Utils.keccak256)(Buffer.from(publicKey, 'hex')).slice(64 - 38) | ||
var ethAddress = (0, _web3Utils.toChecksumAddress)(ethAddressLower) | ||
return ethAddress | ||
} | ||
}, | ||
{ | ||
key: 'getPubKeyAsync', | ||
value: function getPubKeyAsync(endpoints, _ref2) { | ||
var verifier = _ref2.verifier, | ||
verifierId = _ref2.verifierId | ||
return new Promise(function(resolve, reject) { | ||
;(0, _utils.keyLookup)(endpoints, verifier, verifierId) | ||
.then(function(_ref3) { | ||
var keyResult = _ref3.keyResult, | ||
errorResult = _ref3.errorResult | ||
var delta = upper.mul(lower.invm(this.ec.curve.n)).umod(this.ec.curve.n); | ||
delta = delta.mul(shares[i]).umod(this.ec.curve.n); | ||
secret = secret.add(delta); | ||
} | ||
if (errorResult) { | ||
return (0, _utils.keyAssign)(endpoints, undefined, verifier, verifierId).then(function(_) { | ||
return (0, _utils.keyLookup)(endpoints, verifier, verifierId) | ||
}) | ||
} | ||
return secret.umod(this.ec.curve.n); | ||
} | ||
}, { | ||
key: "generateAddressFromPrivKey", | ||
value: function generateAddressFromPrivKey(privateKey) { | ||
var key = this.ec.keyFromPrivate(privateKey.toString('hex', 64), 'hex'); | ||
var publicKey = key.getPublic().encode('hex').slice(2); | ||
var ethAddressLower = '0x' + (0, _web3Utils.keccak256)(Buffer.from(publicKey, 'hex')).slice(64 - 38); | ||
var ethAddress = (0, _web3Utils.toChecksumAddress)(ethAddressLower); | ||
return ethAddress; | ||
} | ||
}, { | ||
key: "getPubKeyAsync", | ||
value: function getPubKeyAsync(endpoints, _ref2) { | ||
var verifier = _ref2.verifier, | ||
verifierId = _ref2.verifierId; | ||
return new Promise(function (resolve, reject) { | ||
(0, _utils.keyLookup)(endpoints, verifier, verifierId).then(function (_ref3) { | ||
var keyResult = _ref3.keyResult, | ||
errorResult = _ref3.errorResult; | ||
if (keyResult) { | ||
return Promise.resolve({ | ||
keyResult: keyResult | ||
}) | ||
} | ||
if (errorResult) { | ||
return (0, _utils.keyAssign)(endpoints, undefined, verifier, verifierId).then(function (_) { | ||
return (0, _utils.keyLookup)(endpoints, verifier, verifierId); | ||
}); | ||
} | ||
return reject(new Error('node results do not match')) | ||
}) | ||
['catch'](function(_) { | ||
return undefined | ||
}) | ||
.then(function(_ref4) { | ||
var keyResult = _ref4.keyResult | ||
if (keyResult) { | ||
return Promise.resolve({ | ||
keyResult: keyResult | ||
}); | ||
} | ||
if (keyResult) { | ||
var ethAddress = keyResult.keys[0].address | ||
resolve(ethAddress) | ||
} else { | ||
reject(new Error('node results do not match')) | ||
} | ||
}) | ||
['catch'](function(err) { | ||
reject(err) | ||
}) | ||
}) | ||
} | ||
} | ||
]) | ||
return reject(new Error('node results do not match')); | ||
})["catch"](function (_) { | ||
return undefined; | ||
}).then(function (_ref4) { | ||
var keyResult = _ref4.keyResult; | ||
return Torus | ||
})() | ||
if (keyResult) { | ||
var ethAddress = keyResult.keys[0].address; | ||
resolve(ethAddress); | ||
} else { | ||
reject(new Error('node results do not match')); | ||
} | ||
})["catch"](function (err) { | ||
reject(err); | ||
}); | ||
}); | ||
} | ||
}]); | ||
return Torus; | ||
}(); | ||
var _default = Torus; | ||
exports["default"] = _default; | ||
var _default = Torus | ||
exports['default'] = _default |
@@ -1,101 +0,128 @@ | ||
"use strict"; | ||
'use strict' | ||
Object.defineProperty(exports, "__esModule", { | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
exports.keyAssign = exports.keyLookup = exports.thresholdSame = exports.kCombinations = void 0; | ||
}) | ||
exports.keyAssign = exports.keyLookup = exports.thresholdSame = exports.kCombinations = void 0 | ||
var _jsonStableStringify = _interopRequireDefault(require("json-stable-stringify")); | ||
var _jsonStableStringify = _interopRequireDefault(require('json-stable-stringify')) | ||
var _httpHelpers = require("./httpHelpers"); | ||
var _httpHelpers = require('./httpHelpers') | ||
var _some = require("./some"); | ||
var _some = require('./some') | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : { default: obj } | ||
} | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } | ||
function _toConsumableArray(arr) { | ||
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread() | ||
} | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } | ||
function _nonIterableSpread() { | ||
throw new TypeError('Invalid attempt to spread non-iterable instance') | ||
} | ||
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } | ||
function _iterableToArray(iter) { | ||
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === '[object Arguments]') return Array.from(iter) | ||
} | ||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } | ||
function _arrayWithoutHoles(arr) { | ||
if (Array.isArray(arr)) { | ||
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { | ||
arr2[i] = arr[i] | ||
} | ||
return arr2 | ||
} | ||
} | ||
var kCombinations = function kCombinations(s, k) { | ||
var set = s; | ||
var set = s | ||
if (typeof set === 'number') { | ||
set = Array.from({ | ||
length: set | ||
}, function (_, i) { | ||
return i; | ||
}); | ||
set = Array.from( | ||
{ | ||
length: set | ||
}, | ||
function(_, i) { | ||
return i | ||
} | ||
) | ||
} | ||
if (k > set.length || k <= 0) { | ||
return []; | ||
return [] | ||
} | ||
if (k === set.length) { | ||
return [set]; | ||
return [set] | ||
} | ||
if (k === 1) { | ||
return set.reduce(function (acc, cur) { | ||
return [].concat(_toConsumableArray(acc), [[cur]]); | ||
}, []); | ||
return set.reduce(function(acc, cur) { | ||
return [].concat(_toConsumableArray(acc), [[cur]]) | ||
}, []) | ||
} | ||
var combs = []; | ||
var tailCombs = []; | ||
var combs = [] | ||
var tailCombs = [] | ||
for (var i = 0; i <= set.length - k + 1; i++) { | ||
tailCombs = kCombinations(set.slice(i + 1), k - 1); | ||
tailCombs = kCombinations(set.slice(i + 1), k - 1) | ||
for (var j = 0; j < tailCombs.length; j++) { | ||
combs.push([set[i]].concat(_toConsumableArray(tailCombs[j]))); | ||
combs.push([set[i]].concat(_toConsumableArray(tailCombs[j]))) | ||
} | ||
} | ||
return combs; | ||
}; | ||
return combs | ||
} | ||
exports.kCombinations = kCombinations; | ||
exports.kCombinations = kCombinations | ||
var thresholdSame = function thresholdSame(arr, t) { | ||
var hashMap = {}; | ||
var hashMap = {} | ||
for (var i = 0; i < arr.length; i++) { | ||
var str = (0, _jsonStableStringify["default"])(arr[i]); | ||
hashMap[str] = hashMap[str] ? hashMap[str] + 1 : 1; | ||
var str = (0, _jsonStableStringify['default'])(arr[i]) | ||
hashMap[str] = hashMap[str] ? hashMap[str] + 1 : 1 | ||
if (hashMap[str] === t) { | ||
return arr[i]; | ||
return arr[i] | ||
} | ||
} | ||
return undefined; | ||
}; | ||
return undefined | ||
} | ||
exports.thresholdSame = thresholdSame; | ||
exports.thresholdSame = thresholdSame | ||
var keyLookup = function keyLookup(endpoints, verifier, verifierId) { | ||
var lookupPromises = endpoints.map(function (x) { | ||
return (0, _httpHelpers.post)(x, (0, _httpHelpers.generateJsonRPCObject)('VerifierLookupRequest', { | ||
verifier: verifier, | ||
verifier_id: verifierId.toString().toLowerCase() | ||
}))["catch"](function (_) { | ||
return undefined; | ||
}); | ||
}); | ||
return (0, _some.Some)(lookupPromises, function (lookupResults) { | ||
var lookupShares = lookupResults.filter(function (x) { | ||
return x; | ||
}); | ||
var errorResult = thresholdSame(lookupShares.map(function (x) { | ||
return x && x.error; | ||
}), ~~(endpoints.length / 2) + 1); | ||
var keyResult = thresholdSame(lookupShares.map(function (x) { | ||
return x && x.result; | ||
}), ~~(endpoints.length / 2) + 1); | ||
var lookupPromises = endpoints.map(function(x) { | ||
return (0, _httpHelpers.post)( | ||
x, | ||
(0, _httpHelpers.generateJsonRPCObject)('VerifierLookupRequest', { | ||
verifier: verifier, | ||
verifier_id: verifierId.toString().toLowerCase() | ||
}) | ||
)['catch'](function(_) { | ||
return undefined | ||
}) | ||
}) | ||
return (0, _some.Some)(lookupPromises, function(lookupResults) { | ||
var lookupShares = lookupResults.filter(function(x) { | ||
return x | ||
}) | ||
var errorResult = thresholdSame( | ||
lookupShares.map(function(x) { | ||
return x && x.error | ||
}), | ||
~~(endpoints.length / 2) + 1 | ||
) | ||
var keyResult = thresholdSame( | ||
lookupShares.map(function(x) { | ||
return x && x.result | ||
}), | ||
~~(endpoints.length / 2) + 1 | ||
) | ||
@@ -106,23 +133,26 @@ if (keyResult || errorResult) { | ||
errorResult: errorResult | ||
}); | ||
}) | ||
} | ||
return Promise.reject(new Error('invalid')); | ||
})["catch"](function (_) { | ||
return undefined; | ||
}); | ||
}; | ||
return Promise.reject(new Error('invalid')) | ||
})['catch'](function(_) { | ||
return undefined | ||
}) | ||
} | ||
exports.keyLookup = keyLookup; | ||
exports.keyLookup = keyLookup | ||
var keyAssign = function keyAssign(endpoints, lastPoint, verifier, verifierId) { | ||
var nodeNum = lastPoint === undefined ? Math.floor(Math.random() * endpoints.length) : lastPoint % endpoints.length; | ||
return (0, _httpHelpers.post)(endpoints[nodeNum], (0, _httpHelpers.generateJsonRPCObject)('KeyAssign', { | ||
verifier: verifier, | ||
verifier_id: verifierId.toString().toLowerCase() | ||
}))["catch"](function (_) { | ||
return keyAssign(endpoints, nodeNum + 1, verifier, verifierId); | ||
}); | ||
}; | ||
var nodeNum = lastPoint === undefined ? Math.floor(Math.random() * endpoints.length) : lastPoint % endpoints.length | ||
return (0, _httpHelpers.post)( | ||
endpoints[nodeNum], | ||
(0, _httpHelpers.generateJsonRPCObject)('KeyAssign', { | ||
verifier: verifier, | ||
verifier_id: verifierId.toString().toLowerCase() | ||
}) | ||
)['catch'](function(_) { | ||
return keyAssign(endpoints, nodeNum + 1, verifier, verifierId) | ||
}) | ||
} | ||
exports.keyAssign = keyAssign; | ||
exports.keyAssign = keyAssign |
@@ -1,3 +0,3 @@ | ||
import Torus from './dist/torus' | ||
const Torus = require('./dist/torus') | ||
export default Torus | ||
module.exports = Torus |
{ | ||
"name": "@toruslabs/torus.js", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"description": "Handle communication with torus nodes", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
32355
749
2