jinaga
Version:
Data management for web and mobile applications.
41 lines • 1.68 kB
JavaScript
;
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