Socket
Socket
Sign inDemoInstall

@toruslabs/rss-client

Package Overview
Dependencies
Maintainers
4
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@toruslabs/rss-client - npm Package Compare versions

Comparing version 1.2.1 to 1.2.2

dist/types/mock.d.ts

793

dist/rssClient-node.js

@@ -54,3 +54,6 @@ /******/ (() => { // webpackBootstrap

__webpack_require__.d(__webpack_exports__, {
"MockServer": () => (/* reexport */ MockServer),
"RSSClient": () => (/* reexport */ RSSClient),
"RSSRound1Handler": () => (/* reexport */ RSSRound1Handler),
"RSSRound2Handler": () => (/* reexport */ RSSRound2Handler),
"decrypt": () => (/* reexport */ decrypt),

@@ -62,2 +65,3 @@ "dotProduct": () => (/* reexport */ dotProduct),

"generatePolynomial": () => (/* reexport */ generatePolynomial),
"getEndpoint": () => (/* reexport */ getEndpoint),
"getLagrangeCoeffs": () => (/* reexport */ getLagrangeCoeffs),

@@ -67,2 +71,3 @@ "getShare": () => (/* reexport */ getShare),

"lagrangeInterpolation": () => (/* reexport */ lagrangeInterpolation),
"postEndpoint": () => (/* reexport */ postEndpoint),
"randomSelection": () => (/* reexport */ randomSelection),

@@ -72,8 +77,2 @@ "recover": () => (/* reexport */ recover)

;// CONCATENATED MODULE: external "@babel/runtime/helpers/slicedToArray"
const slicedToArray_namespaceObject = require("@babel/runtime/helpers/slicedToArray");
var slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/helpers/asyncToGenerator"
const asyncToGenerator_namespaceObject = require("@babel/runtime/helpers/asyncToGenerator");
var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/helpers/classCallCheck"

@@ -88,15 +87,13 @@ const classCallCheck_namespaceObject = require("@babel/runtime/helpers/classCallCheck");

var defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/helpers/asyncToGenerator"
const asyncToGenerator_namespaceObject = require("@babel/runtime/helpers/asyncToGenerator");
var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/regenerator"
const regenerator_namespaceObject = require("@babel/runtime/regenerator");
var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator_namespaceObject);
;// CONCATENATED MODULE: external "@toruslabs/eccrypto"
const eccrypto_namespaceObject = require("@toruslabs/eccrypto");
;// CONCATENATED MODULE: external "@toruslabs/http-helpers"
const http_helpers_namespaceObject = require("@toruslabs/http-helpers");
;// CONCATENATED MODULE: external "bn.js"
const external_bn_js_namespaceObject = require("bn.js");
var external_bn_js_default = /*#__PURE__*/__webpack_require__.n(external_bn_js_namespaceObject);
;// CONCATENATED MODULE: external "loglevel"
const external_loglevel_namespaceObject = require("loglevel");
var external_loglevel_default = /*#__PURE__*/__webpack_require__.n(external_loglevel_namespaceObject);
;// CONCATENATED MODULE: external "@toruslabs/eccrypto"
const eccrypto_namespaceObject = require("@toruslabs/eccrypto");
;// CONCATENATED MODULE: external "elliptic"

@@ -280,2 +277,741 @@ const external_elliptic_namespaceObject = require("elliptic");

}
;// CONCATENATED MODULE: ./src/mock.ts
/* eslint-disable camelcase */
function RSSRound1Handler(_x, _x2) {
return _RSSRound1Handler.apply(this, arguments);
}
function _RSSRound1Handler() {
_RSSRound1Handler = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee7(body, getTSSShare) {
var b, auth, servers_info, finalLagrangeCoeffs, L, _L2, tssServerShare, masterPolys, masterPolyCommits, serverPolys, serverPolyCommits, i, lc, m, s, serverEncs, userEncs, _i4, _i5, masterPoly, serverPoly, serverEnc, j, pub, data, _i6, resp;
return regenerator_default().wrap(function _callee7$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
b = body;
auth = b.auth; // TODO: verify vid (unique label verifierName + verifierID) against vid_sigs (signature from servers on vid)
if (!(b.round_name !== "rss_round_1")) {
_context8.next = 4;
break;
}
throw new Error("incorrect round name");
case 4:
if (!(b.server_set !== "old" && b.server_set !== "new")) {
_context8.next = 6;
break;
}
throw new Error("server set must be either 'old' or 'new'");
case 6:
if (!(!Array.isArray(b.target_index) || b.target_index.filter(function (elem) {
return elem !== 2 && elem !== 3;
}).length > 0)) {
_context8.next = 8;
break;
}
throw new Error("invalid target index, only 2, 3 allowed");
case 8:
if (!(b.old_user_share_index !== 2 && b.old_user_share_index !== 3)) {
_context8.next = 10;
break;
}
throw new Error("invalid index for user share");
case 10:
if (b.server_set === "old") {
servers_info = b.old_servers_info;
} else {
servers_info = b.new_servers_info;
}
// TODO: check old and new server pubkeys independently, against the registered node list
// TODO: check server_index independently, against the registered node list
if (!(b.server_index <= 0 || b.server_index > servers_info.pubkeys.length)) {
_context8.next = 13;
break;
}
throw new Error("server index out of bounds");
case 13:
if (!(servers_info.selected.filter(function (selectedIndex) {
return selectedIndex <= 0 || b.server_index > servers_info.pubkeys.length;
}).length > 0)) {
_context8.next = 15;
break;
}
throw new Error("selected indexes out of bounds");
case 15:
if (!(servers_info.selected.indexOf(b.server_index) === -1)) {
_context8.next = 17;
break;
}
throw new Error("unselected server, should not have received rss round 1 message");
case 17:
if (b.server_set === "old") {
// firstly, calculate lagrange coefficient for own server sharing poly
L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
L = L.mul(getLagrangeCoeffs([1, b.old_user_share_index], 1, 0)).umod(ecCurve.n);
// thirdly, calculate lagrange coefficient for new master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return L.mul(getLagrangeCoeffs([0, 1], 0, target)).umod(ecCurve.n);
});
} else {
// firstly, calculate lagrange coefficient for own server sharing poly
_L2 = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return _L2.mul(getLagrangeCoeffs([0, 1], 1, target)).umod(ecCurve.n);
});
}
// retrieve server tss subshare from db
_context8.next = 20;
return getTSSShare(auth.label);
case 20:
tssServerShare = _context8.sent;
masterPolys = [];
masterPolyCommits = [];
serverPolys = [];
serverPolyCommits = [];
for (i = 0; i < finalLagrangeCoeffs.length; i++) {
lc = finalLagrangeCoeffs[i];
m = generatePolynomial(1, lc.mul(tssServerShare).umod(ecCurve.n));
masterPolys.push(m);
masterPolyCommits.push(m.map(function (coeff) {
var gCoeff = ecCurve.g.mul(coeff);
return hexPoint(gCoeff);
}));
s = generatePolynomial(b.new_servers_info.threshold - 1, getShare(m, 1));
serverPolys.push(s);
serverPolyCommits.push(s.map(function (coeff) {
return hexPoint(ecCurve.g.mul(coeff));
}));
}
serverEncs = [];
userEncs = [];
for (_i4 = 0; _i4 < masterPolys.length; _i4++) {
serverEncs.push([]); // for each target_index, create an array of server encryptions
}
// generate N + 1 shares
_i5 = 0;
case 30:
if (!(_i5 < b.target_index.length)) {
_context8.next = 53;
break;
}
masterPoly = masterPolys[_i5];
_context8.t0 = userEncs;
_context8.next = 35;
return encrypt(Buffer.from("04".concat(b.user_temp_pubkey.x.padStart(64, "0")).concat(b.user_temp_pubkey.y.padStart(64, "0")), "hex"), Buffer.from(getShare(masterPoly, 2).toString(16, 64), "hex"));
case 35:
_context8.t1 = _context8.sent;
_context8.t0.push.call(_context8.t0, _context8.t1);
serverPoly = serverPolys[_i5];
serverEnc = serverEncs[_i5];
j = 0;
case 40:
if (!(j < b.new_servers_info.pubkeys.length)) {
_context8.next = 50;
break;
}
pub = b.new_servers_info.pubkeys[j];
_context8.t2 = serverEnc;
_context8.next = 45;
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(getShare(serverPoly, j + 1).toString(16, 64), "hex"));
case 45:
_context8.t3 = _context8.sent;
_context8.t2.push.call(_context8.t2, _context8.t3);
case 47:
j++;
_context8.next = 40;
break;
case 50:
_i5++;
_context8.next = 30;
break;
case 53:
data = [];
for (_i6 = 0; _i6 < b.target_index.length; _i6++) {
data.push({
master_poly_commits: masterPolyCommits[_i6],
server_poly_commits: serverPolyCommits[_i6],
target_encryptions: {
user_enc: userEncs[_i6],
server_encs: serverEncs[_i6]
}
});
}
resp = {
target_index: b.target_index,
data: data
};
return _context8.abrupt("return", resp);
case 57:
case "end":
return _context8.stop();
}
}
}, _callee7);
}));
return _RSSRound1Handler.apply(this, arguments);
}
function RSSRound2Handler(_x3, _x4) {
return _RSSRound2Handler.apply(this, arguments);
}
function _RSSRound2Handler() {
_RSSRound2Handler = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee8(body, getPrivKey) {
var b, privKey, privKeyHex, privKeyBuf, data, _loop2, i, resp;
return regenerator_default().wrap(function _callee8$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
b = body;
_context10.next = 3;
return getPrivKey();
case 3:
privKey = _context10.sent;
privKeyHex = privKey.toString(16, 64);
privKeyBuf = Buffer.from(privKeyHex, "hex");
data = [];
if (!(b.round_name !== "rss_round_2")) {
_context10.next = 9;
break;
}
throw new Error("incorrect round name");
case 9:
_loop2 = /*#__PURE__*/regenerator_default().mark(function _loop2(i) {
var factorPubs, masterCommits, serverCommits, gB0, _gB0, encs, decs, dec, gDec, _gDec, j, gBX, ind, factorEncs;
return regenerator_default().wrap(function _loop2$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
factorPubs = b.data[i].factor_pubkeys; // TODO: check that the same factorPub is not used for multiple shares
masterCommits = b.data[i].master_commits.map(ecPoint);
serverCommits = b.data[i].server_commits.map(ecPoint);
gB0 = masterCommits[0].add(masterCommits[1]);
_gB0 = serverCommits[0];
if (!(!gB0.x.eq(_gB0.x) || !gB0.y.eq(_gB0.y))) {
_context9.next = 7;
break;
}
throw new Error("server sharing poly commits are inconsistent with master sharing poly commits");
case 7:
encs = b.data[i].server_encs;
_context9.next = 10;
return Promise.all(encs.map(function (enc) {
return decrypt(privKeyBuf, enc);
}));
case 10:
decs = _context9.sent;
dec = decs.reduce(function (acc, dBuf) {
var dBN = new (external_bn_js_default())(dBuf);
return acc.add(dBN).umod(ecCurve.n);
}, new (external_bn_js_default())(0));
gDec = ecCurve.g.mul(dec);
_gDec = serverCommits[0];
for (j = 1; j < serverCommits.length; j++) {
gBX = serverCommits[j];
ind = new (external_bn_js_default())(b.server_index);
_gDec = _gDec.add(gBX.mul(ind.pow(new (external_bn_js_default())(j))));
}
if (!(!gDec.x.eq(_gDec.x) || !gDec.y.eq(_gDec.y))) {
_context9.next = 17;
break;
}
throw new Error("shares are inconsistent with the server poly commits");
case 17:
_context9.next = 19;
return Promise.all(factorPubs.map(function (pub) {
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(dec.toString(16, 64), "hex"));
}));
case 19:
factorEncs = _context9.sent;
data.push({
encs: factorEncs
});
case 21:
case "end":
return _context9.stop();
}
}
}, _loop2);
});
i = 0;
case 11:
if (!(i < b.data.length)) {
_context10.next = 16;
break;
}
return _context10.delegateYield(_loop2(i), "t0", 13);
case 13:
i++;
_context10.next = 11;
break;
case 16:
resp = {
data: data,
target_index: b.target_index
};
return _context10.abrupt("return", resp);
case 18:
case "end":
return _context10.stop();
}
}
}, _callee8);
}));
return _RSSRound2Handler.apply(this, arguments);
}
var MockServer = /*#__PURE__*/function () {
function MockServer() {
classCallCheck_default()(this, MockServer);
defineProperty_default()(this, "pubKey", void 0);
defineProperty_default()(this, "shareDB", void 0);
defineProperty_default()(this, "store", void 0);
defineProperty_default()(this, "tssNonce", void 0);
this.shareDB = {};
this.store = {};
this.tssNonce = {};
}
createClass_default()(MockServer, [{
key: "getTSSShare",
value: function () {
var _getTSSShare = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee(label) {
return regenerator_default().wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", this.shareDB[label]);
case 1:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function getTSSShare(_x5) {
return _getTSSShare.apply(this, arguments);
}
return getTSSShare;
}()
}, {
key: "getPrivKey",
value: function () {
var _getPrivKey = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee2() {
return regenerator_default().wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt("return", new (external_bn_js_default())(this.store.privKey.padStart(64, "0"), "hex"));
case 1:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function getPrivKey() {
return _getPrivKey.apply(this, arguments);
}
return getPrivKey;
}()
}, {
key: "get",
value: function () {
var _get = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee3(path) {
return regenerator_default().wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (!(path === "/test")) {
_context3.next = 2;
break;
}
return _context3.abrupt("return", {});
case 2:
if (!(path === "/public_key")) {
_context3.next = 4;
break;
}
return _context3.abrupt("return", this.pubKey);
case 4:
throw new Error("unknown get path ".concat(path));
case 5:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function get(_x6) {
return _get.apply(this, arguments);
}
return get;
}()
}, {
key: "post",
value: function () {
var _post = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee4(path, data) {
var label, tssShareHex, privKey, vid, tssTag, _vid, _tssTag, tssNonce;
return regenerator_default().wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
label = data.label, tssShareHex = data.tss_share_hex;
if (!(path === "/tss_share")) {
_context4.next = 4;
break;
}
this.shareDB[label] = new (external_bn_js_default())(tssShareHex.padStart(64, "0"), "hex");
return _context4.abrupt("return", {});
case 4:
if (!(path === "/private_key")) {
_context4.next = 8;
break;
}
privKey = data.private_key;
this.store.privKey = privKey;
return _context4.abrupt("return", {});
case 8:
if (!(path === "/get_tss_nonce")) {
_context4.next = 11;
break;
}
vid = data.vid, tssTag = data.tssTag;
return _context4.abrupt("return", {
tss_nonce: this.tssNonce["".concat(vid, "\x15").concat(tssTag)]
});
case 11:
if (!(path === "/set_tss_nonce")) {
_context4.next = 15;
break;
}
_vid = data.vid, _tssTag = data.tssTag, tssNonce = data.tssNonce;
this.tssNonce["".concat(_vid, "\x15").concat(_tssTag)] = tssNonce;
return _context4.abrupt("return", {});
case 15:
if (!(path === "/rss_round_1")) {
_context4.next = 17;
break;
}
return _context4.abrupt("return", RSSRound1Handler(data, this.getTSSShare.bind(this)));
case 17:
if (!(path === "/rss_round_2")) {
_context4.next = 19;
break;
}
return _context4.abrupt("return", RSSRound2Handler(data, this.getPrivKey.bind(this)));
case 19:
throw new Error("unknown post path ".concat(path));
case 20:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function post(_x7, _x8) {
return _post.apply(this, arguments);
}
return post;
}()
}, {
key: "RSSRound1Handler",
value: function () {
var _RSSRound1Handler2 = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee5(body, getTSSShare) {
var b, auth, servers_info, finalLagrangeCoeffs, L, _L, tssServerShare, masterPolys, masterPolyCommits, serverPolys, serverPolyCommits, i, lc, m, s, serverEncs, userEncs, _i, _i2, masterPoly, serverPoly, serverEnc, j, pub, data, _i3, resp;
return regenerator_default().wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
b = body;
auth = b.auth; // TODO: verify vid (unique label verifierName + verifierID) against vid_sigs (signature from servers on vid)
if (!(b.round_name !== "rss_round_1")) {
_context5.next = 4;
break;
}
throw new Error("incorrect round name");
case 4:
if (!(b.server_set !== "old" && b.server_set !== "new")) {
_context5.next = 6;
break;
}
throw new Error("server set must be either 'old' or 'new'");
case 6:
if (!(!Array.isArray(b.target_index) || b.target_index.filter(function (elem) {
return elem !== 2 && elem !== 3;
}).length > 0)) {
_context5.next = 8;
break;
}
throw new Error("invalid target index, only 2, 3 allowed");
case 8:
if (!(b.old_user_share_index !== 2 && b.old_user_share_index !== 3)) {
_context5.next = 10;
break;
}
throw new Error("invalid index for user share");
case 10:
if (b.server_set === "old") {
servers_info = b.old_servers_info;
} else {
servers_info = b.new_servers_info;
}
// TODO: check old and new server pubkeys independently, against the registered node list
// TODO: check server_index independently, against the registered node list
if (!(b.server_index <= 0 || b.server_index > servers_info.pubkeys.length)) {
_context5.next = 13;
break;
}
throw new Error("server index out of bounds");
case 13:
if (!(servers_info.selected.filter(function (selectedIndex) {
return selectedIndex <= 0 || b.server_index > servers_info.pubkeys.length;
}).length > 0)) {
_context5.next = 15;
break;
}
throw new Error("selected indexes out of bounds");
case 15:
if (!(servers_info.selected.indexOf(b.server_index) === -1)) {
_context5.next = 17;
break;
}
throw new Error("unselected server, should not have received rss round 1 message");
case 17:
if (b.server_set === "old") {
// firstly, calculate lagrange coefficient for own server sharing poly
L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
L = L.mul(getLagrangeCoeffs([1, b.old_user_share_index], 1, 0)).umod(ecCurve.n);
// thirdly, calculate lagrange coefficient for new master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return L.mul(getLagrangeCoeffs([0, 1], 0, target)).umod(ecCurve.n);
});
} else {
// firstly, calculate lagrange coefficient for own server sharing poly
_L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return _L.mul(getLagrangeCoeffs([0, 1], 1, target)).umod(ecCurve.n);
});
}
// retrieve server tss subshare from db
_context5.next = 20;
return getTSSShare(auth.label);
case 20:
tssServerShare = _context5.sent;
masterPolys = [];
masterPolyCommits = [];
serverPolys = [];
serverPolyCommits = [];
for (i = 0; i < finalLagrangeCoeffs.length; i++) {
lc = finalLagrangeCoeffs[i];
m = generatePolynomial(1, lc.mul(tssServerShare).umod(ecCurve.n));
masterPolys.push(m);
masterPolyCommits.push(m.map(function (coeff) {
var gCoeff = ecCurve.g.mul(coeff);
return hexPoint(gCoeff);
}));
s = generatePolynomial(b.new_servers_info.threshold - 1, getShare(m, 1));
serverPolys.push(s);
serverPolyCommits.push(s.map(function (coeff) {
return hexPoint(ecCurve.g.mul(coeff));
}));
}
serverEncs = [];
userEncs = [];
for (_i = 0; _i < masterPolys.length; _i++) {
serverEncs.push([]); // for each target_index, create an array of server encryptions
}
// generate N + 1 shares
_i2 = 0;
case 30:
if (!(_i2 < b.target_index.length)) {
_context5.next = 53;
break;
}
masterPoly = masterPolys[_i2];
_context5.t0 = userEncs;
_context5.next = 35;
return encrypt(Buffer.from("04".concat(b.user_temp_pubkey.x.padStart(64, "0")).concat(b.user_temp_pubkey.y.padStart(64, "0")), "hex"), Buffer.from(getShare(masterPoly, 2).toString(16, 64), "hex"));
case 35:
_context5.t1 = _context5.sent;
_context5.t0.push.call(_context5.t0, _context5.t1);
serverPoly = serverPolys[_i2];
serverEnc = serverEncs[_i2];
j = 0;
case 40:
if (!(j < b.new_servers_info.pubkeys.length)) {
_context5.next = 50;
break;
}
pub = b.new_servers_info.pubkeys[j];
_context5.t2 = serverEnc;
_context5.next = 45;
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(getShare(serverPoly, j + 1).toString(16, 64), "hex"));
case 45:
_context5.t3 = _context5.sent;
_context5.t2.push.call(_context5.t2, _context5.t3);
case 47:
j++;
_context5.next = 40;
break;
case 50:
_i2++;
_context5.next = 30;
break;
case 53:
data = [];
for (_i3 = 0; _i3 < b.target_index.length; _i3++) {
data.push({
master_poly_commits: masterPolyCommits[_i3],
server_poly_commits: serverPolyCommits[_i3],
target_encryptions: {
user_enc: userEncs[_i3],
server_encs: serverEncs[_i3]
}
});
}
resp = {
target_index: b.target_index,
data: data
};
return _context5.abrupt("return", resp);
case 57:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
function RSSRound1Handler(_x9, _x10) {
return _RSSRound1Handler2.apply(this, arguments);
}
return RSSRound1Handler;
}()
}, {
key: "RSSRound2Handler",
value: function () {
var _RSSRound2Handler2 = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee6(body, getPrivKey) {
var b, privKey, privKeyHex, privKeyBuf, data, _loop, i, resp;
return regenerator_default().wrap(function _callee6$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
b = body;
_context7.next = 3;
return getPrivKey();
case 3:
privKey = _context7.sent;
privKeyHex = privKey.toString(16, 64);
privKeyBuf = Buffer.from(privKeyHex, "hex");
data = [];
if (!(b.round_name !== "rss_round_2")) {
_context7.next = 9;
break;
}
throw new Error("incorrect round name");
case 9:
_loop = /*#__PURE__*/regenerator_default().mark(function _loop(i) {
var factorPubs, masterCommits, serverCommits, gB0, _gB0, encs, decs, dec, gDec, _gDec, j, gBX, ind, factorEncs;
return regenerator_default().wrap(function _loop$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
factorPubs = b.data[i].factor_pubkeys; // TODO: check that the same factorPub is not used for multiple shares
masterCommits = b.data[i].master_commits.map(ecPoint);
serverCommits = b.data[i].server_commits.map(ecPoint);
gB0 = masterCommits[0].add(masterCommits[1]);
_gB0 = serverCommits[0];
if (!(!gB0.x.eq(_gB0.x) || !gB0.y.eq(_gB0.y))) {
_context6.next = 7;
break;
}
throw new Error("server sharing poly commits are inconsistent with master sharing poly commits");
case 7:
encs = b.data[i].server_encs;
_context6.next = 10;
return Promise.all(encs.map(function (enc) {
return decrypt(privKeyBuf, enc);
}));
case 10:
decs = _context6.sent;
dec = decs.reduce(function (acc, dBuf) {
var dBN = new (external_bn_js_default())(dBuf);
return acc.add(dBN).umod(ecCurve.n);
}, new (external_bn_js_default())(0));
gDec = ecCurve.g.mul(dec);
_gDec = serverCommits[0];
for (j = 1; j < serverCommits.length; j++) {
gBX = serverCommits[j];
ind = new (external_bn_js_default())(b.server_index);
_gDec = _gDec.add(gBX.mul(ind.pow(new (external_bn_js_default())(j))));
}
if (!(!gDec.x.eq(_gDec.x) || !gDec.y.eq(_gDec.y))) {
_context6.next = 17;
break;
}
throw new Error("shares are inconsistent with the server poly commits");
case 17:
_context6.next = 19;
return Promise.all(factorPubs.map(function (pub) {
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(dec.toString(16, 64), "hex"));
}));
case 19:
factorEncs = _context6.sent;
data.push({
encs: factorEncs
});
case 21:
case "end":
return _context6.stop();
}
}
}, _loop);
});
i = 0;
case 11:
if (!(i < b.data.length)) {
_context7.next = 16;
break;
}
return _context7.delegateYield(_loop(i), "t0", 13);
case 13:
i++;
_context7.next = 11;
break;
case 16:
resp = {
data: data,
target_index: b.target_index
};
return _context7.abrupt("return", resp);
case 18:
case "end":
return _context7.stop();
}
}
}, _callee6);
}));
function RSSRound2Handler(_x11, _x12) {
return _RSSRound2Handler2.apply(this, arguments);
}
return RSSRound2Handler;
}()
}]);
return MockServer;
}();
;// CONCATENATED MODULE: external "@babel/runtime/helpers/slicedToArray"
const slicedToArray_namespaceObject = require("@babel/runtime/helpers/slicedToArray");
var slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray_namespaceObject);
;// CONCATENATED MODULE: external "@toruslabs/http-helpers"
const http_helpers_namespaceObject = require("@toruslabs/http-helpers");
;// CONCATENATED MODULE: external "loglevel"
const external_loglevel_namespaceObject = require("loglevel");
var external_loglevel_default = /*#__PURE__*/__webpack_require__.n(external_loglevel_namespaceObject);
;// CONCATENATED MODULE: ./src/rss.ts

@@ -293,2 +1029,14 @@

function getEndpoint(endpoint, path, options_, customOptions) {
if (typeof endpoint === "string") {
return (0,http_helpers_namespaceObject.get)("".concat(endpoint).concat(path), options_, customOptions);
}
return endpoint.get(path);
}
function postEndpoint(endpoint, path, data, options_, customOptions) {
if (typeof endpoint === "string") {
return (0,http_helpers_namespaceObject.post)("".concat(endpoint).concat(path), data, options_, customOptions);
}
return endpoint.post(path, data);
}
var RSSClient = /*#__PURE__*/function () {

@@ -320,3 +1068,3 @@ function RSSClient(opts) {

var _this = this;
var targetIndexes, inputIndex, selectedServers, vid1, vid2, vidSigs, dkgNewPub, inputShare, factorPubs, serversInfo, rssRound1Proms, _L, _finalLagrangeCoeffs, _masterPolys, _masterPolyCommits, _serverPolys, _serverPolyCommits, i, _lc, _m, _s, _serverEncs, _userEncs, _i, _i2, _masterPoly, _serverPoly, _serverEnc, j, _pub, _data, _i3, rssRound1Responses, sums, privKeyBuffer, userShares, _loop2, _i4, userFactorEncs, serverEncs, serverIndexes, serverFactorEncs, factorEncs, _loop3, _i5;
var targetIndexes, inputIndex, selectedServers, oldLabel, newLabel, sigs, dkgNewPub, inputShare, factorPubs, serversInfo, rssRound1Proms, _L, _finalLagrangeCoeffs, _masterPolys, _masterPolyCommits, _serverPolys, _serverPolyCommits, i, _lc, _m, _s, _serverEncs, _userEncs, _i, _i2, _masterPoly, _serverPoly, _serverEnc, j, _pub, _data, _i3, rssRound1Responses, sums, privKeyBuffer, userShares, _loop2, _i4, userFactorEncs, serverEncs, serverIndexes, serverFactorEncs, factorEncs, _loop3, _i5;
return regenerator_default().wrap(function _callee$(_context2) {

@@ -326,3 +1074,3 @@ while (1) {

case 0:
targetIndexes = opts.targetIndexes, inputIndex = opts.inputIndex, selectedServers = opts.selectedServers, vid1 = opts.vid1, vid2 = opts.vid2, vidSigs = opts.vidSigs, dkgNewPub = opts.dkgNewPub, inputShare = opts.inputShare, factorPubs = opts.factorPubs;
targetIndexes = opts.targetIndexes, inputIndex = opts.inputIndex, selectedServers = opts.selectedServers, oldLabel = opts.oldLabel, newLabel = opts.newLabel, sigs = opts.sigs, dkgNewPub = opts.dkgNewPub, inputShare = opts.inputShare, factorPubs = opts.factorPubs;
if (!(factorPubs.length !== targetIndexes.length)) {

@@ -341,3 +1089,3 @@ _context2.next = 3;

var serverEndpoint = _this.serverEndpoints[ind - 1];
return (0,http_helpers_namespaceObject.post)("".concat(serverEndpoint, "/rss_round_1"), {
return postEndpoint(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -352,4 +1100,4 @@ server_set: "old",

auth: {
vid: vid1,
vidSigs: vidSigs
label: oldLabel,
sigs: sigs
}

@@ -359,3 +1107,3 @@ });

var serverEndpoint = _this.serverEndpoints[ind - 1];
return (0,http_helpers_namespaceObject.post)("".concat(serverEndpoint, "/rss_round_1"), {
return postEndpoint(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -370,5 +1118,5 @@ server_set: "new",

auth: {
vid: vid2,
label: newLabel,
// TODO: undesigned
vidSigs: vidSigs
sigs: sigs
}

@@ -616,3 +1364,3 @@ });

var serverEndpoint = _this.serverEndpoints[ind - 1];
return (0,http_helpers_namespaceObject.post)("".concat(serverEndpoint, "/rss_round_2"), {
return postEndpoint(serverEndpoint, "/rss_round_2", {
round_name: "rss_round_2",

@@ -711,2 +1459,3 @@ server_index: ind,

module.exports = __webpack_exports__;

@@ -713,0 +1462,0 @@ /******/ })()

@@ -54,3 +54,6 @@ /******/ (() => { // webpackBootstrap

__webpack_require__.d(__webpack_exports__, {
"MockServer": () => (/* reexport */ MockServer),
"RSSClient": () => (/* reexport */ RSSClient),
"RSSRound1Handler": () => (/* reexport */ RSSRound1Handler),
"RSSRound2Handler": () => (/* reexport */ RSSRound2Handler),
"decrypt": () => (/* reexport */ decrypt),

@@ -62,2 +65,3 @@ "dotProduct": () => (/* reexport */ dotProduct),

"generatePolynomial": () => (/* reexport */ generatePolynomial),
"getEndpoint": () => (/* reexport */ getEndpoint),
"getLagrangeCoeffs": () => (/* reexport */ getLagrangeCoeffs),

@@ -67,2 +71,3 @@ "getShare": () => (/* reexport */ getShare),

"lagrangeInterpolation": () => (/* reexport */ lagrangeInterpolation),
"postEndpoint": () => (/* reexport */ postEndpoint),
"randomSelection": () => (/* reexport */ randomSelection),

@@ -72,8 +77,2 @@ "recover": () => (/* reexport */ recover)

;// CONCATENATED MODULE: external "@babel/runtime/helpers/slicedToArray"
const slicedToArray_namespaceObject = require("@babel/runtime/helpers/slicedToArray");
var slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/helpers/asyncToGenerator"
const asyncToGenerator_namespaceObject = require("@babel/runtime/helpers/asyncToGenerator");
var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/helpers/classCallCheck"

@@ -88,15 +87,13 @@ const classCallCheck_namespaceObject = require("@babel/runtime/helpers/classCallCheck");

var defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/helpers/asyncToGenerator"
const asyncToGenerator_namespaceObject = require("@babel/runtime/helpers/asyncToGenerator");
var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator_namespaceObject);
;// CONCATENATED MODULE: external "@babel/runtime/regenerator"
const regenerator_namespaceObject = require("@babel/runtime/regenerator");
var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator_namespaceObject);
;// CONCATENATED MODULE: external "@toruslabs/eccrypto"
const eccrypto_namespaceObject = require("@toruslabs/eccrypto");
;// CONCATENATED MODULE: external "@toruslabs/http-helpers"
const http_helpers_namespaceObject = require("@toruslabs/http-helpers");
;// CONCATENATED MODULE: external "bn.js"
const external_bn_js_namespaceObject = require("bn.js");
var external_bn_js_default = /*#__PURE__*/__webpack_require__.n(external_bn_js_namespaceObject);
;// CONCATENATED MODULE: external "loglevel"
const external_loglevel_namespaceObject = require("loglevel");
var external_loglevel_default = /*#__PURE__*/__webpack_require__.n(external_loglevel_namespaceObject);
;// CONCATENATED MODULE: external "@toruslabs/eccrypto"
const eccrypto_namespaceObject = require("@toruslabs/eccrypto");
;// CONCATENATED MODULE: external "elliptic"

@@ -280,2 +277,741 @@ const external_elliptic_namespaceObject = require("elliptic");

}
;// CONCATENATED MODULE: ./src/mock.ts
/* eslint-disable camelcase */
function RSSRound1Handler(_x, _x2) {
return _RSSRound1Handler.apply(this, arguments);
}
function _RSSRound1Handler() {
_RSSRound1Handler = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee7(body, getTSSShare) {
var b, auth, servers_info, finalLagrangeCoeffs, L, _L2, tssServerShare, masterPolys, masterPolyCommits, serverPolys, serverPolyCommits, i, lc, m, s, serverEncs, userEncs, _i4, _i5, masterPoly, serverPoly, serverEnc, j, pub, data, _i6, resp;
return regenerator_default().wrap(function _callee7$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
b = body;
auth = b.auth; // TODO: verify vid (unique label verifierName + verifierID) against vid_sigs (signature from servers on vid)
if (!(b.round_name !== "rss_round_1")) {
_context8.next = 4;
break;
}
throw new Error("incorrect round name");
case 4:
if (!(b.server_set !== "old" && b.server_set !== "new")) {
_context8.next = 6;
break;
}
throw new Error("server set must be either 'old' or 'new'");
case 6:
if (!(!Array.isArray(b.target_index) || b.target_index.filter(function (elem) {
return elem !== 2 && elem !== 3;
}).length > 0)) {
_context8.next = 8;
break;
}
throw new Error("invalid target index, only 2, 3 allowed");
case 8:
if (!(b.old_user_share_index !== 2 && b.old_user_share_index !== 3)) {
_context8.next = 10;
break;
}
throw new Error("invalid index for user share");
case 10:
if (b.server_set === "old") {
servers_info = b.old_servers_info;
} else {
servers_info = b.new_servers_info;
}
// TODO: check old and new server pubkeys independently, against the registered node list
// TODO: check server_index independently, against the registered node list
if (!(b.server_index <= 0 || b.server_index > servers_info.pubkeys.length)) {
_context8.next = 13;
break;
}
throw new Error("server index out of bounds");
case 13:
if (!(servers_info.selected.filter(function (selectedIndex) {
return selectedIndex <= 0 || b.server_index > servers_info.pubkeys.length;
}).length > 0)) {
_context8.next = 15;
break;
}
throw new Error("selected indexes out of bounds");
case 15:
if (!(servers_info.selected.indexOf(b.server_index) === -1)) {
_context8.next = 17;
break;
}
throw new Error("unselected server, should not have received rss round 1 message");
case 17:
if (b.server_set === "old") {
// firstly, calculate lagrange coefficient for own server sharing poly
L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
L = L.mul(getLagrangeCoeffs([1, b.old_user_share_index], 1, 0)).umod(ecCurve.n);
// thirdly, calculate lagrange coefficient for new master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return L.mul(getLagrangeCoeffs([0, 1], 0, target)).umod(ecCurve.n);
});
} else {
// firstly, calculate lagrange coefficient for own server sharing poly
_L2 = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return _L2.mul(getLagrangeCoeffs([0, 1], 1, target)).umod(ecCurve.n);
});
}
// retrieve server tss subshare from db
_context8.next = 20;
return getTSSShare(auth.label);
case 20:
tssServerShare = _context8.sent;
masterPolys = [];
masterPolyCommits = [];
serverPolys = [];
serverPolyCommits = [];
for (i = 0; i < finalLagrangeCoeffs.length; i++) {
lc = finalLagrangeCoeffs[i];
m = generatePolynomial(1, lc.mul(tssServerShare).umod(ecCurve.n));
masterPolys.push(m);
masterPolyCommits.push(m.map(function (coeff) {
var gCoeff = ecCurve.g.mul(coeff);
return hexPoint(gCoeff);
}));
s = generatePolynomial(b.new_servers_info.threshold - 1, getShare(m, 1));
serverPolys.push(s);
serverPolyCommits.push(s.map(function (coeff) {
return hexPoint(ecCurve.g.mul(coeff));
}));
}
serverEncs = [];
userEncs = [];
for (_i4 = 0; _i4 < masterPolys.length; _i4++) {
serverEncs.push([]); // for each target_index, create an array of server encryptions
}
// generate N + 1 shares
_i5 = 0;
case 30:
if (!(_i5 < b.target_index.length)) {
_context8.next = 53;
break;
}
masterPoly = masterPolys[_i5];
_context8.t0 = userEncs;
_context8.next = 35;
return encrypt(Buffer.from("04".concat(b.user_temp_pubkey.x.padStart(64, "0")).concat(b.user_temp_pubkey.y.padStart(64, "0")), "hex"), Buffer.from(getShare(masterPoly, 2).toString(16, 64), "hex"));
case 35:
_context8.t1 = _context8.sent;
_context8.t0.push.call(_context8.t0, _context8.t1);
serverPoly = serverPolys[_i5];
serverEnc = serverEncs[_i5];
j = 0;
case 40:
if (!(j < b.new_servers_info.pubkeys.length)) {
_context8.next = 50;
break;
}
pub = b.new_servers_info.pubkeys[j];
_context8.t2 = serverEnc;
_context8.next = 45;
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(getShare(serverPoly, j + 1).toString(16, 64), "hex"));
case 45:
_context8.t3 = _context8.sent;
_context8.t2.push.call(_context8.t2, _context8.t3);
case 47:
j++;
_context8.next = 40;
break;
case 50:
_i5++;
_context8.next = 30;
break;
case 53:
data = [];
for (_i6 = 0; _i6 < b.target_index.length; _i6++) {
data.push({
master_poly_commits: masterPolyCommits[_i6],
server_poly_commits: serverPolyCommits[_i6],
target_encryptions: {
user_enc: userEncs[_i6],
server_encs: serverEncs[_i6]
}
});
}
resp = {
target_index: b.target_index,
data: data
};
return _context8.abrupt("return", resp);
case 57:
case "end":
return _context8.stop();
}
}
}, _callee7);
}));
return _RSSRound1Handler.apply(this, arguments);
}
function RSSRound2Handler(_x3, _x4) {
return _RSSRound2Handler.apply(this, arguments);
}
function _RSSRound2Handler() {
_RSSRound2Handler = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee8(body, getPrivKey) {
var b, privKey, privKeyHex, privKeyBuf, data, _loop2, i, resp;
return regenerator_default().wrap(function _callee8$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
b = body;
_context10.next = 3;
return getPrivKey();
case 3:
privKey = _context10.sent;
privKeyHex = privKey.toString(16, 64);
privKeyBuf = Buffer.from(privKeyHex, "hex");
data = [];
if (!(b.round_name !== "rss_round_2")) {
_context10.next = 9;
break;
}
throw new Error("incorrect round name");
case 9:
_loop2 = /*#__PURE__*/regenerator_default().mark(function _loop2(i) {
var factorPubs, masterCommits, serverCommits, gB0, _gB0, encs, decs, dec, gDec, _gDec, j, gBX, ind, factorEncs;
return regenerator_default().wrap(function _loop2$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
factorPubs = b.data[i].factor_pubkeys; // TODO: check that the same factorPub is not used for multiple shares
masterCommits = b.data[i].master_commits.map(ecPoint);
serverCommits = b.data[i].server_commits.map(ecPoint);
gB0 = masterCommits[0].add(masterCommits[1]);
_gB0 = serverCommits[0];
if (!(!gB0.x.eq(_gB0.x) || !gB0.y.eq(_gB0.y))) {
_context9.next = 7;
break;
}
throw new Error("server sharing poly commits are inconsistent with master sharing poly commits");
case 7:
encs = b.data[i].server_encs;
_context9.next = 10;
return Promise.all(encs.map(function (enc) {
return decrypt(privKeyBuf, enc);
}));
case 10:
decs = _context9.sent;
dec = decs.reduce(function (acc, dBuf) {
var dBN = new (external_bn_js_default())(dBuf);
return acc.add(dBN).umod(ecCurve.n);
}, new (external_bn_js_default())(0));
gDec = ecCurve.g.mul(dec);
_gDec = serverCommits[0];
for (j = 1; j < serverCommits.length; j++) {
gBX = serverCommits[j];
ind = new (external_bn_js_default())(b.server_index);
_gDec = _gDec.add(gBX.mul(ind.pow(new (external_bn_js_default())(j))));
}
if (!(!gDec.x.eq(_gDec.x) || !gDec.y.eq(_gDec.y))) {
_context9.next = 17;
break;
}
throw new Error("shares are inconsistent with the server poly commits");
case 17:
_context9.next = 19;
return Promise.all(factorPubs.map(function (pub) {
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(dec.toString(16, 64), "hex"));
}));
case 19:
factorEncs = _context9.sent;
data.push({
encs: factorEncs
});
case 21:
case "end":
return _context9.stop();
}
}
}, _loop2);
});
i = 0;
case 11:
if (!(i < b.data.length)) {
_context10.next = 16;
break;
}
return _context10.delegateYield(_loop2(i), "t0", 13);
case 13:
i++;
_context10.next = 11;
break;
case 16:
resp = {
data: data,
target_index: b.target_index
};
return _context10.abrupt("return", resp);
case 18:
case "end":
return _context10.stop();
}
}
}, _callee8);
}));
return _RSSRound2Handler.apply(this, arguments);
}
var MockServer = /*#__PURE__*/function () {
function MockServer() {
classCallCheck_default()(this, MockServer);
defineProperty_default()(this, "pubKey", void 0);
defineProperty_default()(this, "shareDB", void 0);
defineProperty_default()(this, "store", void 0);
defineProperty_default()(this, "tssNonce", void 0);
this.shareDB = {};
this.store = {};
this.tssNonce = {};
}
createClass_default()(MockServer, [{
key: "getTSSShare",
value: function () {
var _getTSSShare = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee(label) {
return regenerator_default().wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", this.shareDB[label]);
case 1:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function getTSSShare(_x5) {
return _getTSSShare.apply(this, arguments);
}
return getTSSShare;
}()
}, {
key: "getPrivKey",
value: function () {
var _getPrivKey = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee2() {
return regenerator_default().wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt("return", new (external_bn_js_default())(this.store.privKey.padStart(64, "0"), "hex"));
case 1:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function getPrivKey() {
return _getPrivKey.apply(this, arguments);
}
return getPrivKey;
}()
}, {
key: "get",
value: function () {
var _get = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee3(path) {
return regenerator_default().wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (!(path === "/test")) {
_context3.next = 2;
break;
}
return _context3.abrupt("return", {});
case 2:
if (!(path === "/public_key")) {
_context3.next = 4;
break;
}
return _context3.abrupt("return", this.pubKey);
case 4:
throw new Error("unknown get path ".concat(path));
case 5:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function get(_x6) {
return _get.apply(this, arguments);
}
return get;
}()
}, {
key: "post",
value: function () {
var _post = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee4(path, data) {
var label, tssShareHex, privKey, vid, tssTag, _vid, _tssTag, tssNonce;
return regenerator_default().wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
label = data.label, tssShareHex = data.tss_share_hex;
if (!(path === "/tss_share")) {
_context4.next = 4;
break;
}
this.shareDB[label] = new (external_bn_js_default())(tssShareHex.padStart(64, "0"), "hex");
return _context4.abrupt("return", {});
case 4:
if (!(path === "/private_key")) {
_context4.next = 8;
break;
}
privKey = data.private_key;
this.store.privKey = privKey;
return _context4.abrupt("return", {});
case 8:
if (!(path === "/get_tss_nonce")) {
_context4.next = 11;
break;
}
vid = data.vid, tssTag = data.tssTag;
return _context4.abrupt("return", {
tss_nonce: this.tssNonce["".concat(vid, "\x15").concat(tssTag)]
});
case 11:
if (!(path === "/set_tss_nonce")) {
_context4.next = 15;
break;
}
_vid = data.vid, _tssTag = data.tssTag, tssNonce = data.tssNonce;
this.tssNonce["".concat(_vid, "\x15").concat(_tssTag)] = tssNonce;
return _context4.abrupt("return", {});
case 15:
if (!(path === "/rss_round_1")) {
_context4.next = 17;
break;
}
return _context4.abrupt("return", RSSRound1Handler(data, this.getTSSShare.bind(this)));
case 17:
if (!(path === "/rss_round_2")) {
_context4.next = 19;
break;
}
return _context4.abrupt("return", RSSRound2Handler(data, this.getPrivKey.bind(this)));
case 19:
throw new Error("unknown post path ".concat(path));
case 20:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function post(_x7, _x8) {
return _post.apply(this, arguments);
}
return post;
}()
}, {
key: "RSSRound1Handler",
value: function () {
var _RSSRound1Handler2 = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee5(body, getTSSShare) {
var b, auth, servers_info, finalLagrangeCoeffs, L, _L, tssServerShare, masterPolys, masterPolyCommits, serverPolys, serverPolyCommits, i, lc, m, s, serverEncs, userEncs, _i, _i2, masterPoly, serverPoly, serverEnc, j, pub, data, _i3, resp;
return regenerator_default().wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
b = body;
auth = b.auth; // TODO: verify vid (unique label verifierName + verifierID) against vid_sigs (signature from servers on vid)
if (!(b.round_name !== "rss_round_1")) {
_context5.next = 4;
break;
}
throw new Error("incorrect round name");
case 4:
if (!(b.server_set !== "old" && b.server_set !== "new")) {
_context5.next = 6;
break;
}
throw new Error("server set must be either 'old' or 'new'");
case 6:
if (!(!Array.isArray(b.target_index) || b.target_index.filter(function (elem) {
return elem !== 2 && elem !== 3;
}).length > 0)) {
_context5.next = 8;
break;
}
throw new Error("invalid target index, only 2, 3 allowed");
case 8:
if (!(b.old_user_share_index !== 2 && b.old_user_share_index !== 3)) {
_context5.next = 10;
break;
}
throw new Error("invalid index for user share");
case 10:
if (b.server_set === "old") {
servers_info = b.old_servers_info;
} else {
servers_info = b.new_servers_info;
}
// TODO: check old and new server pubkeys independently, against the registered node list
// TODO: check server_index independently, against the registered node list
if (!(b.server_index <= 0 || b.server_index > servers_info.pubkeys.length)) {
_context5.next = 13;
break;
}
throw new Error("server index out of bounds");
case 13:
if (!(servers_info.selected.filter(function (selectedIndex) {
return selectedIndex <= 0 || b.server_index > servers_info.pubkeys.length;
}).length > 0)) {
_context5.next = 15;
break;
}
throw new Error("selected indexes out of bounds");
case 15:
if (!(servers_info.selected.indexOf(b.server_index) === -1)) {
_context5.next = 17;
break;
}
throw new Error("unselected server, should not have received rss round 1 message");
case 17:
if (b.server_set === "old") {
// firstly, calculate lagrange coefficient for own server sharing poly
L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
L = L.mul(getLagrangeCoeffs([1, b.old_user_share_index], 1, 0)).umod(ecCurve.n);
// thirdly, calculate lagrange coefficient for new master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return L.mul(getLagrangeCoeffs([0, 1], 0, target)).umod(ecCurve.n);
});
} else {
// firstly, calculate lagrange coefficient for own server sharing poly
_L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return _L.mul(getLagrangeCoeffs([0, 1], 1, target)).umod(ecCurve.n);
});
}
// retrieve server tss subshare from db
_context5.next = 20;
return getTSSShare(auth.label);
case 20:
tssServerShare = _context5.sent;
masterPolys = [];
masterPolyCommits = [];
serverPolys = [];
serverPolyCommits = [];
for (i = 0; i < finalLagrangeCoeffs.length; i++) {
lc = finalLagrangeCoeffs[i];
m = generatePolynomial(1, lc.mul(tssServerShare).umod(ecCurve.n));
masterPolys.push(m);
masterPolyCommits.push(m.map(function (coeff) {
var gCoeff = ecCurve.g.mul(coeff);
return hexPoint(gCoeff);
}));
s = generatePolynomial(b.new_servers_info.threshold - 1, getShare(m, 1));
serverPolys.push(s);
serverPolyCommits.push(s.map(function (coeff) {
return hexPoint(ecCurve.g.mul(coeff));
}));
}
serverEncs = [];
userEncs = [];
for (_i = 0; _i < masterPolys.length; _i++) {
serverEncs.push([]); // for each target_index, create an array of server encryptions
}
// generate N + 1 shares
_i2 = 0;
case 30:
if (!(_i2 < b.target_index.length)) {
_context5.next = 53;
break;
}
masterPoly = masterPolys[_i2];
_context5.t0 = userEncs;
_context5.next = 35;
return encrypt(Buffer.from("04".concat(b.user_temp_pubkey.x.padStart(64, "0")).concat(b.user_temp_pubkey.y.padStart(64, "0")), "hex"), Buffer.from(getShare(masterPoly, 2).toString(16, 64), "hex"));
case 35:
_context5.t1 = _context5.sent;
_context5.t0.push.call(_context5.t0, _context5.t1);
serverPoly = serverPolys[_i2];
serverEnc = serverEncs[_i2];
j = 0;
case 40:
if (!(j < b.new_servers_info.pubkeys.length)) {
_context5.next = 50;
break;
}
pub = b.new_servers_info.pubkeys[j];
_context5.t2 = serverEnc;
_context5.next = 45;
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(getShare(serverPoly, j + 1).toString(16, 64), "hex"));
case 45:
_context5.t3 = _context5.sent;
_context5.t2.push.call(_context5.t2, _context5.t3);
case 47:
j++;
_context5.next = 40;
break;
case 50:
_i2++;
_context5.next = 30;
break;
case 53:
data = [];
for (_i3 = 0; _i3 < b.target_index.length; _i3++) {
data.push({
master_poly_commits: masterPolyCommits[_i3],
server_poly_commits: serverPolyCommits[_i3],
target_encryptions: {
user_enc: userEncs[_i3],
server_encs: serverEncs[_i3]
}
});
}
resp = {
target_index: b.target_index,
data: data
};
return _context5.abrupt("return", resp);
case 57:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
function RSSRound1Handler(_x9, _x10) {
return _RSSRound1Handler2.apply(this, arguments);
}
return RSSRound1Handler;
}()
}, {
key: "RSSRound2Handler",
value: function () {
var _RSSRound2Handler2 = asyncToGenerator_default()( /*#__PURE__*/regenerator_default().mark(function _callee6(body, getPrivKey) {
var b, privKey, privKeyHex, privKeyBuf, data, _loop, i, resp;
return regenerator_default().wrap(function _callee6$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
b = body;
_context7.next = 3;
return getPrivKey();
case 3:
privKey = _context7.sent;
privKeyHex = privKey.toString(16, 64);
privKeyBuf = Buffer.from(privKeyHex, "hex");
data = [];
if (!(b.round_name !== "rss_round_2")) {
_context7.next = 9;
break;
}
throw new Error("incorrect round name");
case 9:
_loop = /*#__PURE__*/regenerator_default().mark(function _loop(i) {
var factorPubs, masterCommits, serverCommits, gB0, _gB0, encs, decs, dec, gDec, _gDec, j, gBX, ind, factorEncs;
return regenerator_default().wrap(function _loop$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
factorPubs = b.data[i].factor_pubkeys; // TODO: check that the same factorPub is not used for multiple shares
masterCommits = b.data[i].master_commits.map(ecPoint);
serverCommits = b.data[i].server_commits.map(ecPoint);
gB0 = masterCommits[0].add(masterCommits[1]);
_gB0 = serverCommits[0];
if (!(!gB0.x.eq(_gB0.x) || !gB0.y.eq(_gB0.y))) {
_context6.next = 7;
break;
}
throw new Error("server sharing poly commits are inconsistent with master sharing poly commits");
case 7:
encs = b.data[i].server_encs;
_context6.next = 10;
return Promise.all(encs.map(function (enc) {
return decrypt(privKeyBuf, enc);
}));
case 10:
decs = _context6.sent;
dec = decs.reduce(function (acc, dBuf) {
var dBN = new (external_bn_js_default())(dBuf);
return acc.add(dBN).umod(ecCurve.n);
}, new (external_bn_js_default())(0));
gDec = ecCurve.g.mul(dec);
_gDec = serverCommits[0];
for (j = 1; j < serverCommits.length; j++) {
gBX = serverCommits[j];
ind = new (external_bn_js_default())(b.server_index);
_gDec = _gDec.add(gBX.mul(ind.pow(new (external_bn_js_default())(j))));
}
if (!(!gDec.x.eq(_gDec.x) || !gDec.y.eq(_gDec.y))) {
_context6.next = 17;
break;
}
throw new Error("shares are inconsistent with the server poly commits");
case 17:
_context6.next = 19;
return Promise.all(factorPubs.map(function (pub) {
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(dec.toString(16, 64), "hex"));
}));
case 19:
factorEncs = _context6.sent;
data.push({
encs: factorEncs
});
case 21:
case "end":
return _context6.stop();
}
}
}, _loop);
});
i = 0;
case 11:
if (!(i < b.data.length)) {
_context7.next = 16;
break;
}
return _context7.delegateYield(_loop(i), "t0", 13);
case 13:
i++;
_context7.next = 11;
break;
case 16:
resp = {
data: data,
target_index: b.target_index
};
return _context7.abrupt("return", resp);
case 18:
case "end":
return _context7.stop();
}
}
}, _callee6);
}));
function RSSRound2Handler(_x11, _x12) {
return _RSSRound2Handler2.apply(this, arguments);
}
return RSSRound2Handler;
}()
}]);
return MockServer;
}();
;// CONCATENATED MODULE: external "@babel/runtime/helpers/slicedToArray"
const slicedToArray_namespaceObject = require("@babel/runtime/helpers/slicedToArray");
var slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray_namespaceObject);
;// CONCATENATED MODULE: external "@toruslabs/http-helpers"
const http_helpers_namespaceObject = require("@toruslabs/http-helpers");
;// CONCATENATED MODULE: external "loglevel"
const external_loglevel_namespaceObject = require("loglevel");
var external_loglevel_default = /*#__PURE__*/__webpack_require__.n(external_loglevel_namespaceObject);
;// CONCATENATED MODULE: ./src/rss.ts

@@ -293,2 +1029,14 @@

function getEndpoint(endpoint, path, options_, customOptions) {
if (typeof endpoint === "string") {
return (0,http_helpers_namespaceObject.get)("".concat(endpoint).concat(path), options_, customOptions);
}
return endpoint.get(path);
}
function postEndpoint(endpoint, path, data, options_, customOptions) {
if (typeof endpoint === "string") {
return (0,http_helpers_namespaceObject.post)("".concat(endpoint).concat(path), data, options_, customOptions);
}
return endpoint.post(path, data);
}
var RSSClient = /*#__PURE__*/function () {

@@ -320,3 +1068,3 @@ function RSSClient(opts) {

var _this = this;
var targetIndexes, inputIndex, selectedServers, vid1, vid2, vidSigs, dkgNewPub, inputShare, factorPubs, serversInfo, rssRound1Proms, _L, _finalLagrangeCoeffs, _masterPolys, _masterPolyCommits, _serverPolys, _serverPolyCommits, i, _lc, _m, _s, _serverEncs, _userEncs, _i, _i2, _masterPoly, _serverPoly, _serverEnc, j, _pub, _data, _i3, rssRound1Responses, sums, privKeyBuffer, userShares, _loop2, _i4, userFactorEncs, serverEncs, serverIndexes, serverFactorEncs, factorEncs, _loop3, _i5;
var targetIndexes, inputIndex, selectedServers, oldLabel, newLabel, sigs, dkgNewPub, inputShare, factorPubs, serversInfo, rssRound1Proms, _L, _finalLagrangeCoeffs, _masterPolys, _masterPolyCommits, _serverPolys, _serverPolyCommits, i, _lc, _m, _s, _serverEncs, _userEncs, _i, _i2, _masterPoly, _serverPoly, _serverEnc, j, _pub, _data, _i3, rssRound1Responses, sums, privKeyBuffer, userShares, _loop2, _i4, userFactorEncs, serverEncs, serverIndexes, serverFactorEncs, factorEncs, _loop3, _i5;
return regenerator_default().wrap(function _callee$(_context2) {

@@ -326,3 +1074,3 @@ while (1) {

case 0:
targetIndexes = opts.targetIndexes, inputIndex = opts.inputIndex, selectedServers = opts.selectedServers, vid1 = opts.vid1, vid2 = opts.vid2, vidSigs = opts.vidSigs, dkgNewPub = opts.dkgNewPub, inputShare = opts.inputShare, factorPubs = opts.factorPubs;
targetIndexes = opts.targetIndexes, inputIndex = opts.inputIndex, selectedServers = opts.selectedServers, oldLabel = opts.oldLabel, newLabel = opts.newLabel, sigs = opts.sigs, dkgNewPub = opts.dkgNewPub, inputShare = opts.inputShare, factorPubs = opts.factorPubs;
if (!(factorPubs.length !== targetIndexes.length)) {

@@ -341,3 +1089,3 @@ _context2.next = 3;

var serverEndpoint = _this.serverEndpoints[ind - 1];
return (0,http_helpers_namespaceObject.post)("".concat(serverEndpoint, "/rss_round_1"), {
return postEndpoint(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -352,4 +1100,4 @@ server_set: "old",

auth: {
vid: vid1,
vidSigs: vidSigs
label: oldLabel,
sigs: sigs
}

@@ -359,3 +1107,3 @@ });

var serverEndpoint = _this.serverEndpoints[ind - 1];
return (0,http_helpers_namespaceObject.post)("".concat(serverEndpoint, "/rss_round_1"), {
return postEndpoint(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -370,5 +1118,5 @@ server_set: "new",

auth: {
vid: vid2,
label: newLabel,
// TODO: undesigned
vidSigs: vidSigs
sigs: sigs
}

@@ -616,3 +1364,3 @@ });

var serverEndpoint = _this.serverEndpoints[ind - 1];
return (0,http_helpers_namespaceObject.post)("".concat(serverEndpoint, "/rss_round_2"), {
return postEndpoint(serverEndpoint, "/rss_round_2", {
round_name: "rss_round_2",

@@ -711,2 +1459,3 @@ server_index: ind,

module.exports = __webpack_exports__;

@@ -713,0 +1462,0 @@ /******/ })()

@@ -1,12 +0,12 @@

import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
import _createClass from '@babel/runtime/helpers/createClass';
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
import _regeneratorRuntime from '@babel/runtime/regenerator';
import BN from 'bn.js';
import { encrypt as encrypt$1, decrypt as decrypt$1, generatePrivate } from '@toruslabs/eccrypto';
import { post } from '@toruslabs/http-helpers';
import BN from 'bn.js';
import { ec as ec$1 } from 'elliptic';
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import { get, post } from '@toruslabs/http-helpers';
import log from 'loglevel';
import { ec as ec$1 } from 'elliptic';

@@ -184,2 +184,731 @@ var ec = new ec$1("secp256k1");

function RSSRound1Handler(_x, _x2) {
return _RSSRound1Handler.apply(this, arguments);
}
function _RSSRound1Handler() {
_RSSRound1Handler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(body, getTSSShare) {
var b, auth, servers_info, finalLagrangeCoeffs, L, _L2, tssServerShare, masterPolys, masterPolyCommits, serverPolys, serverPolyCommits, i, lc, m, s, serverEncs, userEncs, _i4, _i5, masterPoly, serverPoly, serverEnc, j, pub, data, _i6, resp;
return _regeneratorRuntime.wrap(function _callee7$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
b = body;
auth = b.auth; // TODO: verify vid (unique label verifierName + verifierID) against vid_sigs (signature from servers on vid)
if (!(b.round_name !== "rss_round_1")) {
_context8.next = 4;
break;
}
throw new Error("incorrect round name");
case 4:
if (!(b.server_set !== "old" && b.server_set !== "new")) {
_context8.next = 6;
break;
}
throw new Error("server set must be either 'old' or 'new'");
case 6:
if (!(!Array.isArray(b.target_index) || b.target_index.filter(function (elem) {
return elem !== 2 && elem !== 3;
}).length > 0)) {
_context8.next = 8;
break;
}
throw new Error("invalid target index, only 2, 3 allowed");
case 8:
if (!(b.old_user_share_index !== 2 && b.old_user_share_index !== 3)) {
_context8.next = 10;
break;
}
throw new Error("invalid index for user share");
case 10:
if (b.server_set === "old") {
servers_info = b.old_servers_info;
} else {
servers_info = b.new_servers_info;
}
// TODO: check old and new server pubkeys independently, against the registered node list
// TODO: check server_index independently, against the registered node list
if (!(b.server_index <= 0 || b.server_index > servers_info.pubkeys.length)) {
_context8.next = 13;
break;
}
throw new Error("server index out of bounds");
case 13:
if (!(servers_info.selected.filter(function (selectedIndex) {
return selectedIndex <= 0 || b.server_index > servers_info.pubkeys.length;
}).length > 0)) {
_context8.next = 15;
break;
}
throw new Error("selected indexes out of bounds");
case 15:
if (!(servers_info.selected.indexOf(b.server_index) === -1)) {
_context8.next = 17;
break;
}
throw new Error("unselected server, should not have received rss round 1 message");
case 17:
if (b.server_set === "old") {
// firstly, calculate lagrange coefficient for own server sharing poly
L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
L = L.mul(getLagrangeCoeffs([1, b.old_user_share_index], 1, 0)).umod(ecCurve.n);
// thirdly, calculate lagrange coefficient for new master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return L.mul(getLagrangeCoeffs([0, 1], 0, target)).umod(ecCurve.n);
});
} else {
// firstly, calculate lagrange coefficient for own server sharing poly
_L2 = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return _L2.mul(getLagrangeCoeffs([0, 1], 1, target)).umod(ecCurve.n);
});
}
// retrieve server tss subshare from db
_context8.next = 20;
return getTSSShare(auth.label);
case 20:
tssServerShare = _context8.sent;
masterPolys = [];
masterPolyCommits = [];
serverPolys = [];
serverPolyCommits = [];
for (i = 0; i < finalLagrangeCoeffs.length; i++) {
lc = finalLagrangeCoeffs[i];
m = generatePolynomial(1, lc.mul(tssServerShare).umod(ecCurve.n));
masterPolys.push(m);
masterPolyCommits.push(m.map(function (coeff) {
var gCoeff = ecCurve.g.mul(coeff);
return hexPoint(gCoeff);
}));
s = generatePolynomial(b.new_servers_info.threshold - 1, getShare(m, 1));
serverPolys.push(s);
serverPolyCommits.push(s.map(function (coeff) {
return hexPoint(ecCurve.g.mul(coeff));
}));
}
serverEncs = [];
userEncs = [];
for (_i4 = 0; _i4 < masterPolys.length; _i4++) {
serverEncs.push([]); // for each target_index, create an array of server encryptions
}
// generate N + 1 shares
_i5 = 0;
case 30:
if (!(_i5 < b.target_index.length)) {
_context8.next = 53;
break;
}
masterPoly = masterPolys[_i5];
_context8.t0 = userEncs;
_context8.next = 35;
return encrypt(Buffer.from("04".concat(b.user_temp_pubkey.x.padStart(64, "0")).concat(b.user_temp_pubkey.y.padStart(64, "0")), "hex"), Buffer.from(getShare(masterPoly, 2).toString(16, 64), "hex"));
case 35:
_context8.t1 = _context8.sent;
_context8.t0.push.call(_context8.t0, _context8.t1);
serverPoly = serverPolys[_i5];
serverEnc = serverEncs[_i5];
j = 0;
case 40:
if (!(j < b.new_servers_info.pubkeys.length)) {
_context8.next = 50;
break;
}
pub = b.new_servers_info.pubkeys[j];
_context8.t2 = serverEnc;
_context8.next = 45;
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(getShare(serverPoly, j + 1).toString(16, 64), "hex"));
case 45:
_context8.t3 = _context8.sent;
_context8.t2.push.call(_context8.t2, _context8.t3);
case 47:
j++;
_context8.next = 40;
break;
case 50:
_i5++;
_context8.next = 30;
break;
case 53:
data = [];
for (_i6 = 0; _i6 < b.target_index.length; _i6++) {
data.push({
master_poly_commits: masterPolyCommits[_i6],
server_poly_commits: serverPolyCommits[_i6],
target_encryptions: {
user_enc: userEncs[_i6],
server_encs: serverEncs[_i6]
}
});
}
resp = {
target_index: b.target_index,
data: data
};
return _context8.abrupt("return", resp);
case 57:
case "end":
return _context8.stop();
}
}
}, _callee7);
}));
return _RSSRound1Handler.apply(this, arguments);
}
function RSSRound2Handler(_x3, _x4) {
return _RSSRound2Handler.apply(this, arguments);
}
function _RSSRound2Handler() {
_RSSRound2Handler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(body, getPrivKey) {
var b, privKey, privKeyHex, privKeyBuf, data, _loop2, i, resp;
return _regeneratorRuntime.wrap(function _callee8$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
b = body;
_context10.next = 3;
return getPrivKey();
case 3:
privKey = _context10.sent;
privKeyHex = privKey.toString(16, 64);
privKeyBuf = Buffer.from(privKeyHex, "hex");
data = [];
if (!(b.round_name !== "rss_round_2")) {
_context10.next = 9;
break;
}
throw new Error("incorrect round name");
case 9:
_loop2 = /*#__PURE__*/_regeneratorRuntime.mark(function _loop2(i) {
var factorPubs, masterCommits, serverCommits, gB0, _gB0, encs, decs, dec, gDec, _gDec, j, gBX, ind, factorEncs;
return _regeneratorRuntime.wrap(function _loop2$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
factorPubs = b.data[i].factor_pubkeys; // TODO: check that the same factorPub is not used for multiple shares
masterCommits = b.data[i].master_commits.map(ecPoint);
serverCommits = b.data[i].server_commits.map(ecPoint);
gB0 = masterCommits[0].add(masterCommits[1]);
_gB0 = serverCommits[0];
if (!(!gB0.x.eq(_gB0.x) || !gB0.y.eq(_gB0.y))) {
_context9.next = 7;
break;
}
throw new Error("server sharing poly commits are inconsistent with master sharing poly commits");
case 7:
encs = b.data[i].server_encs;
_context9.next = 10;
return Promise.all(encs.map(function (enc) {
return decrypt(privKeyBuf, enc);
}));
case 10:
decs = _context9.sent;
dec = decs.reduce(function (acc, dBuf) {
var dBN = new BN(dBuf);
return acc.add(dBN).umod(ecCurve.n);
}, new BN(0));
gDec = ecCurve.g.mul(dec);
_gDec = serverCommits[0];
for (j = 1; j < serverCommits.length; j++) {
gBX = serverCommits[j];
ind = new BN(b.server_index);
_gDec = _gDec.add(gBX.mul(ind.pow(new BN(j))));
}
if (!(!gDec.x.eq(_gDec.x) || !gDec.y.eq(_gDec.y))) {
_context9.next = 17;
break;
}
throw new Error("shares are inconsistent with the server poly commits");
case 17:
_context9.next = 19;
return Promise.all(factorPubs.map(function (pub) {
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(dec.toString(16, 64), "hex"));
}));
case 19:
factorEncs = _context9.sent;
data.push({
encs: factorEncs
});
case 21:
case "end":
return _context9.stop();
}
}
}, _loop2);
});
i = 0;
case 11:
if (!(i < b.data.length)) {
_context10.next = 16;
break;
}
return _context10.delegateYield(_loop2(i), "t0", 13);
case 13:
i++;
_context10.next = 11;
break;
case 16:
resp = {
data: data,
target_index: b.target_index
};
return _context10.abrupt("return", resp);
case 18:
case "end":
return _context10.stop();
}
}
}, _callee8);
}));
return _RSSRound2Handler.apply(this, arguments);
}
var MockServer = /*#__PURE__*/function () {
function MockServer() {
_classCallCheck(this, MockServer);
_defineProperty(this, "pubKey", void 0);
_defineProperty(this, "shareDB", void 0);
_defineProperty(this, "store", void 0);
_defineProperty(this, "tssNonce", void 0);
this.shareDB = {};
this.store = {};
this.tssNonce = {};
}
_createClass(MockServer, [{
key: "getTSSShare",
value: function () {
var _getTSSShare = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(label) {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", this.shareDB[label]);
case 1:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function getTSSShare(_x5) {
return _getTSSShare.apply(this, arguments);
}
return getTSSShare;
}()
}, {
key: "getPrivKey",
value: function () {
var _getPrivKey = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt("return", new BN(this.store.privKey.padStart(64, "0"), "hex"));
case 1:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function getPrivKey() {
return _getPrivKey.apply(this, arguments);
}
return getPrivKey;
}()
}, {
key: "get",
value: function () {
var _get = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(path) {
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (!(path === "/test")) {
_context3.next = 2;
break;
}
return _context3.abrupt("return", {});
case 2:
if (!(path === "/public_key")) {
_context3.next = 4;
break;
}
return _context3.abrupt("return", this.pubKey);
case 4:
throw new Error("unknown get path ".concat(path));
case 5:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function get(_x6) {
return _get.apply(this, arguments);
}
return get;
}()
}, {
key: "post",
value: function () {
var _post = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(path, data) {
var label, tssShareHex, privKey, vid, tssTag, _vid, _tssTag, tssNonce;
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
label = data.label, tssShareHex = data.tss_share_hex;
if (!(path === "/tss_share")) {
_context4.next = 4;
break;
}
this.shareDB[label] = new BN(tssShareHex.padStart(64, "0"), "hex");
return _context4.abrupt("return", {});
case 4:
if (!(path === "/private_key")) {
_context4.next = 8;
break;
}
privKey = data.private_key;
this.store.privKey = privKey;
return _context4.abrupt("return", {});
case 8:
if (!(path === "/get_tss_nonce")) {
_context4.next = 11;
break;
}
vid = data.vid, tssTag = data.tssTag;
return _context4.abrupt("return", {
tss_nonce: this.tssNonce["".concat(vid, "\x15").concat(tssTag)]
});
case 11:
if (!(path === "/set_tss_nonce")) {
_context4.next = 15;
break;
}
_vid = data.vid, _tssTag = data.tssTag, tssNonce = data.tssNonce;
this.tssNonce["".concat(_vid, "\x15").concat(_tssTag)] = tssNonce;
return _context4.abrupt("return", {});
case 15:
if (!(path === "/rss_round_1")) {
_context4.next = 17;
break;
}
return _context4.abrupt("return", RSSRound1Handler(data, this.getTSSShare.bind(this)));
case 17:
if (!(path === "/rss_round_2")) {
_context4.next = 19;
break;
}
return _context4.abrupt("return", RSSRound2Handler(data, this.getPrivKey.bind(this)));
case 19:
throw new Error("unknown post path ".concat(path));
case 20:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function post(_x7, _x8) {
return _post.apply(this, arguments);
}
return post;
}()
}, {
key: "RSSRound1Handler",
value: function () {
var _RSSRound1Handler2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(body, getTSSShare) {
var b, auth, servers_info, finalLagrangeCoeffs, L, _L, tssServerShare, masterPolys, masterPolyCommits, serverPolys, serverPolyCommits, i, lc, m, s, serverEncs, userEncs, _i, _i2, masterPoly, serverPoly, serverEnc, j, pub, data, _i3, resp;
return _regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
b = body;
auth = b.auth; // TODO: verify vid (unique label verifierName + verifierID) against vid_sigs (signature from servers on vid)
if (!(b.round_name !== "rss_round_1")) {
_context5.next = 4;
break;
}
throw new Error("incorrect round name");
case 4:
if (!(b.server_set !== "old" && b.server_set !== "new")) {
_context5.next = 6;
break;
}
throw new Error("server set must be either 'old' or 'new'");
case 6:
if (!(!Array.isArray(b.target_index) || b.target_index.filter(function (elem) {
return elem !== 2 && elem !== 3;
}).length > 0)) {
_context5.next = 8;
break;
}
throw new Error("invalid target index, only 2, 3 allowed");
case 8:
if (!(b.old_user_share_index !== 2 && b.old_user_share_index !== 3)) {
_context5.next = 10;
break;
}
throw new Error("invalid index for user share");
case 10:
if (b.server_set === "old") {
servers_info = b.old_servers_info;
} else {
servers_info = b.new_servers_info;
}
// TODO: check old and new server pubkeys independently, against the registered node list
// TODO: check server_index independently, against the registered node list
if (!(b.server_index <= 0 || b.server_index > servers_info.pubkeys.length)) {
_context5.next = 13;
break;
}
throw new Error("server index out of bounds");
case 13:
if (!(servers_info.selected.filter(function (selectedIndex) {
return selectedIndex <= 0 || b.server_index > servers_info.pubkeys.length;
}).length > 0)) {
_context5.next = 15;
break;
}
throw new Error("selected indexes out of bounds");
case 15:
if (!(servers_info.selected.indexOf(b.server_index) === -1)) {
_context5.next = 17;
break;
}
throw new Error("unselected server, should not have received rss round 1 message");
case 17:
if (b.server_set === "old") {
// firstly, calculate lagrange coefficient for own server sharing poly
L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
L = L.mul(getLagrangeCoeffs([1, b.old_user_share_index], 1, 0)).umod(ecCurve.n);
// thirdly, calculate lagrange coefficient for new master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return L.mul(getLagrangeCoeffs([0, 1], 0, target)).umod(ecCurve.n);
});
} else {
// firstly, calculate lagrange coefficient for own server sharing poly
_L = getLagrangeCoeffs(servers_info.selected, b.server_index, 0); // secondly, calculate lagrange coefficient for master sharing poly
finalLagrangeCoeffs = b.target_index.map(function (target) {
return _L.mul(getLagrangeCoeffs([0, 1], 1, target)).umod(ecCurve.n);
});
}
// retrieve server tss subshare from db
_context5.next = 20;
return getTSSShare(auth.label);
case 20:
tssServerShare = _context5.sent;
masterPolys = [];
masterPolyCommits = [];
serverPolys = [];
serverPolyCommits = [];
for (i = 0; i < finalLagrangeCoeffs.length; i++) {
lc = finalLagrangeCoeffs[i];
m = generatePolynomial(1, lc.mul(tssServerShare).umod(ecCurve.n));
masterPolys.push(m);
masterPolyCommits.push(m.map(function (coeff) {
var gCoeff = ecCurve.g.mul(coeff);
return hexPoint(gCoeff);
}));
s = generatePolynomial(b.new_servers_info.threshold - 1, getShare(m, 1));
serverPolys.push(s);
serverPolyCommits.push(s.map(function (coeff) {
return hexPoint(ecCurve.g.mul(coeff));
}));
}
serverEncs = [];
userEncs = [];
for (_i = 0; _i < masterPolys.length; _i++) {
serverEncs.push([]); // for each target_index, create an array of server encryptions
}
// generate N + 1 shares
_i2 = 0;
case 30:
if (!(_i2 < b.target_index.length)) {
_context5.next = 53;
break;
}
masterPoly = masterPolys[_i2];
_context5.t0 = userEncs;
_context5.next = 35;
return encrypt(Buffer.from("04".concat(b.user_temp_pubkey.x.padStart(64, "0")).concat(b.user_temp_pubkey.y.padStart(64, "0")), "hex"), Buffer.from(getShare(masterPoly, 2).toString(16, 64), "hex"));
case 35:
_context5.t1 = _context5.sent;
_context5.t0.push.call(_context5.t0, _context5.t1);
serverPoly = serverPolys[_i2];
serverEnc = serverEncs[_i2];
j = 0;
case 40:
if (!(j < b.new_servers_info.pubkeys.length)) {
_context5.next = 50;
break;
}
pub = b.new_servers_info.pubkeys[j];
_context5.t2 = serverEnc;
_context5.next = 45;
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(getShare(serverPoly, j + 1).toString(16, 64), "hex"));
case 45:
_context5.t3 = _context5.sent;
_context5.t2.push.call(_context5.t2, _context5.t3);
case 47:
j++;
_context5.next = 40;
break;
case 50:
_i2++;
_context5.next = 30;
break;
case 53:
data = [];
for (_i3 = 0; _i3 < b.target_index.length; _i3++) {
data.push({
master_poly_commits: masterPolyCommits[_i3],
server_poly_commits: serverPolyCommits[_i3],
target_encryptions: {
user_enc: userEncs[_i3],
server_encs: serverEncs[_i3]
}
});
}
resp = {
target_index: b.target_index,
data: data
};
return _context5.abrupt("return", resp);
case 57:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
function RSSRound1Handler(_x9, _x10) {
return _RSSRound1Handler2.apply(this, arguments);
}
return RSSRound1Handler;
}()
}, {
key: "RSSRound2Handler",
value: function () {
var _RSSRound2Handler2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(body, getPrivKey) {
var b, privKey, privKeyHex, privKeyBuf, data, _loop, i, resp;
return _regeneratorRuntime.wrap(function _callee6$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
b = body;
_context7.next = 3;
return getPrivKey();
case 3:
privKey = _context7.sent;
privKeyHex = privKey.toString(16, 64);
privKeyBuf = Buffer.from(privKeyHex, "hex");
data = [];
if (!(b.round_name !== "rss_round_2")) {
_context7.next = 9;
break;
}
throw new Error("incorrect round name");
case 9:
_loop = /*#__PURE__*/_regeneratorRuntime.mark(function _loop(i) {
var factorPubs, masterCommits, serverCommits, gB0, _gB0, encs, decs, dec, gDec, _gDec, j, gBX, ind, factorEncs;
return _regeneratorRuntime.wrap(function _loop$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
factorPubs = b.data[i].factor_pubkeys; // TODO: check that the same factorPub is not used for multiple shares
masterCommits = b.data[i].master_commits.map(ecPoint);
serverCommits = b.data[i].server_commits.map(ecPoint);
gB0 = masterCommits[0].add(masterCommits[1]);
_gB0 = serverCommits[0];
if (!(!gB0.x.eq(_gB0.x) || !gB0.y.eq(_gB0.y))) {
_context6.next = 7;
break;
}
throw new Error("server sharing poly commits are inconsistent with master sharing poly commits");
case 7:
encs = b.data[i].server_encs;
_context6.next = 10;
return Promise.all(encs.map(function (enc) {
return decrypt(privKeyBuf, enc);
}));
case 10:
decs = _context6.sent;
dec = decs.reduce(function (acc, dBuf) {
var dBN = new BN(dBuf);
return acc.add(dBN).umod(ecCurve.n);
}, new BN(0));
gDec = ecCurve.g.mul(dec);
_gDec = serverCommits[0];
for (j = 1; j < serverCommits.length; j++) {
gBX = serverCommits[j];
ind = new BN(b.server_index);
_gDec = _gDec.add(gBX.mul(ind.pow(new BN(j))));
}
if (!(!gDec.x.eq(_gDec.x) || !gDec.y.eq(_gDec.y))) {
_context6.next = 17;
break;
}
throw new Error("shares are inconsistent with the server poly commits");
case 17:
_context6.next = 19;
return Promise.all(factorPubs.map(function (pub) {
return encrypt(Buffer.from("04".concat(pub.x.padStart(64, "0")).concat(pub.y.padStart(64, "0")), "hex"), Buffer.from(dec.toString(16, 64), "hex"));
}));
case 19:
factorEncs = _context6.sent;
data.push({
encs: factorEncs
});
case 21:
case "end":
return _context6.stop();
}
}
}, _loop);
});
i = 0;
case 11:
if (!(i < b.data.length)) {
_context7.next = 16;
break;
}
return _context7.delegateYield(_loop(i), "t0", 13);
case 13:
i++;
_context7.next = 11;
break;
case 16:
resp = {
data: data,
target_index: b.target_index
};
return _context7.abrupt("return", resp);
case 18:
case "end":
return _context7.stop();
}
}
}, _callee6);
}));
function RSSRound2Handler(_x11, _x12) {
return _RSSRound2Handler2.apply(this, arguments);
}
return RSSRound2Handler;
}()
}]);
return MockServer;
}();
function getEndpoint(endpoint, path, options_, customOptions) {
if (typeof endpoint === "string") {
return get("".concat(endpoint).concat(path), options_, customOptions);
}
return endpoint.get(path);
}
function postEndpoint(endpoint, path, data, options_, customOptions) {
if (typeof endpoint === "string") {
return post("".concat(endpoint).concat(path), data, options_, customOptions);
}
return endpoint.post(path, data);
}
var RSSClient = /*#__PURE__*/function () {

@@ -211,3 +940,3 @@ function RSSClient(opts) {

var _this = this;
var targetIndexes, inputIndex, selectedServers, vid1, vid2, vidSigs, dkgNewPub, inputShare, factorPubs, serversInfo, rssRound1Proms, _L, _finalLagrangeCoeffs, _masterPolys, _masterPolyCommits, _serverPolys, _serverPolyCommits, i, _lc, _m, _s, _serverEncs, _userEncs, _i, _i2, _masterPoly, _serverPoly, _serverEnc, j, _pub, _data, _i3, rssRound1Responses, sums, privKeyBuffer, userShares, _loop2, _i4, userFactorEncs, serverEncs, serverIndexes, serverFactorEncs, factorEncs, _loop3, _i5;
var targetIndexes, inputIndex, selectedServers, oldLabel, newLabel, sigs, dkgNewPub, inputShare, factorPubs, serversInfo, rssRound1Proms, _L, _finalLagrangeCoeffs, _masterPolys, _masterPolyCommits, _serverPolys, _serverPolyCommits, i, _lc, _m, _s, _serverEncs, _userEncs, _i, _i2, _masterPoly, _serverPoly, _serverEnc, j, _pub, _data, _i3, rssRound1Responses, sums, privKeyBuffer, userShares, _loop2, _i4, userFactorEncs, serverEncs, serverIndexes, serverFactorEncs, factorEncs, _loop3, _i5;
return _regeneratorRuntime.wrap(function _callee$(_context2) {

@@ -217,3 +946,3 @@ while (1) {

case 0:
targetIndexes = opts.targetIndexes, inputIndex = opts.inputIndex, selectedServers = opts.selectedServers, vid1 = opts.vid1, vid2 = opts.vid2, vidSigs = opts.vidSigs, dkgNewPub = opts.dkgNewPub, inputShare = opts.inputShare, factorPubs = opts.factorPubs;
targetIndexes = opts.targetIndexes, inputIndex = opts.inputIndex, selectedServers = opts.selectedServers, oldLabel = opts.oldLabel, newLabel = opts.newLabel, sigs = opts.sigs, dkgNewPub = opts.dkgNewPub, inputShare = opts.inputShare, factorPubs = opts.factorPubs;
if (!(factorPubs.length !== targetIndexes.length)) {

@@ -232,3 +961,3 @@ _context2.next = 3;

var serverEndpoint = _this.serverEndpoints[ind - 1];
return post("".concat(serverEndpoint, "/rss_round_1"), {
return postEndpoint(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -243,4 +972,4 @@ server_set: "old",

auth: {
vid: vid1,
vidSigs: vidSigs
label: oldLabel,
sigs: sigs
}

@@ -250,3 +979,3 @@ });

var serverEndpoint = _this.serverEndpoints[ind - 1];
return post("".concat(serverEndpoint, "/rss_round_1"), {
return postEndpoint(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -261,4 +990,4 @@ server_set: "new",

auth: {
vid: vid2,
vidSigs: vidSigs
label: newLabel,
sigs: sigs
}

@@ -502,3 +1231,3 @@ });

var serverEndpoint = _this.serverEndpoints[ind - 1];
return post("".concat(serverEndpoint, "/rss_round_2"), {
return postEndpoint(serverEndpoint, "/rss_round_2", {
round_name: "rss_round_2",

@@ -595,3 +1324,3 @@ server_index: ind,

export { RSSClient, decrypt, dotProduct, ecCurve, ecPoint, encrypt, generatePolynomial, getLagrangeCoeffs, getShare, hexPoint, lagrangeInterpolation, randomSelection, recover };
export { MockServer, RSSClient, RSSRound1Handler, RSSRound2Handler, decrypt, dotProduct, ecCurve, ecPoint, encrypt, generatePolynomial, getEndpoint, getLagrangeCoeffs, getShare, hexPoint, lagrangeInterpolation, postEndpoint, randomSelection, recover };
//# sourceMappingURL=rssClient.esm.js.map

@@ -0,2 +1,3 @@

export * from "./mock";
export * from "./rss";
export * from "./utils";

17

dist/types/rss.d.ts

@@ -0,6 +1,13 @@

import { CustomOptions, Data } from "@toruslabs/http-helpers";
import BN from "bn.js";
import { EncryptedMessage, PointHex } from "./utils";
export interface IMockServer {
get(path: string): Promise<any>;
post(path: string, data?: Data): Promise<any>;
}
export declare function getEndpoint<T>(endpoint: string | IMockServer, path: string, options_?: RequestInit, customOptions?: CustomOptions): Promise<any>;
export declare function postEndpoint<T>(endpoint: string | IMockServer, path: string, data?: Data, options_?: RequestInit, customOptions?: CustomOptions): Promise<any>;
export type RSSClientOptions = {
tssPubKey: PointHex;
serverEndpoints: string[];
serverEndpoints: string[] | IMockServer[];
serverThreshold: number;

@@ -16,5 +23,5 @@ serverPubKeys: PointHex[];

export type RefreshOptions = {
vid1: string;
vid2: string;
vidSigs: any[];
oldLabel: string;
newLabel: string;
sigs: any[];
dkgNewPub: PointHex;

@@ -62,3 +69,3 @@ inputShare: BN;

tempPubKey: PointHex;
serverEndpoints: string[];
serverEndpoints: string[] | IMockServer[];
serverThreshold: number;

@@ -65,0 +72,0 @@ serverPubKeys: PointHex[];

{
"name": "@toruslabs/rss-client",
"version": "1.2.1",
"version": "1.2.2",
"description": "RSS Client",

@@ -5,0 +5,0 @@ "main": "dist/rssClient.cjs.js",

@@ -0,2 +1,3 @@

export * from "./mock";
export * from "./rss";
export * from "./utils";
import { generatePrivate } from "@toruslabs/eccrypto";
import { post } from "@toruslabs/http-helpers";
import { CustomOptions, Data, get, post } from "@toruslabs/http-helpers";
import BN from "bn.js";

@@ -20,5 +20,30 @@ import log from "loglevel";

export interface IMockServer {
get(path: string): Promise<any>;
post(path: string, data?: Data): Promise<any>;
}
export function getEndpoint<T>(endpoint: string | IMockServer, path: string, options_?: RequestInit, customOptions?: CustomOptions): Promise<any> {
if (typeof endpoint === "string") {
return get<T>(`${endpoint}${path}`, options_, customOptions);
}
return endpoint.get(path);
}
export function postEndpoint<T>(
endpoint: string | IMockServer,
path: string,
data?: Data,
options_?: RequestInit,
customOptions?: CustomOptions
): Promise<any> {
if (typeof endpoint === "string") {
return post<T>(`${endpoint}${path}`, data, options_, customOptions);
}
return endpoint.post(path, data);
}
export type RSSClientOptions = {
tssPubKey: PointHex;
serverEndpoints: string[];
serverEndpoints: string[] | IMockServer[];
serverThreshold: number;

@@ -36,5 +61,5 @@ serverPubKeys: PointHex[];

export type RefreshOptions = {
vid1: string;
vid2: string;
vidSigs: any[];
oldLabel: string;
newLabel: string;
sigs: any[];
dkgNewPub: PointHex;

@@ -101,3 +126,3 @@ inputShare: BN;

serverEndpoints: string[];
serverEndpoints: string[] | IMockServer[];

@@ -123,3 +148,3 @@ serverThreshold: number;

async refresh(opts: RefreshOptions): Promise<RefreshResponse[]> {
const { targetIndexes, inputIndex, selectedServers, vid1, vid2, vidSigs, dkgNewPub, inputShare, factorPubs } = opts;
const { targetIndexes, inputIndex, selectedServers, oldLabel, newLabel, sigs, dkgNewPub, inputShare, factorPubs } = opts;
if (factorPubs.length !== targetIndexes.length) throw new Error("inconsistent factorPubs and targetIndexes lengths");

@@ -136,3 +161,3 @@ const serversInfo: ServersInfo = {

const serverEndpoint = this.serverEndpoints[ind - 1];
return post<RSSRound1Response>(`${serverEndpoint}/rss_round_1`, {
return postEndpoint<RSSRound1Response>(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -147,4 +172,4 @@ server_set: "old",

auth: {
vid: vid1,
vidSigs,
label: oldLabel,
sigs,
},

@@ -156,3 +181,3 @@ });

const serverEndpoint = this.serverEndpoints[ind - 1];
return post<RSSRound1Response>(`${serverEndpoint}/rss_round_1`, {
return postEndpoint<RSSRound1Response>(serverEndpoint, "/rss_round_1", {
round_name: "rss_round_1",

@@ -167,4 +192,4 @@ server_set: "new",

auth: {
vid: vid2, // TODO: undesigned
vidSigs,
label: newLabel, // TODO: undesigned
sigs,
},

@@ -358,3 +383,3 @@ });

const serverEndpoint = this.serverEndpoints[ind - 1];
return post<RSSRound2Response>(`${serverEndpoint}/rss_round_2`, {
return postEndpoint<RSSRound2Response>(serverEndpoint, "/rss_round_2", {
round_name: "rss_round_2",

@@ -361,0 +386,0 @@ server_index: ind,

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc