restpki-client
Version:
Classes to consume Lacuna Software REST PKI
111 lines (86 loc) • 2.83 kB
JavaScript
;
const fs = require('fs');
const {SignatureExplorer} = require('./signature-explorer');
const {CadesSignature} = require('./cades-signature');
const {DigestAlgorithm} = require('./digest-algorithm');
const CMS_SIGNATURE_MIME_TYPE = 'application/pkcs7-signature';
class CadesSignatureExplorer extends SignatureExplorer {
constructor(client) {
super(client);
this._dataFileContent = null;
}
//region setDataFile
setDataFileFromPath(path) {
this._dataFileContent = fs.readFileSync(path);
}
setDataFileFromContentRaw(contentRaw) {
this._dataFileContent = contentRaw;
}
setDataFileFromContentBase64(contentBase64) {
this._dataFileContent = new Buffer(contentBase64, 'base64');
}
set dataFile(path) {
this.setDataFileFromPath(path);
}
set dataFileContent(contentRaw) {
this.setDataFileFromContentRaw(contentRaw);
}
//endregion
async open(extractContent = false) {
if (!this._signatureFileContent) {
throw new Error('The signature file to be opened not set');
}
try {
if (this._dataFileContent) {
let requiredHashes = await this._getRequiredHashes();
let dataHash = null;
if (requiredHashes.length > 0) {
dataHash = this._computeDataHashes(this._dataFileContent, requiredHashes);
}
let request = this._getRequest(CMS_SIGNATURE_MIME_TYPE);
request['dataHashes'] = dataHash;
let response = await this._client.getRestClient().post('Api/CadesSignatures/Open', request);
return new CadesSignature(response.data);
} else {
let request = this._getRequest(CMS_SIGNATURE_MIME_TYPE);
if (extractContent) {
request['extractEncapsulatedContent'] = true;
request['dataHashes'] = null;
}
let response = await this._client.getRestClient().post('Api/CadesSignatures/Open', request);
return new CadesSignature(response.data);
}
} catch (err) {
throw err;
}
}
async _getRequiredHashes() {
let request = {
content: new Buffer(this._signatureFileContent).toString('base64'),
mimeType: CMS_SIGNATURE_MIME_TYPE
};
try {
let response = await this._client.getRestClient().post('Api/CadesSignatures/RequiredHashes', request);
let algs = [];
for (let alg of response.data) {
algs.push(DigestAlgorithm.getInstanceByApiModel(alg));
}
return algs;
} catch (err) {
throw err;
}
}
_computeDataHashes(dataFileContent, algorithms) {
let dataHashes = [];
for (let algorithm of algorithms) {
let digestValue = algorithm.computeHash(dataFileContent);
let dataHash = {
algorithm: algorithm.apiModel,
value: digestValue
};
dataHashes.push(dataHash);
}
return dataHashes;
}
}
exports.CadesSignatureExplorer = CadesSignatureExplorer;