@planq-network/encrypted-backup
Version:
Libraries for implemented password encrypted account backups
171 lines • 7.02 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MockOdis = exports.MOCK_ODIS_ENVIRONMENT = void 0;
var phone_number_privacy_common_1 = require("@planq-network/phone-number-privacy-common");
var poprf = __importStar(require("@celo/poprf"));
var debug_1 = __importDefault(require("debug"));
var debug = (0, debug_1.default)('kit:encrypted-backup:odis:mock');
var MOCK_ODIS_KEYPAIR = poprf.keygen(Buffer.from('MOCK ODIS KEYPAIR SEED'));
exports.MOCK_ODIS_ENVIRONMENT = {
odisUrl: 'https://mockodis.com',
odisPubKey: Buffer.from(MOCK_ODIS_KEYPAIR.publicKey).toString('base64'),
};
var MockOdis = /** @class */ (function () {
function MockOdis() {
this.state = {};
this.poprf = new phone_number_privacy_common_1.PoprfServer(MOCK_ODIS_KEYPAIR.privateKey);
this.now = function () { return Math.floor(Date.now() / 1000); };
}
MockOdis.prototype.domainState = function (hash) {
var _a;
return ((_a = this.state[hash.toString('hex')]) !== null && _a !== void 0 ? _a : { timer: 0, counter: 0, disabled: false, now: this.now() });
};
MockOdis.prototype.quota = function (req) {
var authorized = (0, phone_number_privacy_common_1.verifyDomainQuotaStatusRequestAuthenticity)(req);
if (!authorized) {
return {
status: 401,
body: {
success: false,
version: 'mock',
error: 'unauthorized',
},
};
}
return {
status: 200,
body: {
success: true,
version: 'mock',
status: this.domainState((0, phone_number_privacy_common_1.domainHash)(req.domain)),
},
};
};
MockOdis.prototype.sign = function (req) {
var authorized = (0, phone_number_privacy_common_1.verifyDomainRestrictedSignatureRequestAuthenticity)(req);
if (!authorized) {
return {
status: 401,
body: {
success: false,
version: 'mock',
error: 'unauthorized',
status: undefined,
},
};
}
var hash = (0, phone_number_privacy_common_1.domainHash)(req.domain);
var domainState = this.domainState(hash);
var nonce = req.options.nonce.defined ? req.options.nonce.value : undefined;
if (nonce !== domainState.counter) {
return {
status: 403,
body: {
success: false,
version: 'mock',
error: 'incorrect nonce',
status: domainState,
},
};
}
var limitCheck = (0, phone_number_privacy_common_1.checkSequentialDelayRateLimit)(req.domain, this.now(), domainState);
if (!limitCheck.accepted || limitCheck.state === undefined) {
return {
status: 429,
body: {
success: false,
version: 'mock',
error: 'request limit exceeded',
status: domainState,
},
};
}
this.state[hash.toString('hex')] = limitCheck.state;
var signature;
try {
signature = this.poprf
.blindEval(hash, Buffer.from(req.blindedMessage, 'base64'))
.toString('base64');
}
catch (error) {
return {
// TODO(victor) Note that although this is a returned as a 500, the fault my actually be the
// users because the blinded message is not validated in JS before attempting the evaluation.
// This logic is the same in the real service. When validation functions are added to the
// WASM interface for the POPRF, this can be improved.
status: 500,
body: {
success: false,
version: 'mock',
status: undefined,
error: error.toString(),
},
};
}
return {
status: 200,
body: {
success: true,
version: 'mock',
status: limitCheck.state,
signature: signature,
},
};
};
MockOdis.prototype.installQuotaEndpoint = function (mock, override) {
var _this = this;
mock.mock({
url: new URL(phone_number_privacy_common_1.DomainEndpoint.DOMAIN_QUOTA_STATUS, MockOdis.environment.odisUrl).href,
method: 'POST',
}, override !== null && override !== void 0 ? override : (function (url, req) {
var res = _this.quota(JSON.parse(req.body));
debug('Mocking request', JSON.stringify({ url: url, req: req, res: res }));
return res;
}));
};
MockOdis.prototype.installSignEndpoint = function (mock, override) {
var _this = this;
mock.mock({
url: new URL(phone_number_privacy_common_1.DomainEndpoint.DOMAIN_SIGN, MockOdis.environment.odisUrl).href,
method: 'POST',
}, override !== null && override !== void 0 ? override : (function (url, req) {
var res = _this.sign(JSON.parse(req.body));
debug('Mocking request', JSON.stringify({ url: url, req: req, res: res }));
return res;
}));
};
MockOdis.prototype.install = function (mock) {
this.installQuotaEndpoint(mock);
this.installSignEndpoint(mock);
};
MockOdis.environment = exports.MOCK_ODIS_ENVIRONMENT;
return MockOdis;
}());
exports.MockOdis = MockOdis;
//# sourceMappingURL=odis.mock.js.map