UNPKG

cadesjs

Version:

CAdESjs gives you an ability to make CAdES signatures on pure JavaScript. The libray made with latest CAdES standards in mind

125 lines (101 loc) 5.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _asn1js = require("asn1js"); var asn1js = _interopRequireWildcard(_asn1js); var _pvutils = require("pvutils"); var _pkijs = require("pkijs"); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } //************************************************************************************** // noinspection JSUnusedGlobalSymbols class CAdESCTimestamp extends _pkijs.ContentInfo { //********************************************************************************** /** * Constructor for CAdESCTimestamp class * @param {Object} [parameters={}] * @property {Object} [schema] asn1js parsed value */ constructor(parameters = {}) { super(parameters); /** * @type {ArrayBuffer} * @description tspResponse */ this.tspResponse = (0, _pvutils.getParametersValue)(parameters, "tspResponse", new ArrayBuffer(0)); } //********************************************************************************** // noinspection JSUnusedGlobalSymbols /** * Get "ArrayBuffer" to transfer to time-stamp server * @param {SignedData} cmsSignedData CMS Signed Data to make attribute for * @param {number} signerIndex Index of signer to make attribute for * @param {Object} [parameters] Additional parameters for making attribute * @returns {Promise} */ getStampingBuffer(cmsSignedData, signerIndex, parameters = {}) { //region Initial variables let sequence = Promise.resolve(); let hashAlgorithm = "SHA-256"; let resultBuffer = new ArrayBuffer(0); let signatureTimeStamp; // SignatureTimeStamp let completeCertificateReferences; // CompleteCertificateReferences let completeRevocationReferences; // CompleteRevocationReferences //endregion //region Get a "crypto" extension const crypto = (0, _pkijs.getCrypto)(); if (typeof crypto === "undefined") return Promise.reject("Unable to create WebCrypto object"); //endregion //region Check input parameters if ("hashAlgorithm" in parameters) hashAlgorithm = parameters.hashAlgorithm; if ("signatureTimeStamp" in parameters) signatureTimeStamp = parameters.signatureTimeStamp;else return Promise.reject("Parameter \"signatureTimeStamp\" is mandatory for making \"CAdES-C-Timestamp\" attribute"); if ("completeCertificateReferences" in parameters) completeCertificateReferences = parameters.completeCertificateReferences;else return Promise.reject("Parameter \"completeCertificateReferences\" is mandatory for making \"CAdES-C-Timestamp\" attribute"); if ("completeRevocationReferences" in parameters) completeRevocationReferences = parameters.completeRevocationReferences;else return Promise.reject("Parameter \"completeRevocationReferences\" is mandatory for making \"CAdES-C-Timestamp\" attribute"); //endregion //region Make stamping buffer sequence = sequence.then(() => { resultBuffer = (0, _pvutils.utilConcatBuf)(resultBuffer, cmsSignedData.signerInfos[signerIndex].signature.valueBlock.valueHex); resultBuffer = (0, _pvutils.utilConcatBuf)(resultBuffer, signatureTimeStamp.makeAttribute().toSchema().toBER(false)); resultBuffer = (0, _pvutils.utilConcatBuf)(resultBuffer, completeCertificateReferences.makeAttribute().toSchema().toBER(false)); resultBuffer = (0, _pvutils.utilConcatBuf)(resultBuffer, completeRevocationReferences.makeAttribute().toSchema().toBER(false)); }, error => Promise.reject(error)); //endregion //region Make hash of signature sequence = sequence.then(() => crypto.digest({ name: hashAlgorithm }, resultBuffer), error => Promise.reject(error)); //endregion return sequence; } //********************************************************************************** /** * Create "CAdES-C-Timestamp" CAdES attribute * @param {Object} parameters Additional parameters for making attribute * @returns {Attribute} */ makeAttribute(parameters) { //region Initial variables let tspResponse; //endregion //region Check input parameters if ("tspResponse" in parameters) tspResponse = parameters.tspResponse;else { if ("tspResponse" in this) tspResponse = this.tspResponse;else throw new Error("Parameter \"tspResponse\" is mandatory for making \"CAdES-C-Timestamp\" attribute"); } this.tspResponse = tspResponse; //endregion //region Change type of "tspResponse" const asn1 = asn1js.fromBER(tspResponse); tspResponse = new _pkijs.TimeStampResp({ schema: asn1.result }); //endregion //region Initialize internal variables from "tspResponse" if ("timeStampToken" in tspResponse) this.fromSchema(tspResponse.timeStampToken.toSchema());else throw new Error("No neccessary \"timeStampToken\" inside \"tspResponse\""); //endregion //region Create and return attribute return new _pkijs.Attribute({ type: "1.2.840.113549.1.9.16.2.25", values: [this.toSchema()] }); //endregion } //********************************************************************************** } exports.default = CAdESCTimestamp; //************************************************************************************** //# sourceMappingURL=CAdESCTimestamp.js.map