Javascript 当我使用代码生成PAdES LT签名时,Adobe显示PKCS7解析错误

Javascript 当我使用代码生成PAdES LT签名时,Adobe显示PKCS7解析错误,javascript,pdf,digital-signature,pades,Javascript,Pdf,Digital Signature,Pades,我正在开发制作PAdES签名的webapp。我已经成功地实现了PAdES Baseline-B。但是,当我试图通过添加所描述的所有必要信息(包括OCSP响应、CRL和证书)来创建PAdES Baseline LT时,文件似乎已损坏,Adobe显示以下错误:签名验证期间出错:PKCS7解析错误 如果您想查看,请参阅签名的PDF: 我在对PDF签名后附加DSS,因此我附加到get LT subtype的那些附加对象不会影响签名本身,因此我不确定为什么会出现PKCS7错误,如果我所做的相同签名(创建基

我正在开发制作PAdES签名的webapp。我已经成功地实现了PAdES Baseline-B。但是,当我试图通过添加所描述的所有必要信息(包括OCSP响应、CRL和证书)来创建PAdES Baseline LT时,文件似乎已损坏,Adobe显示以下错误:签名验证期间出错:PKCS7解析错误

如果您想查看,请参阅签名的PDF:

我在对PDF签名后附加DSS,因此我附加到get LT subtype的那些附加对象不会影响签名本身,因此我不确定为什么会出现PKCS7错误,如果我所做的相同签名(创建基线-B时)看起来很好的话

以下是创建和插入这些附加数据的代码部分:

public appendVri(pdfRaw, pdfToSign, vri: VRI) {
    if (pdfRaw instanceof ArrayBuffer) {
        pdfRaw = new Uint8Array(pdfRaw);
    }

    const pdf = this.loadPdf(pdfRaw);
    const root = this.findRootEntry(pdf.xref);
    const rootSuccessor = this.findSuccessorEntry(pdf.xref.entries, root);

    const certsEntry = [];

    const xObjects = [];
    let offsetDss;
    let offsetVri;
    // let offsetCerts[];
    // let offsetOcsp[];
    // let offsetCrls[];

    const dummy = this.findFreeXrefNr(pdf.xref.entries, xObjects);
    xObjects.push(dummy);
    const dssEntry = this.findFreeXrefNr(pdf.xref.entries, xObjects);
    xObjects.push(dssEntry);
    const vriEntry = this.findFreeXrefNr(pdf.xref.entries, xObjects);
    xObjects.push(vriEntry);

    for (let i = 0; i < vri.certs.length; i++) {
        certsEntry[i] = this.findFreeXrefNr(pdf.xref.entries, xObjects);
        xObjects.push(certsEntry[i]);
    }

    const ocspEntry = [];

    for (let i = 0; i < vri.OCSPs.length; i++) {
        ocspEntry[i] = this.findFreeXrefNr(pdf.xref.entries, xObjects);
        xObjects.push(ocspEntry[i]);
    }

    const crlsEntry = [];

    for (let i = 0; i < vri.CRLs.length; i++) {
        crlsEntry[i] = this.findFreeXrefNr(pdf.xref.entries, xObjects);
        xObjects.push(crlsEntry[i]);
    }

    let certsReference = '/Certs [';
    for (let i = 0; i < vri.certs.length; i++) {
        certsReference = certsReference + certsEntry[i] + ' 0 R';

        if (i === vri.certs.length - 1) {
            certsReference = certsReference + '] \n';
        } else {
            certsReference = certsReference + ' ';
        }
    }

    let ocspReference = '/OCSPs [';
    for (let i = 0; i < vri.OCSPs.length; i++) {
        ocspReference = ocspReference + ocspEntry[i] + ' 0 R';

        if (i === vri.OCSPs.length - 1) {
            ocspReference = ocspReference + '] \n';
        } else {
            ocspReference = ocspReference + ' ';
        }
    }

    let crlsReference = '/CRLs [';
    for (let i = 0; i < vri.CRLs.length; i++) {
        crlsReference = crlsReference + crlsEntry[i] + ' 0 R';

        if (i === vri.CRLs.length - 1) {
            crlsReference = crlsReference + '] \n';
        } else {
            crlsReference = crlsReference + ' ';
        }
    }

    const offsets = [];

    const appendDss = '\n' + pdfToSign.dssEntry + ' 0 obj\n' +
        '<< \n' +
        '/VRI ' + vriEntry + ' 0 R \n' +
        certsReference +
        ocspReference +
        crlsReference +
        '>>';
    offsetDss = (pdf.stream.bytes.length);
    offsets.push(offsetDss);
    let array = this.insertIntoArray(pdf.stream.bytes, offsetDss, appendDss);

    const sigHash = this.strHex(this.digest(forge.util.decode64(pdfToSign.sig), 'SHA1')).toUpperCase();

    const appendVri = '\n' + vriEntry + ' 0 obj\n' +
        '<< \n' +
        '/' + sigHash + ' << \n' +
        certsReference +
        ocspReference +
        crlsReference +
        '>> \n' +
        '>>\n';
    offsetVri = offsetDss + appendDss.length;
    offsets.push(offsetVri);
    array = this.insertIntoArray(array, offsetVri, appendVri);

    let lastOffset = offsetVri + appendVri.length;
    const appendCerts = [];
    const appendOcsp = [];
    const appendCrls = [];

    let offsetDelta = 0;

    appendCerts[-1] = '';
    for (let i = 0; i < vri.certs.length; i++) {
        appendCerts[i] = certsEntry[i] + ' 0 obj\n' +
            '<< \n' +
            '/Length ' + vri.certs[i].length + ' \n' +
            '>>\n' +
            'stream\n' +
            atob(vri.certs[i]) + '\n' +
            'endstream\n' +
            'endobj\n';
        const currentOffset = lastOffset + appendCerts[i - 1].length;
        offsets.push(currentOffset);
        array = this.insertIntoArray(array, currentOffset, appendCerts[i]);
        lastOffset = currentOffset;
        offsetDelta += currentOffset;
    }

    lastOffset = lastOffset + appendCerts[appendCerts.length - 1].length;

    appendOcsp[-1] = '';
    for (let i = 0; i < vri.OCSPs.length; i++) {
        appendOcsp[i] = ocspEntry[i] + ' 0 obj\n' +
            '<< \n' +
            '/Length ' + vri.OCSPs[i].length + ' \n' +
            '>>\n' +
            'stream\n' +
            atob(vri.OCSPs[i]) + '\n' +
            'endstream\n' +
            'endobj\n';
        const currentOffset = lastOffset + appendOcsp[i - 1].length;
        offsets.push(currentOffset);
        array = this.insertIntoArray(array, currentOffset, appendOcsp[i]);
        lastOffset = currentOffset;
        offsetDelta += currentOffset;
    }

    lastOffset = lastOffset + appendOcsp[appendOcsp.length - 1].length;

    appendCrls[-1] = '';
    for (let i = 0; i < vri.CRLs.length; i++) {
        appendCrls[i] = crlsEntry[i] + ' 0 obj\n' +
            '<< \n' +
            '/Length ' + vri.CRLs[i].length + ' \n' +
            '>>\n' +
            'stream\n' +
            atob(vri.CRLs[i]) + '\n' +
            'endstream\n' +
            'endobj\n';
        const currentOffset = lastOffset + appendCrls[i - 1].length;
        offsets.push(currentOffset);
        array = this.insertIntoArray(array, currentOffset, appendCrls[i]);
        lastOffset = currentOffset;
        offsetDelta += currentOffset;
    }

    offsetDelta += appendDss.length + appendVri.length;

    let middle = '';
    offsets.forEach(offset => {
        offset = offset + '';
        middle += offset.padStart(10, '0') + ' ' + '00000' + ' ' + ' n' + '\n';
    });

    let xref = '\nxref\n' +
        pdfToSign.dssEntry + ' ' + (2 + vri.certs.length + vri.CRLs.length + vri.OCSPs.length) + '\n' +
    middle;

    const sha256Hex = sha256(array, false);

    xref += this.createTrailer(pdf.xref.topDict, array.length, sha256Hex, pdf.xref.entries.length);
    array = this.insertIntoArray(array, array.length, xref);

    return array;
}
公共附件vri(pdfRaw、pdfToSign、vri:vri){
if(阵列缓冲区的pdfRaw实例){
pdfRaw=新的UINT8阵列(pdfRaw);
}
const pdf=this.loadPdf(pdfRaw);
const root=this.findRootEntry(pdf.xref);
const rootSuccessor=this.findSuccessorEntry(pdf.xref.entries,root);
常数certsEntry=[];
常量xObjects=[];
让我们抵消DSS;
让我们抵消;
//让抵销证书[];
//让我们抵消CSP[];
//出租抵消权[];
const dummy=this.findFreeXrefNr(pdf.xref.entries,xObjects);
xObject.push(虚拟对象);
const dssEntry=this.findFreeXrefNr(pdf.xref.entries,xObjects);
xObjects.push(dss条目);
const vriEntry=this.findFreeXrefNr(pdf.xref.entries,xObjects);
xObjects.push(vriEntry);
for(设i=0;i';
offsetDss=(pdf.stream.bytes.length);
offset.push(offsetDss);
让array=this.insertIntoArray(pdf.stream.bytes,offsetDss,appendDss);
const sigHash=this.strHex(this.digest(forge.util.decode64(pdfToSign.sig),'SHA1')).toUpperCase();
常量appendVri='\n'+vriEntry+'0对象\n'+
“\n”+
“>>\n”;
offsetVri=offsetDss+appendDss.length;
偏置。推送(偏置VRI);
array=this.insertIntoArray(array,offsetVri,appendVri);
设lastOffset=offsetVri+appendVri.length;
常量appendCerts=[];
常量appendOcsp=[];
常量appendCrls=[];
让offsetDelta=0;
附件证书[-1]='';
for(设i=0;i\n”+
'流\n'+
atob(vri.certs[i])+'\n'+
'结束流\n'+
“endobj\n”;
const currentOffset=lastOffset+appendCerts[i-1]。长度;
offset.push(当前偏移量);
array=this.insertIntoArray(数组、currentOffset、appendCerts[i]);
lastOffset=当前偏移量;
offsetDelta+=当前偏移量;
}
lastOffset=lastOffset+appendCerts[appendCerts.length-1]。长度;
附录SP[-1]='';
for(设i=0;i\n”+
'流\n'+
atob(vri.OCSPs[i])+'\n'+
'结束流\n'+
“endobj\n”;
const currentOffset=lastOffset+appendOcsp[i-1]。长度;
offset.push(当前偏移量);
array=this.insertIntoArray(array,currentcoffset,appendOcsp[i]);
lastOffset=当前偏移量;
offsetDelta+=当前偏移量;
}
lastOffset=lastOffset+appendOcsp[appendOcsp.length-1]。长度;
附录CRLS[-1]='';
for(设i=0;i\n”+
'流\n'+
atob(vri.CRLs[i])+'\n'+
'结束流\n'+
“endobj\n”;
const currentOffset=lastOffset+appendCrls[i-1]。长度;
offset.push(当前偏移量);
array=this.insertIntoArray(array,currentcoffset,appendCrls[i]);
lastOffset=当前偏移量;
offsetDelta+=当前偏移量;
}
offsetDelta+=appendDss.length+appendVri.length;
让中间=“”;
offset.forEach(offset=>{
偏移量=偏移量+“”;
middle+=offset.padStart(10,'0')+'+'00000'+'+'n'+'\n';
});
让外部参照='\nxref\n'+
pdfToSign.dssEntry++(2+vri.certs.length+vri.CRLs.length+vri.OCSPs.length)+'\n'+
中间的
0000067127 00000  n\n
0000067127 00000 n \n
/Size 18
/Size 29
/Prev 66604