UNPKG

node-signpdf

Version:

DEPRECATED. Have a look at @signpdf/signpdf instead.

71 lines (54 loc) 2.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _SignPdfError = _interopRequireDefault(require("../SignPdfError")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const getSubstringIndex = (str, substring, n) => { let times = 0; let index = null; while (times < n && index !== -1) { index = str.indexOf(substring, index + 1); times += 1; } return index; }; /** * Basic implementation of signature extraction. * * Really basic. Would work in the simplest of cases where there is only one signature * in a document and ByteRange is only used once in it. * * @param {Buffer} pdf * @returns {Object} {ByteRange: Number[], signature: Buffer, signedData: Buffer} */ const extractSignature = (pdf, signatureCount = 1) => { if (!(pdf instanceof Buffer)) { throw new _SignPdfError.default('PDF expected as Buffer.', _SignPdfError.default.TYPE_INPUT); } // const byteRangePos = pdf.indexOf('/ByteRange ['); const byteRangePos = getSubstringIndex(pdf, '/ByteRange [', signatureCount); if (byteRangePos === -1) { throw new _SignPdfError.default('Failed to locate ByteRange.', _SignPdfError.default.TYPE_PARSE); } const byteRangeEnd = pdf.indexOf(']', byteRangePos); if (byteRangeEnd === -1) { throw new _SignPdfError.default('Failed to locate the end of the ByteRange.', _SignPdfError.default.TYPE_PARSE); } const byteRange = pdf.slice(byteRangePos, byteRangeEnd + 1).toString(); const matches = /\/ByteRange \[(\d+) +(\d+) +(\d+) +(\d+) *\]/.exec(byteRange); if (matches === null) { throw new _SignPdfError.default('Failed to parse the ByteRange.', _SignPdfError.default.TYPE_PARSE); } const ByteRange = matches.slice(1).map(Number); const signedData = Buffer.concat([pdf.slice(ByteRange[0], ByteRange[0] + ByteRange[1]), pdf.slice(ByteRange[2], ByteRange[2] + ByteRange[3])]); const signatureHex = pdf.slice(ByteRange[0] + ByteRange[1] + 1, ByteRange[2]).toString('binary').replace(/(?:00|>)+$/, ''); const signature = Buffer.from(signatureHex, 'hex').toString('binary'); return { ByteRange: matches.slice(1, 5).map(Number), signature, signedData }; }; var _default = extractSignature; exports.default = _default;