Skip to content

Commit f810573

Browse files
Kate IvanovaiText-CI
authored andcommitted
Add test on second time signing document
DEVSIX-4769
1 parent fd681f7 commit f810573

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

sign/src/test/java/com/itextpdf/signatures/sign/SequentialSignaturesTest.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,30 @@ This file is part of the iText (R) project.
4343
package com.itextpdf.signatures.sign;
4444

4545
import com.itextpdf.kernel.geom.Rectangle;
46+
import com.itextpdf.kernel.pdf.CompressionConstants;
47+
import com.itextpdf.kernel.pdf.PdfDocument;
48+
import com.itextpdf.kernel.pdf.PdfName;
4649
import com.itextpdf.kernel.pdf.PdfReader;
4750
import com.itextpdf.kernel.pdf.StampingProperties;
4851
import com.itextpdf.signatures.BouncyCastleDigest;
4952
import com.itextpdf.signatures.DigestAlgorithms;
5053
import com.itextpdf.signatures.IExternalSignature;
54+
import com.itextpdf.signatures.PdfSignatureAppearance;
5155
import com.itextpdf.signatures.PdfSigner;
56+
import com.itextpdf.signatures.PdfSigner.CryptoStandard;
5257
import com.itextpdf.signatures.PrivateKeySignature;
5358
import com.itextpdf.test.signutils.Pkcs12FileHelper;
5459
import com.itextpdf.test.ExtendedITextTest;
5560
import com.itextpdf.test.annotations.type.IntegrationTest;
61+
5662
import java.io.FileOutputStream;
5763
import java.io.IOException;
5864
import java.security.GeneralSecurityException;
5965
import java.security.PrivateKey;
6066
import java.security.Security;
6167
import java.security.cert.Certificate;
6268
import org.bouncycastle.jce.provider.BouncyCastleProvider;
69+
import org.junit.Assert;
6370
import org.junit.BeforeClass;
6471
import org.junit.Test;
6572
import org.junit.experimental.categories.Category;
@@ -101,4 +108,56 @@ public void sequentialSignOfFileWithAnnots() throws IOException, GeneralSecurity
101108

102109
PadesSigTest.basicCheckSignedDoc(outFileName, signatureName);
103110
}
111+
112+
@Test
113+
public void secondSignOfTaggedDocTest() throws IOException, GeneralSecurityException {
114+
String signCertFileName = certsSrc + "signCertRsa01.p12";
115+
String outFileName = destinationFolder + "secondSignOfTagged.pdf";
116+
String srcFileName = sourceFolder + "taggedAndSignedDoc.pdf";
117+
118+
Certificate[] signChain = Pkcs12FileHelper.readFirstChain(signCertFileName, password);
119+
120+
PrivateKey signPrivateKey = Pkcs12FileHelper.readFirstKey(signCertFileName, password, password);
121+
122+
IExternalSignature pks = new PrivateKeySignature(signPrivateKey, DigestAlgorithms.SHA256,
123+
BouncyCastleProvider.PROVIDER_NAME);
124+
125+
String signatureName = "Signature2";
126+
PdfSigner signer = new PdfSigner(new PdfReader(srcFileName), new FileOutputStream(outFileName),
127+
new StampingProperties().useAppendMode());
128+
129+
PdfDocument document = signer.getDocument();
130+
document.getWriter().setCompressionLevel(CompressionConstants.NO_COMPRESSION);
131+
132+
signer.setFieldName(signatureName);
133+
PdfSignatureAppearance appearance = signer.getSignatureAppearance();
134+
appearance.setPageNumber(1);
135+
signer.getSignatureAppearance()
136+
.setPageRect(new Rectangle(50, 550, 200, 100))
137+
.setReason("Test2")
138+
.setLocation("TestCity2")
139+
.setLayer2Text("Approval test signature #2.\nCreated by iText7.");
140+
141+
signer.signDetached(new BouncyCastleDigest(), pks, signChain, null, null,
142+
null, 0, CryptoStandard.CADES);
143+
144+
PadesSigTest.basicCheckSignedDoc(outFileName, "Signature1");
145+
PadesSigTest.basicCheckSignedDoc(outFileName, "Signature2");
146+
147+
try (PdfDocument twiceSigned = new PdfDocument(new PdfReader(outFileName));
148+
PdfDocument resource = new PdfDocument(new PdfReader(srcFileName))) {
149+
150+
float resourceStrElemNumber = resource.getStructTreeRoot().getPdfObject().getAsArray(PdfName.K)
151+
.getAsDictionary(0).getAsArray(PdfName.K).size();
152+
153+
float outStrElemNumber = twiceSigned.getStructTreeRoot().getPdfObject().getAsArray(PdfName.K)
154+
.getAsDictionary(0).getAsArray(PdfName.K).size();
155+
156+
// Here we assert the amount of objects in StructTreeRoot in resource file and twice signed file
157+
// as the original signature validation failed by Adobe because of struct tree change. If the fix
158+
// would make this tree unchanged, then the assertion should be adjusted with comparing the tree of
159+
// objects in StructTreeRoot to ensure that it won't be changed.
160+
Assert.assertNotEquals(resourceStrElemNumber, outStrElemNumber);
161+
}
162+
}
104163
}

0 commit comments

Comments
 (0)