falcotura-atv-sdk
Version:
Librería (SDK) de Javascript/NodeJS para acceder al API de Administración Tributaria Virtual (ATV) del Ministerio de Hacienda.
72 lines • 3.38 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.genKeysAndCert = void 0;
const node_forge_1 = __importDefault(require("node-forge"));
function getBags(pkcs12) {
const keyData = pkcs12.getBags({ bagType: node_forge_1.default.pki.oids.pkcs8ShroudedKeyBag })[node_forge_1.default.pki.oids.pkcs8ShroudedKeyBag].concat(pkcs12.getBags({ bagType: node_forge_1.default.pki.oids.keyBag })[node_forge_1.default.pki.oids.keyBag]);
const certBags = pkcs12.getBags({ bagType: node_forge_1.default.pki.oids.certBag })[node_forge_1.default.pki.oids.certBag];
return { keyData, certBags };
}
function preparePem(pem) {
return pem
.replace(/-----(BEGIN|END)[\w\d\s]+-----/g, '')
.replace(/[\r\n]/g, '');
}
function preparePems(privatePem, publicPem, certPem) {
const privatePem64 = preparePem(privatePem);
const publicPem64 = preparePem(publicPem);
const certPem64 = preparePem(certPem);
return { privatePem64, publicPem64, certPem64 };
}
function fromBase64(base64Text) {
base64Text = base64Text.replace(/\n/g, '').replace(/\r/g, '').replace(/\t/g, '').replace(/\s/g, '');
return new Uint8Array(Buffer.from(base64Text, 'base64')).buffer;
}
function convertFromBase64(pems) {
const { privatePem64, publicPem64, certPem64 } = pems;
const privateKeyDer = fromBase64(privatePem64);
const publicKeyDer = fromBase64(publicPem64);
const certDer = fromBase64(certPem64);
return { privateKeyDer, publicKeyDer, certDer };
}
function getPrivatePem(keyData) {
const rsaPrivateKey = node_forge_1.default.pki.privateKeyToAsn1(keyData[0].key);
const privateKeyInfo = node_forge_1.default.pki.wrapRsaPrivateKey(rsaPrivateKey);
return node_forge_1.default.pki.privateKeyInfoToPem(privateKeyInfo);
}
function getPublicPem(privatePem) {
const preprivateKey = node_forge_1.default.pki.privateKeyFromPem(privatePem);
const prepublicKey = node_forge_1.default.pki.setRsaPublicKey(preprivateKey.n, preprivateKey.e);
return node_forge_1.default.pki.publicKeyToPem(prepublicKey);
}
function getKeysAndCert(keyStr, password) {
const pkcs12Asn1 = node_forge_1.default.asn1.fromDer(keyStr, false);
const pkcs12 = node_forge_1.default.pkcs12.pkcs12FromAsn1(pkcs12Asn1, password);
const { keyData, certBags } = getBags(pkcs12);
const privatePem = getPrivatePem(keyData);
const publicPem = getPublicPem(privatePem);
const certPem = node_forge_1.default.pki.certificateToPem(certBags[0].cert);
const pems64 = preparePems(privatePem, publicPem, certPem);
return pems64;
}
function genKeysAndCert(crypto, opts) {
const alg = opts.algorithm;
const pems = getKeysAndCert(opts.keyStr, opts.password);
const ders = convertFromBase64(pems);
const { privateKeyDer, publicKeyDer, certDer } = ders;
const pKey = crypto.subtle.importKey('pkcs8', privateKeyDer, alg, false, ['sign']);
const pbKey = crypto.subtle.importKey('spki', publicKeyDer, alg, true, ['verify']);
return {
privateKey: pKey,
publicKey: pbKey,
cert: {
certDer,
certPem: pems.certPem64
}
};
}
exports.genKeysAndCert = genKeysAndCert;
//# sourceMappingURL=genKeysAndCert.js.map