UNPKG

fecr

Version:

Modulo de comprobantes electrónicos para el API del Ministerio de Hacienda de Costa Rica versión 4.3

102 lines (84 loc) 3.03 kB
"use strict"; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } var { Crypto } = require("@peculiar/webcrypto"); var xadesjs = require("xadesjs"); var { XMLSerializer } = require("xmldom-alpha"); var pkcs12 = require("./pkcs12.js"); var crypto = new Crypto(); xadesjs.Application.setEngine("NodeJS", new Crypto()); function singFromKeyPair(_x, _x2) { return _singFromKeyPair.apply(this, arguments); } // eslint-disable-next-line max-len function _singFromKeyPair() { _singFromKeyPair = _asyncToGenerator(function* (keyPair, xmlString) { var hash = "SHA-256"; var alg = { name: "RSASSA-PKCS1-v1_5", hash }; // Read cert var { x509 } = keyPair; // Read key var keyDer = pkcs12.pem2der(keyPair.key); var key = yield crypto.subtle.importKey("pkcs8", keyDer.buffer, alg, false, ["sign"]); // XAdES-EPES // eslint-disable-next-line new-cap var xml = xadesjs.Parse(xmlString); var xadesXml = new xadesjs.SignedXml(); // eslint-disable-next-line new-cap var signature = yield xadesXml.Sign( // Signing document alg, // algorithm key, // key xml, // document { // options x509: [x509], references: [{ id: "r-id-1", uri: "", hash, transforms: ["enveloped"] }], policy: { hash, identifier: { value: "https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica" } }, signingCertificate: x509 }); // append signature // eslint-disable-next-line new-cap xml.documentElement.appendChild(signature.GetXml()); // serialize XML var oSerializer = new XMLSerializer(); var sXML = oSerializer.serializeToString(xml); return sXML.toString(); /**/ }); return _singFromKeyPair.apply(this, arguments); } module.exports.signXmlString = (xml, options) => new Promise((resolve, reject) => { var { keyPair } = options; var { p12 } = options; if (keyPair) { singFromKeyPair(keyPair, xml).then(xmlSigned => { resolve(xmlSigned); }).catch(err => { reject(err); }); } else if (p12) { pkcs12.getKeyPair(p12.path, p12.pass).then(newKeyPair => singFromKeyPair(newKeyPair, xml)).then(xmlSigned => { resolve(xmlSigned); }).catch(err => { reject(err); }); } else { reject(new Error("keyPair or p12 must to exist")); } });