Skip to content
Snippets Groups Projects
signatureUtils.js 3.89 KiB
Newer Older
  • Learn to ignore specific revisions
  • "use strict";
    var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
        if (k2 === undefined) k2 = k;
        var desc = Object.getOwnPropertyDescriptor(m, k);
        if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
          desc = { enumerable: true, get: function() { return m[k]; } };
        }
        Object.defineProperty(o, k2, desc);
    }) : (function(o, m, k, k2) {
        if (k2 === undefined) k2 = k;
        o[k2] = m[k];
    }));
    var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
        Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
        o["default"] = v;
    });
    var __importStar = (this && this.__importStar) || function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
        __setModuleDefault(result, mod);
        return result;
    };
    Object.defineProperty(exports, "__esModule", { value: true });
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    exports.getMessageFromSignature = exports.extractSignature = void 0;
    
    const forge = __importStar(require("@vereign/node-forge"));
    const errors_1 = require("./errors");
    const generalUtils_1 = require("./generalUtils");
    const timeUtils_1 = require("./timeUtils");
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    // const rootCAs = require("./rootCAs");
    
    const getSignatureMeta = (signedData) => {
        const str = Buffer.isBuffer(signedData) ? signedData.toString() : signedData;
        const formattedSignDate = (0, timeUtils_1.formatPdfTime)((0, generalUtils_1.getMetaRegexMatch)("M")(str));
        return {
            reason: (0, generalUtils_1.getMetaRegexMatch)("Reason")(str),
            contactInfo: (0, generalUtils_1.getMetaRegexMatch)("ContactInfo")(str),
            location: (0, generalUtils_1.getMetaRegexMatch)("Location")(str),
            signDate: formattedSignDate,
        };
    };
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    // const verifyCaBundle = (certs) =>
    //   !!certs.find((cert, i) => certs[i + 1] && certs[i + 1].issued(cert));
    // const getRootCAs = () => rootCAs;
    // const verifyRootCert = (chainRootInForgeFormat) =>
    //   !!getRootCAs().find((rootCAInPem) => {
    //     try {
    //       const rootCAInForgeCert = forge.pki.certificateFromPem(rootCAInPem);
    //       return (
    //         forge.pki.certificateToPem(chainRootInForgeFormat) === rootCAInPem ||
    //         rootCAInForgeCert.issued(chainRootInForgeFormat)
    //       );
    //     } catch (e) {
    //       return false;
    //     }
    //   });
    
    const extractSignature = (pdf) => {
        const pdfBuffer = (0, generalUtils_1.preparePDF)(pdf);
        const { byteRanges } = (0, generalUtils_1.getByteRange)(pdfBuffer);
        const signatureStr = [];
        const signedData = [];
        byteRanges.forEach((byteRange) => {
            signedData.push(Buffer.concat([
                pdfBuffer.slice(byteRange[0], byteRange[0] + byteRange[1]),
                pdfBuffer.slice(byteRange[2], byteRange[2] + byteRange[3]),
            ]));
            const signatureHex = pdfBuffer
                .slice(byteRange[0] + byteRange[1] + 1, byteRange[2])
                .toString("latin1");
            signatureStr.push(Buffer.from(signatureHex, "hex").toString("latin1"));
        });
        const signatureMeta = signedData.map((sd) => getSignatureMeta(sd));
        return {
            byteRanges,
            signatureStr,
            signedData,
            signatureMeta,
        };
    };
    exports.extractSignature = extractSignature;
    const getMessageFromSignature = (signature) => {
        try {
            const p7Asn1 = forge.asn1.fromDer(signature);
            return forge.pkcs7.messageFromAsn1(p7Asn1);
        }
        catch (error) {
            //no signature is found return empty object
            if (error.message === "Too few bytes to parse DER.") {
                return {};
            }
            throw new errors_1.AppError(error);
        }
    };
    exports.getMessageFromSignature = getMessageFromSignature;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    // export const authenticateSignature = (certs) =>
    //   verifyCaBundle(certs) && verifyRootCert(certs[certs.length - 1]);