Skip to content

Commit cedd237

Browse files
michaeldemeySamuel Huylebroeck
authored andcommitted
New DSS entries weren't properly merged into an existing DSS - DEVSIX-1441
1 parent 855b0f4 commit cedd237

File tree

3 files changed

+128
-11
lines changed

3 files changed

+128
-11
lines changed

sign/src/main/java/com/itextpdf/signatures/LtvVerification.java

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,17 @@ This file is part of the iText (R) project.
4747
import com.itextpdf.io.font.PdfEncodings;
4848
import com.itextpdf.io.source.ByteBuffer;
4949
import com.itextpdf.kernel.PdfException;
50-
import com.itextpdf.kernel.pdf.*;
51-
import org.bouncycastle.asn1.*;
52-
import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
53-
import org.bouncycastle.asn1.ocsp.OCSPResponse;
54-
import org.bouncycastle.asn1.ocsp.OCSPResponseStatus;
55-
import org.bouncycastle.asn1.ocsp.ResponseBytes;
56-
import org.bouncycastle.cert.ocsp.OCSPResp;
57-
import org.bouncycastle.cert.ocsp.OCSPRespBuilder;
58-
import org.slf4j.Logger;
59-
import org.slf4j.LoggerFactory;
50+
import com.itextpdf.kernel.pdf.CompressionConstants;
51+
import com.itextpdf.kernel.pdf.PdfArray;
52+
import com.itextpdf.kernel.pdf.PdfCatalog;
53+
import com.itextpdf.kernel.pdf.PdfDeveloperExtension;
54+
import com.itextpdf.kernel.pdf.PdfDictionary;
55+
import com.itextpdf.kernel.pdf.PdfDocument;
56+
import com.itextpdf.kernel.pdf.PdfIndirectReference;
57+
import com.itextpdf.kernel.pdf.PdfName;
58+
import com.itextpdf.kernel.pdf.PdfObject;
59+
import com.itextpdf.kernel.pdf.PdfStream;
60+
import com.itextpdf.kernel.pdf.PdfString;
6061

6162
import java.io.ByteArrayInputStream;
6263
import java.io.IOException;
@@ -65,7 +66,24 @@ This file is part of the iText (R) project.
6566
import java.security.NoSuchAlgorithmException;
6667
import java.security.cert.Certificate;
6768
import java.security.cert.X509Certificate;
68-
import java.util.*;
69+
import java.util.ArrayList;
70+
import java.util.Arrays;
71+
import java.util.Collection;
72+
import java.util.HashMap;
73+
import java.util.List;
74+
import java.util.Map;
75+
76+
import org.bouncycastle.asn1.ASN1InputStream;
77+
import org.bouncycastle.asn1.ASN1Primitive;
78+
import org.bouncycastle.asn1.DEROctetString;
79+
import org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
80+
import org.bouncycastle.asn1.ocsp.OCSPResponse;
81+
import org.bouncycastle.asn1.ocsp.OCSPResponseStatus;
82+
import org.bouncycastle.asn1.ocsp.ResponseBytes;
83+
import org.bouncycastle.cert.ocsp.OCSPResp;
84+
import org.bouncycastle.cert.ocsp.OCSPRespBuilder;
85+
import org.slf4j.Logger;
86+
import org.slf4j.LoggerFactory;
6987

7088
/**
7189
* Add verification according to PAdES-LTV (part 4).
@@ -400,19 +418,22 @@ private void outputDss(PdfDictionary dss, PdfDictionary vrim, PdfArray ocsps, Pd
400418
ps.makeIndirect(document);
401419
crl.add(ps);
402420
crls.add(ps);
421+
crls.setModified();
403422
}
404423
for (byte[] b : validated.get(vkey).ocsps) {
405424
PdfStream ps = new PdfStream(b);
406425
ps.setCompressionLevel(CompressionConstants.DEFAULT_COMPRESSION);
407426
ocsp.add(ps);
408427
ocsps.add(ps);
428+
ocsps.setModified();
409429
}
410430
for (byte[] b : validated.get(vkey).certs) {
411431
PdfStream ps = new PdfStream(b);
412432
ps.setCompressionLevel(CompressionConstants.DEFAULT_COMPRESSION);
413433
ps.makeIndirect(document);
414434
cert.add(ps);
415435
certs.add(ps);
436+
certs.setModified();
416437
}
417438
if (ocsp.size() > 0) {
418439
ocsp.makeIndirect(document);
@@ -430,6 +451,7 @@ private void outputDss(PdfDictionary dss, PdfDictionary vrim, PdfArray ocsps, Pd
430451
vrim.put(vkey, vri);
431452
}
432453
vrim.makeIndirect(document);
454+
vrim.setModified();
433455
dss.put(PdfName.VRI, vrim);
434456
if (ocsps.size() > 0) {
435457
ocsps.makeIndirect(document);
@@ -445,6 +467,7 @@ private void outputDss(PdfDictionary dss, PdfDictionary vrim, PdfArray ocsps, Pd
445467
}
446468

447469
dss.makeIndirect(document);
470+
dss.setModified();
448471
catalog.put(PdfName.DSS, dss);
449472
}
450473

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.itextpdf.signatures.sign;
2+
3+
import com.itextpdf.kernel.pdf.PdfArray;
4+
import com.itextpdf.kernel.pdf.PdfDictionary;
5+
import com.itextpdf.kernel.pdf.PdfDocument;
6+
import com.itextpdf.kernel.pdf.PdfName;
7+
import com.itextpdf.kernel.pdf.PdfReader;
8+
import com.itextpdf.kernel.pdf.PdfWriter;
9+
import com.itextpdf.kernel.pdf.StampingProperties;
10+
import com.itextpdf.signatures.LtvVerification;
11+
import com.itextpdf.signatures.testutils.Pkcs12FileHelper;
12+
import com.itextpdf.signatures.testutils.client.TestCrlClient;
13+
import com.itextpdf.signatures.testutils.client.TestOcspClient;
14+
import com.itextpdf.signatures.testutils.client.TestTsaClient;
15+
import com.itextpdf.test.ExtendedITextTest;
16+
import com.itextpdf.test.annotations.type.IntegrationTest;
17+
18+
import java.security.GeneralSecurityException;
19+
import java.security.PrivateKey;
20+
import java.security.Security;
21+
import java.security.cert.Certificate;
22+
import java.security.cert.X509Certificate;
23+
import java.util.Arrays;
24+
25+
import org.junit.Assert;
26+
import org.junit.BeforeClass;
27+
import org.junit.Test;
28+
import org.junit.experimental.categories.Category;
29+
30+
@Category( IntegrationTest.class)
31+
public class LtvWithTwoSignatures extends ExtendedITextTest {
32+
33+
private static final String certsSrc = "./src/test/resources/com/itextpdf/signatures/certs/";
34+
private static final String sourceFolder = "./src/test/resources/com/itextpdf/signatures/sign/LtvWithTwoSignaturesTest/";
35+
private static final String destinationFolder = "./target/test/com/itextpdf/signatures/sign/LtvWithTwoSignaturesTest/";
36+
37+
private static final char[] password = "testpass".toCharArray();
38+
39+
@BeforeClass
40+
public static void before() {
41+
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
42+
createOrClearDestinationFolder(destinationFolder);
43+
}
44+
45+
@Test
46+
public void AddLtvInfo() throws GeneralSecurityException, java.io.IOException {
47+
String tsaCertFileName = certsSrc + "tsCertRsa.p12";
48+
String caCertFileName = certsSrc + "rootRsa.p12";
49+
String srcFileName = sourceFolder + "signedDoc.pdf";
50+
String ltvFileName = destinationFolder + "ltvEnabledTest01.pdf";
51+
String ltvFileName2 = destinationFolder + "ltvEnabledTest02.pdf";
52+
53+
Certificate[] tsaChain = Pkcs12FileHelper.readFirstChain(tsaCertFileName, password);
54+
PrivateKey tsaPrivateKey = Pkcs12FileHelper.readFirstKey(tsaCertFileName, password, password);
55+
X509Certificate caCert = (X509Certificate) Pkcs12FileHelper.readFirstChain(caCertFileName, password)[0];
56+
PrivateKey caPrivateKey = Pkcs12FileHelper.readFirstKey(caCertFileName, password, password);
57+
58+
TestTsaClient testTsa = new TestTsaClient(Arrays.asList(tsaChain), tsaPrivateKey);
59+
TestOcspClient testOcspClient = new TestOcspClient(caCert, caPrivateKey);
60+
TestCrlClient testCrlClient = new TestCrlClient(caCert, caPrivateKey);
61+
62+
AddLtvInfo(srcFileName,ltvFileName,"sig",testOcspClient,testCrlClient);
63+
AddLtvInfo(ltvFileName,ltvFileName2,"sig2",testOcspClient,testCrlClient);
64+
65+
PdfReader reader = new PdfReader(ltvFileName2);
66+
PdfDocument document = new PdfDocument(reader);
67+
PdfDictionary catalogDictionary = document.getCatalog().getPdfObject();
68+
PdfDictionary dssDictionary = catalogDictionary.getAsDictionary(PdfName.DSS);
69+
70+
PdfDictionary vri = dssDictionary.getAsDictionary(PdfName.VRI);
71+
Assert.assertNotNull(vri);
72+
Assert.assertEquals(2, vri.size());
73+
74+
PdfArray ocsps = dssDictionary.getAsArray(PdfName.OCSPs);
75+
Assert.assertNotNull(ocsps);
76+
Assert.assertEquals(2, ocsps.size());
77+
78+
PdfArray certs = dssDictionary.getAsArray(PdfName.Certs);
79+
Assert.assertNotNull(certs);
80+
Assert.assertEquals(2, certs.size());
81+
82+
PdfArray crls = dssDictionary.getAsArray(PdfName.CRLs);
83+
Assert.assertNotNull(crls);
84+
Assert.assertEquals(1, crls.size());
85+
}
86+
87+
private void AddLtvInfo(String src, String dest, String sigName, TestOcspClient testOcspClient,TestCrlClient testCrlClient ) throws java.io.IOException, GeneralSecurityException {
88+
PdfDocument document = new PdfDocument(new PdfReader(src), new PdfWriter(dest), new StampingProperties().useAppendMode());
89+
LtvVerification ltvVerification = new LtvVerification(document, "BC");
90+
ltvVerification.addVerification(sigName, testOcspClient, testCrlClient, LtvVerification.CertificateOption.SIGNING_CERTIFICATE, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES);
91+
ltvVerification.merge();
92+
document.close();
93+
}
94+
}

0 commit comments

Comments
 (0)