UNPKG

jinaga

Version:

Data management for web and mobile applications.

41 lines 1.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.signFacts = exports.generateKeyPair = void 0; const node_forge_1 = require("node-forge"); const hash_1 = require("../fact/hash"); const trace_1 = require("../util/trace"); function generateKeyPair() { const keypair = node_forge_1.pki.rsa.generateKeyPair({ bits: 2048 }); const privatePem = node_forge_1.pki.privateKeyToPem(keypair.privateKey); const publicPem = node_forge_1.pki.publicKeyToPem(keypair.publicKey); return { privatePem, publicPem }; } exports.generateKeyPair = generateKeyPair; function signFacts(keyPair, facts) { const privateKey = node_forge_1.pki.privateKeyFromPem(keyPair.privatePem); const envelopes = facts.map(fact => signFact(fact, keyPair.publicPem, privateKey)); return envelopes; } exports.signFacts = signFacts; function signFact(fact, publicPem, privateKey) { const canonicalString = (0, hash_1.canonicalizeFact)(fact.fields, fact.predecessors); const encodedString = node_forge_1.util.encodeUtf8(canonicalString); const digest = node_forge_1.md.sha512.create().update(encodedString); const hash = node_forge_1.util.encode64(digest.digest().getBytes()); if (fact.hash !== hash) { trace_1.Trace.error(`Hash does not match. "${fact.hash}" !== "${hash}"\nFact: ${canonicalString}`); return { fact, signatures: [] }; } const signature = node_forge_1.util.encode64(privateKey.sign(digest)); return { fact, signatures: [{ signature, publicKey: publicPem }] }; } //# sourceMappingURL=key-pair.js.map