UNPKG

@a4smanjorg5/invoida

Version:

> Core signing and cryptographic module for the Invoida project

35 lines (34 loc) 2.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sign = exports.removeKeyPair = exports.listKeys = exports.generateKeyPair = void 0; const glob_1 = require("glob"); const jose_1 = require("jose"); const crypto_1 = require("crypto"); const promises_1 = require("fs/promises"); const path_1 = require("path"); const BUFFER_SIZE = Math.max(+process.env.INVOIDA_KIDSZ, 8) || 8; const encodeObj = (obj) => new Uint8Array(Buffer.from(JSON.stringify(obj).replace(/[^\x00-\xff]/g, char => ('\\u' + char.charCodeAt(0).toString(16).padStart(4, '0'))))); const generateKeyPair = async (kid) => { const { privateKey, publicKey } = await (0, jose_1.generateKeyPair)('ES256'); const jwk = await (0, jose_1.exportJWK)(publicKey); jwk.kid = kid || (0, crypto_1.randomBytes)(BUFFER_SIZE).toString('base64url'); await (0, promises_1.mkdir)(pathToKeysDir(''), { recursive: true }).catch(); await Promise.all([ (0, promises_1.writeFile)(pathToKeysDir(jwk.kid + '.jwk'), JSON.stringify(jwk)), (0, promises_1.writeFile)(pathToKeysDir(jwk.kid + '.pem'), await (0, jose_1.exportPKCS8)(privateKey)), ]); return jwk; }; exports.generateKeyPair = generateKeyPair; const listKeys = async () => Promise.all((await (0, glob_1.glob)(pathToKeysDir('*.jwk'), { windowsPathsNoEscape: true })).map(async (path) => JSON.parse('' + await (0, promises_1.readFile)(path)))); exports.listKeys = listKeys; const removeKeyPair = (kid) => Promise.all([ (0, promises_1.unlink)(pathToKeysDir(kid + '.pem')), (0, promises_1.unlink)(pathToKeysDir(kid + '.jwk')), ]).then(arr => arr[0]); exports.removeKeyPair = removeKeyPair; const sign = async (payload, kid) => new jose_1.CompactSign(encodeObj({ iat: Math.floor(Date.now() / 1000), ...payload })) .setProtectedHeader({ alg: 'ES256', kid }) .sign(await (0, jose_1.importPKCS8)('' + await (0, promises_1.readFile)(pathToKeysDir(kid + '.pem')), 'ES256')); exports.sign = sign; const pathToKeysDir = (...paths) => (0, path_1.join)(process.env.INVOIDA_CERTS_DIR, ...paths);