@planq-network/encrypted-backup
Version:
Libraries for implemented password encrypted account backups
107 lines • 4.65 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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deserializeBackup = exports.serializeBackup = exports.BackupSchema = exports.BufferFromBase64 = void 0;
var result_1 = require("@planq-network/base/lib/result");
var domains_1 = require("@planq-network/phone-number-privacy-common/lib/domains");
var Either_1 = require("fp-ts/lib/Either");
var pipeable_1 = require("fp-ts/lib/pipeable");
var t = __importStar(require("io-ts"));
var config_1 = require("./config");
var errors_1 = require("./errors");
var BASE64_REGEXP = /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/;
/** Utility type to leverage io-ts for encoding and decoding of buffers from base64 strings. */
exports.BufferFromBase64 = new t.Type('BufferFromBase64', Buffer.isBuffer, function (unk, context) {
return (0, pipeable_1.pipe)(t.string.validate(unk, context), (0, Either_1.chain)(function (str) {
// Check that the string is base64 data and return the decoding if it is.
if (!BASE64_REGEXP.test(str)) {
return t.failure(unk, context, 'provided string is not base64');
}
return t.success(Buffer.from(str, 'base64'));
}));
}, function (buffer) { return buffer.toString('base64'); });
/** io-ts codec used to encode and decode backups from JSON objects */
exports.BackupSchema = t.intersection([
// Required fields
t.type({
encryptedData: exports.BufferFromBase64,
nonce: exports.BufferFromBase64,
version: t.string,
}),
// Optional fields
// https://github.com/gcanti/io-ts/blob/master/index.md#mixing-required-and-optional-props
t.partial({
odisDomain: domains_1.SequentialDelayDomainSchema,
metadata: t.UnknownRecord,
encryptedFuseKey: exports.BufferFromBase64,
computationalHardening: t.union([
t.type({
function: t.literal(config_1.ComputationalHardeningFunction.PBKDF),
iterations: t.number,
}),
t.intersection([
t.type({
function: t.literal(config_1.ComputationalHardeningFunction.SCRYPT),
cost: t.number,
}),
t.partial({
blockSize: t.number,
parallelization: t.number,
}),
]),
]),
environment: t.partial({
odis: t.type({
odisUrl: t.string,
odisPubKey: t.string,
}),
circuitBreaker: t.type({
url: t.string,
publicKey: t.string,
}),
}),
}),
]);
function serializeBackup(backup) {
return JSON.stringify(exports.BackupSchema.encode(backup));
}
exports.serializeBackup = serializeBackup;
function deserializeBackup(data) {
var jsonDecode = (0, result_1.parseJsonAsResult)(data);
if (!jsonDecode.ok) {
return (0, result_1.Err)(new errors_1.DecodeError(jsonDecode.error));
}
var decoding = exports.BackupSchema.decode(jsonDecode.result);
if ((0, Either_1.isLeft)(decoding)) {
return (0, result_1.Err)(new errors_1.DecodeError(new Error("error in validating backup object: ".concat(JSON.stringify(decoding.left)))));
}
var backup = decoding.right;
if (backup.nonce.length !== 32) {
return (0, result_1.Err)(new errors_1.DecodeError(new Error("expected backup nonce to be 32 bytes but got ".concat(backup.nonce.length))));
}
return (0, result_1.Ok)(backup);
}
exports.deserializeBackup = deserializeBackup;
//# sourceMappingURL=schema.js.map