UNPKG

@govtechsg/open-attestation

Version:
64 lines (63 loc) 2.88 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapDocuments = exports.wrapDocument = void 0; var digest_1 = require("./digest"); var merkle_1 = require("../shared/merkle"); var utils_1 = require("../shared/utils"); var document_1 = require("../shared/@types/document"); var validate_1 = require("../shared/validate"); var salt_1 = require("./salt"); var ajv_1 = require("../shared/ajv"); var createDocument = function (data, option) { var documentSchema = { version: document_1.SchemaId.v2, data: (0, salt_1.saltData)(data), }; if (option === null || option === void 0 ? void 0 : option.externalSchemaId) { documentSchema.schema = option.externalSchemaId; } return documentSchema; }; var wrapDocument = function (data, options) { var _a; var document = createDocument(data, options); var errors = (0, validate_1.validateSchema)(document, (0, ajv_1.getSchema)((_a = options === null || options === void 0 ? void 0 : options.version) !== null && _a !== void 0 ? _a : document_1.SchemaId.v2)); if (errors.length > 0) { throw new utils_1.SchemaValidationError("Invalid document", errors, document); } var digest = (0, digest_1.digestDocument)(document); var signature = { type: "SHA3MerkleProof", targetHash: digest, proof: [], merkleRoot: digest, }; return __assign(__assign({}, document), { signature: signature }); }; exports.wrapDocument = wrapDocument; var wrapDocuments = function (data, options) { // wrap documents individually var documents = data.map(function (d) { return (0, exports.wrapDocument)(d, options); }); // get all the target hashes to compute the merkle tree and the merkle root var merkleTree = new merkle_1.MerkleTree(documents.map(function (document) { return document.signature.targetHash; }).map(utils_1.hashToBuffer)); var merkleRoot = merkleTree.getRoot().toString("hex"); // for each document, update the merkle root and add the proofs needed return documents.map(function (document) { var merkleProof = merkleTree .getProof((0, utils_1.hashToBuffer)(document.signature.targetHash)) .map(function (buffer) { return buffer.toString("hex"); }); return __assign(__assign({}, document), { signature: __assign(__assign({}, document.signature), { proof: merkleProof, merkleRoot: merkleRoot }) }); }); }; exports.wrapDocuments = wrapDocuments;