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
JavaScript
;
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"));
}
});