UNPKG

@planq-network/encrypted-backup

Version:

Libraries for implemented password encrypted account backups

107 lines 4.65 kB
"use strict"; 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