UNPKG

pdf-signature-reader-sl

Version:

Verify digital signatures in PDF documents with content validation and enhanced support for Spanish certificates (FNMT, DNIe, corporate)

61 lines (52 loc) 1.82 kB
const forge = require('node-forge'); const { Buffer } = require('../packages/buffer'); const VerifyPDFError = require('../VerifyPDFError'); const preparePDF = (pdf) => { try { if (Buffer.isBuffer(pdf)) return pdf; return Buffer.from(pdf); } catch (error) { throw new VerifyPDFError( 'PDF expected as Buffer.', VerifyPDFError.TYPE_INPUT, ); } }; const checkForSubFilter = (pdfBuffer) => { const matches = pdfBuffer.toString().match(/\/SubFilter\s*\/([\w.]*)/); const subFilter = Array.isArray(matches) && matches[1]; if (!subFilter) { throw new VerifyPDFError( 'cannot find subfilter', VerifyPDFError.TYPE_PARSE, ); } const supportedTypes = ['adbe.pkcs7.detached', 'etsi.cades.detached']; if (!supportedTypes.includes(subFilter.trim().toLowerCase())) throw new VerifyPDFError(`subFilter ${subFilter} not supported`, VerifyPDFError.UNSUPPORTED_SUBFILTER); return subFilter; }; const getMessageFromSignature = (signature) => { const p7Asn1 = forge.asn1.fromDer(signature, {parseAllBytes: false}); return forge.pkcs7.messageFromAsn1(p7Asn1); }; const getMetaRegexMatch = (keyName) => (str) => { const regex = new RegExp(`/${keyName}\\s*\\(([\\w.\\s@,]*)`, 'g'); const matches = [...str.matchAll(regex)]; const meta = matches.length ? matches[matches.length - 1][1] : null; return meta; }; const getSignatureMeta = (signedData) => { const str = Buffer.isBuffer(signedData) ? signedData.toString() : signedData; return ({ reason: getMetaRegexMatch('Reason')(str), contactInfo: getMetaRegexMatch('ContactInfo')(str), location: getMetaRegexMatch('Location')(str), name: getMetaRegexMatch('Name')(str), }); }; module.exports = { checkForSubFilter, getSignatureMeta, getMessageFromSignature, preparePDF, };