From 32b535b88c65fc428f5d0275341e51e03e818aad Mon Sep 17 00:00:00 2001 From: Eugene Bochilo Date: Sun, 8 Sep 2024 20:52:48 +0000 Subject: [PATCH 1/4] Fix acroform and revisions validation minor issues DEVSIX-8572 Autoported commit. Original commit hash: [b6d14af58] --- .../itext/forms/PdfAcroFormIntegrationTest.cs | 14 ++++++++++++++ ...DocumentRevisionsValidatorIntegrationTest.cs | 10 ++++++++++ .../pdfVersionAdded.pdf | Bin 0 -> 31387 bytes .../itext/forms/fields/PdfFormFieldMergeUtil.cs | 6 +++++- .../validation/DocumentRevisionsValidator.cs | 1 + port-hash | 2 +- 6 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 itext.tests/itext.sign.tests/resources/itext/signatures/validation/DocumentRevisionsValidatorIntegrationTest/pdfVersionAdded.pdf diff --git a/itext.tests/itext.forms.tests/itext/forms/PdfAcroFormIntegrationTest.cs b/itext.tests/itext.forms.tests/itext/forms/PdfAcroFormIntegrationTest.cs index e999323972..65aa3452de 100644 --- a/itext.tests/itext.forms.tests/itext/forms/PdfAcroFormIntegrationTest.cs +++ b/itext.tests/itext.forms.tests/itext/forms/PdfAcroFormIntegrationTest.cs @@ -52,6 +52,20 @@ public virtual void OrphanedNamelessFormFieldTest() { } } + [NUnit.Framework.Test] + public virtual void FormWithSameFieldReferencesTest() { + String srcFileName = SOURCE_FOLDER + "formWithSameFieldReferences.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_formWithSameFieldReferences.pdf"; + String outFileName = DESTINATION_FOLDER + "formWithSameFieldReferences.pdf"; + using (PdfDocument sourceDoc = new PdfDocument(new PdfReader(srcFileName), new PdfWriter(outFileName))) { + PdfAcroForm acroForm = PdfFormCreator.GetAcroForm(sourceDoc, true); + NUnit.Framework.Assert.AreEqual(1, acroForm.GetFields().Size()); + NUnit.Framework.Assert.IsNull(acroForm.GetField("Field").GetKids()); + } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER + , "diff_")); + } + [NUnit.Framework.Test] public virtual void MergeMergedFieldsWithTheSameNamesTest() { String srcFileName = SOURCE_FOLDER + "fieldMergedWithWidget.pdf"; diff --git a/itext.tests/itext.sign.tests/itext/signatures/validation/DocumentRevisionsValidatorIntegrationTest.cs b/itext.tests/itext.sign.tests/itext/signatures/validation/DocumentRevisionsValidatorIntegrationTest.cs index 016e40eca0..778d715937 100644 --- a/itext.tests/itext.sign.tests/itext/signatures/validation/DocumentRevisionsValidatorIntegrationTest.cs +++ b/itext.tests/itext.sign.tests/itext/signatures/validation/DocumentRevisionsValidatorIntegrationTest.cs @@ -616,5 +616,15 @@ public virtual void FullCompressionModeLevel3Test(bool continueValidationAfterFa (0).HasNumberOfLogs(0)); } } + + [NUnit.Framework.TestCaseSource("CreateParameters")] + public virtual void PdfVersionAddedTest(bool continueValidationAfterFail) { + SetUp(continueValidationAfterFail); + using (PdfDocument document = new PdfDocument(new PdfReader(SOURCE_FOLDER + "pdfVersionAdded.pdf"))) { + DocumentRevisionsValidator validator = builder.BuildDocumentRevisionsValidator(); + ValidationReport report = validator.ValidateAllDocumentRevisions(validationContext, document); + AssertValidationReport.AssertThat(report, (a) => a.HasStatus(ValidationReport.ValidationResult.VALID)); + } + } } } diff --git a/itext.tests/itext.sign.tests/resources/itext/signatures/validation/DocumentRevisionsValidatorIntegrationTest/pdfVersionAdded.pdf b/itext.tests/itext.sign.tests/resources/itext/signatures/validation/DocumentRevisionsValidatorIntegrationTest/pdfVersionAdded.pdf new file mode 100644 index 0000000000000000000000000000000000000000..844f68281b2e2ce7aa61a07146af85de65ac1896 GIT binary patch literal 31387 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 Q+S(WTa3G)b^U&vi0jwtf!2kdN literal 0 HcmV?d00001 diff --git a/itext/itext.forms/itext/forms/fields/PdfFormFieldMergeUtil.cs b/itext/itext.forms/itext/forms/fields/PdfFormFieldMergeUtil.cs index 177cd5bd5d..53e296c1a4 100644 --- a/itext/itext.forms/itext/forms/fields/PdfFormFieldMergeUtil.cs +++ b/itext/itext.forms/itext/forms/fields/PdfFormFieldMergeUtil.cs @@ -49,7 +49,7 @@ public static void MergeKidsWithSameNames(PdfFormField parentField, bool throwEx return; } PdfArray kids = parent.GetAsArray(PdfName.Kids); - if (kids == null || kids.Size() == 0) { + if (kids == null || kids.IsEmpty()) { return; } IDictionary addedKids = new LinkedDictionary(); @@ -83,6 +83,10 @@ public static void MergeKidsWithSameNames(PdfFormField parentField, bool throwEx /// true if fields is successfully merged, false otherwise. public static bool MergeTwoFieldsWithTheSameNames(PdfFormField firstField, PdfFormField secondField, bool throwExceptionOnError) { + if (firstField.GetPdfObject() == secondField.GetPdfObject()) { + // We don't need to perform any strategy on duplicated references, we can just always remove them. + return true; + } OnDuplicateFormFieldNameStrategy onDuplicateFormFieldNameStrategy = firstField.GetDocument().GetDiContainer ().GetInstance(); return onDuplicateFormFieldNameStrategy.Execute(firstField, secondField, throwExceptionOnError); diff --git a/itext/itext.sign/itext/signatures/validation/DocumentRevisionsValidator.cs b/itext/itext.sign/itext/signatures/validation/DocumentRevisionsValidator.cs index 619d5ca716..9a051511ec 100644 --- a/itext/itext.sign/itext/signatures/validation/DocumentRevisionsValidator.cs +++ b/itext/itext.sign/itext/signatures/validation/DocumentRevisionsValidator.cs @@ -1693,6 +1693,7 @@ private PdfDictionary CopyCatalogEntriesToCompare(PdfDictionary catalog) { catalogCopy.Remove(PdfName.AcroForm); catalogCopy.Remove(PdfName.Pages); catalogCopy.Remove(PdfName.StructTreeRoot); + catalogCopy.Remove(PdfName.Version); return catalogCopy; } diff --git a/port-hash b/port-hash index 07b074bd51..158df4c262 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -0af84b16dc49ad7731dcd72fba6644e6079af932 +b6d14af580ba26e05a2d011b69085c5f0a29861b From 3f4be4e4526395977732f804b0d2ebb3cd9d7a12 Mon Sep 17 00:00:00 2001 From: Eugene Bochilo Date: Sun, 8 Sep 2024 20:54:39 +0000 Subject: [PATCH 2/4] Read and rewrite PDF documents with MAC token DEVSIX-8572 Autoported commit. Original commit hash: [c26d73afe] Manual files: bouncy-castle-adapter/src/main/java/com/itextpdf/bouncycastle/BouncyCastleFactory.java bouncy-castle-connector/src/main/java/com/itextpdf/bouncycastleconnector/BouncyCastleDefaultFactory.java bouncy-castle-fips-adapter/src/main/java/com/itextpdf/bouncycastlefips/BouncyCastleFipsFactory.java commons/src/main/java/com/itextpdf/commons/bouncycastle/IBouncyCastleFactory.java kernel/src/test/java/com/itextpdf/kernel/crypto/PdfEncryptingTest.java --- .../cmp_formWithSameFieldReferences.pdf | Bin 0 -> 1530 bytes .../formWithSameFieldReferences.pdf | Bin 0 -> 1366 bytes .../crypto/pdfencryption/PdfEncryptionTest.cs | 2 +- ...s => MacIntegrityProtectorCreationTest.cs} | 196 ++++------ ...tegrityProtectorReadingAndRewritingTest.cs | 182 +++++++++ ..._appended_encryptWithCertificateAes128.pdf | Bin 9626 -> 9391 bytes ...ryptWithCertificateAes128NoCompression.pdf | Bin 9632 -> 9443 bytes ..._appended_encryptWithCertificateAes256.pdf | Bin 9639 -> 9483 bytes ...ryptWithCertificateAes256NoCompression.pdf | Bin 9620 -> 9416 bytes ...nded_encryptWithCertificateStandard128.pdf | Bin 9116 -> 8980 bytes ...ithCertificateStandard128NoCompression.pdf | Bin 9129 -> 8901 bytes ...ended_encryptWithCertificateStandard40.pdf | Bin 9188 -> 8918 bytes ...WithCertificateStandard40NoCompression.pdf | Bin 9125 -> 8954 bytes .../cmp_encryptWithCertificateAes128.pdf | Bin 5200 -> 5235 bytes ...ryptWithCertificateAes128NoCompression.pdf | Bin 5201 -> 5227 bytes .../cmp_encryptWithCertificateAes256.pdf | Bin 5223 -> 5240 bytes ...ryptWithCertificateAes256NoCompression.pdf | Bin 5214 -> 5180 bytes .../cmp_encryptWithCertificateStandard128.pdf | Bin 4942 -> 4961 bytes ...ithCertificateStandard128NoCompression.pdf | Bin 4932 -> 4917 bytes .../cmp_encryptWithCertificateStandard40.pdf | Bin 4962 -> 4924 bytes ...WithCertificateStandard40NoCompression.pdf | Bin 4917 -> 4899 bytes .../certs/SHA256withRSA.cer | Bin .../certs/SHA256withRSA.key | 0 .../cmp_macEncryptionWithAesGsmTest.pdf | Bin 0 -> 5751 bytes ...p_standaloneMacPublicKeyEncryptionTest.pdf | Bin 0 -> 6033 bytes ...mp_standaloneMacStandardEncryptionTest.pdf | Bin 0 -> 5419 bytes ...tandaloneMacWithAllHashAlgorithmsTest1.pdf | Bin 0 -> 5367 bytes ...tandaloneMacWithAllHashAlgorithmsTest2.pdf | Bin 0 -> 5435 bytes ...tandaloneMacWithAllHashAlgorithmsTest3.pdf | Bin 0 -> 5512 bytes ...tandaloneMacWithAllHashAlgorithmsTest4.pdf | Bin 0 -> 5436 bytes ...tandaloneMacWithAllHashAlgorithmsTest5.pdf | Bin 0 -> 5440 bytes ...tandaloneMacWithAllHashAlgorithmsTest6.pdf | Bin 0 -> 5522 bytes .../certs/SHA256withRSA.cer | Bin 0 -> 899 bytes .../certs/SHA256withRSA.key | 51 +++ .../certs/certForEncryption.crt | Bin 0 -> 876 bytes .../certs/keyForEncryption.pem | 30 ++ .../cmp_appendModeTest.pdf | Bin 0 -> 10414 bytes .../cmp_macShouldNotBePreservedTest.pdf | Bin 0 -> 4245 bytes ...ShouldNotBePreservedWithEncryptionTest.pdf | Bin 0 -> 4963 bytes .../cmp_preserveEncryptionTest.pdf | Bin 0 -> 5850 bytes .../cmp_writerPropertiesTest.pdf | Bin 0 -> 5914 bytes .../invalidMacProtectedDocument.pdf} | Bin 5439 -> 5439 bytes .../invalidPublicKeyMacProtectedDocument.pdf} | Bin 6043 -> 6043 bytes .../macProtectedDocument.pdf | Bin 0 -> 5471 bytes .../macProtectedDocumentPdf1_7.pdf | Bin 0 -> 2781 bytes .../thirdPartyMacProtectedDocument.pdf | Bin 0 -> 3470 bytes ...hirdPartyPublicKeyMacProtectedDocument.pdf | Bin 0 -> 4584 bytes ...mp_standaloneMacStandardEncryptionTest.pdf | Bin 5400 -> 0 bytes ...tandaloneMacWithAllHashAlgorithmsTest1.pdf | Bin 5356 -> 0 bytes ...tandaloneMacWithAllHashAlgorithmsTest2.pdf | Bin 5436 -> 0 bytes ...tandaloneMacWithAllHashAlgorithmsTest3.pdf | Bin 5520 -> 0 bytes ...tandaloneMacWithAllHashAlgorithmsTest4.pdf | Bin 5380 -> 0 bytes ...tandaloneMacWithAllHashAlgorithmsTest6.pdf | Bin 5486 -> 0 bytes .../itext/bouncycastle/BouncyCastleFactory.cs | 7 + .../BouncyCastleDefaultFactory.cs | 4 + .../BouncyCastleFipsFactory.cs | 5 + .../bouncycastle/IBouncyCastleFactory.cs | 8 + .../itext.io/itext/io/source/OutputStream.cs | 2 +- .../PubSecHandlerUsingAes128.cs | 1 - .../PubSecHandlerUsingAes256.cs | 1 - .../PubSecHandlerUsingAesGcm.cs | 1 - .../PubSecHandlerUsingStandard128.cs | 2 - .../PubSecHandlerUsingStandard40.cs | 1 - .../StandardSecurityHandler.cs | 6 +- .../KernelExceptionMessageConstant.cs | 22 ++ .../itext/kernel/mac/MacIntegrityProtector.cs | 352 +++++++++++++----- .../itext/kernel/mac/MacPdfObject.cs | 6 +- .../itext/kernel/pdf/PdfDocument.cs | 26 +- .../itext/kernel/pdf/PdfEncryption.cs | 225 +++++++++-- .../itext.kernel/itext/kernel/pdf/PdfName.cs | 6 + .../itext/kernel/pdf/PdfReader.cs | 15 +- .../itext/kernel/pdf/PdfWriter.cs | 48 ++- port-hash | 2 +- 73 files changed, 908 insertions(+), 293 deletions(-) create mode 100644 itext.tests/itext.forms.tests/resources/itext/forms/PdfAcroFormIntegrationTest/cmp_formWithSameFieldReferences.pdf create mode 100644 itext.tests/itext.forms.tests/resources/itext/forms/PdfAcroFormIntegrationTest/formWithSameFieldReferences.pdf rename itext.tests/itext.kernel.tests/itext/kernel/mac/{MacIntegrityProtectorTest.cs => MacIntegrityProtectorCreationTest.cs} (50%) create mode 100644 itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs rename itext.tests/itext.kernel.tests/resources/itext/kernel/mac/{MacIntegrityProtectorTest => MacIntegrityProtectorCreationTest}/certs/SHA256withRSA.cer (100%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/mac/{MacIntegrityProtectorTest => MacIntegrityProtectorCreationTest}/certs/SHA256withRSA.key (100%) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_macEncryptionWithAesGsmTest.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacPublicKeyEncryptionTest.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacStandardEncryptionTest.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest1.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest2.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest3.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest4.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest5.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest6.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/SHA256withRSA.cer create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/SHA256withRSA.key create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/certForEncryption.crt create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/keyForEncryption.pem create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_appendModeTest.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_macShouldNotBePreservedTest.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_macShouldNotBePreservedWithEncryptionTest.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_preserveEncryptionTest.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_writerPropertiesTest.pdf rename itext.tests/itext.kernel.tests/resources/itext/kernel/mac/{MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest5.pdf => MacIntegrityProtectorReadingAndRewritingTest/invalidMacProtectedDocument.pdf} (98%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/mac/{MacIntegrityProtectorTest/cmp_standaloneMacPublicKeyEncryptionTest.pdf => MacIntegrityProtectorReadingAndRewritingTest/invalidPublicKeyMacProtectedDocument.pdf} (99%) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/macProtectedDocument.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/macProtectedDocumentPdf1_7.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/thirdPartyMacProtectedDocument.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/thirdPartyPublicKeyMacProtectedDocument.pdf delete mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacStandardEncryptionTest.pdf delete mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest1.pdf delete mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest2.pdf delete mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest3.pdf delete mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest4.pdf delete mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest6.pdf diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfAcroFormIntegrationTest/cmp_formWithSameFieldReferences.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfAcroFormIntegrationTest/cmp_formWithSameFieldReferences.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea4260551c15b672ce188176350cfbbd1a7bec72 GIT binary patch literal 1530 zcmZ`(%Z}SN6itz=wCOK!693??BGlIuR3wXSs#4A^UM;b_S;B?pj z=nrI*59y{r`v>iyACPS~y_6qvJtzS^cyS+x_nyN}Gzt5B;8~qN|N89@%O#8y@jGic zq~i!*mxOaPO-Ca-8Fy*O3Af2C?a^>XXB!%(gwcpN#)VEHspp(ABJr`!SFi=WUdQ!^ zJD}fZdI>e1b;Ar+x<}u3d!vyBxi;lwTQ;;Wf zi9W<`T&7SJ>oS3AIK

%Ix-m|I8dLQcGx0A~1Fb;2g2mS&>ihB;Cn3HnTbNn9rpX zFz-1N&lr2wqZfs49USHh#$6|H+=D|@7J8jP+0ACKsXq~Kzz5vxUtf-+>sMDZ@)29j z`X)PRJjlzkSl^M$x8$Zfei^;#zlX9y7&pCd$!(#tGy_f6RhBQe{-4NsQ344DY{1&A z+gNglZOb@hd{=&`;85pij)p7y_9tZ#7UeAonr@mdRlCkMZ97-BS{2K-b6y*JrYZ<= zVDuHN-b0-wioVE^3Wynbl#lZ&JM8!TGD$gYQk&2=ubJk4BE=fV%jtKSuI3GC7u$#i zT^nK`??NV1RDnroKAaekCq@7XF{xwnr~iU1poPX(1!c zdx4TV=HULQrmb7tKU~G{P<2Pbcz$o)|NiC2=0s*m#Ar>IG5Pp&<=BpGt zFd8zRNJn~(Cm_+x4w#?1o=owNI|)->V9PY++=dv0NaDbbUBztWX<%CTKEzxlF}SIx z9UTNt;0lE$xa25!p{1h$q^&*M)51=908-kilYn+PcVk!R(Sp9t(}I}m1#jA-KpHo{ l*V#{iBSZpr8uj;$nEU?~vsKlqtebIj#sjOWvi6i$_{yy+EYLjz68%-9&43Lz03CsFfbft6MwECzd^j=&R*hlqC9d-MX? z^dQ|-YH!d+JwUeI^o;{C0<|59F@E~q-}k=fQsDVjy5|_BA3wi-H|mHWF}yOGP23LP zIzyC#soQE{uU*DIMbt#$sDk|vhjZ+Y5WxYeX$bD}NcAZp$cCS(pB5S5-fXDeUvvB> ziN{>wuRg`Uw70U;EqTYPgRC=sxCg|al-b+yiefOZrI4JnFAa!2^eJN zkS@=}Oh!CwHlh1aCesaks2dB|m=~RBww47%QusnnQ6rD1aoHkv?$}|9O~knHwF=)3 z^r;e&dcZ>2du0-n5{J0dt~H3WOROD2b}IN(#Qz2aQpB@}%W@L(x%!NpJ-SDoYVWKa z^p4I$bPHo5RUIAW2y`gL>>8b2pv!XmFgU5+aG60Fmz9-aIYpWKEaN^fi;wu^hN~oE z_#lOuCFvLjp0?90d3;|ALHAB^&VY6;+Sjx%sOyLs%z@(9Nu2d_bqyXoauN#{&FsR( z>w;W$K>eUd7YV9`$>n-m=m6zv*t`ct$XxG>nET6#YgKD8|6QD>gHM@~$-J)>Ku~@U zU?)~Zw4^|*;-R0n=ff*ln-yj6-Whk_p4|r5_p@Iw?!Ii_Uw(YK)qMW+_omqAl8+2X zWg0NWhvTBUZCf@Pp{32Tpl5wh`e>`$P~Mu&YHZ?60yM7Ss0H&_vk?kgwPv&HAm=q3 zp+F5Bx>BD*VD9TUsCEPAuH;aXB@-_7XX@BP{U(dt8jo4S;zKs%LyKF~vfL { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - } - ).Message; - NUnit.Framework.Assert.AreEqual("HKDF algorithm is not supported in bouncy-castle FIPS mode.", exceptionMessage - ); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER + , "diff", PASSWORD, PASSWORD)); + } + + [NUnit.Framework.Test] + public virtual void MacEncryptionWithAesGsmTest() { + String fileName = "macEncryptionWithAesGsmTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + "cmp_" + fileName; + MacProperties macProperties = new MacProperties(MacProperties.MacDigestAlgorithm.SHA_256); + WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption + (PASSWORD, PASSWORD, 0, EncryptionConstants.ENCRYPTION_AES_GCM, macProperties); + using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties + ))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER + , "diff", PASSWORD, PASSWORD)); } [NUnit.Framework.Test] public virtual void StandaloneMacUnwritableStreamTest() { - String fileName = "standaloneMacStandardEncryptionTest.pdf"; - String outputFileName = DESTINATION_FOLDER + fileName; MacProperties macProperties = new MacProperties(MacProperties.MacDigestAlgorithm.SHA_256, MacProperties.MacAlgorithm .HMAC_WITH_SHA_256, MacProperties.KeyWrappingAlgorithm.AES_256_NO_PADD); WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption (PASSWORD, PASSWORD, 0, EncryptionConstants.ENCRYPTION_AES_256, macProperties); - MemoryStream unwritableStream = new _MemoryStream_122(); - if ("BC".Equals(PROVIDER_NAME)) { - String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(Exception), () => { - using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(unwritableStream, writerProperties))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - } - ).Message; - NUnit.Framework.Assert.AreEqual("expected", exceptionMessage); - } - else { - String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(NotSupportedException), () => { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } + MemoryStream unwritableStream = new _MemoryStream_120(); + String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(Exception), () => { + using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(unwritableStream, writerProperties))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); } - ).Message; - NUnit.Framework.Assert.AreEqual("HKDF algorithm is not supported in bouncy-castle FIPS mode.", exceptionMessage - ); } + ).Message; + NUnit.Framework.Assert.AreEqual("expected", exceptionMessage); unwritableStream.Dispose(); } - private sealed class _MemoryStream_122 : MemoryStream { - public _MemoryStream_122() { + private sealed class _MemoryStream_120 : MemoryStream { + public _MemoryStream_120() { } public override void Write(byte[] b, int off, int len) { @@ -144,25 +133,12 @@ public virtual void StandaloneMacWithAllHashAlgorithmsTest() { ); WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption (PASSWORD, PASSWORD, 0, EncryptionConstants.ENCRYPTION_AES_256, macProperties); - if ("BC".Equals(PROVIDER_NAME)) { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER - , "diff", PASSWORD, PASSWORD)); - } - else { - String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(NotSupportedException), () => { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - } - ).Message; - NUnit.Framework.Assert.AreEqual("HKDF algorithm is not supported in bouncy-castle FIPS mode.", exceptionMessage - ); + using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties + ))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER + , "diff", PASSWORD, PASSWORD)); } } @@ -174,28 +150,14 @@ public virtual void StandaloneMacPdfVersionNotSetTest() { .HMAC_WITH_SHA_256, MacProperties.KeyWrappingAlgorithm.AES_256_NO_PADD); WriterProperties writerProperties = new WriterProperties().SetStandardEncryption(PASSWORD, PASSWORD, 0, EncryptionConstants .ENCRYPTION_AES_256, macProperties); - if ("BC".Equals(PROVIDER_NAME)) { - String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(PdfException), () => { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - } - ).Message; - NUnit.Framework.Assert.AreEqual("MAC integrity protection is only supported for PDF 2.0 or higher.", exceptionMessage - ); - } - else { - String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(NotSupportedException), () => { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } + String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(PdfException), () => { + using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties + ))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); } - ).Message; - NUnit.Framework.Assert.AreEqual("HKDF algorithm is not supported in bouncy-castle FIPS mode.", exceptionMessage - ); } + ).Message; + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.MAC_FOR_PDF_2, exceptionMessage); } [NUnit.Framework.Test] @@ -206,32 +168,17 @@ public virtual void StandaloneMacOldEncryptionAlgorithmTest() { .HMAC_WITH_SHA_256, MacProperties.KeyWrappingAlgorithm.AES_256_NO_PADD); WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption (PASSWORD, PASSWORD, 0, EncryptionConstants.ENCRYPTION_AES_128, macProperties); - if ("BC".Equals(PROVIDER_NAME)) { - String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(PdfException), () => { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - } - ).Message; - NUnit.Framework.Assert.AreEqual("MAC integrity protection is only supported for encryption algorithms of version 5 or higher." - , exceptionMessage); - } - else { - String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(NotSupportedException), () => { - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } + String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(PdfException), () => { + using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties + ))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); } - ).Message; - NUnit.Framework.Assert.AreEqual("HKDF algorithm is not supported in bouncy-castle FIPS mode.", exceptionMessage - ); } + ).Message; + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.MAC_FOR_ENCRYPTION_5, exceptionMessage); } [NUnit.Framework.Test] - [LogMessage(VersionConforming.DEPRECATED_AES256_REVISION, Ignore = true)] public virtual void StandaloneMacPublicKeyEncryptionTest() { String fileName = "standaloneMacPublicKeyEncryptionTest.pdf"; String outputFileName = DESTINATION_FOLDER + fileName; @@ -240,37 +187,24 @@ public virtual void StandaloneMacPublicKeyEncryptionTest() { .HMAC_WITH_SHA_256, MacProperties.KeyWrappingAlgorithm.AES_256_NO_PADD); IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(CERTS_SRC + "SHA256withRSA.cer")); - if ("BC".Equals(PROVIDER_NAME)) { - WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetPublicKeyEncryption - (new IX509Certificate[] { certificate }, new int[] { -1 }, EncryptionConstants.ENCRYPTION_AES_256, macProperties - ); - using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outputFileName, writerProperties))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - IPrivateKey privateKey = GetPrivateKey("SHA256withRSA.key"); - CompareTool compareTool = new CompareTool(); - compareTool.GetCmpReaderProperties().SetPublicKeySecurityParams(certificate, privateKey); - compareTool.GetOutReaderProperties().SetPublicKeySecurityParams(certificate, privateKey); - NUnit.Framework.Assert.IsNull(compareTool.CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER - , "diff")); - } - else { - NUnit.Framework.Assert.Catch(typeof(Exception), () => { - WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetPublicKeyEncryption - (new IX509Certificate[] { certificate }, new int[] { -1 }, EncryptionConstants.ENCRYPTION_AES_256, macProperties - ); - using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties - ))) { - pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); - } - } + WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetPublicKeyEncryption + (new IX509Certificate[] { certificate }, new int[] { -1 }, EncryptionConstants.ENCRYPTION_AES_256, macProperties ); + using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outputFileName, writerProperties + ))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); } + IPrivateKey privateKey = GetPrivateKey(CERTS_SRC + "SHA256withRSA.key"); + CompareTool compareTool = new CompareTool(); + compareTool.GetCmpReaderProperties().SetPublicKeySecurityParams(certificate, privateKey); + compareTool.GetOutReaderProperties().SetPublicKeySecurityParams(certificate, privateKey); + NUnit.Framework.Assert.IsNull(compareTool.CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER + , "diff")); } - public virtual IPrivateKey GetPrivateKey(String keyName) { - return PemFileHelper.ReadPrivateKeyFromPemFile(FileUtil.GetInputStreamForFile(CERTS_SRC + keyName), "testpassphrase" - .ToCharArray()); + public static IPrivateKey GetPrivateKey(String keyName) { + return PemFileHelper.ReadPrivateKeyFromPemFile(FileUtil.GetInputStreamForFile(keyName), "testpassphrase".ToCharArray + ()); } } } diff --git a/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs new file mode 100644 index 0000000000..1b82da5f4b --- /dev/null +++ b/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs @@ -0,0 +1,182 @@ +using System; +using NUnit.Framework; +using iText.Bouncycastleconnector; +using iText.Commons.Bouncycastle.Cert; +using iText.Commons.Bouncycastle.Crypto; +using iText.Commons.Utils; +using iText.Kernel.Crypto; +using iText.Kernel.Exceptions; +using iText.Kernel.Geom; +using iText.Kernel.Pdf; +using iText.Kernel.Pdf.Annot; +using iText.Kernel.Utils; +using iText.Test; + +namespace iText.Kernel.Mac { + [NUnit.Framework.Category("BouncyCastleIntegrationTest")] + public class MacIntegrityProtectorReadingAndRewritingTest : ExtendedITextTest { + private static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/"; + + private static readonly String DESTINATION_FOLDER = NUnit.Framework.TestContext.CurrentContext.TestDirectory + + "/test/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/"; + + private static readonly String CERTS_SRC = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/"; + + private static readonly byte[] PASSWORD = "123".GetBytes(); + + private static readonly String PROVIDER_NAME = BouncyCastleFactoryCreator.GetFactory().GetProviderName(); + + [NUnit.Framework.OneTimeSetUp] + public static void BeforeClass() { + NUnit.Framework.Assume.That("BC".Equals(PROVIDER_NAME)); + CreateOrClearDestinationFolder(DESTINATION_FOLDER); + } + + [NUnit.Framework.OneTimeTearDown] + public static void AfterClass() { + CompareTool.Cleanup(DESTINATION_FOLDER); + } + + [NUnit.Framework.Test] + public virtual void AppendModeTest() { + String fileName = "appendModeTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + "cmp_" + fileName; + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "macProtectedDocument.pdf", new + ReaderProperties().SetPassword(PASSWORD)), CompareTool.CreateTestPdfWriter(outputFileName), new StampingProperties + ().UseAppendMode())) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); + } + NUnit.Framework.Assert.IsNull(new CompareTool().EnableEncryptionCompare().CompareByContent(outputFileName, + cmpFileName, DESTINATION_FOLDER, "diff", PASSWORD, PASSWORD)); + } + + [NUnit.Framework.Test] + public virtual void PreserveEncryptionTest() { + String fileName = "preserveEncryptionTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + "cmp_" + fileName; + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "macProtectedDocument.pdf", new + ReaderProperties().SetPassword(PASSWORD)), CompareTool.CreateTestPdfWriter(outputFileName), new StampingProperties + ().PreserveEncryption())) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); + } + NUnit.Framework.Assert.IsNull(new CompareTool().EnableEncryptionCompare().CompareByContent(outputFileName, + cmpFileName, DESTINATION_FOLDER, "diff", PASSWORD, PASSWORD)); + } + + [NUnit.Framework.Test] + public virtual void WriterPropertiesTest() { + String fileName = "writerPropertiesTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + "cmp_" + fileName; + MacProperties macProperties = new MacProperties(MacProperties.MacDigestAlgorithm.SHA_512); + WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption + (PASSWORD, PASSWORD, 0, EncryptionConstants.ENCRYPTION_AES_256, macProperties); + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "macProtectedDocument.pdf", new + ReaderProperties().SetPassword(PASSWORD)), CompareTool.CreateTestPdfWriter(outputFileName, writerProperties + ))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); + } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER + , "diff", PASSWORD, PASSWORD)); + } + + [NUnit.Framework.Test] + public virtual void MacShouldNotBePreservedWithEncryptionTest() { + String fileName = "macShouldNotBePreservedWithEncryptionTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + "cmp_" + fileName; + WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_1_7).SetStandardEncryption + (PASSWORD, PASSWORD, 0, EncryptionConstants.ENCRYPTION_AES_128); + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "macProtectedDocument.pdf", new + ReaderProperties().SetPassword(PASSWORD)), CompareTool.CreateTestPdfWriter(outputFileName, writerProperties + ))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); + } + NUnit.Framework.Assert.IsNull(new CompareTool().EnableEncryptionCompare().CompareByContent(outputFileName, + cmpFileName, DESTINATION_FOLDER, "diff", PASSWORD, PASSWORD)); + } + + [NUnit.Framework.Test] + public virtual void MacShouldNotBePreservedTest() { + String fileName = "macShouldNotBePreservedTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + "cmp_" + fileName; + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "macProtectedDocument.pdf", new + ReaderProperties().SetPassword(PASSWORD)), CompareTool.CreateTestPdfWriter(outputFileName))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); + } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outputFileName, cmpFileName, DESTINATION_FOLDER + , "diff", PASSWORD, PASSWORD)); + } + + [NUnit.Framework.Test] + public virtual void InvalidMacTokenTest() { + String fileName = "invalidMacTokenTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(PdfException), () => { + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "invalidMacProtectedDocument.pdf" + , new ReaderProperties().SetPassword(PASSWORD)), CompareTool.CreateTestPdfWriter(outputFileName))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); + } + } + ).Message; + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.MAC_VALIDATION_FAILED, exceptionMessage); + } + + [NUnit.Framework.Test] + public virtual void InvalidPublicKeyMacProtectedDocumentTest() { + String fileName = "invalidPublicKeyMacProtectedDocumentTest.pdf"; + String outputFileName = DESTINATION_FOLDER + fileName; + IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(CERTS_SRC + + "SHA256withRSA.cer")); + IPrivateKey privateKey = MacIntegrityProtectorCreationTest.GetPrivateKey(CERTS_SRC + "SHA256withRSA.key"); + String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(PdfException), () => { + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "invalidPublicKeyMacProtectedDocument.pdf" + , new ReaderProperties().SetPublicKeySecurityParams(certificate, privateKey)), CompareTool.CreateTestPdfWriter + (outputFileName))) { + pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); + } + } + ).Message; + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.MAC_VALIDATION_FAILED, exceptionMessage); + } + + [NUnit.Framework.Test] + public virtual void ReadThirdPartyMacProtectedDocumentTest() { + NUnit.Framework.Assert.DoesNotThrow(() => { + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "thirdPartyMacProtectedDocument.pdf" + , new ReaderProperties().SetPassword(PASSWORD)))) { + } + } + ); + } + + [NUnit.Framework.Test] + public virtual void ReadThirdPartyPublicKeyMacProtectedDocumentTest() { + IPrivateKey privateKey = MacIntegrityProtectorCreationTest.GetPrivateKey(CERTS_SRC + "keyForEncryption.pem" + ); + IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(CERTS_SRC + + "certForEncryption.crt")); + NUnit.Framework.Assert.DoesNotThrow(() => { + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "thirdPartyPublicKeyMacProtectedDocument.pdf" + , new ReaderProperties().SetPublicKeySecurityParams(certificate, privateKey)))) { + } + } + ); + } + + [NUnit.Framework.Test] + public virtual void ReadMacProtectedPdf1_7() { + NUnit.Framework.Assert.DoesNotThrow(() => { + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(SOURCE_FOLDER + "macProtectedDocumentPdf1_7.pdf" + , new ReaderProperties().SetPassword(PASSWORD)))) { + } + } + ); + } + } +} diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateAes128.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateAes128.pdf index e173bf5a6c4907e3ac4709dc58b86b5373e0ac37..b13b030ef51858a9910356b31cd306f8ed7af910 100644 GIT binary patch literal 9391 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 literal 9626 zcmeHt2T)X7w9>P^km)SRk5r}x_53VWS(cJ=!D2pg(vN<(B&%);-c zU-vO1KwuCB@60SOFRSU~>P4c;YP#aQNa`d4g-DXsBe^?xIfBq&MMY09DhcPtT)2#9 zZ(uaMoThn5!;kOi3u?`yuj%BKSAuqmCTaO4Bv)r9P6d|lQM+y%_Ztg`Mcl9%xMPM& z`wEV{D9H3PZ>QSSFz6tPi?s{{R&#U3dYMV?#Gj^tZ?s6@|3sularYv*dwGIrQ5wtY zlZZ|@Rf?ZA7#Jcj2oM?$wUIT%Q2`7Hx(6{Pc~ZQo1d=ChJ%Bdt0s$dubBe$rYf5!; z`^|!>|3wmD#(|`$NDGG+1O(9dnHGJL7mkSY!hukG9%wkvpWgNq)qpuyio-v;uzz&b zfSh?bQQXyml!~1prd-?})vJ`mf?@FI>%M`>!TH33Qdz9noGE%+b1@_d3x+~%{nEaa zxDH{#5LBK{Z3z|(MlDs+G}Odp)x15uC~p7G(D<#Y-Q+tE!Bxwvi38f71;u6cDa8LK zuZC0#(VIY`{yV=wU`X4qpj1oBUZj^5lzVq{yW?r`>gIXlfCa&^URd#%bG^Vq5WoD-EsH{JwTO(g{ccGCXq&um%PR z3MHrC7XK&9w0rvV4yociNwk|St3`74A$d6waIzZiK>a$oJIGo%xvRK)I{iI1@y2`6 zZa3}LLH5pjb@Gp0S{?ngt48q#3JW5u>qPXlrj@0!&7T^3HSmuLtuTJ7{Cr@bNEB4| zFISfOdVi|@RY`w8Of7die~f^tf{$C7(Pd+FWOyzl@29gIJu9cK>AU~c_Pb$xx)_?? z{hQ7RPKlx5q6Ul+40DQg&aHlX&v;m;jB}SRk((u?wd*YSae>js)v~qHea4TEaa8QP z08U zKWx7keOoiF_x|wY^r=!-Ciiobsi!uLb`PfapWA9(T@Tnqh(?z!2@;P|B?1Sc9Boey zdkLF zmt+j1|T<=HrerLEm*2#j8x;MI# zmYOPr&?Pn+0UrJFn9G1{LFK{SMlNIJz*ux z-GjaQ!bgTU>hVpN47zUA;`+AJ#F(Sb1?OQ)zI&$_eUSWAN}WS;9y!%M_ULN>oAXmb zo*-N6cQZWImNSFiXP+HkeMPN`3s>5oaZ*6e7}G~Z3VG?G>Cel%KMwPWVI@xc!t#o0An zzeo3K8g9_XOLd8#d`dvT%d%>oCbY|obDeP$9LA* zFP~qqdMIi3wxIih@Vs6}{f=JsWOqP_p*>%k#nU`C(Hr>X=MCn=BKBoFCpOrU?QY&` zr0=oR-CPT5)~qUGMo4iUk1C&&kG&5$maq|>#2&)*PvZXLYds2l;Ou?z;h*h`^wFx*ya<$Pa~%9G#QMMCaa^fXd96`gW=6?8kv~=~^rQxu(Bpt!Y0`jYm_1xDtb9|$?^7w9a6EilWWX6T;#4zR|{|9l3Cy1rIH=o?`*W|8r zy=0TNS(XQ82?@K^jG?+d{KJ{OEOm?Ldb2O?LQ_Y;gJCP?!h0g@&THv5#*coOd3R(r zhp##;pN;b;E+z|%?7uesMEMZ&lN|AhPA&5{pSV#e4?wb>2K#c(ejA&3`bA@~%GqN* z8=-^6E5H+!2tovP_jFd-FOZ$*>xtQ$<+nb*-_2!@zjv`@m)qL3Mv-|H-@qijt8lP0 za=lg2`ZmY2*jR18%|MGNIdt>lu$y=iYzgVXiuOn0I`1*-n8zhy8o5&rOZ3&lT@u)@Qr} zJ@D7w_e>y6i3ulm5}w$179TB@!pErk2icwUydgY4BT=}#(!TmsPogjM+1UnIpk7y* zDDMq+rK(dO4?@J9ga(c+lx|}qH^pPzktk-vPgz(T`K@pJ=g%`4Nh)HP)cW<92{qmZ zY|H$Tr371@|EU|IJk6b?`E8tldT%WvtwZr}`tVBftUcq$8JUK+ftfDRL)}3}>s?uu zh=c)?!xq#n;iUX@QAbfDo?B@KYR9L$rz4h~S-Yx9%8?|u-5kE|FYuQZPgEVePtQ9j zXB-W8D3(5uQ1r^x2js30x>Ne%^vZTdOJZlw?QqbGRQD^Hsjts|pHTW-VL2hvSjldT zyW)}MpdfVjK?zyjQ%=OFz3dIBYE52HY+@|P%UUEMlw{|0d!vILUU83+D49HLabhV` zC+N$_0jG#0wP;a}x6A62ha*0-a_m1Ah+1U+z={PIn;h_&NM)|sm}cLYG4&3s<_Zwo z84B6yetYeduC8p_n}+0m_iZWGuc=#N)2E#t5y3T~by2iH%tM^xbWaqKR93IQ#wzx&8%BgvBso7KWd0V9hB=Sz* z;n;IhR~SDexLGms7NajUa%m+vpj)W)%A)N{h59(tHUmrKL&nKUXg>DZpmuIszu@Nl zf>?19f2S_aI(T#Vt(y?@u7!f?C%Juu)pT;KjJ~|$ zq&zqz78(`%Ei+5)PC`>t|CG;!2FJ_h6er%{cE${J_F2#+kB)L}T1!}6F-#b`p_ z-R=h1!(mUfonO3%+cX9YGX6|UoSVi3#iTHcry$1%y*GFg01eImztT6H|9Fj z&E9o*DqxkoUqXLOQY6o>JWylBHB~G_%6@|&>ZDp3c(Uo^XigC&v}Ik3pp!;$widO# z>2i6H9E%ZM>UDY&!W=Wky#(BGXsZsqedi~iC0zx%SeOVO^6LaWa z{U8L2mNh03oGv=ix-)Ara2W9G9ER`k!J}BS=%i5d&^e5~CAc6jz z1w-~`Zu~iu@aqiN7fb;RKww~?fuI=%?3e*3_@4tP47fr~O#lcKfPkSiXTN~(G&$DY zl;r6JGVuc1FB%X^0|K94fqNkWP_I3xDaF^FhJ*kp2rc$sOuFxx#P8uKR0kRiOoP!N zzrcWy_ke)mJ*a`%fA0EELWL$MYUJbc0f{v2=D=hN}A#by-cdGV4V}-yx4ggOB z>WBalNjJOJi*MGI05Rm{2Nx{aA}y&6D+W~#2a*m!UTv)uxo&6svEoj;FaUvSDH|AK z$rZT}yWCaUjoNO&CtePA5%O^TGBGl2e2Ff$fK!wO*4?(t_y^5hK!uOUwr2)B&2XD6IIG zY3Y_HfFf#XLF-aaI5L>F?ux`ObwGeqZ>^f@fiWCQRzLp-=>}L282pxfT1n7q14c_f zFl!&7MU#+#6Kx^1;)F>2`2`9_Xn%yZTIWqB)XO~q4_~SY1%<$uD&}reY>YfE(Lh$0 z30Q2aDwbLr^E9Jg-^X0?#-Oi-BlcoUyF7I>=fc0VY7fI5-MMAfq4%5&{7s5b#JOjsQlXU^pBeiX`As zL_7+ECqhsNFa`$35Mg*25{id{NpL6;fCA%yZA$U~d;~VK+U{fuh{jPF%NkQC0Kc*K)x;@) z1i}DSAnasH^7E2bqfklGXc@2!MB3!MilK>?fhn`67mn(+R~~RA9KtLttYM(Z{Qovp z7Ls=g9frw)fDr8YQ7w znrwQbdib+MLBgF{Kmlbur@m-cptjXB23SUXZ1qqEuCShpreRpP3vH7{4&U``uj{Az z{e_N${KA<2@8#p5zwmJ&46S(o%d8v|y5xaD8+GV6~2fL_gM=QQL+&p9X$_e-7uI&O>_AK)=C6FhPPpEW? z>sr6aLK^FgAeme=Q0bm?f`8VF^Mm4=8`L*1z@&O(c{KTO@?$pb>Yf8@s3qYu{;fim zS&5$peO2DojZ84sKyD-|uW26%Rm>ml1*=DOvKERS&0=R0g@Z%#yF74^^V*!v7tR${ zJwjYDvQid=fgS~ugRG>Jqq{v6&jKcD4j7w*wURJSU7$x|E80HP)j1B?WR-1RF zXMP~I@G*w;-7c1ciW%jI8*tirNYgi}ndUOIId_7{EN?+WQ-6{OubAc?N z_%pGdzIP%wl1W=k=X0W4x{Vg;>0U2fM#X4>3O`AFXxi84$(Re}{(SXAiT(WbSI!vT zssnclop zkBvmekMBZ#RkB@Um?7LZAgbLvkRL3Z@xCuU-wt|Y=t1{I^PYiESp>8ObY#Yc!DqYU zy~|MkJ6I`e+CU6GZA$j6)I)B{9pkektD3aBM+W; z*HVS6Tpql>E|pP9-yBSRHLI+h7Po<-65y?6Zb`CRE~>dVm!i)*px z^X%ed*mp-l5w?e!mE53Aroqnxo^D0g({VG$FwYD;p>o)U9o`<7(TqNs+quNe1ZyR< zYY|X!Yc7&$-m6C6C^bPP21&=~)F%+|XyY zbylZ>R1|Ahddx1sL(eYcAK*k(7v-4V4Nyo2hiqL&y=zA#v|dn#_!kPKxvJKkVLf|d z@`~I?ufjtzJ#!{91mA=8klD)lP_?X}@*m0RTxvFcgq*i6l@kZazT(0?8o?R)3PjwC zey&{sF2Npj-^wv&GM)a(TN+aG^|RXq1ijE&q-AHXoPvn?ZmV%?FI5vQX|#^+x@O36=AZ0vJwxYs5U zYknQN9{QD0{*@6lT1*2W6;u~-bBKS4Za}A>wZG90Ym=dm3T`_hGF)S_^APg!c!4^P zUj}^OTtr%%i4;j%0M{AFz++?gE#`YABk6%g_5pLloxaeoiPZZ8RuSwC0u@Zt5~1Un z_P)F-2fJ2-pN?of1@ZQ%Djm9hOZrfaL08>S_&(+kOQ-gz zmQO6%1~|*(g?v6l*V)+)YD?j-JuOm9!oNB`8zKj_3J=|?OJQyGRUIKxj#NqsSM=UV zNByB9+Fg`q$*%bu<)efl|M7c_{k!c}22q!1 zqJ)KetPPA4ZccT%%g9Ebv@)~h+z4G?v7f7$2*=3m#x6J-&W1@%%~>qGDNehG4`?Y< z(@rk6)S7ALZLHrnEHrLeyI(ZBe)0^$<0Q-bD{EUj&8KIOpU-CRf4EQTtcc-Hl8 zOB(F{h-QIc}%Y$H}H&?+-h)ou?vJLc0CA;;Nz2Vwlhk2*zwfx~BbQ+|(LD zCXz$xwM?`3;hBP5C57s#C+V$D>X#H6oN9Z{HXZ#WO(tI%e~Z3 zJxJ1WQs=}0thkEJ&&jWD{Qw~-nHIlo|J?61!f)Li!}ks z92nzUj(T8}onI-^5&8In)uF?+#2xB!B{A#U;k0m`V4d z=&C(sCr4mW{gPtNY_#usPLykYY-IdpL;^pGKPo)6gs(p;Y_`rPG9jzcaD_!|F8*ey zQNp9D#Lq14M~_b3v|Aj2SBJBDDcUlD2`K^(XT-9KB_-HEtD_Z!L<#f5@{Zp&(<=&& zLGGxpo`3ZDds`}qeo+)uC54bNKehRJwA%Q*XPJ}M?8}lz=JC}Vtw#ih=0gwX@(5XJ zo=;izO?@ez7JGb(h4*7QzEz+|<2FyJLDS)}-&sG}ujar1_Wx z)_q{E73dF;uYnVds6v*XS?<-E#A0)90gVEU1VIhD=r)WzvB*qD6xd<$@j-5Hlkc0I zp{~(751?59L#2Ti5&l=-+SqF;{wH7Cpe^F(%Kr1$Sun`I|AEhcq2g`bH2?kj_yV*2 zP*J=nqrAn|T=V^lRp~hmVO@>sCYHlhSv#WiHv<_BE$_<+Pavu5QHhp=OfqyLXFu`O zt~o4tFsll>bNY%!Jt%*^E>I^NOP+V!vQAE2Ujl9Zp8LK283Ka+q*4%2@Nbj`0uBC! z(%9oRzzFECv?R$T$)hhay4=U=jq6fZ`!w6d6K90%Qyk z1CYRY0uG>MU}Q2GU~|YY6bXlik;rfY3<1z$I3xy!K#>s`fWSdxkT^0CNk+m5I4BMZ hfhzt7`oxe*@&VDPkl%yP(B1w@TK@iCTf@DOHtVjj{ zMS=uTK|~}-k~z)Qd;Op9ubP>fsW(&gy6Wt+_gddtd+l(#&ic+4&{a|qhe)941!iXZ zhUgL8U~XqCd-@9(K$=7+8Ulyv^rA+6-3T&0o*8_cid1VD`Hh zNBpkd%g?lOwe>10;-vCi<^5ULvWW1Kx_8@+H6b>8XNj@F_EUm``Fz2*YKDJYIj?ss zrrKip!V#|ydZH8Ir)!`_?iT(}_lnL=B%%|^otqqzK1hp5u)`@hdz*oQCIW-tM#G`z zAYGgrfZ>K7K=g_3&K_=fqB{`03SdpXLAa4*oeb~;8M@gy{^7yU$At*Eu_4OHki#Jd z0Rt?4&VeE@Zjzm|lM;?Z6du8X!C+0GfX!#b+WC}EF7B-t5im zy6$~1en5cQIRCb&BU`)EbUE|NhEk^pNYTTcbCP#*xBI(o;9*4~FF4sL(C*x+tLuY_ijInMx7Wy6D5? zr@AYGR#=TOy_8{sZ#vychSiB`tuoH))S!2V3}0T*5Vf0L2>oiUCGDYETx2XZ_j%J| z;^f_&T*dl~u*sEI&uK~CjW3-|>CVQ4s)pskZlT2;+4~%QCyFF1G>GtQ2oN=#%-(6POqx9VMf?HYV)WK zez~TR2Gm6ijm!;&fa@|9A_g0b#wXz#0${sSsug`KAiJ}M4 z{(JtNC)974a5i-YFzC`TH@TAi;JUbVFKE|PrzLiH+icnT_cxYD&x-(`3}zK8cH zTiR#^wod;QXzJ23n1NpelDN+>H@?;nhY{IZv4k+4>eK1sJJ+pPuX682mce7PGEZF+ znx|_mqd$Ig;GC4sd!x5^9zGlglWqqrJT-(%%UCImtGlhqH7#i{i6r!*a}}hnevD!g zRPPPGE_v$B1CKAGmLTWbz63y8}_3l&@D=6%IIb3m>?Vh$nz`hVM z`UgTSuC>R{AU3ro6{KdnU zDFx?u6>^@Bn0C92us-N|_;NYpMamQ;oY#wejmzjcocW6 z?`_Ks0hOe-Q0R7XPjR858kCvIqygDsNKfSQWW&(jrd{V1%n319?VF8y88n`9g2O(O zB5c!H$WrTb_YXZCkk7;k%G4_L4x^~aZYR5q1kfwVRn<4<>*ZYh_nJ4(vYHi#`(f&n z=SY>|U<;=$DlH*#`ofDw3v(yw;TdgjrPn)NJwVsI8r}#NB)NVb$~4#+D&#RLyU8ka z_JYdIQqiiLj2W)C#tGASY!a70UZEek)Qt2Shj zg>gJyn#SSNb*f4XX7_I3Q4GPPS8-_T!up2L3Ss!_>tqe5cb z?X4O!kxA(vwG*#i@O~;hD!3PLPN4`ZSo-PO*=lpuG0wQYuPU{xd-68+xl$7NahlT} z$?`$Fpm{M2IHeD*IL+YPaXY9iAXAWz`eNg24v*Zkd{3nfL;a^+zD2T))NsJ1& z-Zy?{=slYw*AkL>?OQKhhmQT^#YjP~ z?bd6793lg^#1g6vZL)9j$G_nHda;uapU@}@i42fi(*BFP;9u+MT?(A)YMwY8prT;2xisAyFC8fG{d#Cud`}U{Ef<_M)JX9U16Gu;*S-V z=_wb_ZRX4Jq~HZ-8H+0;YhJe(3A(hwEH@RVG4Bsuc+Mm7Mr~Qptu8qq&P3o_o02b} zyfBVdI96|3&KiMzsROMy<(9M1qv;NgQ5CfqWJuWE;zhmp*r=<>S{e6(Dyt5z%*u4k z+A?{v7OlU#rK0tiay9({+-BBdX#A$k^{yKikNi>wRhUXmhA68$~R))?4>=tXwpX~N&~odTK^l!yqIw=i#xr0)3r?Wn-w8HX^}+5gO#837Oe{zc zlxyvSbndh=UNMSpzNj|cqZ?S%5);_KIZ$F=>GFa=wMo4-PJgct&&pN9b1zoZ`YxyV zTUb<3%K}3IU9dk-PBTXCey>}sG=64r%eXMAxlZyNT3qg9)7lM6kY?kvkW}9FO$*xH(e^xF*^G;@S*!R`L?`np%jVfT$|T@YZdA0wi@ zNn?>P2CIA~hv2E@+Ez=y_ zgQ^sRUo45xU5TZjO%Ob?{6N~J5rvol+ZtdUu0A-uZk_^K@fyt3>#(e&s!cv5Nci+} z&`7Jb-a>Qk4a>J(?e{`-_V`Q1p{ z#f!(FV->E6I|6Wx?P1iljnztPe#wn1Qeuub4Q|-0XnV`v7gvl@j6Bh)wP%>&#`)M| zg@>gbt=7ZlC(F&R51IHZMrHr1F!GUjcw`o&q#~g1HW$Z;Na>f7^U9~(t#=Rx=L4mz zQ=_%CV7kLcqUbtuIJZ?tbqbQ291hp!LGI!dms^eG+U{N6Ez^*R%Gsi>h2Qs-JcNA1 z9Q#serYw9s^aXK#ZctB!+N@-7@O)nvvHlcNbfIX`3`)1Fk2rJV($@I$O;gXu`M7he z1#^(xD(3kUuF-DEM0d@4pPrySs?*54{0E7aOabw=ClI?6Z{bN!ovd8m_e-M3P0~aw z{ay|q)6`54W}<7YD2ib{{Po@qKNb_E8~w2Z%~o=fYyDhIKfo$}{sxc5tVx$&u#Qjj zH6Zl-IC7l@499&9e2q6f^-D`;UYYt!88}L|Op86ycQ_&X#NDua6N9&dyi^Tu5kS;{4|$&(9lr5201I)aG|JO(q` zrHN-HG!3C4LgC+b7Daw+`Sa={NH_H^J`#kNs0tXaLrX#xJ#?8!{y1VXE!~-T-s|aE zYe!T`=dEW{8T*$%x49 z!PMtRRBztS+oc*4`c&G^g~yCJZ4UhCi!F-|3>Gi?mYmJ!9(UEfcXxhLowto`LsG}? z`L#1DRGC4`ABt`C>;oWy{?vjY2bzSxG;zOcz+PZyzySnE zI!J&V30yEEpn(6?ILNl3h6VrxO3q85%WkH zb#3HMBu^T7YT&x2>6_q#Is9Wn0cQsjivaHAp}-GjklgsRU{pv>(3(rKbjTH`XTeGl zIlemzKyR=}$ zg&Yg%Qt!Q6z=)w>i@NO=Km`u>soWV)?2nzx2U>{nM#%#z;Ex3&?;7&10w$Sr`3SusPdmY z+#myz+kYTZTdd1Pl51n+%Hj69<6<$@qW3fgyk5kN_Ff#^o&xd3v2{C~$y{xj4EsVi}tU4X!>a0sw93Wr3a@m4T`H5!VrhT))S2+kS@ zMuWjP49waZ4zaevU~oWbMS#J!3u2m}U$$o$twU=C7uvUcVsb7A@*eP?HY z2|1`5*!dE%Huq!$oS z)={DVZ(8mD16mF88z=XFmsf-S#;b8-$Xn~b*|q;tcI}y{y)>cXh<(aQrbh#klQN`M zL?ho_apnq@7L@K0nn>Gz>?eWK&579`J__GQov4}Sm~dh(&wTRjT#=|+v)3}7VuR_J ztrU%HOhvXzGmdpK^Kt1V^H^fHw%L{x^)h(1kO>v2qy2EWGEQqAogPPM6`7Yaf(SqR zV(OXWr5!KDb7VP)-t5%6k|pni+}H!XDLx2mn#@_Q?x$%LJU7c7v)c-l*3~4N8Qz)m zC)Yl5Khh=7r?K;OVCRF4A^WZD2IW^nZ4aj!wjE7+OI>=S(dgoBL&cI;jh>e~g*~OJ zm|kFG=0{$1%k`JiFWOo==yAzPG_Ig+GVl%sR0F-*0?vM&H>~xE&H6-mC}OiC{kwqIFt&;{LR-{F6J5N-{|v zp%zm%)9#x#PVAJa{&A;r^W2l9oCdODRHh z!RwH{x@T zNR8ss4ziQ-5MkQrU)5+opJw|y#!x8W-SrG9NHhETG)3Ni>L8IvrC6k1Ld_bz+J9=V zW@?M3>(tVlMR^V!-leEm&u3O6=>4W?L(6AnxZ))fKeZ0#<>=I~NV@H)AIaPLp8{{S z;$}68GJVEJ%ky{2k0U>LSOoHQXEi@otG9gD2b;d_dBtPM*6OjeD$1din$mH2w90nV z%V$bR*}|UlD#Oy;Jvy&;MLGOOeF+X+(|)GcVV;m5#dla(;_qvA4ri=rn#eQBS!Agw zz-^p|bsM!myBA)^PXzRP-R3~Ihs z@T0(`(7Bema^1W!Z!}-tqV3(!qu4a&wBU+Bal0ogO#@A*9=&a3IThx=p)~r~$1k1U zG-p|buHTZxaBVF1k-MdqovMRAWvpLYf-~n^h+jylJVVFZ#dZ8(-xZyv3ci(VsfHd@ zNjTCETPfB7Uqd!dwW*?B4%MTjo2&w78JO&BoR7Mm=~bHdxlkTkaDgSIL#J+vA%M}T zyv8N-7%r9Bzcfqqop$u?j}N9*pQb!vl`RRQ0Uh2S4Vc0&U3Cn(YX7L@jmk__5(?br zz0>7W)?-!U!If7_pFHDX*4BAe5Ja6Q#vZgfySpI3!kw(l&>VX~^$NA2dVXt2a>v@& zt(#xA9$?~aBT7FBq*Q;Fa~xoSywZ>lz3ed<5zs{SgHJ}J090mhhS6ndUOH*K^{bi; zUlDOs$8L(QyK6!%{n(XOPs9%Wn*ylgGr=b}apHx0PtPAh zPKfa{)Qz2VJoH2d4zfw$d|8*3bfhIReI(w28cS?4Il4Z^T=nI~KqL%X6$h|#OCz00cm znPDa?{q5Cfm7CXj_If9R9=x5NPpZ(D=|GCtMI=+@Rx--AD0{vr{&v`%;+1yfObHFo z(k=T%CLGZ-;%Hky)Wp=lq<>7AYi9{G_qJ(a8fL~3#TAy*a;dv`g`1rs&PCEVLnaa=eFHR*5BpZlLmpFbuEOJETe9qG_9?^oT z$FhDyoQN;yp4~sSYNSHpJ49%s_a>QR%@8!)AJ10o8A%8-Ks9wG_0VPmBNR>*RJZ&* zx>QBXwNzO0G1}QyJt=aeApO&8_lG(+G*!cv+-V`I?h=88iH3v5T~{z(Eg;&chyH>) z-Xgo?$8`Pbzc zaw;;io80X;-QW1${GRdddGk??AGsB8G&~;)i}VCNy562yysf1!9f`SEPzF%aTJHHe zLxu^a8+6^2QU+qK9I2-+WDlQuz&`yn=lVSrDosBfrsy*Q z-$fVRYb-=;)`#VbcV54+<)ogzC-PCLy0DD$sajL`-4*ac&AD&G4b2?!hmU`DEHerZ zJmGY0w5wF9k_r|3aL+3o@3+cD>F^wBV~ObUf1)cTwz_vkIu5EW+|ebGAX|sDY?2?{ zt;(gwh0c=fGh43&M~r3Cl=%-uWWFv}P`K6G^x?#{a>jAm+2GX00)4!CVRy)k%UZB> zrk{J9etdje+KE>*+Hg(*bMb3)kQB{lMmMP3PtA*euvrU=<&3zdfj0*<;(cL>WJ4H&_Eo}DkDj8InilU*af)&Bi0`R8E< z2>JMe{;ynIc#oeaVi;gOP(quj$etvn3-v9H0IdQ>h}yR_)!z}QfBGcVcF$YYC~?Qv z4&VY%23RY<#Rs{ME&~Sx{&!DA9K7WJuN{dv2>a()eli0p4gjsDLnFp~WuY5OzQK(9?F$SudCoO25iRvKH6#qHf2l*z1 z8}^fWKp@b-8G&Ev{y_zdK>bNaAfV9Sa42rbFMAZ`H~Indw_h{@2CVD9`bDGuq$&_d z_-}syU#A-Yx&nj115_#oj5`BHseurh4H2XZ2nf=VDpk5PQ3R!k zAWf=hs3J%Qr3iO|{@Uw%*ZS_a?pOY}Su2w{`#ihMK6_5GpN!x|6*UQ{B$`=pbgZMB z83}@bNH{xY85!^ef|Cv9DhLCSlXInz30OzwyUwiyiY`u4v5)hO#u$68TQ5k5H6lCJ zdH&OV&X;`$EW-?&oYf8&yB(oLyF%WlIW>~M zapZglf|=li|799Dqq#-===81&ha0upsoV2O7@xm$zL-Wnj*MWb>CU{4ZT)AZHX?l9LLSLJ%o4hd>~YOs9v4 zNue%Mi6-A>kme9L%p3wm7Xv4VIhAV$R6fmX?|+PcnKmtbn@yYTi|G|Jeqr{;oMJ92 z3RZS=rH~x|oux<&F%ZC`ZkR)0(3+sU`5klO65tS8CJNRj;s3h=xJV}9-K+`Ze-}b5 z4)6!l3_};4{Y<+k9pf;M99lRtQC-T8^;Io0lE4TVVvcJbyp!wZ0RiHLE-H15WgA!n z6X>;&u}^^w(#nGxG^G;T5!FeX%b;7&g<`))0TRRymCd?F&5qLdqJQO@wz9w0NeSyp zpe;FAo#5b3px9bt!KzNyB)qMY4fwLHlcJNW?Vn?PHynkw=(Gid?jComw@OKFXKFt?X}<^z(*vu{ehqxs>=G zd#-HaIR9BQf1vW1eBCoqHIIU5A&DVob6MDfP|vICL6zN8-NTUBJdCJ}w8?|^de)jq z&`p;weHK9;#e60wEKf^ytCJrjF>vMa7uX@6R>nU&!{yyh0??M=Nu$tNJ3<*;(^T#TyGpKo`t(6GxvD+_Sh?#!`}G>rblK zH(btrRGWVs*`9Xp#gE3!E7%bvJheh6SkyvBFsMD7)fyFz}O}hC-qsr)x zxhrhLQ#?n{zoV?q3+r~Y>U11VINpBrUay3-D#yxoD)$145Hv#1)^RrNyjaCqhsT|n z?5l^kVslMN!_uu!Sw*(kR$+2wu3-vnJns+ie*=4~1hH&BwW+i_GN}?v=N*Ts$}Z&M zoblS{5#h4eIrYs!QoJV9+CX}Fa)vM$1HFRuyFzP28*?p>6Otu5D^k7Pr+N1`G)Bl5 zNN-er!XD#K{kWQweOUCFe+bXsM^AoiZn+KSAjX9>UE#Cu$PxzG1CLrk@uhJ$ze`SA zQWEd0zfjw-y8q;TGnu#L-1#-{#QOZrHv!+v)>YZA%e5I2t@L0i^$Pun_ zXSVKam<8QBRUmuwR(@jB{Gyp*m}5X!LI3_7_4A1tQFKY1-qQ^J$61#9XHrQeM|;CW z*y!mhRJjCsPQL2=dNvY~!Kam@t(L|T`bK*GV~)e;<{`rKFN?35T-9~U9N*FDngqtV zpTyR9glAd}=S$+P^7|9IPASLZ69aZ!cBU&0)4%t`*xwO}N7zL}Mi+|L2b~F8=BuM# zF;Ze?3%OJ+(!mcci0Yx|QANVGu`k5-2ndj0Y@I2(OhrZRYch)M=VE`;&F4L%06X(! zmcCpdrmIq?#5AU-HD9T>uss4gB*S&jxa<)>9k)vOH8z7qtrT-5R%+QdIOh;ms`&^EvM#36ViAClric^W+7#Mfzd z^@{$>g!k{iyjlKiU`wyZG!jSkI*uh(2Nj7vmMCRPSIMyapmS6{AZhRlS4x(!CDV_O zc^;ar`Rkd?cE*7ftog4_md!;g3GAzXMA#xv2NrYroQ#}n?pqBQ)|q=aML5ZNatAI_ zY$ELL=*r<(MSsA=EUz(IP0CEi@2Gvrq3o7>ue#{@I8^i+)-1+i41CA5>cGqfp@t8aN@E0gw+x5EOb=01~&%|I8 z)qSAPTGCS&d&|@%N;scb1|_A7sI6~CR}`@Ni(7~!>|%p>nHH)HHYmyXYTK4x4(UFP0XSoUzqGZL?_zf8?J`PtQ%x=I&bJG*DXdP4sdhV=cupO&LvKoRxm5tw>=^XjhzWa zj#Qc{4TDMUjvEL2{dlsLZNG62e-$u~x*D_i7XCar;8uc$hF(Rw zcX<|h+wQg=OWYS1od+7>hZYD61x7?@%D#f8jXF8emFD^q=NF27 zv#GF8Y*|NA2g|KblKb~0KJt{a+<$wZ*fek8RfaiZ2+NyGJ=;uoJWhAFNm7iHPHcaK=KuJP!PLY5AZYQZU)!K=MbMFz;7YL!ms1X1prH3P#Qs?0H5R}I~X zFb$2lHz~fR$J!NwCU@Sz7jA)~>LoDF#Wu{=Opn*7=1@P(seW(k3rPpYbtjs)y`ah8 z9g2&ImgAH8?3~vzoc1Zv>CxhccvgDCn53;4PcPR6N%P`_UUBhV8E{VCDe=#eo3rq$ z2|2RCGJ~z!dXb%3DBBvM={YOt!D-Rxo_zD96tm>b12~A5G7Q0Y0>k1Pdu&mSz;)oP zdC+?2fCZ>6%~!s6rNsDSaba+kYS)t$-eccwm>={E2UtC;vhnQJ9+&wc=)t#AtXu8i zan^*34(3E3l&i}rSkZFx^=kpnbhmgEU5if02K%}Be(9C-{+*MSoQZV4VtI;TY#8#z z`fFSFOux!{`LKP}8^<3KuJ;xXEaKQhcYjGpU}{gCaHIyjX+B#ftZhCuj9x*D^O$z8 zq8`RObUA0-QdYX!&iYaKa>P!S1l^g5q5(7L_!Z-O;o*%o8;bFg-|sH%(@Mz>YO|e6 zj`_Xi!u<8qRap&anN$cwteXQxne63EQL}ZR5XgW~Sxpo+!m1InBt=CAJm&74e=0B+A)x>YN{jt(ew}u4xLq8HY(s-VXfPV&Z!jR_T_AAn zyHH)j|J?OY(xkM0a_GpTBbNg{LxA zAMJw4_UAuLWSP?1Nt&=~+TJBV95_QnEZ^KRCs#PBXDqe?v+(p@J00;gbKG@WG)k9B zeg%UHuI^5LYZ>z1Uv-XnF}D8Rg;%r$A#07C%texmJwKU?sy(L#8Ga873w_pdjijX< zK{G*6@6_=C!l(I#LlT82J^g9o((B>ERpBv!4R|szMpJXaivE(Sw20oU%YCQFMH0wY zQDsTF5q9w?KXaUkg$*=!J!*rrpm+-nf3+qVG&?);41mLniQeX-0u428kbxPC+X-0$ zRyu$|S`pEb2t}Hcy&xX#w4s|Hm^PC;V{s000XX|@1!!eKs}DGB34mEEe|4IK032xc zXax!t`*{L`Jkj><1(PVQ<~Vbay1KKLftcGM?S3o5>Qi&4T%btd@L=EoMXI-304nH$ z2){|G86~`$hp^Wuk!DHMVwb-7c{73)0gi$odC?80Pq6;S-3UT}^(l^O|Kn+ASq@bGrwLS6cPzXf{36$WH22ez+&>cWwjzv)uQSX&1InZ{=U z1ORPM1JO3TOJEHZkeLh?4n;t41R_xikB1WQ5EKMWz*wX3NVqlJ8byGhaabe@3&9f6 z7$g#kgutY*)+h`NEro-l5O@Th0LP;sSQs3OA)?SoYa*I}gjqwO1ULo_WC)AJ!U;r( z6dDO3SmOv-0tSXd!clNEl!$>5@B{=(?*DxR7GMo0A_+v}tuBEtkw^gBv3sg-dyN2+ z0;)jJ)_~wikx(X)2@)7dh$K`(Uq|txzPhdfvnvHlrtFpn0)>Dv3ks_0sxki$efFR5 zcmMb4vlq0T)SQ?=`+h(Lb{AsAbU>huuVNW!rJzCafu5oBYqcMfYl>nL+DL|XD{=Q7 zBxlRbarvKWDw`JF;*jQ)*sqhX-_1@3*NOJ&orJ4Wu zPG2if#`DHgKm?nw{TodO{TrY9f0n0%{f(ys0h`5tfvrQMF#p5W{kOAqIIdh>F|Xtk z{iz|P@)5>otOCwg#&*hi9XdA}l4ls>QG{*-UllGh*|$J9@%^!TR_pwW``o5`YKBJ3 zy0P&W4@`Kkg*)~zN~#K1w!b_q^*!pE^mRzay@ibyNXS_C>d}qri6wAy{Se5yh6g=9 zsq|T!=iFQWY0f8{oe2f?!c`xXdtVbzHFA|Ppb!h|*AG3P=D=`hwmQm&Vg%|o#Kjv! zc&|Qw|6Qi%>XGy9IVm|^T9tfCiJ|U?o^KwB+Te&SZb>#ZsuZ(&&MIU?WnqUAfsCe%|$_mD|H``M;PUyc_ob>xgmS2L#n=-V-xmY#~m zMKvaC7Gd8ud1UyvF>QvqUy_mKf5uUUu^c^h>dCDls7GO|;X$f_tm~oX1xoi6uYhmo z7fZ9*!<#Cfg5SS4A|`=ZBrqRS)$k3Z`4D%<2VS<)Y5xV3V~QlZc;%wx(ffxo z$Q;(2;(|kJiG&5EmC^F!iR3t#{YR@@@v+vMVe*GS&wePEIo#L&G~|Y|%nMiW4Vy5} zEo^yQv=Fl{x%F_WHoZtWaiF*$Fk3~n!E%!B^4p5FX0LVT-0tLqsVjyW&s#;il=(c^ zhD7KXR~ys{eVlR$+kQhM(fz@aq_IQE8J_evRFlB>FO*-o;hERS8?Bi7>}Z1!1NRTs zrumSl6-3x2wSgO^*dn~UDs`SaP1h$kgj8#c%`&^JcF}5&*sFpSYMz>{k@)8;LX)Na zbKQ$Ryg{KK28o}|4)GJLgbmiOh6O)%)!Z&}t$PNOGG)BFEKqpBBQiR$MDIdHU1bwB z!<#6kR}IlwnMI7>ja-s0k2+?R86Q?zCE+vkgHPksTh+sZ{0Rc-#g5OYq4Ei=N9k^F z^R=yA3FGIp<6~^uZ(qBqM0bCpwlSVLl_yG6^+b#^FLl4VUFebUS1KMFE=+qYUKanq9qJf#pNwX0W#)REO!^XOv zEbg2=+?u}kw3uZO!3E3askCNE|XGFA|^{3uT{bI%8+vM2gqAo$LdwR^oQ61M(5W5GWl#pzOY z_g6}hrQsyI>o1DC-B=3kL?~BSD_?K2YrI5GhreNTD~)Vo3oI%E>vng!--@x`6e0%* z3E8p69MG?q%tF>?wj&eZ?}jQdDMJnSS~dq>*-Z*I6y?Fj;sq)|n-TbiQ$i1H4HGK+ zZ*)KI-*z>p#Birg(Zx(M?RqZ6*--ianc=K+w zHA~qsB^&?v%FBt!U95I2FzXsqXA7*Dd+V7`4xN605l$mAfka9TS8J@Cq^bG#o-4dEIe-4wA^ z=nd}cH)MkzyKR4JxcuFIqotH$)U2nWK<9IBFl_kLMxEQf)JISEmhV+^i=VE(;e$Bh zh_0DBHB)hW{^6B|v$l7SM^-xp%QZ^q3?|;G_B;GC^y>MWCDY_V*fHnOL2Z$!lZSj9 z=i1s8hOFX<-)_N~-Qb7b{8)pyb^P^16t|OO-z7{OnW?>f=hdoOzeZl4 zZ+TYtoN4C#G^L8Q+TZ4+&b5Qx4&P2!h!l*j&)KtX2|I_}sFKU<>3*JPx*;cqolWwF z4Qjm!qU!9K2frV9a6FFT(4uQc`~y;C5w!Jo)`M{tYHo+cmgSGA3m-*p5ugkM%L|ze zCqm8QXEkA7r%ch0A@GA`#F)%|`Y)+ky1 zMBr7mmE$7my!uMV631HUl+~xWw72P9O_kJNEKa#Tc~Bi~HZ0epeD(NQE}_Yto0-P9 z&M6Oyq@6u$KXs(~6GI9D!99AL^}XND_UO_=q%4R3DkQDp2Xy))Y$2r@U31WzXJFx* z`swz&as=;aRgM~#4=*#>zn<+KbzZ;Mfy?@1WV=1}+0lg4wc zl6FK%a&I3-lMgH_v4Ty_m3%x7lG{Z$p)H|j4^zI`G{)v=S~}xK7UOzP`;&b-y`kKO zY4ja~KG~sKq_)yKhFMMVnU~>i$yB~2_Cmo2=q3woVw{viB7AI@@3odwjvc?|VMOl~Idj}`gQF)#>9HqSZ9dMB+R=C! zZ15xXd>{2qsto7Br&kHeJQ>Q&6N>g6rdF4Za$WmT2M2e5GIj7`D5#hzaJuCzcA3p@ z!-vWb!``+$k(?wuwTALnnr$#Vx0b`BMu{AMfLv~8$3CFj5PDGf@TR-|f)LT<1bQRN zP7-QzbieHC=j>;_1u7CwR%`(sjX~;;Ec$#fp?Rk zUQ?yVsl2CL_9k(kVOSja?tjy@hQcb_Dccp8ymA8~c%*sNH>6IIp2^sxLvY-7$Q1lk zw&mV|s4xO%wHXi65;5*)xUp8_15cxWJ&dgyt+qoD*wgL4-!0ZI^>a9=U=ryhAS0Ro zUK>?rVyhc{MVO^)Fvq0+-uP_o0qK=^3(v8GCt?ij4y60`n|&SQ{hbY@{c8U6zwciU zU_fb)TwMBtR}e`N2m^lnL#1gQz{Q7^BO`r%dH`(&hb#uXj|5r)#M9E3i3S3RYvnZJ z$A1(`jLDb>{`fEN+U1e__4zA-#}fW`ALrQZCjN`hbI{`dby2_Q4mAgW4^$xlPY4kH z;83JcfBq?-u=$F~Naq=sgwcUq_+0SHx0gji&&CuvPWFk}hINQ+oaY^jDE}6jMR+b8 zdzzU$=6PG~&U~-)ESviEq+Hn;Pc57yzdmBo%8lwGeVA44!<>5DY19r!P2`O2iuCKY zz~9rp+eAY_@Lzli5(fE=6G392zwsYP80v30Gzj{KKEOZx#fwP&X%~b3-3CSq4m4>0 z(V|xEd&why-XEDI`=1g~eDSkr*ii4vCOL;c*ZIK=Vl9 zU=TQPgyP{C1QCaY!%;{g1`C79{ewffNG7<0Xne?TYzh?ize=Y_L8K7B=#>8eO`utE diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateAes256.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateAes256.pdf index d0c35c7959da6086436e8ab2383261a907d5ef4f..138ba14ec990fbcb5aae2b376497fba515e6d59e 100644 GIT binary patch literal 9483 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 W7L)KB4*`Y!-x3iRECTtHi1;_%#K?dE literal 9639 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 literal 9620 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 A`~Uy| diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard128.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard128.pdf index 3292cd3cb27bd18f3417570884161840cd349532..d8467daf59db61be83a340990b88e7909167978f 100644 GIT binary patch literal 8980 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 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard128NoCompression.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard128NoCompression.pdf index 8f0016377295b67ceeff0b124c57a0c153698312..09c024527209ab793feae28cac3377836f949670 100644 GIT binary patch literal 8901 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 IfH}zU4+zRlkpKVy diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard40.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard40.pdf index 45d5c2a2d4921abd16a9622db64cb2487515ef63..f48d6885cefbd47a432c26b76646bc5ad7a24880 100644 GIT binary patch literal 8918 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 KBH)2(0`XrqnJCZz diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard40NoCompression.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_appended_encryptWithCertificateStandard40NoCompression.pdf index 0769bbd00c48c27d50756512aff7e5c1989ea4e7..782c17518a907d5f4a9411073602bde24e1005b9 100644 GIT binary patch literal 8954 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 LbqNq@j;;R-$N|+N literal 9125 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 w6dey~Kn8HuwixSJvXu}DqgNyv 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 Mu}etkn(49s2mfmh!2kdN delta 3938 zcmc&%X&{vE+qEQ1scdDWLiVlMjUnsUw}i5cWy~Vk*Fo`AgrRIBB4mr~4YDN>epy2H zCCQex>_o&n-jDD5`||(v|M1+;eO>3i&N=tDb1zHwO2*0FcD%{7OoH;-#2o^?MnC1;e0NFhqey z-@sQeLFQ8;`awf~XO|YOE4uQJ(cz>)Y0E~NPOL9hO6r=XpO3GHo8-SRC7?)=^z+F3 zSTGdwj#9LGge7gz1tFDE*Ni*}7@RLa{I|LP)WHpJ4}u?_=>2b8$&PeEsD6yX8`*{9 zTNzu%kPD9eEK~b5-3*&*+m+?%B_bN@*f#d4(2oqJt3%c`dS>#?@pM38CwgWwvKg&8 zrguD5?mVG2=X6^r(FOU0`BNiYWnB<$HB=(C@E#M)wAvVQ;)m4*D1dKbCYKe%uDKfJ2GTm7zmr;yQ+FCF$Eji zja+WVB-l*3W;z>Vv4!3{*p1M28aaL@fsx&BplA|UJE|C_{NwKF`#C=Bn_z+KN2v_= z(qHhnC03Rwcy^`q^hZBcwgR_^#zpgQ>$&^5j!I$D^-2A}H7Ct={pum5mSV&Fa8xTi zgE>+2;+|G0LYI%LxI(6-bVA6`#w2a}1JOSZ#5waa{d$uC#-;goVOD)HFQPkJsqt^i zD|;NUN>iP6`Sw@_{e>6fZ2V!dNLj66!Vv#hl{N0F`PazCP)1C2fN{AO#QN@GesFBb!g#xSR6~!f=}IPQd`nI4S%59TJ-4ziq30-mzT_+3S!B~DPkimi6CJ+( z5KMbhfj#Yo?dOLN-nKQr@=xhINeye8@i4N!kTd<}mCc-$ztT!cwOpoZgmjo0vmxUd zB+O?u&lDIQvvt){`KQGpKdgrN)TD5lR$B)Xf9C4KOot^B} z7SK!iE~v)fGkRLxbzL}CGTBm$dif?Ql6C~yXIfpqRg>7WV$VH3FL+Mpi|_WTgh@|_ zanG3-yxr%X4$7gmE^OVKy10fUQYM(Wfgagx9qB4r*VnzT__j}jk_)Xp#?c+sT#^Ue z+fbECpBOc6!6CM*zpnup3g>>cQ_bD8bC_f%AO%&MUkc)14m?SY^J4VO>^$X>s?WYN zn)5azR|0f`Sq=TA6mQ{#H6WjtFE`#&9PGa=%-Y-%r&@ykQ!|O!gp;3cC69pkI{QU{Wi{xPvY*UvMU(n!jLWT)20Ds021~o+ zAYYY1Pc196t}?4`!&Yu6*_-{&;DZ_W`am{d?tH8oiBH|7YWqcv=1`fa)h|9Ng3 zeDEN-@J6*sDCQKh=fS*=nH8|ay2-;FEi%?h#eswmIb_~J4e-q0{ln`sXS;blr)~9x-lwTPK7v)Ht6&Inr?^@we3|QukzGHxJi0*wXpf z?pEJAIGQqi?`17+zoArqWSEX=~ z>jt4;_X%aEkX~DAM%dso*Qh_m;Fn&$)lom(MS5-S*qeQPF$4@Pb#5-0J2RWIPozu* z^5Q(|C~u@*%T=)FU~=ug8J|;)NFTEYz08xaWB>cTh^*gHy!VRZu4QBuS8=OA-p?$95*kJapzNE_Z^%jAQdqjsw(RQTVKrkvX@U<-L#fTWs^s z)a^TPZI7y;#}13@JpO#+OAwLI_Zp)1kPMLvq$n$`lR^sy==mFimAZ1}{AG5O^c+d; zz5T?h60UF=TgewExi=D6&)iX#$PODh{GM$Dq^~>Fi}C|9rZ)ve-`hT#@|}sX;I?@) z{;tJ9I0HR>i@JmUalyT^Cq_N%>c@c+_qZnC;Ac}x0rhazGiB;-L3R}2VZT1ZQApQI z=f@Ml2PuTcbJ5?lF^_#%oc2RDL`Bd!mY@%hFe-I2x4w_vBeY`^o^rIIT%} z%cnLkGL%*V&o=@R2xexRQw0JGKA}_FOtEznBfhcuEJ$y4ezZ=h<~@;xP`$J4T$jt` z9Qyh~SZ-ao*4DQ`{S~B?HfLSMq3-fIizGgCg`S>iRSxhr5AZ&``@oblWy#C!Q)tTr5j8XXnjPjwH|>3x5(+Pj993WvDezw;E;cs1vppB1CPH zLwVAiIPmPRcc!qAFw~_H0B@MiHf!>u?Jy9MvFl2sk?dyYiuw5Oq4-^1Cgvo{oEF>~ zh+#+LSuSrjP|(7T;;kSN`%%w~qw?@Pl@;4S;9d0DKb*_B+JnaYSEbiGqV)rQijnzk zTl_PE1r#~tgV`Lx2AWW~$axfJXfn^bHW9=oi>2)Kj@k-+&JI-_+$y*HPAiS7)#@wT z66V=;;&?VN9^vr5)+wOhXjb{J7+GYCW>V)$mbC&gLEV`tg(m!BRqet5{3FVrlXT=`7*2L=zwr`Q`!x zQ~ZXw=sZJ;M1mgd(`vqQ%;(k27-lsCejcMibyF1ZWV2w_?mD{eEqf7DaucOP$@GiBTxDHbK*VyJd8#Huu`JU@BF}{%eD_*>gzp!h^Na3=r5>=T?Q@zXx7`*1;>w|T~N;Wje+C`!s2pNqy z5Vxzb?uGRC1`HNOUmytGZd>}CLP=cMoZ_+uL7OZQI88d{rZ#bjGv5?~Q|GvXsFB>f z=M_*2LUbW8Sjb(7<9|1FJs35L8!dxWRQ!Js3WoZ>Js1LopssRD0yr214t6AxNQwjk zgh&7*!3sna9!WsJ@Gv}*2v%^!A&@vQj--G>ARq`ZR1t?qqM!(_yeLW@EDw=0GgiN0rfXu(;p2<*_6_hRk~rWtZMU6Uxk5xOmzmGOWdpDreY;ir7eB`r8u21ju9xe3z%x;$yL2cVt z(A$q+B`Q3&A|-Ed(_c+#KAAH7+)AwblGGQpX7Vk~yZb%dP%=x0Vd&By@Mo79YCK66 zDwn}xo}6?~IdA71cLDV&d1ADvUqv;tRe{!HSU{92>!8BAf#)dJn}QO?!c|bopusJK z#0o@EA=P5>Y(7b@fOaXr?zu>DoulEiRxdXCwdJu`a5MOzhB_TB=x_hcz8y`WUzw-V1z!45m3jeeh`qp8Ho;^$ zzL`hpcN+%B-6=y10W55lsXo-6`KkO*_Po-k2S=jqjpiLip7x^v(Hf#hty*Uz5s6GP zHT@GPq%iD9vk0PQ)B6sM)54^LEjf<2mZ(=TnA+r2c&8jLvEcWcgl*5iZyb_USdCmi z-k$7jy&`e?tKu6ccxUgG^-C#nqfJ_~roxSGpw$Z;N|f20j+}?xTG<#k6Zp@_t1V-f zJx}FH9S_e*z<3|5|NZ4l3xCGdAO&{LJhQE~`{&qYL=ZQ5ddqG3=>xU{grdGEd(ZIQ z8{7_@SCahLCS?>Iy|Zd3bBAVp3nlq!g9{~b8#v>cyXXFTYe46Alf*c0URs7r`q%PW zkGqYF{+y#cG#a-&%Gac)lZ&0d@wIPY9FzOJptJTFZW!F=SKshCzjw^k;?#jZTa!_e zu<3Wa?}79?Mzf=?(4!;fRgJQW&T4@+^Z?9@qVuX@gWjD(>QC8)itc9AoKsz2Qt8$a zw3mPj@kC-$-z-LLu8b_yP_;6{_rJXE9rudkIem`t|9xfr!DgJ4a5TGpYhDk1_tc2$4_fh! zguNz}l97iS2I5*{1nz zC2Bt?o5SsZgS}SMV{3%miY=9!rv5*ESsn}n1%6Sw8M_Pol@9DHVf|jKUSeR=K1MP zRoo0&7t4&wfe$*%>zkd{x|E97dF&qXb9#B4U*_Y1?2UN*Y;NJ zZ_x{*G6YY1@+EQ|k!y*=MZtb{`FhQKy_-&K3=t zQfy`Y7EErkV5#5i_+!~G6r<5&>wovjXYC=8o(kKlT&nJyXF}dbF}^vB^?;O`ZS;U_fn_^5^X0-?X@^ubt%l zCTpBd3Bu&B3e=gQ^0KtrzE+TI?}Qt&edlYO*YH^1RY(ZB%2}%e+*v&1&QKCv<~Qi4 z8`#cY=4Kmsr58n|o(C#g$dj#shA0BnWomE0es`mOj~l=qY#+e>xOC-m!{74XBrOcz zYZPey3CiY>;L3;4M$H`zdSkUAgK%BJ-MBvxCiQe z^dO`D&y??S)o_}7XV$g}=e8CnB%|OBd+_VG_WpjWom z55wA;dj3R#7n$_~p$!jmdZU0k@0q*RvX#X*{a~F&D&6wSHi@F+n1~NH1+vmoB3l(% zyVv_K=)U^Mxk{;^9l=q&8?fU)JFJ0 z+LXwex=aHB!&d?4wp{ACR%Q z*~YHF`^Uk;I_3U9@diIzB8{nz5lNo>RQ;COD@pMj{B+JdujzKq(SBu^0YDy7r8Yjt zmx*!SR^Z~iCW>OtW-3Ouk^!11fx8=>8!sJv z5se<0DMBC-rDj4yp+zZvYgZyod9H+y^y~)e;vTe+Qw9Ahq7u+@6d~R~yrly=- zw%~|Twd}F9>J*)g>NBOqiKzB0-yhr<*&|#pJEJJoMqOh?76hgSz%5iik#UNV%XRP? zog{RMm+pAo13I6-Bmr=cosIj!U50;NvJ$A>=bDAg7BBAbF7_@HHbsK@Oa<$<`&?YZ zzMh-U!8Ek+Uutfvibrz|=j6t-XV%*Ut4oFz#wE9M7$ymr@H=>D5#K|fbI1_IGeO*I z5*(wk))|C~1Kx1}g*D!SU-)8`GDe{5SQ2WCHH5=w4h?)d!tRY86Lq6M5DNlBld$e8 z85dYHEtr*rxx5XkG2I95ul0wdOaD@JZoMeqWzA>{2xjd7AUI>}9AU%eE;@31?|!9q zMLDYn#32p(;&3rY$)Ct`6TRj}@~DVmnzG*x;jmAHVl%cZy)24Ff{M=#$a# zL&!R4wne`aB%M|I1;N|}CXikS$joJ$)n4@LyE&f{;{{&wE@73!TUcO3dhgrAGphl_ z#B(~R5M*S#LfL11|d6oaFIyCk_P+y4`u2d_O)ky zIWTgXrYfj!%;J@w**jEHeLd`;IaGUSI=V4fI({6CC1brC^}h`rR$S;<>|lAY1Ixhd zSO$tEx4npp58CUmv1eTo=?%16K?OD|vKwt*P=vN8=%|7~LZw-&5(p&iF3t1r0|s9;Do7P{ j!OBe6+{);xHIEM&=S}waCX#qy2o#t{UjEWm1D<~Ydj&bi delta 3947 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 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_encryptWithCertificateAes256NoCompression.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_encryptWithCertificateAes256NoCompression.pdf index 7acb873318868307729f25dff172d40ad0af767a..5f364a5d3aa50de94b6492ec2558ae79ef524a8e 100644 GIT binary patch delta 3909 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 KB3ee;^#1{%v>v1Y delta 3967 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 delta 3777 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 Hr^fsrB(Lvh delta 3784 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 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_encryptWithCertificateStandard40.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_encryptWithCertificateStandard40.pdf index ebfbe0697b371d0e7d23b28a91f8879daca11dfd..708d88a008a8ac24d8814502ee85d003b117bdda 100644 GIT binary patch delta 3779 zcmc(hX*kqv|He_>$u3KjB8(+rR*dDgCdp2SNyaRi?8d&#k8C09ShHsvOIbsTNXU{s zyRr;f%1-E(XZ(-je)WIxynJ5#j^nz{>vNvp^EiHQzVl-5#Nt(z7nHO$vKL*qlq^rS zx8~4M2FQJ-!#G_#uyb$r&g--RN_MHK>Y@8dzu_9w%`vsl8Y)e`sa`H=Jjj@}1pidB z0X-j(ob$RTA_rx+@&^Tm$}gHvqQGECl;MY;rYIE3;}%&`R@0N{;o>CmWNMZzh)PYEU1!KW=_LY^6#5#LSI+fTkLnz`s4m(!Vi> zD08o07~OFi>XDS&;yd#~IbXQ22wfI>@W*HNM zbHd)ylWciEMc`bj_Z;q-Y1z6w(0ir!MRPjb-u#l6v5))E38&>qi*Q2WicR_pLE8nOFxWcEw{g39-CG z(7x;X0E_svoI7cgeTbi-VlcV?zT&PdxQjA>BJWjlWc9e9l*~bG{ME?2S2oGIF~%K} z9&#Z;CY4je+jXrq?bvWC!pJ%1QO1F1a>`~T18^RABE+KW$BUerCB5REab<~`4r0Av z{5BF3uq(m#B z4k=cKv7EO%JDC+_<*~{;`4d!tN~~U`7Yl#t%`vgB-zLq^EPi|R&9|^xta|X(oS;9m zFaqzpTiX3L2BSi{o#}rj*MEjR=2Jac*kr#c@YG`DUX&2~3qQ@jymPg)C4?=EiOy-i z00dqq^P!9yQ}n3jOoK2lR=r80c*g&!QYu}>yV@N(gMoPLKcdU-tn5D)bnBBqy+@XL zF-OwA8eZ@HescYI=AW7O*zL>5z z5?5-g>aDpqI@l}ZMY0SXL|Evw9Lfpl66hB9VGuN`&n8Is8OQE0`M&P~a zbUlk3wPQTY)BS17%r0c*YrT)vHwf{;wUX95ZQJ7mc9RQ}O|k^GV;kNP4HhP6L*xKY zS?IYBtr-1Ef}6mL?^P_fi zxLwISYl&X^)Pkq6MuLan5@~5Q0oZl8EmV8#D&jZTD4*7%o3!#nK7wEP;g4zbbABk28~2~BQ5;+48+1MJ;p2B zB;D*u;`o>b`7DReGJ8{bmGW;m<1F2XDU( zS*UZ&3tDatharmEiw49!L&Ltd3#WmutZAHa6zwA~rg{}bf=9p+0H-EF{gTAj<<_;7 z!TICj?-624^I~&gI{fnF+;rudfHK`H*WY0Q*7usK5$^V&Gvccp^P|^)7qdan-1i+O zvr8dwg0NYQf_1;F6S%($UTc6k;x)KS-Djzye{r_PIKYE^BCd{O>rIVBlH0>n_qsxu z%nt21nMfW$d^Ai3u%LUI2+#1o>sjKa>h$aJoN8P3CR=1bbo-nKe5R95SMLba^d(@( zvDYWXawckcMW2{l8Jp!Svy;lfau$!RRD6OdxmdY0hWSQ}_F8P*xcc~^`-O+UFgL_) z4ew()oD3yX2Ad0Q*|{|YgiJXfvv0W62iuj_cl&A7W*3}w1$-HoxQxwH2^lSLum=B0 z5O;k$w#))Mvw!Eu8K>?t`_hEp-fMGN&pf3!mD4WpWbp0dJSAT_H=B&CJV>5=!`sih zd;YPoeK$sMWjvg_nWWom`r=%s6l@|B+nqT}zW7hV z44+M^rBF^9BnPN|`de?N)8X04N4~a>rFpCYf36R)c6+tWq2Fi5VR_+∾rb(i`tY z8KESK&HF6F(r1uo*E+1wsROqDtV5KRPI=1+B;!&T|C;(h?->|wsLt4)$K9*=ZYz}P zPhVavDsoK+tv^;&rSa;6d!Tx*^4prcujH+Z49CJFB9DP|2gBV*t89K*l?Qz9yEsXZ zldU+>%PlE$k#(U79VEl)+jAGM_4kS&InbqXo?AS z4d=6W;nG<&L}3F|?byxqb2%->j8>Xj2t41*KNLae4nkXYZioA_xFl(*(*4+N5cL&h z(Hs}wJkbG6+b-56DpE3&1p1Wyl}Dtje$T(YaQ#x#gD$(H(OaWO;DQ|8=TbZ(74K)o z8Al+`&QD){cg0ZcXMUdv?tTdUbQ$HZgyaTuqNh@kl#yOMzP>qh{hz;wdgJ;G?XwzF z_IHWq%d%x!i*6-q$}rDC)63k{NrCeC@vfo8FE3w2AZcL%xbvzsW6zbc0neXQK}vwaP^jdR)hjM3eXa zsOl_T!mJy)rz1akPaaT7C@%GpQA#dKW}-9KO?2#majs_=Xkxi_cJ9$qoSWA`hO|FJ z^qP1Bwt-{`2>D|aE4ruT5dJI32a!ZIMl{|0WjC~|!n+gRe z1I1re=oC;EjI&GhnZu1YLliz1T5s=~p9MrXpGujDnQBcf-GQB4wG-c@Nq1x`4} zb7VxQB0El$))%7jZ4EVn((UnbQIkA`)DBx~=5#%?=l++0&TAdQ!ELT9`Il?fc@#KV z6SdgtSw4E+wrTN|DrMwR_W-Hha0p`4@UG7|V_waKbH)-q+;M29)02xG`4OvdO)P5y zJ+LqTcCdi9!phHij&EC+D3-x1GTIZn>q5R#`xMdB+OmnkDCg%y5)Fa+wSGa_$yR^& zr|q*)pr!3oJ*f-Wpe@W$IoF_BU5AE0nrSAd>#(}svw)YSrgJn7QKNWlP#Ng668UwBl?4`8_%W0^d-a7sq zk=BP5gw2$zP6LiR4oQC$aoyP}w7F0k50mpjNjT2*cUMtp7l^@5t1?)Ryv4>%PU4W( z7)Id>)PKtsMtyXTGI)4OPY{EI-UpwYG@|oq0klG3xk%qAEv@h$aiv7$&3n1dmZzHT zNd}FEQ`N}KoO*%?FkFb%1q>E)7GnCp0}Vky|JBF_oL9+Y&Kr{dpOOc|{-yqP!r)LO zd5Kd3khhb^AZfoGEsw#-;V}pV1cwAG$iuNP1q=iUgUKV%U?c{D#mb>ENE{li0LMXT zW;7I!hbUk%NHkIbEr-L|VGua5JOocmfWm1a5{gG-As9RihK3<zt)WJHlNU>UHqse!tYsg9u;6VU_h?&0H(!!yBQ OatJ06=$4^2(|-W+l;FYu delta 3801 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 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_encryptWithCertificateStandard40NoCompression.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/PdfEncryptionManuallyPortedTest/cmp_encryptWithCertificateStandard40NoCompression.pdf index ea318f14dfbcc67225b96b7f25323bcbfd528f43..07548fe6de97ba8cc5c43ed4f0ee3f4f346c6a5f 100644 GIT binary patch delta 3765 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 NNPrCj(K6Cz`!7BctEm70 delta 3773 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 CovVKU diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/certs/SHA256withRSA.cer b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/certs/SHA256withRSA.cer similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/certs/SHA256withRSA.cer rename to itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/certs/SHA256withRSA.cer diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/certs/SHA256withRSA.key b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/certs/SHA256withRSA.key similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/certs/SHA256withRSA.key rename to itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/certs/SHA256withRSA.key diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_macEncryptionWithAesGsmTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_macEncryptionWithAesGsmTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..31a6c562bc4420b67a75da35a3f28f77ccb7d937 GIT binary patch literal 5751 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 SjU1XNh+jod&(_sW<$nNdAv%Hp literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacStandardEncryptionTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacStandardEncryptionTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f8bffedbdc3ca2c7d0c8e27fa583fed1363ddcf0 GIT binary patch literal 5419 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 O5dytYy}2&7YX1YgzGlS$ literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest1.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0c296530e4e2500f8567d21454d16bfa7ce393b7 GIT binary patch literal 5367 zcmc&&dpuP6`%h_$Y^6jSwY7gQ8Gp=A4mYhA~1&NRnOYA|=VSqI;`Q zD8wpci!KrhW!q9Jbd~RC+S-15`Tq6&<9A-KnRCu_p6B_zpUe5Y&im1ES!id1m_o`r zUENL1$^;8yNd)VZEiBkBEDYT6*?dMQTLnW9Oa4Rt_<6HkLj? z^hl&%N2{Zn-!a*zm)ove)|klseo_6hf*jKqfL3C$L>9bC4w>)GwvmWsj93=Tl4Ibr zofz7WvX+Fcg1{|K;w&zPc(Yw7DbQgdpH=uwup~q(WP&X$cs#b7)Gy#4`fl4OIwXQvTirVHOt!tN^XgULY)u6-%NeO$%m&40 z|Ec82Y+(FBg&+v~Cgd|4{N$?t7UPf?1QUaUBOn@1LfTNQmuRK@l5_X50o$GL_-`g& z0+Ysvg!xM^5nrzQglD$cu;rRV=zK4Izw*NPb;s5Xc*)vNvDoLF@1KhTDhRaiZ24|y z%*cSp^9H4IVq_Fe$tV`*a~zO*gEA&@`Y-owf953{dW{%cF4L-RM6FPqst#b)WmhXak*x7O#W z%#7DxBD9gd*PvQU@bs;v2%Rvqj2pQ*s>(oTe(IY|R7Vo4gkRLwVz{hL<8@8uoavoA z62!XYiDj_PespM#Qk>3pg@W-eG*o!m(ecxh^N@MT3g;w+d2@G9zICInCZK>;)h&1F z3|UcA_0(pgzNg`H6aOQ<{cj7ru;gCb)e4{7uGJg&FAp+Tec|(~@5Is8oK3N%MhOv1 zr_dQK;n9{&)mO65ubcGi)&T!Z(fF74iKlcXM}2x|^1i2e%%-ZLDDG|V?1rkeP3MEJ z?{bG4=S(l;o%GqXs6eoA?~vfYch%+}s~l4a!!lfb$_L-2-LxYs8lRaT=z0X*y7P(*nKv)8S~hju(E6jIXz(AkHp&dTb0ge zvpE!6k@hY9nW(>~@bAJcC9_|cB) z(aE~Cqug(7^tI9;crp88Tr+AcKV%e{`0eyPB)J&mwBb{w;AYxY6!u_y0M(54&hTn9AEm))TgulcAfO8sOX?7*AW^!?kk z3%!P+cFAcm+pE*NUW`)n_^s}H^8AEDQP&T=NR}2au$w4e($18Y-Mwm6n4_UmziXTE zg}~AYYcq_aX2vPi7Nd&89%J8!*La4+2PYcN&L7;R6`>dGvR-B6xq@m^=1p<1arQN& zbeC0QWs*O?YhY_q^qBX@?*xqY)&9_YO()BBL*Ek=CjE4dup)k6?9?#)>4QS&62XT1 zuX6Q$$KF~t)IY|m^MpHZXKw@IsCg%qj=$yf?wCXFB8i#v^o@&daT=}TruvuG`8`UtxR^H2h4(x+d%u=l^XMH} z!r|lTaZ~2egXXX96+9(1LVQOuXa49|XFtkKy(oFxySJTf-X{3%+SKw#2GL}byLmIw zG&9lk!%)0=Vd&2C_bsh_)rK84a{?A0RFue;d_dI9JQ4!$oPWaeuyMBA>vxgg>d`g> zCLWk3&Fv8!Z`^Xf-frHs*BuS0(LJ5rxx?|JP@QNk6;Icnx`tG=tv!?8;73o?*E7|< zSpv0|tvL(kMLf!n-U-8xG77QjDVO_Z)?nG2(rSmcwceXxs4L-zowgGU**?=Ngza-6 zB)>}W#7N7tt?rZeCq>w~y@<@}NGxl2sPwD1U|)HpxZ%JngW$f+lZM*@OdJR8V$!ll zEWdMYxm#M!{eI@v+V7TdAn0^_O_8QLeqWyg{hld#L)H~lA? zbBdbASFWyj74y1#q>%0D^K^V1xfSw0q^|kI5Orv^w1v^M?*bptMmMLOp7&|;kunN` zLoA<-S}J|#hR-x#llmA_+8urgV}e}&uX{aWo*eeG`?qM7mbWQtePD3hLW`Prqbxh^qgcNIX^F z6R~~Iujh~6Y@6}+P)v;h6PwgtH@1skVOBBz*L#TzH;YWS%$!;{RM+3j@WHhDT~2_D}wBs3%BS&9~XqNh4CVccpl0!O7VP zJ(Id@kQecBg~xJ6*5@p}WtDVuT*n(EX3$HS-0k|{^^PXh%-B7-lRx;E+K=$ov-EDh znfPv&d)MKRyom68lXtKn{6+eJ-fOj=D@Rl;SLD{)>MvDzH)5b1Fj+;#CIsEfxDV_7 zn83eUtW~W1Q|$M}eA8PB8lm2&=8r4UAvHR@U9oPqgZB@Sb+Jc}yGcJ}X7R(?>aqsI zdKDU;)4ICD+KUzmC-=S#Jh65nGDEph{oESgcw4*e;hPWL@IQLcE^%}49M94jv)m0X zcWl=17j&E|*fWhinwL8JU_s+khxW6k+d}F0`j)$XICffe&4S>~kDfkzG8}r~ZU6Vt zg^CZVESLSfb<(85C!F{wd!xfE=?!lp#^kMjQRil8q-7H#C|(XRh3D@JH(tn;T94De z|4X=q^~RREF`Z{(Gj`}I+(`*h3d2*jW!!C>bmqE};<@Y))!Yo58s47U+q6m*-Cb0o zwT%2O$_~Aa^FEUt7!(=$G>*^eI;FTJkIO~}vIH~Mk)5Mo=%~!nEBa;C&kKxvJdAo~ zs;Ul#!Vf}f){h@LmaFUe^Yx8Yvca>ynnl-q-1h#IpF>~e4_DR1tTfNxUN)F!hwq=E%j%r|3yRYww&#OIf_3|{0y>7cheEY_GShhii z1x=@y8L9SoISz#k@BVm7oRbk-5_j#c?YQ*YtX)Co9mJIHj6EJ0Jf3Q_AS3hbh{n_+ z#g%yrmW~S4yFBr*WpUi2p9Zy_hu++%bESHqwkv3R&ODv&=7}zT=hr*r^=wslie&{{ zaDAhP*}PrxAZ(lRm0E+24a8yDQxmgT<0KOg?EB-d@RN(QkDs&;h&~XfUKL#GY*Ff5 zxWNAfapiS|IA`mMjY{56nwBSk&**>wm*M$kS%OjL9y^mVjnc6nH@i(Hbe5ZCm0dRD zXtthvrFX%l*gI4qr{L^6#XPg3r`m?~iS{ECMB{27hH9HO#Pf6u3WLY1T`ZoZ>UShF z-)-&&~#*HE%^v(wyJ-J84i&7!k@Eax9@c{ty2ZGL9e zvz(9s&EknYiBFQr#Z&h6z8w72I#)^Uq2}2&jLx+8ul$_zk1C#+GEGu{|4DlLpxT86 zwu_FeOI7F^*4)xLHomlciPfOSwTV=V-qLf}1n=@)5>ecyZB=HKE&I=QBxU@#Tt~lg z8db5L&g^-0&wLm0=Gn)hn#3Rt|FTP$5;ug1YBj4Gmr<|Ud#{fwS(N^?TfLU+IPBx= zA1doud9~JDc}V~(EhSij3B=2R=L5Gwi-oWe)J}1q(F8-4u zald`K+Sq}QeODR%`D_&;TWh-k@E`UjuFKK?OU=Ls_80EvDx<_S zC8gO83+-Gff0+d(q$n5@3P}zFVFXO0TwEZ;859x142lbIibhZ&B*HKnp=kk*;RHtn zVH}8yLL!2sIJ~dxAUKEZ%+l|V#STWfEIFG3_z=2m#NG=+u~eJ9y;s0Je(zY_S&#i^ zqB>76JaVSY({)*8tPu{_0NU|NFD|g(fbDF{()W3OFCwf6%Y-bOtWG2YF2dQ<4UDm8 z<|`Za-8yVul;odXk+q@t`805e0C;E`3V0C!KG<=+w<1zI(Zblv0QlmdoCMB0FR@(3XMO1Y z%@q+FZveMMkP|?(oP~d5CSg)Wqzti0W$4d?#ldkDXNg!}Wf%cyul!(%|CA9JV1<8^ zp%7rpf0Mxk;68toK?G>3zsU#^(5k=5Aow5tP#h({>B*#&pFbm&&llwFXamLqayl9= zWB8QVmtg_Aj-d#~!bmQ{0`0}}X8lhG+sVp?Wr0Fm1cEUP;y?m~;&MPEa6|+|Loh^w zsRj%o)MpJ8{X-KG0TvG)pfJXvP+<4@j)EXA@W4U1Tv$Xw7|?)G2oeAp33?oO1?`7J zsQd{+Lm0xPa3O;L0WJ_wq>uvLC4xC30V<#b94=0QcZY&;hD0y~!$^`Vpt-aNfoZS` z7kEWP0+K;R9AL)4Fo`n=Sd9X!asLtn0+AH_uP6X&6apdr6*F*wkN_QlLJ0mxWZ(`$ z7%qn5W@uLgvJ z)YG_-AZad+16ZU;gfoOl2(ky{A`$_cFhwx}SV&Vs1S2_w2tXF11T1e~&{PzJ3MrgJ zi7*C{N6cYJ0q9TAl3bJ&3Pd6lA!!KW{r@BIX4{KJ5|(`S1_qK637Ft~zI655$goJT wH|qGw2azT=5-DRsnnI?KiR)4;7uUtkZpy(jN-F!jX@d8XtE{7A>ujg|A3jrIVE_OC literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest2.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..396ef5bb012f752d5933f003dce9a7d731ce310a GIT binary patch literal 5435 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 F{|DzPcQ*h4 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest4.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorCreationTest/cmp_standaloneMacWithAllHashAlgorithmsTest4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..54aac7180357ef0beaae8f6638d755bf7cd39764 GIT binary patch literal 5436 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 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/SHA256withRSA.key b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/SHA256withRSA.key new file mode 100644 index 0000000000..d7e9b5e825 --- /dev/null +++ b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/SHA256withRSA.key @@ -0,0 +1,51 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFNTBfBgkqhkiG9w0BBQ0wUjAxBgkqhkiG9w0BBQwwJAQQdOaEUfD0sZWtUR11 +xwgn0gICCAAwDAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEBaNXSfwUjF5SS7n +ce1JFoUEggTQ6eV+IsckiVP7I9VTldLkpP5OKB8brmw5t20fO11HyCnqkkhooR2b +t2fBj4fWv0IRUe266L+fVs7AOngjkWfezEvGR6nte4pNXEFrOwt/U8A6IYZXBdA5 +dvqs6VMPHbjQ8CufVLGvksuYFQVRcGy0rk1DH2Of44GU4X0GtROlFFJnkmfZhVPS +Hx2MXXGQ02Ko1i1eKoEGgvmSAsDcPijiX96DKlQZJ4YMtI/8rRsdvNJsJ2beyZDa +T3aJMmSSBF92mS2dtS21DwjzEu8utquguYA0KYzjZM9onOuBEEUifam8Fjnvlui6 +beQJya4zldoA6QZPSd2PUAP6l1U/d8UXqcisjzArDZDmRu58dPxn4rs0NgTOIO8h +fEUIvfS+wuknff1b/wdGnwXkXoeSrrjS9dhP9KVU1SJ/FWKc6BY+P+JmE5vLjAtn +AmbyZhXY0jX7ZHFh0z0y1y1fTIXL1aj4iB+cUwhJ1ZdlGkT5HdG4ts/oTGCnpB6O +F1GvGyhprmtjp/dspLH5ha0I+4aTn46yFpnBNyg8w9c2+xj8Jiqy9J/ppVtPdhxt +wrE1/ThUGIWUTsbGbLW87WIrZq6IlSGtztbxAMYxXoe4solYueE3pI3eYFzgnBcq +T6Byktr71gt9AGD/N/p+Kk5RM4JT8XpQjLjz9TlmsGpJzUoBGeG6KFLsqqLLSD+0 +c5lAGWsFhec3uCu4fCyBqxpQc0y5j2bgUiTRGYn1NOdyZg+ERO/aWGfkDOAtlL1i +B79NGIBxIXgt508g83UeaQC6KjuG/8hPY6UHmU5mlgRT9H5jvkSX3mEtl1Gdk2y0 +M5pZTTrhbG4p66GhBi8vM5tQfiBoLUKEM/kgiGXPC6Kob42nb3ufP0rmnKklcDGC ++898hW5ge+VNmOkHpVuV5ZD9aWUSVEU4+8QNZj8pcyL0GXFyEL/HxNxUESdz3k0S +bInuxO49mgGPjBqtx5ZvaxyWFnzOp6rmHZUHymejxxdnlnTnSnXKkJFjcm7n0sKO +575ofHtk0OdqIK6YiPgfeF6nZkIg3C0PbReZ05kTplrW182ZWuQQyJgv+RPzF4+9 +5rCe67nJhJrt7hXFRsUScHXNj+HF9Av8WR2RnHTRbpQBJszijM+Xgl+VeYcY5ckB +fk+AfcR9r0Jud4O9795OOWVxWqGVu/b1RGonfjMkGW+JdnZL0vkOYYcHt4iMZmzW +M0ZowZPGO5dFBV7/ZkVzb0fexw+f+E0lUBEK1cx0gxnzjmcGJO+C9if1uIEfwpon +3wBOTDsU7XKDx9v6ibcDMOXrZa+rcJWxgNkXt5nRpozZkddYctBkehGu+snV2g4n +SdOwr0eIVv/L+v4IywZmeWWEVnbSAvB0p7nB89bgLMr9tV0ly7MWxPH+gPnNJ1gE +7Mp3AgN5BxEmLfW3+ou3QLoqnOS2MCw/xcgLP0nJACSPI7/nWy95iKXKgkCkAgF9 +4Ztk7uBG4tiK14KcKq8ToCW2YNliT3g0CWjBLtVPUS6qboudMiuedxTxE8WEirpT +A77nfDNg4MVjl4kP9jhV0Phpn9rDMJ2jw0BqFc1Vou4aNDXYandAFJea44Wce9H+ +qAowcrfsWehD01HBQ2KwWVg3sLnwwBHw0nvbATS41hdxsP2OmCnxWkc= +-----END ENCRYPTED PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDfzCCAmegAwIBAgIEUFic9zANBgkqhkiG9w0BAQsFADBvMQswCQYDVQQGEwJU +UzETMBEGA1UECBMKVGVzdCBTdGF0ZTESMBAGA1UEBxMJVGVzdCBUb3duMREwDwYD +VQQKEwhUZXN0IG9yZzEQMA4GA1UECxMHVGVzdCBPVTESMBAGA1UEAxMJVGVzdCBV +c2VyMCAXDTE0MDkyMjA5MTExMVoYDzIxMTQwODI5MDkxMTExWjBvMQswCQYDVQQG +EwJUUzETMBEGA1UECBMKVGVzdCBTdGF0ZTESMBAGA1UEBxMJVGVzdCBUb3duMREw +DwYDVQQKEwhUZXN0IG9yZzEQMA4GA1UECxMHVGVzdCBPVTESMBAGA1UEAxMJVGVz +dCBVc2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+6g5sYzXiNOA +hR7C8wc8buxU/JgcbdHpHIR44iuXjpepBYAE7hRsWM7H4cuXrKiRxS9UMOadqkGF +Qqb5sG6lo2UUhcj4qlN6hKDc/+AMZMIW1mvQldiygCAkqgM8iso+kw56dpVuerG/ +k1nd8f+X9rjXN6/DIMznZcMy2d9ByIFuixFKElPvOWx9q9N4aiueOd5FM5eHxp+3 +F4uCTrpM5zkS7Rmf5GVtCofc8KgaTLLp4D0Ge5VUJm7yW8fuU3eIpin4ivjk+Gye +Q3t0BsrmNyQy3CmKGOBP/vX0+wEMvGN2xqNgAFP9dxA+AbJMiAfsmoWvxXaPktqC +DOspTCFqbwIDAQABoyEwHzAdBgNVHQ4EFgQUILviRCmSrhuLDmF0nus4pv2uu7gw +DQYJKoZIhvcNAQELBQADggEBAGnfGYL7nDm5taDPRxuGGMqUPwRnH2bXwef6S2Xb +/nIEFtNheVFQFtKNn5Ikq68DTFMP06yXLnI7F40+ZiQezRBB1EPPmDL2fYKc9fL1 +SHntu6HLgP/Y5nnCVegtL8l9745gQZnnXlMtkTs2HFwffznIHW/3STO0Bcj0+KMa +p8vebMjmvV7bZEGvrcrVXL55QPZXJwRuQMXJB3f5XhAEH1VqAhTW6DrvBUnuESwo +9fxxA5gmblt80SQYdKr2I08OTk0qmyF8zNuffTOiSS8/V6Cf7CntuPWjSuVf1EVP +MH6KkSjceLZ99Y7bvl7KKvQ4Kj5Bp27PwlRvtYbfCUmQEG8= +-----END CERTIFICATE----- diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/certForEncryption.crt b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/certForEncryption.crt new file mode 100644 index 0000000000000000000000000000000000000000..9b472214d48f1ddab5f1a31192da504eac698cd0 GIT binary patch literal 876 zcmXqLV$LvVVhUKm%*4pV#3aCAz{|#|)#lOmotKf3o0Y-9$&lNClZ`o)g-w{r$<>h0 zfCt3k;$h7UNv$X`R5nlq@tJv~!2FQZ;u7c7q7t|KBGE~X|%MuvOd@!Nym^+>DL&B)v1uuX4D z{Q2I@sZTa_CkHw#+I5i4#lx6k{yq6nJ@a3OQaTk^t39`S8aVHQ&epf0HlCsB@p|@* z0r~5{Y3muzH??kxeqg^u$mPVQ`j1zZ%(Pw1TFX&oR7RJiHA2n+9WDb>}vCQbzx$3r26Cg+-6Vb zU7xeza@5X4P8?;9@@}o)72iyKy)0z!qT7w!vVBQsE*^hB>&zpsFp;m~{MUUB`dtaI z^8P9%_C4{X^w$5J2Io_9j=SC0S?ld8-?A;=o#Rr#w2M!7mw9$1g->&4VrFDuT%2Z* zVjv5QGFd(rF&2^cn@+F>wko`fZasYG!1~*fJGu1s7|4U9m02VV#2TW@P-& z!ePJ$q?i~P4fsG}{2(zFW+qkzdOxc2)QKL!bY-GHsTbu;km1Q>>Er79HKRT6+?oPKj8yZRz3-=_?pB z*72#k9Sqpa<1p{<2E`SIM->lwEGx0y>3fC2Eb*tJmxa>KFyY*XM_2yer2OJfxk$K< rRee>#nxMUlw65O%ui3J~zQwQnc4nQDQpWPAlzW%Bxh3t7@O=gVrjtt) literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/keyForEncryption.pem b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/keyForEncryption.pem new file mode 100644 index 0000000000..068689ceaa --- /dev/null +++ b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/certs/keyForEncryption.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFNTBfBgkqhkiG9w0BBQ0wUjAxBgkqhkiG9w0BBQwwJAQQw74LmQhymYGN8QhZ +NXA6/QICCAAwDAYIKoZIhvcNAgkFADAdBglghkgBZQMEAQIEEAw8/Oa2xvlCpECW +RKztuKUEggTQiWBW4ih3uPsyF3rmJbCU+ipcKTe6NcDEIowHxY1BH0MjvlO7KBaB +Qxg+9mz9yf05lz9CkrPvd8HCjpLa0+v4tzsBq55me6flqYTq8udtVkzCSigPkWkb +35QjCG1FHNUN4Fxc+YlZfbMvCCW2e7uGvANXtAeUNq8oo7bGOJUizdcs8V8CJ0t2 +UtXIYWV72WHznn4qZNcQBtAwFtL8tO/mpan+J0TLbydWu+oK8aDvTwkVs4DQPBp/ +ztEBMPuyJXSoChxzh4IpWlKBJoWkTXZpBZds9zjQ21JV3QeCxqBvAqlY0YBChOMh +HSxGhIuCQlj+44BjFUVYfGYTCulW/qLd+fS/fZGe7PKEoXxA71+uC47oCQMQKZda +XBOqYEGhoXg3XRidPK0yGSkRsSpyhVGgffy5c+ckDW2b9CO3IRAFIqI06QgW9tBt +Wfk30KfhbRADQ08p9zEaEchKUyEZLcAp0b+UHl0ocL1Up/tfygv5atqwvoR/aL3p +lX4yAfDPDIXSY7wF13WPwx8FbebPSd3T2OZQB9q07gjLgkczbRSvq+7muFCFCNPH +mBtyZl8WQqE85yz/jrvkSQG+6TCLgXEJvNxOvw4tmDDvWxW2bKKnij3fUDKHlop5 +6ypojj8jcfFJVUVGbxEdD19mTvnBTSY1Kv1h6D2CEBLzMuYyZaomwWfUD0oGIdfA +ImuI+WhFXcY5GIo0yWPbu1L0HWH9xJObEM9MhNdLm1LIY3rQ0OoNipDAFrLv9jfc +W9Ef9VPklv5lO6HhfAhEQgRvdP9NAY8U66287lioRUuTU9O1MULZETg7Or08JIMP +qIeKYWxrmXEuaS0S6i1Q65WF9ayP5mEragIBiEQpTm5C6BVk3cxv2GVN84HyEdRQ +ekAQyRbZQitzkRGv8Nf30GXlhEz1vgiG2tylfvLmAhL5y4BE51YrrBtoljeLTm59 +2kGSXYUqN5bTlvjk/v/kflRpMNCPzJAMP59dkY0ithoiQJn3VHbRiqB0NwxuRtpM +EpYTkBiItKhlpVA48pX/kfNbk8t7cp5Xo/FFo5gupygYZOJI1LnEQyoGoqR8n8wO +XzyAqzQFyhtAyOkTQMn10x6s2g3mjnYnfify/9oJQstX4Q2UNChwLresxpv/fcDF +rJjG5Qq5kvbZjGsdYcT6O89DGWWTHVPZdKe9MApaw1hb/q8OhueCrVgudZES/A9t +jx0F7TSoEPcm5yTAWCZfdsukI4Vtfj0x653uhFlu4DpRIxw06yLjH+6Sb6abvDoS +LpDs1l/doQI6CJOcPw0uESEAXkj7tWmyCSXxFnG0hor7w5Oaz82hpQcc/mZ09p4O +PqP0QBU/dUzHgSQdhZHDBXY5NT6laEQMMzdnyYdFanxdoinWMY4RvgmjwRFU9rQg +N72sYdZZ8GD0mG3k8ZhSt3rs4+sraDo38BqOFtNGBGE9LMyP8AqQtfbABPl8VAb6 +MrI4tVuUpo/vD68tFfDk2flH36jvmZoAUUgGINn1GFgTJXXC+embg6lHAu3GgeQC +9TOrtNzKjIj7jX3sECgmPEBS+9HymrGhSue9klq0/iptRLIrXWuuB5TtBD5PGG15 +Afn2MfHM5IR8Bls+5khYRtoM5M+TdfkAjvsFUpD1YXehn/aTO2BzquE= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_appendModeTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_appendModeTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..31dafb647254fd8543a104426d4380033b0ddd55 GIT binary patch literal 10414 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 S1^DmbH1I|VY)|}w)BYa_5FJba literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_macShouldNotBePreservedTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_macShouldNotBePreservedTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..079ab91ce51eab4722e6f7ac050bd7adff2310ad GIT binary patch literal 4245 zcmeHLU2fY(5N^>oonpblh>b$pKQ4a+Nr7Xnv-ARe z=>_^wAQ$LEZ_pl~SLiGyOS0968b#0-FCa*qoxlC|8)8O#!~Stov{+;Bk3WC=z2Or^ z^7wtD)1gD+;=_oJKv!p+F=9Vr`8lVj^SHX60Ug7l>h&6s8Ed9C=Ev!zf`T4Tq6+$; za|84QvWx1H1ifBa6%b7uiyy!G0@s(;d?i{rvY}Ub9A;Twm1j1y(K$WJvkJ1RBsSED z4#1?*vwU&J@KJ?|1gB+VB5IWpl=-~SP{~jn_zo zD^LF(32qZw+5a~vZ0x&G)VXbAQ3v~sV8~4hM|g2nnrD5y*8P54FyXS0Nx>DD;u|KP zF!tnt4svr>K{2iZ*Sl5N!g=HR`2ugYMBjK*^wsH`AI|XmSyaMXD6E(wP3cExi- zJ4b#Dpo&aXMTB$AY*e$NTrsJp$q{Z&@{7$0wuo|+&n@lfx2Y-5>gpjibI$3SVdciK zjUAkr*!0tn2*s%dZYeP1pHe4cK6I1efW{ zn*vU6UXS(72OS#cX|K^)v=`Ia6c0!i(@9pg7hNa9vV}JOwqoj#TBZ8Xbq?(Yc{do6 zqr3p3TD--Y?=@r6=`{%H6eekp`o}9z_|$bQ&?}s;WDPS9!;msTg=nHiv%Jo#Xwl5d zuWKJGFMTL=k8d$l6_{mBNlCClXzPbsNLLT+WAi}Q|MBwNb@i7oIwnR2lqz9+-cVMoUNU{}VLGQJfT z$BKW@TjsK@=ki^D(%sE32zPT4!PeQTB1$Jv*a7)fpPY4K9r$?AI0gw?`$DeV#O49dBXiz$AOa43ws?9GIYVjiYpap38<|?kco0Rw(9{fkdX|MPzseKT1hTq z6$FWA5|?2VuKhTW5sTf>W5Ah-r8FJ@D9&{#(4E!wLeNb3##4y_8ON>!52FeZ$=*4A zl_fc`Ln8iLkmnUyj!viP4IpiB;MuF&-=>`;ns=Mu22Nr{RZ|RM2^xEQ&)*z3{sum^ Bank?* literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_macShouldNotBePreservedWithEncryptionTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_macShouldNotBePreservedWithEncryptionTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b54a711e1249c69376dc0896baecbc1c864ca10 GIT binary patch literal 4963 zcmcIo2UJtb*1n>&03s-;6pbKK6mrsY1StYRq$Gr*m{3wq5GjdCXbLJQpdv*CMO3f^ zR0OUf7r9>PSde-J3kae#6)7T8_3D3u_5c0fT5qkl-mIK6XLg%!cJ`h%d-SL_WMi}m z5uw-9+uVvEA^{|iwF6;hhN2>I@PLM*L2MBn4FE{VgZc7!p_} zm?Kfc|4=9U2Z|s8iX6xkK{gPZ$AM6eP_Un9I}(dAHy4To5Hkqj8ERlPW?$oDs-1Q* zdd(Xh{gROzAIA0OUBKdtW;7xjBzC`wew{&r=_^31;9#CeNS8pSd7-R%!6GPFBt%Lu z&`?eg$Dg^87fuJ@As)mdNjQubipmtgGDysv2n`bQLIi9`Xl7<^j&c+D2mK=NCRrkt z=?DE-B3h#S-9_M6OaH!$&=Npj_5Up&aS9)B0_0h{Z`~R0*qg<8iagyZjbnPaTSri; z_h`GH_|-=eQ2*OUbD)2A(j1EaqL;8gAXvlyw8)98O6fW_HGJ?Nkjc ziNBtL+5`6hYy@+Cy<{;&26rc|oFNL1?70AQ&|4)AxJELPbVns~-R| z;bjub42DD#{=!v_Jj##*9dN?ufe6{_e}ZS48!$8j0P(qG9~raK;3W(Y2^k{U{Z>+ zbNkhe4%oJMMX5See6$J}kX?3rtjXQFwXm|Y@5Q{TnX$m+c4x}EvFmT&kslGg4BJjn z>iuTR9`{?*{z@rJ8>{BM_KU=(|C2@4`FqhwxWcyj)tD{A+t@-|U(3}2D-vnjTOGn+6SUzx9bFNjb5L0+NfVgpw^?C#&^C(xYTEosHga0 zXXdh+ozFpq&!yhW>l1`lw2u?Bv_nqf(Y1(E>J71ihSrYt0jSUFhNd$nQZq+|nysrl zW$sh-ia3{I!3&9-qo(7ixPIfpu~6}F(IKF#bK!=(8`(Zt>8-QYyS#2RrREoIEvq|I zZPc?v&h*0iaHsBd*H(LS!OeqHuZl{|JBoK+G0DwJ&Po&O7svC_T=Rox&bp14u4>E9 zU@tWSvzELrmeM?SNgAoWw3AaCaimwKE1pz>%=)a-0#a;FWWm# zomQ(b$ypC3pUbaw#L80Sb(Q%l{ffQjEc=4QiRor)4RG>Rm4wJJ5uGm5e!fYf=Ib*%7_{r4wH!lU8DJz&zr6# z|8~DUcAWA_x6P39+xDlq_iLM|yR$yI`+*2!UeghAX@<#p7aeIEIWP5_HSaznDrYfg zZx~ga+SDm5f@vPw4jM69$HIIGY=9@EJJi3cfOo4I?-*<{3DN4Kn)zJ%9S>7VsFcNv{*k! zNy#XVGhG*HZRF*xlasOO5M@G;B>3~?hy^{;0LZ-?Fla}%S#j0=ui=f-QDkcRz0qo^ z-QkO6KCU-fM7mh-p;ES_R&!KC?eySRsYxrlA|N8C((B z9I#yOLH8yRs`dXTHiE8G}ujk39Z}!=K*yj4=J8ZdT#O-;I`r6G6 zQjPkjIp!ar4=ln@=GaHack?c9qCS2&e;@BmG+3sfHugF~eG7fG_xGcvpEYFn zwx6DCDz9SC*nRnrEV62XN*ya`Iwt0H@@t1Ds z50LS=nUAnwJ|uW3D%Iuk(XZOVURHKp3eQw2QD|@Iy<1$>m$ykI7(9T>HIh+KOK48Z zGjr^G+kU#y#gRE{+jW?!B_%kaa%#MyAjpJtbI%Pw&cR_#oBXt$_#1aQI*Z9iGO#~$>W>+B~-xAJD|lWAUppCaKd(O>b6h;)h4OpOKNqcg)7ZL?e|B&s%qCs>iOdI7s6Frj*ONgO6wW4PjO~)1&dLhI+Lmu9tH(< zr(aG%E`y+=k7>;$K{(b$(9~=1PCu!{cpQ3t{Bubj8JIo(FXI6vYjiT?L^OM!g} zW)s?mr`x!f(^I9|*ddw+mPxt2?MWfi#~1V0W~XdRBNTUR+%tWk z2p6M0sI&XV-woE=2R~^RA3kp7I=DZ%zxJV`-0Us=gswW>=+VrA_q7ME_Zw(5mlId` z9P>!8&gO8N&OzUqrcdUGBUv%fk-5(Y` z!#n$9XR7ulKj@?SD#v`*Y6*GX0D6K zu6;<=xJ2#Mq9l7fD{(hhfA~Yy(fb(|{hc>S`Sf{E&cdq%A9tgL=~?o~Wf9~??wy7b zC9BImVvDn2z1bfn7vA&#lD=?B!?P!o(orR6d$?8kali9%dNuw+1ed(rZ4FlAPEe&6 z`^Cl74=}oCq3#R{CE8ca9%a1~XL^s)}i4O~sz^p1Cq+%HkcpElZm{J6FXH6`g4u1!F7^EO)NC zW9OV0OAFn}HU;1HCY%2$eQMFd74EL5kF~duKR(bKQ>9z?RKCzXNMbbftUj_>PFdE+ z@`Zm=K{$z5%^(j9Tx!x6%rpJ$gRC(r-kT{qJ*tLchcIpK*=cDy?5ph#uUVz+uD&M0)wJp`yAeAiM%p&_A79-q{(4Cx97O2VJlfm zYJFo)j>^zrlto3UimI7k+oc?BUA0#}`JG6}aJ6+j0K44zgt3a1s7paD%(4`+^^^dprM%`q#MAQvNHD~DfZaCz-x7i`~ zfK92gxm44RvSD86V)oHnqj#h-7IqxpGO_GZb%A*+_s#kx|IB8~&bTjeDc*6=N8xl^ z%cCXFm#=$Zb%o_5TeQ{l80+XvM}CabNqK+&fM5^J&}Yebi%##Q(7;u`VI~EQcffY7a~J1q&KOgrh*xe!_pn`NE{9h4U(_~G?&04;8++ghs0#E0U{H}Are4Ydnu{i~*entr3op{#49|h9Fd~M7<>JK1VR`r0D?>o2?KILh|2*;Y>>mk!16c( zo5cbl5Mpux7!DT%F+?JffJ37p44VsKSpXYAL*`y6`(Q2)DakPS?u*BR9W?jp>c0zu yBMS~TJ%7oim$5ZZ02zZOfC*si>TE@I-9&Li2t`bRXf6tISOAUC)3c?J5&r{x&*`ZE literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_preserveEncryptionTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/cmp_preserveEncryptionTest.pdf new file mode 100644 index 0000000000000000000000000000000000000000..abefee33ede7f084095e0a6e41926502efa2a934 GIT binary patch literal 5850 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 S_BrjcAPiU4)wOiAQvDA-dUnnL literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/macProtectedDocumentPdf1_7.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/macProtectedDocumentPdf1_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e3410f2fc79ad1e4a16a691d8ae2a59e53878c55 GIT binary patch literal 2781 zcmc&$U2Gl26_%<#-A7*fx~Xtvx3YJBcV>`#iGA%$(!^Z%UgJ`H4Vs;qjc>7c!`^k8 z00~Hl3N>v|P*kW2w4#4f6jUL(0x3~~iWQNN)IbP`Ab}GDRVzS>Kmk=k;f#OcfSsqR z>Pq`JbIzIX`_7rO+c7*)?Z!Q#)NyfP?rbRvP>{txE%o+>!vTYrdRTX+7{dq!{v=E1 zc-WYZi`_e1IO28{<#NfT*1Pdl_iAghaCumr)P);xCbKTw=F;uOL_kTo+%9sbr%K;? zwEtlF#p<{J{G+p1o;+~!z=3;?edq2^Z#f?Gn>OEYV&kljyKK6=g2%KBurE!sqCMsz z*T=(3mKH88+JVPV4~Lv>>Hcij7=l->cpw=W4~KOQHUU{Qsk?SIog3Hg?JbwXk-Rmv z#(u<89M;?2Dn$yu%K$3Cp=f3408s2~B1D$hz!O^`)I^lMJaoZN?rS1~kHSTqg$sIc zbYXVW+5OYs|NH(X!t{)pCtEi(V?Q<96%J+ge-L#z&+N2u`E|gaO3%F2b8_#OpVt9J z)B?~VzVpN<&HU5TcL5P{=(A_uzx!wV(*7MkzVX>wxd~w?p55C6*7VL7`19uujUJiU z0B)#XTz>W?HT=&D8{RuM*X(@w{1-=1b>`;a*0=MnRVneRl!Lnw*+j{TozfEM?u@jATp`R#ujgomi_KW{d>7H)cO&(Rdvqf6fCqd#0OmyiBp;8maP z-|hURY<3=cjD!=a9=r>5$Dz7>4Yil+Zn3B;y3mu^_Ej-_O|H~cHVs9J!>ujb9$Vam zuD8U6vP^_?KTrh=WCL&v2 zS%>f_tOcFwK9Gk0@zm{KoIb)Y|L_s{_TG^_Uf26y{rJ27{?rGLT+#>r?bUqrd<{m} zsfCl{=O@68`11O}ruXK%!rEZadGyyl4I55}r{PYY?Dz@((#L-Og#llq^vq1Nc*T48 zP=CEd7GO|Jx-MvE-4ZG@9CrCsJLo)I;U7Nk+Kl zE04DYofod?H{ZCp|AG1TYrnbi{^P&j2;td>wd48py}vrK``B>+L$P1>AMg;(45n8e zdSKK;n1u_T83L^Mw@_|CVE&VH&z%WAtKadxJ#)?UiGOY0bZOp40~56IFU{t`m_62W zZVp~aS2!B*)qL;DT~b1UEP>_n5k#C*9wfoaSVW;8`XflMjwu8^@f%}woiQxd`XV9M z_#(VEp5oW|7P)Rsy4-(7d@WX>`TOm>yKr@#Zg&ARWh|%+2vt!)B@f1f|LO>b`YJ&$ zMUo)Q7>ZC#w2YXPQ6i8<7%BL6VMO$z1*J=tB!ONF6BM&ZQ}A1S(+Ek35D_VHq7efN zOc9D2}>H87-J&NxHCy?00xd=R&qy>jtuZI&RXhqkidmd$iG+PYxqE80D;$N z2SR~D>sZ4I7{?GxT}NHur2)WtNcamtbX}^MY_-A(YWE=0ZC|oRG{2e|HQEV+BFPSx7E**q~TDNPv@s z>I8$N7I6f$Vx15T@>^)_G$ywE|3@$$Zb_3Y@PAnF+nHtX4P1O|wC;6*gg)5O^1qwi ml`MDNst5I;?#8Ws!;Q_gky5+Rd9m0aG2^7v(J@%7mc9aKfmVb7 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/thirdPartyMacProtectedDocument.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/thirdPartyMacProtectedDocument.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1850292a1a90c53d8b44bcfc9b4176dee895414f GIT binary patch literal 3470 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 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/thirdPartyPublicKeyMacProtectedDocument.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest/thirdPartyPublicKeyMacProtectedDocument.pdf new file mode 100644 index 0000000000000000000000000000000000000000..766820a649ce15e96800da9a187b8c8258f305f2 GIT binary patch literal 4584 zcmcgvdz4jG85d=xUWAqr=31d1DNsPT`~Api@Z6W8JjNL$L=pGiXCD}uxr2A^AYhJ$!8&|;06*%IF%WDK?54jfjY~u*QqnY8QJdJ;fSX z>J5!7w%8f2spM3sIErGTxFz24+En_A`e8v0j**H*rNixbKd1A$a3-Oy&s z6&uD3A6A`PwIZ3`S}u9hoch(^-3RX8GUUoX&w8!f^65`(?Q&r6goTs-{%YH2tC|iJ z$7UZwcsEfeZ1n@@pTBti zp<7SrFX`9K?yVU)KGStr+n&F!zx1=0`VF}Cq+R<4_OOFP)BM4%>2F;7%dT@iU$X19 zuT5XD`t5FF<74-I+H?PJU#Wd;V)Ka)Z@*^LxAjR|Z{P80pR@bz`B@it$%xxV^gE${ z&$$y%yL{%5nX5Jo$uF5dbY*5m*QLEKUpln>c=@)2qoF?;iT_^{e;Ko;9~u?g0&J3vZsjZ?zsfw5H!n8#aEvVeOe0U%vOT`*@DYSeq~ ziaB-TmfZ5l)Z(%iHa>LGmOl8cZ8be-pZoCo9Y0vu$YJn{Hb= zFLPk_;?`>!pLfxDOD|bF`U>>@wwGU@G_`Qr_IuBn)w}zeE!|HX_RU+aIlsK&#$A_A z>iw6o13!G{dOD>~?LFy!Kc4r_n(Lna7I|jnUH!lM-lAWR>2dng&)mI!!5KsT(0%QV zZ!UX2DxGy`^ZoXdzF){gX5sI@D2-hF`r>Ab5}0;Ctpl(Ls;htvi^Z050(DgddA6kp zYy)jNX-N_%YBZUasW1k?AJ;rkj6lXgx|LvHHQ(xeYfD?nK>`9tCD}Nt)YyF7dF`2* zq|p&slq6XvqeNmtvejXuWYY3~Gb-7?YE)f252Vud-jyL37@^7=2sTLGVCCVAALXZ( zkMJ!qy1GoEv8n7!LAuan%0A~^OXO4O4%(pP2ws@jWpm>%esJ{!KHkzWCLHXEve}Ul=sEv$Z%uQ+1y#P+=L0SPp^`)F=UUhG~i*uE=9$1Qkp> z=8&e|3xy z6hMunuwDu!nXwK+KS8jC!oM1gG#Trf=97&bCC1{YO~F?2Gm!1_oTr(sE< z80FeS4NfXCO=?}W?BF96LiLL6Hxhj8KrrC~ z#75DTrcEwaYh6$-wE@N(%FTr!o%6A2Ybs}x0qwRWJ*9uqlPy$KPUlIL=CG|iF+U}t zpmeUqjhyU@Koo`HK|0JgjHXB11WDUCxv|1)pqwaD1YzfpK$;jOm{KB^C_)%XL`|g^ z4!Qjs1QN6(ijz5lwYLh?(TbR&h!KiGFd?L2Manq>C}Dsv1DryShn{4w_8tSjxzL;m zE&(JI6M!kfhxx?oX;#}fjuiKT00cFr%yE`LoC7vJGTYisIOSup`#S+(wW*kcXDV4iLd8O;AixFe1c&Fh#MZv1Q0wW3(XJD}rN4NDGkl z5F)UhTJ90d0&s)Vk%&R|DoA@KF))Ji3K@%F7;=;Wtd#_Fw6=*RhFv8x&WPB9^`K%g z#SUT|Auvo}%OeZ%cNiq8r%b{qCY)9#g1q&dOD?#G;+R^=EF~Io1ri!U;A3SCY@v;p z5JwJv!AV*ga}~jE&PK#VkrSZ86_`ntF&J|XND@{MIBumBJQ-{}^1wXGAz&j={GggW zoUT-mpoS@?!7=1w3|s?R9Dzw53qbAh@ejbo75spTh0FlVbAS{>m>9%>765?MFvP$w zkAcTx042oH31H3GCKOo?g7C>11KyQhdiVkh6{r*z{~~U z2Am8Rgrn!e?FP8_m^R>rPHh}@9w!jUuVdy43F_yVHrd%e0!i`ZxN^xfHu+NJf|xL2 z7L-JV7Kew~D#O9)36vpWJHr(u%0cF9NPbA1u)=PTB<> z2y9D$XA)oG31w9_O!iPhw&c_A+%?m_am>t&QD#9@U6=8}I-1UoX!Z7o z4s{Y#^i$HA12JENA}9kOHkrl|kQPBuPD~7E0?JRC$khflPQ_d}4w5f+5CbqAd!5iY kFdG9NtB_Vh<8+^}5s*}C*_6r^exg*dRNub&k%iPh0SOO4(*OVf literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacStandardEncryptionTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacStandardEncryptionTest.pdf deleted file mode 100644 index 8bdd26def959f227ab1a41e921fd4943ea50cfb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5400 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 Mu$;QOnJriDzlZ}_O8@`> diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest1.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest1.pdf deleted file mode 100644 index 7e218254adc331dd7d22c099824e2aa845a41112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5356 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 E4+wH`uK)l5 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest2.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest2.pdf deleted file mode 100644 index f25099f307519ba235acbc6ad617f91054412389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5436 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 N0nE_SGPk#2{2w4tcRBz7 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest3.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest3.pdf deleted file mode 100644 index 73c8e340d44d06533efa798950ca4f3d8ed7dcb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5520 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 IgPr<+0AS~TiU0rr diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest4.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest4.pdf deleted file mode 100644 index 9706fb91e719c12ebca60b46e0db2d482b1fd8dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5380 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 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest6.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/mac/MacIntegrityProtectorTest/cmp_standaloneMacWithAllHashAlgorithmsTest6.pdf deleted file mode 100644 index 821a42f27e5e89092989ca404f8b16f83c4e2c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5486 zcmc&&d0b6v_rK;khU>beyt$l^3a7K@eKvJyM6=SQ6ZV*>j!vgkhB9q7lt6Q=0rZ9ep2@^Mjg43m(JuP)N;9q z59Tyx_*ZkgfIu~`lG+8*YTkxtl^id1*&6?#1A*e z);WGKGEA?YCBC+Q@J_1TM&G8SMdSC2>X#WbF?|WpGB{YN4)xW9?B*x6RtBs2V0EZi z6N8)7iRS`nD`kW)1co?;i)9$%Cv~M&Ku3&xQgP!$m0>ED4>dQJ%cV0_0YTsC&(x&o zO8fI)Q$&I7mjJ9m4(b49unkDj{_-LD1CuubL^t00CgBLjV`*`-$Lw z(!Z-5`qf0^`isdI+9Cvr{7rjrC&$lbf5q}&Dcx4_aG$b>$Q^ZJf_7T!>pN5T$Omhs zH{J+Tq#esSy42)OuD55>M%TVw+1UwWF8$u{hx?-PkXWUa?u(uYW6E3K9FLrvYPe23 z+|f1aSQOjd)cJEw;tpqvbUVk{QP*)kLvJOmd=%pBokGnX z|9ocm?8T?fMA|+b!klj;GSMx{od-)B`^0Z^9qN{m`e>%X#uuUgqC1CY9p62>=6q}! zR@`B)ziIoh{^DGR@NoOGJ@40<8Q;*wtbScmaeL>MtO<=}=4&VA`T55C)Zr(3<0F)I z9=?6n<>cG!F_;joLq2}`N8$nMvUKIxDg%*O%$nq}S*C%08$GgD8TH<9rn@=+%+blG zYIe@D9TI-Q(zAY!)7~rhy9P&$tGko&qOAR5Syoc9t<_z1TFQIoNnKz1%j#!)u zozR+k$hj&mb7I5e>$a7-P6fx)r#ymhUtJYdJofEWqn)=cdcN6u-FWF*?`=J{6~AyW zjT%Me49~59en4;J^0)fkW1Kcbj%X!+5>8qI;i7)X(mRgkDYg(1&5=i8(Kt>x~oAKcqO_npv7K4pIHotZseLy+?ENl#o^85hfYF}ld8X6fdq35N z*g>1jl~_tgi|GB$niX$7e=uA$w`Hh4?;8u7+H9!J#@QK*F^On=%*Rn%6BXwh4r*O^ z@TYv;;Fjb1p--Ad$!{j!RgJ!N_`%9vx-HR5&-U4161hm#D{JJt;QS2;J=E;Ng~%L3 z68lYLVlv@=y*BxNxUS*WLs@rU9pd|WL3*98$NVR&@UkHm&zEj9F|KT%*I3xn|D2B@ z-p@0S3hl{^p!-CPY}H~%`dD8deJsswM&M5i^0=s`T7!WN{&6b~9_~);T-$_IG*^-3 zHNNAVB~Pucw{(_YNN@J3Dsu7K!niL8d~(WYe|om|nk|ZfOKvz@ID|)@E8cm2^9Sv{ zlTz@Cn%|d>?l&v7D=DPW@9v1(J>>++gC^Zc4u!ygUnF-gk?>)+O2OYw2raz=xVOgxmD%QQ5&5WO?a@j|I%6a znw%fG1f6xL&|Cisi!LN`Zr`8!OIicbda}oWjcc!HZ5#U4Fr{@vVs8+R#vD<(a9J978=d1!=><)(xpw*_st+Qw)5A|{n(nNsCq@3ou%IJ$YV z&jZ2b$=RCTFC|L@=fCltZF-p6z&2Zjz5P9`@fZD})#=aozxz3N%naic$uN0N(5se2 zpT=#vn}dD)D~s#K9n*R3eECgGcj|LQ=?Z5L3e&k!S4&itE0*ti>k%-I>n^yxvbDfe zyS=q7CjCLzY@t_<&I&7$c=G7_^yiKf+lS9T8kZSl%q+liyd|Sf}Do!*imq#*Q#2mUCWv2xorNJ zYa8!yGGmp__4rZ?!o>2ic6*O!Yh2??isV6;cRp!~cCy*L>P>!L!I(8OXHK~_)c51W zjHU~3uD8|9UOB4fYMjdg=}(f1NtSt67x%2)RX23<)?J=Y#F%aiu`j(<&#}-^2zp#6 z80M`FJoR>J5jQe7SWz7ZkqCtbi|YwX4dKN#C9jH+HW}6d(gT5OIs6?94~s4hIWuX{n4#?-=M2#ca)}~Gg^%kee;Im7R*|l^_Cvgs-g5D* zDN?cL=fLChMifO_Us|){_jtpK8JE2)((bEt%E^K%uclcRg&x=zzmmEc4I_yAN$;X> zUrb0zdK_zSXxT2>kb%B%pD{LIGbFD~KG)X%CgD7*Meo1gRB0LOzqynyueoYDmtTF! z>+rZ=esKPE1E$V-*8PE7)5>fKPhME(Fm;Jb_0d%8+V?`_-F`?s1j4J-^PvSP+J{%m|}SP#cYiQA3G zVZFOE^a|!JTiI8VjV0~NG|)-;DG~Cl-esT74KA#$Jzlf@w56SrQj~gbNjRCm(!u=t z+5$u>?Nt2q-Eo)i%sO@L(10fk8eZ2XZWw;I zZ1B8{&HnW*{ErrS+oqENG}@Nuam_UB&4aK#lGOuV<=J;{iK$QOSd?nNKFKz%ui^BK zo5)eaeGad?nzO+{JhZQTQDb3s@-=&UTG{CzMFCzet(p2^4jG;b><>Z{i#!>HV8`XgcpR?-s#fr zXfb-Kqg#@AGkN$};#!rxs4FkFSNz!=gNFNNK5fhOS6uftJZD!K9&^3I;#c%4+lg-N) z-_(6pcVqCi2;Y4M*yzGO;WLWgq$Q8Lx3#{X?kIzWVc9$TpQ#^Yakt;{M)yn+_8(&>Kqi>RZ=fn2)UZn*c zc5W}8CnanO?WNy4KjK`+MX0G@s#~tyAhX7oKJMY<9;wLdh^^6%h`fEHt+b!^ZEn)hm;ey;ty0<4gIly zM&&QgE)y!P|2SDXz_ZW49yzgH^Cye4;H61_=KCHEECpy{Cc1#a;NP1@bjlg{o z4`!FRRGH?B90T{lxuZI#NoPY>F^Ht*kgZRM;Lha86Gt*0_F3U9qBLHit#q}^G4CI4bs zfuJS(y=!%0cI*Ucnl82elqk%VdYCsAaoN?JZI)KzGTHc%d0;YsMejGdquPkES>ky- zM|smQYng-8@IznokP$v}Y#b9eybMgfd`Z~6z3csj%K=xz!rmR+ZESzlC88vh&=l*~y8tvzO$_En(7?m-7AaR;9h&tQ{Zg z)?O<=n`kK?WU$@O^6@UFPae~k4i znSa-&H5a8lf&D#}f&}WdsqZM<3DQ*fHTM3F%h}4x=1%--D z$}b#l(q1R??X)BIEsq}@n14b z26|o1ArAgqMq;1={6>aCphf;h29u!S`9=njfJxuTNDA~)-^d{NJAWvSQeXAdDmoyL zS7|mCG#s=BdjXoxGg8gF(ZT+_81(2E3Zr5ihF~!&!^M8$|J5ONva}YPqmT@NU>Ob( z5QES%0+Y!I0gw=aAqs3|zz{-z(jc+Vnk3*JkU}Vo5j2WnpGPzV$$$p}k;!0zhA^N3 zqY%UZ8AU)Eub_v;0c*e$go7{yh#(wid4Xpro?;k^Mi7jZA*dh&js%E;Fib|X6hz`Y z&w??@vxto1F@!)EULbjbf)SGEU<}4lf+Y|z8x3ZY{YMT6MA7g+Mu9*yC@}g>%)kYv znVAHE;-51EBZ$HoieM?62QQic6AaAJC?})A9S932Wdet>B!>t*PjCbQgCbEhKnENw zKoo~*l$YT&!h-jmCuuSa zUULmxnmXe#oZHVQZdGr$-1U+M#pp~3l2SOQdpfAR?dpBSP+ ziUWuPVqh?b;v9#N4EqTt9G3C422hk`V1}e90vBLP;82+W0go8LqO^=gXc9&VMh1|8 z85R{-oTFL5KUT&HtUv<-;v~akGEPQO7=q(GSTz}*WB~NAfT6${444Ih6_%h-1fwaM zL2!zfF){)WkR&+<)Is0?tSHW)G{GY*##20?Awz)VrlKDWIt_MfyGR- zx(6zQ!RD6KHkegKE>w#({~d19={90tb4tKqf<+)4MnH8LaF85^G9*i}5XLZoIS_*~ z3`__tN>V(}!z_V=g&n{I_<~><$IDn!;4x5ZfCNoYfb|qlU?4(_#sm_O1ke!>N(KSW zFceE*6nHlPxCny7g#7?;2Mz$_?qJIMsE|bCl diff --git a/itext/itext.bouncy-castle-adapter/itext/bouncycastle/BouncyCastleFactory.cs b/itext/itext.bouncy-castle-adapter/itext/bouncycastle/BouncyCastleFactory.cs index ef8807f277..13c6ceef29 100644 --- a/itext/itext.bouncy-castle-adapter/itext/bouncycastle/BouncyCastleFactory.cs +++ b/itext/itext.bouncy-castle-adapter/itext/bouncycastle/BouncyCastleFactory.cs @@ -1207,6 +1207,13 @@ public byte[] GenerateEncryptedKeyWithAES256NoPad(byte[] key, byte[] kek) { wrapper.Init(true, new KeyParameter(kek)); return wrapper.Wrap(key, 0, key.Length); } + + ///

+ public byte[] GenerateDecryptedKeyWithAES256NoPad(byte[] key, byte[] kek) { + IWrapper wrapper = new AesWrapEngine(); + wrapper.Init(false, new KeyParameter(kek)); + return wrapper.Unwrap(key, 0, key.Length); + } public IGCMBlockCipher CreateGCMBlockCipher() { GcmBlockCipher cipher = new GcmBlockCipher(new AesEngine()); diff --git a/itext/itext.bouncy-castle-connector/itext/bouncycastleconnector/BouncyCastleDefaultFactory.cs b/itext/itext.bouncy-castle-connector/itext/bouncycastleconnector/BouncyCastleDefaultFactory.cs index 9136f2fc21..d80dc474b7 100644 --- a/itext/itext.bouncy-castle-connector/itext/bouncycastleconnector/BouncyCastleDefaultFactory.cs +++ b/itext/itext.bouncy-castle-connector/itext/bouncycastleconnector/BouncyCastleDefaultFactory.cs @@ -739,6 +739,10 @@ public byte[] GenerateHMACSHA256Token(byte[] key, byte[] data) { public byte[] GenerateEncryptedKeyWithAES256NoPad(byte[] key, byte[] kek) { throw new NotSupportedException(BouncyCastleLogMessageConstant.BOUNCY_CASTLE_DEPENDENCY_MUST_PRESENT); } + + public byte[] GenerateDecryptedKeyWithAES256NoPad(byte[] key, byte[] kek) { + throw new NotSupportedException(BouncyCastleLogMessageConstant.BOUNCY_CASTLE_DEPENDENCY_MUST_PRESENT); + } public IGCMBlockCipher CreateGCMBlockCipher() { throw new NotSupportedException(BouncyCastleLogMessageConstant.BOUNCY_CASTLE_DEPENDENCY_MUST_PRESENT); diff --git a/itext/itext.bouncy-castle-fips-adapter/itext/bouncycastlefips/BouncyCastleFipsFactory.cs b/itext/itext.bouncy-castle-fips-adapter/itext/bouncycastlefips/BouncyCastleFipsFactory.cs index f763a55cc8..434628ff94 100644 --- a/itext/itext.bouncy-castle-fips-adapter/itext/bouncycastlefips/BouncyCastleFipsFactory.cs +++ b/itext/itext.bouncy-castle-fips-adapter/itext/bouncycastlefips/BouncyCastleFipsFactory.cs @@ -1249,6 +1249,11 @@ public byte[] GenerateHMACSHA256Token(byte[] key, byte[] data) { public byte[] GenerateEncryptedKeyWithAES256NoPad(byte[] key, byte[] kek) { throw new NotSupportedException("Encrypted key generation with AES256 is not supported in bouncy-castle FIPS mode."); } + + /// + public byte[] GenerateDecryptedKeyWithAES256NoPad(byte[] key, byte[] kek) { + throw new NotSupportedException("Encrypted key generation with AES256 is not supported in bouncy-castle FIPS mode."); + } public IGCMBlockCipher CreateGCMBlockCipher() { return new GCMBlockCipherBCFips(); diff --git a/itext/itext.commons/itext/commons/bouncycastle/IBouncyCastleFactory.cs b/itext/itext.commons/itext/commons/bouncycastle/IBouncyCastleFactory.cs index c9226fb392..451b308e64 100644 --- a/itext/itext.commons/itext/commons/bouncycastle/IBouncyCastleFactory.cs +++ b/itext/itext.commons/itext/commons/bouncycastle/IBouncyCastleFactory.cs @@ -1674,6 +1674,14 @@ IX509V3CertificateGenerator CreateJcaX509v3CertificateBuilder(IX509Certificate s /// encrypted key. byte[] GenerateEncryptedKeyWithAES256NoPad(byte[] key, byte[] kek); + /// + /// Generates decrypted key based on AES256 without padding unwrapping algorithm. + /// + /// key to be decrypted + /// key encryption key to be used + /// decrypted key. + byte[] GenerateDecryptedKeyWithAES256NoPad(byte[] key, byte[] kek); + IGCMBlockCipher CreateGCMBlockCipher(); } } diff --git a/itext/itext.io/itext/io/source/OutputStream.cs b/itext/itext.io/itext/io/source/OutputStream.cs index 39d465429c..8a7d5c3d36 100644 --- a/itext/itext.io/itext/io/source/OutputStream.cs +++ b/itext/itext.io/itext/io/source/OutputStream.cs @@ -31,7 +31,7 @@ public class OutputStream : Stream private bool? localHighPrecision; - private Stream outputStream = null; + protected Stream outputStream = null; private long currentPos = 0; diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes128.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes128.cs index 1557df8067..6bf6c5bee4 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes128.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes128.cs @@ -80,7 +80,6 @@ protected internal override void SetPubSecSpecificHandlerDicEntries(PdfDictionar encryptMetadata, bool embeddedFilesOnly) { encryptionDictionary.Put(PdfName.Filter, PdfName.Adobe_PubSec); encryptionDictionary.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_s5); - encryptionDictionary.Put(PdfName.R, new PdfNumber(4)); encryptionDictionary.Put(PdfName.V, new PdfNumber(4)); PdfArray recipients = CreateRecipientsArray(); PdfDictionary stdcf = new PdfDictionary(); diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes256.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes256.cs index 5c356e8728..ed745372a6 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes256.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAes256.cs @@ -54,7 +54,6 @@ protected internal override void SetPubSecSpecificHandlerDicEntries(PdfDictionar encryptMetadata, bool embeddedFilesOnly) { encryptionDictionary.Put(PdfName.Filter, PdfName.Adobe_PubSec); encryptionDictionary.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_s5); - encryptionDictionary.Put(PdfName.R, new PdfNumber(5)); encryptionDictionary.Put(PdfName.V, new PdfNumber(5)); PdfArray recipients = CreateRecipientsArray(); PdfDictionary stdcf = new PdfDictionary(); diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcm.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcm.cs index b7be2385a1..32d7bea01b 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcm.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcm.cs @@ -98,7 +98,6 @@ public override IDecryptor GetDecryptor() { protected internal override void SetPubSecSpecificHandlerDicEntries(PdfDictionary encryptionDictionary, bool encryptMetadata, bool embeddedFilesOnly) { base.SetPubSecSpecificHandlerDicEntries(encryptionDictionary, encryptMetadata, embeddedFilesOnly); - encryptionDictionary.Put(PdfName.R, new PdfNumber(6)); encryptionDictionary.Put(PdfName.V, new PdfNumber(7)); } } diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard128.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard128.cs index 4c1bac6fe4..ee6228522d 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard128.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard128.cs @@ -41,13 +41,11 @@ protected internal override void SetPubSecSpecificHandlerDicEntries(PdfDictionar encryptionDictionary.Put(PdfName.Filter, PdfName.Adobe_PubSec); PdfArray recipients = CreateRecipientsArray(); if (encryptMetadata) { - encryptionDictionary.Put(PdfName.R, new PdfNumber(3)); encryptionDictionary.Put(PdfName.V, new PdfNumber(2)); encryptionDictionary.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_s4); encryptionDictionary.Put(PdfName.Recipients, recipients); } else { - encryptionDictionary.Put(PdfName.R, new PdfNumber(4)); encryptionDictionary.Put(PdfName.V, new PdfNumber(4)); encryptionDictionary.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_s5); PdfDictionary stdcf = new PdfDictionary(); diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard40.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard40.cs index a6aa3988ae..9cccd0a070 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard40.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/PubSecHandlerUsingStandard40.cs @@ -59,7 +59,6 @@ protected internal override void InitKey(byte[] globalKey, int keyLength) { protected internal override void SetPubSecSpecificHandlerDicEntries(PdfDictionary encryptionDictionary, bool encryptMetadata, bool embeddedFilesOnly) { encryptionDictionary.Put(PdfName.Filter, PdfName.Adobe_PubSec); - encryptionDictionary.Put(PdfName.R, new PdfNumber(2)); PdfArray recipients = CreateRecipientsArray(); encryptionDictionary.Put(PdfName.V, new PdfNumber(1)); encryptionDictionary.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_s4); diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardSecurityHandler.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardSecurityHandler.cs index 28f9129517..bbfe223d06 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardSecurityHandler.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardSecurityHandler.cs @@ -26,11 +26,11 @@ You should have received a copy of the GNU Affero General Public License namespace iText.Kernel.Crypto.Securityhandler { public abstract class StandardSecurityHandler : SecurityHandler { - protected internal const int PERMS_MASK_1_FOR_REVISION_2 = unchecked((int)(0xffffffc0)); + protected internal const int PERMS_MASK_1_FOR_REVISION_2 = -64; - protected internal const int PERMS_MASK_1_FOR_REVISION_3_OR_GREATER = unchecked((int)(0xfffff0c0)); + protected internal const int PERMS_MASK_1_FOR_REVISION_3_OR_GREATER = -8000; - protected internal const int PERMS_MASK_2 = unchecked((int)(0xfffffffc)); + protected internal const int PERMS_MASK_2 = -4; protected internal long permissions; diff --git a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs index 820d3a05e4..cfabfcac45 100644 --- a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs +++ b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs @@ -164,6 +164,12 @@ public sealed class KernelExceptionMessageConstant { public const String COLOR_SPACE_NOT_FOUND = "ColorSpace not found."; + public const String CONTAINER_EMBEDDING_EXCEPTION = "IOException occurred while trying to embed MAC container into document output stream."; + + public const String CONTAINER_GENERATION_EXCEPTION = "Exception occurred during MAC container generation."; + + public const String CONTAINER_PARSING_EXCEPTION = "Exception occurred during MAC container parsing."; + public const String CONTENT_STREAM_MUST_NOT_INVOKE_OPERATORS_THAT_SPECIFY_COLORS_OR_OTHER_COLOR_RELATED_PARAMETERS = "Content stream must not invoke operators that specify colors or other color related parameters in " + "the graphics state."; @@ -183,6 +189,8 @@ public const String CONTENT_STREAM_MUST_NOT_INVOKE_OPERATORS_THAT_SPECIFY_COLORS public const String THIS_DICTIONARY_KEY_IS_NOT_A_NAME = "Dictionary key {0} is not a name."; + public const String DIGEST_NOT_SUPPORTED = "This digest algorithm is not supported for MAC integrity protection."; + public const String DICTIONARY_DOES_NOT_HAVE_SUPPORTED_FONT_DATA = "Dictionary doesn't have supported font " + "data."; @@ -346,6 +354,16 @@ public const String CONTENT_STREAM_MUST_NOT_INVOKE_OPERATORS_THAT_SPECIFY_COLORS public const String LZW_FLAVOUR_NOT_SUPPORTED = "LZW flavour not supported."; + public const String MAC_ALGORITHM_NOT_SUPPORTED = "This MAC algorithm is not supported."; + + public const String MAC_FOR_ENCRYPTION_5 = "MAC integrity protection is only supported for encryption algorithms of version 5 or higher."; + + public const String MAC_FOR_PDF_2 = "MAC integrity protection is only supported for PDF 2.0 or higher."; + + public const String MAC_PERMS_WITHOUT_MAC = "Permissions bit 13 is set to zero, " + "which indicates that MAC integrity protection is enabled. However MAC container wasn't found."; + + public const String MAC_VALIDATION_FAILED = "MAC integrity protection was compromised. Document content was modified."; + public const String MISSING_REQUIRED_FIELD_IN_FONT_DICTIONARY = "Missing required field {0} in font dictionary."; public const String MUST_BE_A_TAGGED_DOCUMENT = "Must be a tagged document."; @@ -524,6 +542,8 @@ public const String CONTENT_STREAM_MUST_NOT_INVOKE_OPERATORS_THAT_SPECIFY_COLORS public const String UNSUPPORTED_XOBJECT_TYPE = "Unsupported XObject type."; + public const String VALIDATION_EXCEPTION = "Unexpected exception occurred during MAC token validation."; + public const String WHEN_ADDING_OBJECT_REFERENCE_TO_THE_TAG_TREE_IT_MUST_BE_CONNECTED_TO_NOT_FLUSHED_OBJECT = "When adding object reference to the tag tree, it must be connected to not flushed object."; @@ -531,6 +551,8 @@ public const String WHEN_ADDING_OBJECT_REFERENCE_TO_THE_TAG_TREE_IT_MUST_BE_CONN public const String WMF_IMAGE_EXCEPTION = "WMF image exception."; + public const String WRAP_ALGORITHM_NOT_SUPPORTED = "This wrapping algorithm is not supported."; + public const String WRONG_MEDIA_BOX_SIZE_TOO_FEW_ARGUMENTS = "Wrong media box size: {0}. Need at least 4 " + "arguments"; diff --git a/itext/itext.kernel/itext/kernel/mac/MacIntegrityProtector.cs b/itext/itext.kernel/itext/kernel/mac/MacIntegrityProtector.cs index bbb626ea33..7fde5a6b77 100644 --- a/itext/itext.kernel/itext/kernel/mac/MacIntegrityProtector.cs +++ b/itext/itext.kernel/itext/kernel/mac/MacIntegrityProtector.cs @@ -22,7 +22,6 @@ You should have received a copy of the GNU Affero General Public License */ using System; using System.IO; -using System.Security.Cryptography; using iText.Bouncycastleconnector; using iText.Commons.Bouncycastle; using iText.Commons.Bouncycastle.Asn1; @@ -41,9 +40,9 @@ public class MacIntegrityProtector { private const String ID_AUTHENTICATED_DATA = "1.2.840.113549.1.9.16.1.2"; - private const String ID_KDF_PDFMACWRAPKDF = "1.0.32004.1.1"; + private const String ID_KDF_PDF_MAC_WRAP_KDF = "1.0.32004.1.1"; - private const String ID_CT_PDFMACINTEGRITYINFO = "1.0.32004.1.0"; + private const String ID_CT_PDF_MAC_INTEGRITY_INFO = "1.0.32004.1.0"; private const String ID_CONTENT_TYPE = "1.2.840.113549.1.9.3"; @@ -51,30 +50,23 @@ public class MacIntegrityProtector { private const String ID_MESSAGE_DIGEST = "1.2.840.113549.1.9.4"; - private const String DIGEST_NOT_SUPPORTED = "Digest algorithm is not supported."; + private const String PDF_MAC = "PDFMAC"; - private const String MAC_ALGORITHM_NOT_SUPPORTED = "This MAC algorithm is not supported."; - - private const String WRAP_ALGORITHM_NOT_SUPPORTED = "This wrapping algorithm is not supported."; - - private const String CONTAINER_GENERATION_EXCEPTION = "Exception occurred during MAC container generation."; - - private const String CONTAINER_EMBEDDING_EXCEPTION = "IOException occurred while trying to embed MAC container into document output stream."; - - private readonly MacPdfObject macPdfObject; + private MacPdfObject macPdfObject; private readonly PdfDocument document; private readonly MacProperties macProperties; - private readonly byte[] kdfSalt = new byte[32]; + private byte[] kdfSalt = null; private byte[] fileEncryptionKey = new byte[0]; /// /// Creates /// - /// instance. + /// instance from the provided + /// . /// /// /// @@ -89,13 +81,29 @@ public class MacIntegrityProtector { public MacIntegrityProtector(PdfDocument document, MacProperties macProperties) { this.document = document; this.macProperties = macProperties; - this.macPdfObject = new MacPdfObject(GetContainerSizeEstimate()); - AddDocumentEvents(); - RNGCryptoServiceProvider sr = BC_FACTORY.GetSecureRandom(); - sr.GetBytes(kdfSalt); } - /// Sets file encryption key to be used during MAC token calculation. + /// + /// Creates + /// + /// instance from the Auth dictionary. + /// + /// + /// + /// + /// , for which integrity protection is required + /// + /// + /// + /// + /// , representing Auth dictionary, in which MAC container is stored + /// + public MacIntegrityProtector(PdfDocument document, PdfDictionary authDictionary) { + this.document = document; + this.macProperties = ParseMacProperties(authDictionary.GetAsString(PdfName.MAC).GetValueBytes()); + } + + /// Sets file encryption key to be used during MAC calculation. /// /// /// byte[] @@ -105,37 +113,89 @@ public virtual void SetFileEncryptionKey(byte[] fileEncryptionKey) { this.fileEncryptionKey = fileEncryptionKey; } - /// Gets KDF salt bytes, which are used during MAC token calculation. + /// Gets KDF salt bytes, which are used during MAC key encryption. /// /// /// byte[] /// KDF salt bytes. /// public virtual byte[] GetKdfSalt() { + if (kdfSalt == null) { + kdfSalt = GenerateRandomBytes(32); + } return JavaUtil.ArraysCopyOf(kdfSalt, kdfSalt.Length); } + /// Sets KDF salt bytes, to be used during MAC key encryption. + /// + /// + /// byte[] + /// KDF salt bytes. + /// + public virtual void SetKdfSalt(byte[] kdfSalt) { + this.kdfSalt = JavaUtil.ArraysCopyOf(kdfSalt, kdfSalt.Length); + } + + /// Validates MAC container integrity. + /// + /// Validates MAC container integrity. This method throws + /// + /// in case of any modifications, + /// introduced to the document in question, after MAC container is integrated. + /// + /// + /// + /// + /// which represents AuthCode entry in the trailer and container MAC. + /// + public virtual void ValidateMacToken(PdfDictionary authDictionary) { + byte[] expectedMac; + byte[] actualMac; + byte[] expectedMessageDigest; + byte[] actualMessageDigest; + try { + byte[] macContainer = authDictionary.GetAsString(PdfName.MAC).GetValueBytes(); + byte[] macKey = ParseMacKey(macContainer); + PdfArray byteRange = authDictionary.GetAsArray(PdfName.ByteRange); + byte[] dataDigest = DigestBytes(document.GetReader().GetSafeFile().CreateSourceView(), byteRange.ToLongArray + ()); + byte[] expectedData = ParseAuthAttributes(macContainer).GetEncoded(); + expectedMac = GenerateMac(macKey, expectedData); + expectedMessageDigest = CreateMessageDigestSequence(CreateMessageBytes(dataDigest)).GetEncoded(); + actualMessageDigest = ParseMessageDigest(macContainer).GetEncoded(); + actualMac = ParseMac(macContainer); + } + catch (Exception e) { + throw new PdfException(KernelExceptionMessageConstant.VALIDATION_EXCEPTION, e); + } + if (!JavaUtil.ArraysEquals(expectedMac, actualMac) || !JavaUtil.ArraysEquals(expectedMessageDigest, actualMessageDigest + )) { + throw new PdfException(KernelExceptionMessageConstant.MAC_VALIDATION_FAILED); + } + } + + /// Prepare the document for MAC protection. + public virtual void PrepareDocument() { + document.AddEventHandler(PdfDocumentEvent.START_DOCUMENT_CLOSING, new MacIntegrityProtector.MacPdfObjectAdder + (this)); + document.AddEventHandler(PdfDocumentEvent.END_WRITER_FLUSH, new MacIntegrityProtector.MacContainerEmbedder + (this)); + } + private int GetContainerSizeEstimate() { try { IMessageDigest digest = GetMessageDigest(); digest.Update(new byte[0]); - return CreateMacContainer(digest.Digest()).Length * 2 + 2; + return CreateMacContainer(digest.Digest(), GenerateRandomBytes(32)).Length * 2 + 2; } catch (AbstractGeneralSecurityException e) { - throw new PdfException(CONTAINER_GENERATION_EXCEPTION, e); + throw new PdfException(KernelExceptionMessageConstant.CONTAINER_GENERATION_EXCEPTION, e); } catch (System.IO.IOException e) { - throw new PdfException(CONTAINER_GENERATION_EXCEPTION, e); + throw new PdfException(KernelExceptionMessageConstant.CONTAINER_GENERATION_EXCEPTION, e); } } - private void AddDocumentEvents() { - document.AddEventHandler(PdfDocumentEvent.START_DOCUMENT_CLOSING, new MacIntegrityProtector.MacPdfObjectAddingEvent - (document, macPdfObject)); - document.AddEventHandler(PdfDocumentEvent.END_WRITER_FLUSH, new MacIntegrityProtector.MacContainerEmbedder - (this)); - } - private void EmbedMacContainer() { byte[] documentBytes = GetDocumentByteArrayOutputStream().ToArray(); long[] byteRange = macPdfObject.ComputeByteRange(documentBytes.Length); @@ -149,16 +209,16 @@ private void EmbedMacContainer() { os.Write(']'); Array.Copy(localBaos.ToArray(), 0, documentBytes, (int)byteRangePosition, localBaos.Length); IRandomAccessSource ras = new RandomAccessSourceFactory().CreateSource(documentBytes); - // Here we should create MAC token - byte[] macToken; + // Here we should create MAC + byte[] mac; try { byte[] dataDigest = DigestBytes(ras, byteRange); - macToken = CreateMacContainer(dataDigest); + mac = CreateMacContainer(dataDigest, GenerateRandomBytes(32)); } catch (AbstractGeneralSecurityException e) { - throw new PdfException(CONTAINER_GENERATION_EXCEPTION, e); + throw new PdfException(KernelExceptionMessageConstant.CONTAINER_GENERATION_EXCEPTION, e); } - PdfString macString = new PdfString(macToken).SetHexWriting(true); + PdfString macString = new PdfString(mac).SetHexWriting(true); // fill in the MAC localBaos.JReset(); os.Write(macString); @@ -215,7 +275,7 @@ private IMessageDigest GetMessageDigest() { } } - private String GetMessageDigestOid() { + private String GetMacDigestOid() { switch (macProperties.GetMacDigestAlgorithm()) { case MacProperties.MacDigestAlgorithm.SHA_256: { return "2.16.840.1.101.3.4.2.1"; @@ -242,19 +302,19 @@ private String GetMessageDigestOid() { } default: { - throw new PdfException(DIGEST_NOT_SUPPORTED); + throw new PdfException(KernelExceptionMessageConstant.DIGEST_NOT_SUPPORTED); } } } - private byte[] GenerateMacToken(byte[] macKey, byte[] data) { + private byte[] GenerateMac(byte[] macKey, byte[] data) { switch (macProperties.GetMacAlgorithm()) { case MacProperties.MacAlgorithm.HMAC_WITH_SHA_256: { return BC_FACTORY.GenerateHMACSHA256Token(macKey, data); } default: { - throw new PdfException(MAC_ALGORITHM_NOT_SUPPORTED); + throw new PdfException(KernelExceptionMessageConstant.MAC_ALGORITHM_NOT_SUPPORTED); } } } @@ -266,7 +326,19 @@ private byte[] GenerateEncryptedKey(byte[] macKey, byte[] macKek) { } default: { - throw new PdfException(WRAP_ALGORITHM_NOT_SUPPORTED); + throw new PdfException(KernelExceptionMessageConstant.WRAP_ALGORITHM_NOT_SUPPORTED); + } + } + } + + private byte[] GenerateDecryptedKey(byte[] encryptedMacKey, byte[] macKek) { + switch (macProperties.GetKeyWrappingAlgorithm()) { + case MacProperties.KeyWrappingAlgorithm.AES_256_NO_PADD: { + return BC_FACTORY.GenerateDecryptedKeyWithAES256NoPad(encryptedMacKey, macKek); + } + + default: { + throw new PdfException(KernelExceptionMessageConstant.WRAP_ALGORITHM_NOT_SUPPORTED); } } } @@ -278,7 +350,7 @@ private String GetMacAlgorithmOid() { } default: { - throw new PdfException(MAC_ALGORITHM_NOT_SUPPORTED); + throw new PdfException(KernelExceptionMessageConstant.MAC_ALGORITHM_NOT_SUPPORTED); } } } @@ -290,101 +362,197 @@ private String GetKeyWrappingAlgorithmOid() { } default: { - throw new PdfException(WRAP_ALGORITHM_NOT_SUPPORTED); + throw new PdfException(KernelExceptionMessageConstant.WRAP_ALGORITHM_NOT_SUPPORTED); } } } - private byte[] CreateMacContainer(byte[] dataDigest) { + private byte[] ParseMacKey(byte[] macContainer) { + IAsn1Sequence authDataSequence = GetAuthDataSequence(macContainer); + IAsn1Sequence recInfo = BC_FACTORY.CreateASN1Sequence(BC_FACTORY.CreateASN1TaggedObject(BC_FACTORY.CreateASN1Set + (authDataSequence.GetObjectAt(1)).GetObjectAt(0)).GetObject()); + IAsn1OctetString encryptedKey = BC_FACTORY.CreateASN1OctetString(recInfo.GetObjectAt(3)); + byte[] macKek = BC_FACTORY.GenerateHKDF(fileEncryptionKey, kdfSalt, PDF_MAC.GetBytes(System.Text.Encoding. + UTF8)); + return GenerateDecryptedKey(encryptedKey.GetOctets(), macKek); + } + + private IAsn1Sequence ParseMessageDigest(byte[] macContainer) { + IAsn1Set authAttributes = ParseAuthAttributes(macContainer); + return BC_FACTORY.CreateASN1Sequence(authAttributes.GetObjectAt(2)); + } + + private byte[] CreateMacContainer(byte[] dataDigest, byte[] macKey) { IAsn1EncodableVector contentInfoV = BC_FACTORY.CreateASN1EncodableVector(); contentInfoV.Add(BC_FACTORY.CreateASN1ObjectIdentifier(ID_AUTHENTICATED_DATA)); // Recipient info IAsn1EncodableVector recInfoV = BC_FACTORY.CreateASN1EncodableVector(); recInfoV.Add(BC_FACTORY.CreateASN1Integer(0)); // version - recInfoV.Add(BC_FACTORY.CreateDERTaggedObject(0, BC_FACTORY.CreateASN1ObjectIdentifier(ID_KDF_PDFMACWRAPKDF + recInfoV.Add(BC_FACTORY.CreateDERTaggedObject(0, BC_FACTORY.CreateASN1ObjectIdentifier(ID_KDF_PDF_MAC_WRAP_KDF ))); recInfoV.Add(BC_FACTORY.CreateDERSequence(BC_FACTORY.CreateASN1ObjectIdentifier(GetKeyWrappingAlgorithmOid ()))); ////////////////////// KEK - RNGCryptoServiceProvider sr = BC_FACTORY.GetSecureRandom(); - byte[] macKey = new byte[32]; - sr.GetBytes(macKey); - byte[] macKek = BC_FACTORY.GenerateHKDF(fileEncryptionKey, kdfSalt, "PDFMAC".GetBytes(System.Text.Encoding - .UTF8)); + byte[] macKek = BC_FACTORY.GenerateHKDF(fileEncryptionKey, kdfSalt, PDF_MAC.GetBytes(System.Text.Encoding. + UTF8)); byte[] encryptedKey = GenerateEncryptedKey(macKey, macKek); - ////////////////////////////// recInfoV.Add(BC_FACTORY.CreateDEROctetString(encryptedKey)); // Digest info - IAsn1EncodableVector digestInfoV = BC_FACTORY.CreateASN1EncodableVector(); - digestInfoV.Add(BC_FACTORY.CreateASN1Integer(0)); - // version - digestInfoV.Add(BC_FACTORY.CreateDEROctetString(dataDigest)); - byte[] messageBytes = BC_FACTORY.CreateDERSequence(digestInfoV).GetEncoded(); + byte[] messageBytes = CreateMessageBytes(dataDigest); // Encapsulated content info IAsn1EncodableVector encapContentInfoV = BC_FACTORY.CreateASN1EncodableVector(); - encapContentInfoV.Add(BC_FACTORY.CreateASN1ObjectIdentifier(ID_CT_PDFMACINTEGRITYINFO)); + encapContentInfoV.Add(BC_FACTORY.CreateASN1ObjectIdentifier(ID_CT_PDF_MAC_INTEGRITY_INFO)); encapContentInfoV.Add(BC_FACTORY.CreateDERTaggedObject(0, BC_FACTORY.CreateDEROctetString(messageBytes))); + IDerSet authAttrs = CreateAuthAttributes(messageBytes); + // Create mac + byte[] data = authAttrs.GetEncoded(); + byte[] mac = GenerateMac(macKey, data); + // Auth data + IAsn1EncodableVector authDataV = BC_FACTORY.CreateASN1EncodableVector(); + authDataV.Add(BC_FACTORY.CreateASN1Integer(0)); + // version + authDataV.Add(BC_FACTORY.CreateDERSet(BC_FACTORY.CreateDERTaggedObject(false, 3, BC_FACTORY.CreateDERSequence + (recInfoV)))); + authDataV.Add(BC_FACTORY.CreateDERSequence(BC_FACTORY.CreateASN1ObjectIdentifier(GetMacAlgorithmOid()))); + authDataV.Add(BC_FACTORY.CreateDERTaggedObject(false, 1, BC_FACTORY.CreateDERSequence(BC_FACTORY.CreateASN1ObjectIdentifier + (GetMacDigestOid())))); + authDataV.Add(BC_FACTORY.CreateDERSequence(encapContentInfoV)); + authDataV.Add(BC_FACTORY.CreateDERTaggedObject(false, 2, authAttrs)); + authDataV.Add(BC_FACTORY.CreateDEROctetString(mac)); + contentInfoV.Add(BC_FACTORY.CreateDERTaggedObject(0, BC_FACTORY.CreateDERSequence(authDataV))); + return BC_FACTORY.CreateDERSequence(contentInfoV).GetEncoded(); + } + + private IDerSequence CreateMessageDigestSequence(byte[] messageBytes) { // Hash messageBytes to get messageDigest attribute IMessageDigest digest = GetMessageDigest(); digest.Update(messageBytes); byte[] messageDigest = digest.Digest(); + // Message digest + IAsn1EncodableVector messageDigestV = BC_FACTORY.CreateASN1EncodableVector(); + messageDigestV.Add(BC_FACTORY.CreateASN1ObjectIdentifier(ID_MESSAGE_DIGEST)); + messageDigestV.Add(BC_FACTORY.CreateDERSet(BC_FACTORY.CreateDEROctetString(messageDigest))); + return BC_FACTORY.CreateDERSequence(messageDigestV); + } + + private IDerSet CreateAuthAttributes(byte[] messageBytes) { // Content type - mac integrity info IAsn1EncodableVector contentTypeInfoV = BC_FACTORY.CreateASN1EncodableVector(); contentTypeInfoV.Add(BC_FACTORY.CreateASN1ObjectIdentifier(ID_CONTENT_TYPE)); - contentTypeInfoV.Add(BC_FACTORY.CreateDERSet(BC_FACTORY.CreateASN1ObjectIdentifier(ID_CT_PDFMACINTEGRITYINFO + contentTypeInfoV.Add(BC_FACTORY.CreateDERSet(BC_FACTORY.CreateASN1ObjectIdentifier(ID_CT_PDF_MAC_INTEGRITY_INFO ))); IAsn1EncodableVector algorithmsInfoV = BC_FACTORY.CreateASN1EncodableVector(); - algorithmsInfoV.Add(BC_FACTORY.CreateDERSequence(BC_FACTORY.CreateASN1ObjectIdentifier(GetMessageDigestOid - ()))); + algorithmsInfoV.Add(BC_FACTORY.CreateDERSequence(BC_FACTORY.CreateASN1ObjectIdentifier(GetMacDigestOid())) + ); algorithmsInfoV.Add(BC_FACTORY.CreateDERTaggedObject(2, BC_FACTORY.CreateASN1ObjectIdentifier(GetMacAlgorithmOid ()))); // CMS algorithm protection IAsn1EncodableVector algoProtectionInfoV = BC_FACTORY.CreateASN1EncodableVector(); algoProtectionInfoV.Add(BC_FACTORY.CreateASN1ObjectIdentifier(ID_CMS_ALGORITHM_PROTECTION)); algoProtectionInfoV.Add(BC_FACTORY.CreateDERSet(BC_FACTORY.CreateDERSequence(algorithmsInfoV))); - // Message digest - IAsn1EncodableVector messageDigestV = BC_FACTORY.CreateASN1EncodableVector(); - messageDigestV.Add(BC_FACTORY.CreateASN1ObjectIdentifier(ID_MESSAGE_DIGEST)); - messageDigestV.Add(BC_FACTORY.CreateDERSet(BC_FACTORY.CreateDEROctetString(messageDigest))); IAsn1EncodableVector authAttrsV = BC_FACTORY.CreateASN1EncodableVector(); authAttrsV.Add(BC_FACTORY.CreateDERSequence(contentTypeInfoV)); authAttrsV.Add(BC_FACTORY.CreateDERSequence(algoProtectionInfoV)); - authAttrsV.Add(BC_FACTORY.CreateDERSequence(messageDigestV)); - // Create mac - byte[] data = BC_FACTORY.CreateDERSet(authAttrsV).GetEncoded(); - byte[] mac = GenerateMacToken(macKey, data); - // Auth data - IAsn1EncodableVector authDataV = BC_FACTORY.CreateASN1EncodableVector(); - authDataV.Add(BC_FACTORY.CreateASN1Integer(0)); - // version - authDataV.Add(BC_FACTORY.CreateDERSet(BC_FACTORY.CreateDERTaggedObject(false, 3, BC_FACTORY.CreateDERSequence - (recInfoV)))); - authDataV.Add(BC_FACTORY.CreateDERSequence(BC_FACTORY.CreateASN1ObjectIdentifier(GetMacAlgorithmOid()))); - authDataV.Add(BC_FACTORY.CreateDERTaggedObject(1, BC_FACTORY.CreateASN1ObjectIdentifier(GetMessageDigestOid - ()))); - authDataV.Add(BC_FACTORY.CreateDERSequence(encapContentInfoV)); - authDataV.Add(BC_FACTORY.CreateDERTaggedObject(false, 2, BC_FACTORY.CreateDERSet(authAttrsV))); - authDataV.Add(BC_FACTORY.CreateDEROctetString(mac)); - contentInfoV.Add(BC_FACTORY.CreateDERTaggedObject(0, BC_FACTORY.CreateDERSequence(authDataV))); - return BC_FACTORY.CreateDERSequence(contentInfoV).GetEncoded(); + authAttrsV.Add(CreateMessageDigestSequence(messageBytes)); + return BC_FACTORY.CreateDERSet(authAttrsV); + } + + private static byte[] ParseMac(byte[] macContainer) { + IAsn1Sequence authDataSequence = GetAuthDataSequence(macContainer); + return BC_FACTORY.CreateASN1OctetString(authDataSequence.GetObjectAt(6)).GetOctets(); + } + + private static IAsn1Set ParseAuthAttributes(byte[] macContainer) { + IAsn1Sequence authDataSequence = GetAuthDataSequence(macContainer); + return BC_FACTORY.CreateASN1Set(BC_FACTORY.CreateASN1TaggedObject(authDataSequence.GetObjectAt(5)), false); + } + + private static byte[] CreateMessageBytes(byte[] dataDigest) { + IAsn1EncodableVector digestInfoV = BC_FACTORY.CreateASN1EncodableVector(); + digestInfoV.Add(BC_FACTORY.CreateASN1Integer(0)); + digestInfoV.Add(BC_FACTORY.CreateDEROctetString(dataDigest)); + return BC_FACTORY.CreateDERSequence(digestInfoV).GetEncoded(); + } + + private static byte[] GenerateRandomBytes(int length) { + byte[] randomBytes = new byte[length]; + BC_FACTORY.GetSecureRandom().GetBytes(randomBytes); + return randomBytes; + } + + private static MacProperties ParseMacProperties(byte[] macContainer) { + IAsn1Sequence authDataSequence = GetAuthDataSequence(macContainer); + IAsn1Object digestAlgorithmContainer = BC_FACTORY.CreateASN1TaggedObject(authDataSequence.GetObjectAt(3)). + GetObject(); + IDerObjectIdentifier digestAlgorithm; + if (BC_FACTORY.CreateASN1ObjectIdentifier(digestAlgorithmContainer) != null) { + digestAlgorithm = BC_FACTORY.CreateASN1ObjectIdentifier(digestAlgorithmContainer); + } + else { + digestAlgorithm = BC_FACTORY.CreateASN1ObjectIdentifier(BC_FACTORY.CreateASN1Sequence(digestAlgorithmContainer + ).GetObjectAt(0)); + } + return new MacProperties(GetMacDigestAlgorithm(digestAlgorithm.GetId())); } - private class MacPdfObjectAddingEvent : iText.Kernel.Events.IEventHandler { - private readonly PdfDocument document; + private static MacProperties.MacDigestAlgorithm GetMacDigestAlgorithm(String oid) { + switch (oid) { + case "2.16.840.1.101.3.4.2.1": { + return MacProperties.MacDigestAlgorithm.SHA_256; + } + + case "2.16.840.1.101.3.4.2.2": { + return MacProperties.MacDigestAlgorithm.SHA_384; + } + + case "2.16.840.1.101.3.4.2.3": { + return MacProperties.MacDigestAlgorithm.SHA_512; + } + + case "2.16.840.1.101.3.4.2.8": { + return MacProperties.MacDigestAlgorithm.SHA3_256; + } + + case "2.16.840.1.101.3.4.2.9": { + return MacProperties.MacDigestAlgorithm.SHA3_384; + } - private readonly MacPdfObject macPdfObject; + case "2.16.840.1.101.3.4.2.10": { + return MacProperties.MacDigestAlgorithm.SHA3_512; + } -//\cond DO_NOT_DOCUMENT - internal MacPdfObjectAddingEvent(PdfDocument document, MacPdfObject macPdfObject) { - this.document = document; - this.macPdfObject = macPdfObject; + default: { + throw new PdfException(KernelExceptionMessageConstant.DIGEST_NOT_SUPPORTED); + } } -//\endcond + } + private static IAsn1Sequence GetAuthDataSequence(byte[] macContainer) { + IAsn1Sequence contentInfoSequence; + try { + using (IAsn1InputStream din = BC_FACTORY.CreateASN1InputStream(new MemoryStream(macContainer))) { + contentInfoSequence = BC_FACTORY.CreateASN1Sequence(din.ReadObject()); + } + } + catch (System.IO.IOException e) { + throw new PdfException(KernelExceptionMessageConstant.CONTAINER_PARSING_EXCEPTION, e); + } + return BC_FACTORY.CreateASN1Sequence(BC_FACTORY.CreateASN1TaggedObject(contentInfoSequence.GetObjectAt(1)) + .GetObject()); + } + + private class MacPdfObjectAdder : iText.Kernel.Events.IEventHandler { public virtual void HandleEvent(Event @event) { - document.GetTrailer().Put(PdfName.AuthCode, macPdfObject.GetPdfObject()); + this._enclosing.macPdfObject = new MacPdfObject(this._enclosing.GetContainerSizeEstimate()); + this._enclosing.document.GetTrailer().Put(PdfName.AuthCode, this._enclosing.macPdfObject.GetPdfObject()); + } + + internal MacPdfObjectAdder(MacIntegrityProtector _enclosing) { + this._enclosing = _enclosing; } + + private readonly MacIntegrityProtector _enclosing; } private class MacContainerEmbedder : iText.Kernel.Events.IEventHandler { @@ -393,7 +561,7 @@ public virtual void HandleEvent(Event @event) { this._enclosing.EmbedMacContainer(); } catch (System.IO.IOException e) { - throw new PdfException(MacIntegrityProtector.CONTAINER_EMBEDDING_EXCEPTION, e); + throw new PdfException(KernelExceptionMessageConstant.CONTAINER_EMBEDDING_EXCEPTION, e); } } diff --git a/itext/itext.kernel/itext/kernel/mac/MacPdfObject.cs b/itext/itext.kernel/itext/kernel/mac/MacPdfObject.cs index b34c75ca6b..4982fd4031 100644 --- a/itext/itext.kernel/itext/kernel/mac/MacPdfObject.cs +++ b/itext/itext.kernel/itext/kernel/mac/MacPdfObject.cs @@ -30,8 +30,8 @@ internal MacPdfObject(int macContainerSize) : base(new PdfDictionary()) { PdfLiteral macPlaceholder = new PdfLiteral(macContainerSize); PdfLiteral byteRangePlaceholder = new PdfLiteral(80); - GetPdfObject().Put(new PdfName("MACLocation"), new PdfName("Standalone")); - GetPdfObject().Put(new PdfName("MAC"), macPlaceholder); + GetPdfObject().Put(PdfName.MACLocation, PdfName.Standalone); + GetPdfObject().Put(PdfName.MAC, macPlaceholder); GetPdfObject().Put(PdfName.ByteRange, byteRangePlaceholder); } //\endcond @@ -53,7 +53,7 @@ internal virtual long GetByteRangePosition() { //\endcond private PdfLiteral GetMacPlaceholder() { - PdfObject mac = GetPdfObject().Get(new PdfName("MAC")); + PdfObject mac = GetPdfObject().Get(PdfName.MAC); return (PdfLiteral)mac; } diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs b/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs index 5f47d1eb97..8094d9f8ad 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs @@ -55,7 +55,8 @@ namespace iText.Kernel.Pdf { /// Main enter point to work with PDF document. public class PdfDocument : IEventDispatcher, IDisposable { private static readonly PdfName[] PDF_NAMES_TO_REMOVE_FROM_ORIGINAL_TRAILER = new PdfName[] { PdfName.Encrypt - , PdfName.Size, PdfName.Prev, PdfName.Root, PdfName.Info, PdfName.ID, PdfName.XRefStm }; + , PdfName.Size, PdfName.Prev, PdfName.Root, PdfName.Info, PdfName.ID, PdfName.XRefStm, PdfName.AuthCode + }; private static readonly IPdfPageFactory pdfPageFactory = new PdfPageFactory(); @@ -2140,6 +2141,7 @@ protected internal virtual void Open(PdfVersion newPdfVersion) { } xref.InitFreeReferencesList(this); if (writer != null) { + EnableByteArrayWritingMode(); if (reader != null && reader.HasXrefStm() && writer.properties.isFullCompression == null) { writer.properties.isFullCompression = true; } @@ -2161,7 +2163,7 @@ protected internal virtual void Open(PdfVersion newPdfVersion) { } // We keep the original trailer of the document to preserve the original document keys, // but we have to remove all standard keys that can occur in the trailer to avoid invalid pdfs - if (trailer.Size() > 0) { + if (!trailer.IsEmpty()) { foreach (PdfName key in iText.Kernel.Pdf.PdfDocument.PDF_NAMES_TO_REMOVE_FROM_ORIGINAL_TRAILER) { trailer.Remove(key); } @@ -2211,6 +2213,10 @@ protected internal virtual void Open(PdfVersion newPdfVersion) { writer.Write((byte)'\n'); OverrideFullCompressionInWriterProperties(writer.properties, reader.HasXrefStm()); writer.crypto = reader.decrypt; + if (writer.crypto != null) { + writer.crypto.CheckEncryptionRequirements(this); + writer.crypto.ConfigureEncryptionParameters(this, true); + } if (newPdfVersion != null) { // In PDF 1.4, a PDF version can also be specified in the Version entry of the document catalog, // essentially updating the version associated with the file by overriding the one specified in @@ -2244,7 +2250,7 @@ protected internal virtual void Open(PdfVersion newPdfVersion) { encryptedEmbeddedStreamsHandler.StoreAllEmbeddedStreams(); } writer.crypto.CheckEncryptionRequirements(this); - writer.crypto.ConfigureEncryptionParameters(this); + writer.crypto.ConfigureEncryptionParameters(this, true); } } } @@ -2447,6 +2453,20 @@ internal virtual bool HasAcroForm() { } //\endcond + private void EnableByteArrayWritingMode() { + if (properties.appendMode || properties.preserveEncryption) { + if (reader.decrypt != null && reader.decrypt.GetMacContainer() != null) { + writer.EnableByteArrayWritingMode(); + } + } + else { + if (writer.properties.encryptionProperties != null && writer.properties.encryptionProperties.macProperties + != null) { + writer.EnableByteArrayWritingMode(); + } + } + } + private void TryFlushTagStructure(bool isAppendMode) { try { if (tagStructureContext != null) { diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs b/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs index 471d648144..c0222a94fa 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs @@ -34,10 +34,6 @@ You should have received a copy of the GNU Affero General Public License namespace iText.Kernel.Pdf { public class PdfEncryption : PdfObjectWrapper { - private const String MAC_FOR_PDF_2 = "MAC integrity protection is only supported for PDF 2.0 or higher."; - - private const String MAC_FOR_ENCRYPTION_5 = "MAC integrity protection is only supported for encryption algorithms of version 5 or higher."; - private const int STANDARD_ENCRYPTION_40 = 2; private const int STANDARD_ENCRYPTION_128 = 3; @@ -50,6 +46,10 @@ public class PdfEncryption : PdfObjectWrapper { private const int DEFAULT_KEY_LENGTH = 40; + private const int MAC_ENABLED = ~(1 << 12); + + private const int MAC_DISABLED = 1 << 12; + private static long seq = SystemUtil.GetTimeBasedSeed(); private int cryptoMode; @@ -64,7 +64,11 @@ public class PdfEncryption : PdfObjectWrapper { private SecurityHandler securityHandler; - private MacIntegrityProtector mac; + private readonly MacIntegrityProtector macContainer; + + public virtual MacIntegrityProtector GetMacContainer() { + return macContainer; + } /// Creates the encryption. /// @@ -195,22 +199,20 @@ public PdfEncryption(byte[] userPassword, byte[] ownerPassword, int permissions, /// /// of the target document for encryption /// - /// + /// /// /// /// class for MAC integrity protection /// public PdfEncryption(byte[] userPassword, byte[] ownerPassword, int permissions, int encryptionType, byte[] - documentId, PdfVersion version, MacIntegrityProtector mac) + documentId, PdfVersion version, MacIntegrityProtector macContainer) : base(new PdfDictionary()) { - this.mac = mac; + this.macContainer = macContainer; this.documentId = documentId; if (version != null && version.CompareTo(PdfVersion.PDF_2_0) >= 0) { permissions = FixAccessibilityPermissionPdf20(permissions); - if (mac != null) { - permissions = ConfigureAccessibilityPermissionsForMac(permissions); - } } + permissions = ConfigureAccessibilityPermissionsForMac(permissions); int revision = SetCryptoMode(encryptionType); switch (revision) { case STANDARD_ENCRYPTION_40: { @@ -379,22 +381,20 @@ public PdfEncryption(IX509Certificate[] certs, int[] permissions, int encryption /// /// of the target document for encryption /// - /// + /// /// /// /// class for MAC integrity protection /// public PdfEncryption(IX509Certificate[] certs, int[] permissions, int encryptionType, PdfVersion version, - MacIntegrityProtector mac) + MacIntegrityProtector macContainer) : base(new PdfDictionary()) { - this.mac = mac; - if (version != null && version.CompareTo(PdfVersion.PDF_2_0) >= 0) { - for (int i = 0; i < permissions.Length; i++) { + this.macContainer = macContainer; + for (int i = 0; i < permissions.Length; i++) { + if (version != null && version.CompareTo(PdfVersion.PDF_2_0) >= 0) { permissions[i] = FixAccessibilityPermissionPdf20(permissions[i]); - if (mac != null) { - permissions[i] = ConfigureAccessibilityPermissionsForMac(permissions[i]); - } } + permissions[i] = ConfigureAccessibilityPermissionsForMac(permissions[i]); } int revision = SetCryptoMode(encryptionType); switch (revision) { @@ -430,9 +430,61 @@ public PdfEncryption(IX509Certificate[] certs, int[] permissions, int encryption } } + /// + /// Creates + /// + /// instance based on already existing standard encryption dictionary. + /// + /// + /// + /// + /// , which represents encryption dictionary + /// + /// + /// + /// byte[] + /// , which represents encryption password + /// + /// + /// original file ID, the first element in + /// + /// key of trailer. + /// public PdfEncryption(PdfDictionary pdfDict, byte[] password, byte[] documentId) + : this(pdfDict, password, documentId, null) { + } + + /// + /// Creates + /// + /// instance based on already existing standard encryption dictionary. + /// + /// + /// + /// + /// , which represents encryption dictionary + /// + /// + /// + /// byte[] + /// , which represents encryption password + /// + /// + /// original file ID, the first element in + /// + /// key of trailer + /// + /// + /// + /// + /// , which is responsible for MAC integrity + /// protection and validation + /// + public PdfEncryption(PdfDictionary pdfDict, byte[] password, byte[] documentId, MacIntegrityProtector macContainer + ) : base(pdfDict) { SetForbidRelease(); + this.macContainer = macContainer; this.documentId = documentId; int revision = ReadAndSetCryptoModeForStdHandler(pdfDict); switch (revision) { @@ -478,8 +530,77 @@ public PdfEncryption(PdfDictionary pdfDict, byte[] password, byte[] documentId) } } + /// + /// Creates + /// + /// instance based on already existing public encryption dictionary. + /// + /// + /// + /// + /// , which represents encryption dictionary + /// + /// + /// the recipient private + /// + /// to the certificate + /// + /// + /// the recipient + /// + /// , which serves as recipient identifier + /// + /// + /// the certificate key provider id for + /// + /// + /// + /// + /// + /// the external decryption process to be used + /// public PdfEncryption(PdfDictionary pdfDict, IPrivateKey certificateKey, IX509Certificate certificate) + : this(pdfDict, certificateKey, certificate, null) { + } + + /// + /// Creates + /// + /// instance based on already existing public encryption dictionary. + /// + /// + /// + /// + /// , which represents encryption dictionary + /// + /// + /// the recipient private + /// + /// to the certificate + /// + /// + /// the recipient + /// + /// , which serves as recipient identifier + /// + /// + /// the certificate key provider id for + /// + /// + /// + /// + /// + /// the external decryption process to be used + /// + /// + /// + /// + /// , which is responsible for MAC integrity protection and validation + /// + public PdfEncryption(PdfDictionary pdfDict, IPrivateKey certificateKey, IX509Certificate certificate, MacIntegrityProtector + macContainer) : base(pdfDict) { + this.macContainer = macContainer; SetForbidRelease(); int revision = ReadAndSetCryptoModeForPubSecHandler(pdfDict); switch (revision) { @@ -568,12 +689,12 @@ public static PdfObject CreateInfoId(byte[] firstId, byte[] secondId, bool prese } ByteBuffer buf = new ByteBuffer(90); buf.Append('[').Append('<'); - for (int k = 0; k < firstId.Length; ++k) { - buf.AppendHex(firstId[k]); + foreach (byte value in firstId) { + buf.AppendHex(value); } buf.Append('>').Append('<'); - for (int k = 0; k < secondId.Length; ++k) { - buf.AppendHex(secondId[k]); + foreach (byte b in secondId) { + buf.AppendHex(b); } buf.Append('>').Append(']'); return new PdfLiteral(buf.ToByteArray()); @@ -857,7 +978,7 @@ private int ReadAndSetCryptoModeForStdHandler(PdfDictionary encDict) { private int ReadAndSetCryptoModeForPubSecHandler(PdfDictionary encDict) { int cryptoMode; - int length = 0; + int length; PdfNumber vValue = encDict.GetAsNumber(PdfName.V); if (vValue == null) { throw new PdfException(KernelExceptionMessageConstant.ILLEGAL_V_VALUE); @@ -956,6 +1077,15 @@ private int ReadAndSetCryptoModeForPubSecHandler(PdfDictionary encDict) { return SetCryptoMode(cryptoMode, length); } + private int ConfigureAccessibilityPermissionsForMac(int permissions) { + if (macContainer == null) { + return permissions | MAC_DISABLED; + } + else { + return permissions & MAC_ENABLED; + } + } + //\cond DO_NOT_DOCUMENT internal static bool ReadEmbeddedFilesOnlyFromEncryptDictionary(PdfDictionary encDict) { PdfName embeddedFilesFilter = encDict.GetAsName(PdfName.EFF); @@ -974,11 +1104,6 @@ internal static bool ReadEmbeddedFilesOnlyFromEncryptDictionary(PdfDictionary en } //\endcond - private static int ConfigureAccessibilityPermissionsForMac(int permissions) { - // 13 bit but pdf writers start counting from 1 - return permissions & ~(1 << 12); - } - private static int FixAccessibilityPermissionPdf20(int permissions) { // This bit was previously used to determine whether // content could be extracted for the purposes of accessibility, @@ -991,12 +1116,13 @@ private static int FixAccessibilityPermissionPdf20(int permissions) { //\cond DO_NOT_DOCUMENT internal virtual void CheckEncryptionRequirements(PdfDocument document) { - if (mac != null) { + if (macContainer != null) { if (document.GetPdfVersion() == null || document.GetPdfVersion().CompareTo(PdfVersion.PDF_2_0) < 0) { - throw new PdfException(MAC_FOR_PDF_2); + throw new PdfException(KernelExceptionMessageConstant.MAC_FOR_PDF_2); } - if (this.GetPdfObject().GetAsNumber(PdfName.V).IntValue() < 5) { - throw new PdfException(MAC_FOR_ENCRYPTION_5); + if (this.GetPdfObject().GetAsNumber(PdfName.V) != null && this.GetPdfObject().GetAsNumber(PdfName.V).IntValue + () < 5) { + throw new PdfException(KernelExceptionMessageConstant.MAC_FOR_ENCRYPTION_5); } } if (GetCryptoMode() < EncryptionConstants.ENCRYPTION_AES_256) { @@ -1015,7 +1141,6 @@ internal virtual void CheckEncryptionRequirements(PdfDocument document) { if (GetCryptoMode() == EncryptionConstants.ENCRYPTION_AES_GCM) { VersionConforming.ValidatePdfVersionForNotSupportedFeatureLogError(document, PdfVersion.PDF_2_0, VersionConforming .NOT_SUPPORTED_AES_GCM); - document.GetCatalog().AddDeveloperExtension(PdfDeveloperExtension.ISO_32003); } } } @@ -1023,12 +1148,32 @@ internal virtual void CheckEncryptionRequirements(PdfDocument document) { //\endcond //\cond DO_NOT_DOCUMENT - internal virtual void ConfigureEncryptionParameters(PdfDocument document) { - if (mac != null) { - document.GetCatalog().AddDeveloperExtension(PdfDeveloperExtension.ISO_32004); - mac.SetFileEncryptionKey(securityHandler.GetMkey().Length == 0 ? securityHandler.GetNextObjectKey() : securityHandler - .GetMkey()); - GetPdfObject().Put(PdfName.KDFSalt, new PdfString(mac.GetKdfSalt()).SetHexWriting(true)); + internal virtual void CheckEncryptionPermissions() { + if (macContainer == null && permissions != null && (permissions & MAC_DISABLED) == 0) { + throw new PdfException(KernelExceptionMessageConstant.MAC_PERMS_WITHOUT_MAC); + } + } +//\endcond + +//\cond DO_NOT_DOCUMENT + internal virtual void ConfigureEncryptionParameters(PdfDocument document, bool forWriting) { + if (macContainer != null) { + macContainer.SetFileEncryptionKey(securityHandler.GetMkey().Length == 0 ? securityHandler.GetNextObjectKey + () : securityHandler.GetMkey()); + PdfString kdfSalt = GetPdfObject().GetAsString(PdfName.KDFSalt); + if (kdfSalt != null) { + macContainer.SetKdfSalt(kdfSalt.GetValueBytes()); + } + if (forWriting) { + macContainer.PrepareDocument(); + document.GetCatalog().AddDeveloperExtension(PdfDeveloperExtension.ISO_32004); + if (kdfSalt == null) { + GetPdfObject().Put(PdfName.KDFSalt, new PdfString(macContainer.GetKdfSalt()).SetHexWriting(true)); + } + } + } + if (GetCryptoMode() == EncryptionConstants.ENCRYPTION_AES_GCM && forWriting) { + document.GetCatalog().AddDeveloperExtension(PdfDeveloperExtension.ISO_32003); } } //\endcond diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfName.cs b/itext/itext.kernel/itext/kernel/pdf/PdfName.cs index 7d6550147d..0eff417b9e 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfName.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfName.cs @@ -982,6 +982,10 @@ public class PdfName : PdfPrimitiveObject, IComparable public static readonly iText.Kernel.Pdf.PdfName M = CreateDirectName("M"); + public static readonly iText.Kernel.Pdf.PdfName MAC = CreateDirectName("MAC"); + + public static readonly iText.Kernel.Pdf.PdfName MACLocation = CreateDirectName("MACLocation"); + public static readonly iText.Kernel.Pdf.PdfName MacExpertEncoding = CreateDirectName("MacExpertEncoding"); public static readonly iText.Kernel.Pdf.PdfName MacRomanEncoding = CreateDirectName("MacRomanEncoding"); @@ -1500,6 +1504,8 @@ public class PdfName : PdfPrimitiveObject, IComparable public static readonly iText.Kernel.Pdf.PdfName Squiggly = CreateDirectName("Squiggly"); + public static readonly iText.Kernel.Pdf.PdfName Standalone = CreateDirectName("Standalone"); + public static readonly iText.Kernel.Pdf.PdfName St = CreateDirectName("St"); public static readonly iText.Kernel.Pdf.PdfName Stamp = CreateDirectName("Stamp"); diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs b/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs index 2fb963602b..02a6d7c010 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs @@ -29,6 +29,7 @@ You should have received a copy of the GNU Affero General Public License using iText.IO.Source; using iText.Kernel.Crypto.Securityhandler; using iText.Kernel.Exceptions; +using iText.Kernel.Mac; using iText.Kernel.Pdf.Filters; using iText.Kernel.XMP; @@ -1548,23 +1549,33 @@ private void ReadDecryptObj() { return; } encrypted = true; + MacIntegrityProtector mac = null; + if (trailer.GetAsDictionary(PdfName.AuthCode) != null && trailer.GetAsDictionary(PdfName.AuthCode).GetAsString + (PdfName.MAC) != null) { + mac = new MacIntegrityProtector(pdfDocument, trailer.GetAsDictionary(PdfName.AuthCode)); + } PdfName filter = enc.GetAsName(PdfName.Filter); if (PdfName.Adobe_PubSec.Equals(filter)) { if (properties.certificate == null) { throw new PdfException(KernelExceptionMessageConstant.CERTIFICATE_IS_NOT_PROVIDED_DOCUMENT_IS_ENCRYPTED_WITH_PUBLIC_KEY_CERTIFICATE ); } - decrypt = new PdfEncryption(enc, properties.certificateKey, properties.certificate); + decrypt = new PdfEncryption(enc, properties.certificateKey, properties.certificate, mac); } else { if (PdfName.Standard.Equals(filter)) { - decrypt = new PdfEncryption(enc, properties.password, GetOriginalFileId()); + decrypt = new PdfEncryption(enc, properties.password, GetOriginalFileId(), mac); } else { throw new UnsupportedSecurityHandlerException(MessageFormatUtil.Format(KernelExceptionMessageConstant.UNSUPPORTED_SECURITY_HANDLER , filter)); } } + decrypt.CheckEncryptionPermissions(); + if (mac != null) { + decrypt.ConfigureEncryptionParameters(pdfDocument, false); + mac.ValidateMacToken(trailer.GetAsDictionary(PdfName.AuthCode)); + } } private PdfObject ReadObject(PdfIndirectReference reference, bool fixXref) { diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfWriter.cs b/itext/itext.kernel/itext/kernel/pdf/PdfWriter.cs index 46acf6f7fb..31c0351035 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfWriter.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfWriter.cs @@ -28,6 +28,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Commons.Utils; using iText.IO.Source; using iText.Kernel.Events; +using iText.Kernel.Exceptions; using iText.Kernel.Mac; using iText.Kernel.Utils; @@ -77,12 +78,27 @@ public PdfWriter(Stream os) : this(os, new WriterProperties()) { } + /// + /// Creates + /// + /// instance, which writes to the passed + /// + /// , + /// using provided + /// . + /// + /// + /// + /// + /// in which writing should happen + /// + /// + /// + /// + /// to be used during the writing + /// public PdfWriter(Stream os, WriterProperties properties) - : base(IsByteArrayWritingMode(properties) ? (Stream)new ByteArrayOutputStream() : new CountOutputStream(FileUtil - .WrapWithBufferedOutputStream(os))) { - if (IsByteArrayWritingMode(properties)) { - this.originalOutputStream = os; - } + : base(new CountOutputStream(FileUtil.WrapWithBufferedOutputStream(os))) { this.properties = properties; } @@ -105,7 +121,7 @@ public override void Flush() { if (document != null) { document.DispatchEvent(new PdfDocumentEvent(PdfDocumentEvent.END_WRITER_FLUSH, document)); } - if (IsByteArrayWritingMode(properties)) { + if (IsByteArrayWritingMode()) { CompleteByteArrayWritingMode(); } } @@ -442,12 +458,28 @@ internal virtual void FlushCopiedObjects(long docId) { } //\endcond +//\cond DO_NOT_DOCUMENT + internal virtual void EnableByteArrayWritingMode() { + if (IsByteArrayWritingMode()) { + throw new PdfException("Byte array writing mode is already enabled"); + } + else { + this.originalOutputStream = this.outputStream; + this.outputStream = new ByteArrayOutputStream(); + } + } +//\endcond + private void CompleteByteArrayWritingMode() { byte[] baos = ((ByteArrayOutputStream)GetOutputStream()).ToArray(); originalOutputStream.Write(baos, 0, baos.Length); originalOutputStream.Dispose(); } + private bool IsByteArrayWritingMode() { + return originalOutputStream != null; + } + private void MarkArrayContentToFlush(PdfArray array) { for (int i = 0; i < array.Size(); i++) { MarkObjectToFlush(array.Get(i, false)); @@ -488,10 +520,6 @@ private void MarkObjectToFlush(PdfObject pdfObject) { } } - private static bool IsByteArrayWritingMode(WriterProperties properties) { - return properties.encryptionProperties.macProperties != null; - } - private static bool CheckTypeOfPdfDictionary(PdfObject dictionary, PdfName expectedType) { return dictionary.IsDictionary() && expectedType.Equals(((PdfDictionary)dictionary).GetAsName(PdfName.Type )); diff --git a/port-hash b/port-hash index 158df4c262..7ce64276a4 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -b6d14af580ba26e05a2d011b69085c5f0a29861b +462e2fbfd20afb45e27856309e46540467cc43c1 \ No newline at end of file From aeca58b1483c6448d45b66827f5beb88375ecde9 Mon Sep 17 00:00:00 2001 From: iText Software Date: Mon, 9 Sep 2024 03:13:24 +0000 Subject: [PATCH 3/4] Add missing copyright headers Autoported commit. Original commit hash: [ac40d30de] --- ...tegrityProtectorReadingAndRewritingTest.cs | 22 +++++++++++++++++++ port-hash | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs index 1b82da5f4b..b8b82074a3 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorReadingAndRewritingTest.cs @@ -1,3 +1,25 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ using System; using NUnit.Framework; using iText.Bouncycastleconnector; diff --git a/port-hash b/port-hash index 7ce64276a4..3ebb076521 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -462e2fbfd20afb45e27856309e46540467cc43c1 \ No newline at end of file +ac40d30decea70bfa2e27b027ee2cbc654368dd4 From 89e9859dcc16a35fa2524ded073cfda4cb953f35 Mon Sep 17 00:00:00 2001 From: Angelina Pavlovets Date: Fri, 6 Sep 2024 10:53:36 +0000 Subject: [PATCH 4/4] Revise public for-internal-usage methods DEVSIX-3428 Autoported commit. Original commit hash: [a954103ec] Manual files: io/src/main/java/com/itextpdf/io/util/XmlUtil.java sharpenConfiguration.xml styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/PortUtil.java Failed to automatically remove sharp analogs of next files: io/src/main/java/com/itextpdf/io/source/OutputStream.java io/src/test/java/com/itextpdf/io/source/OutputStreamTest.java --- ...st.cs => HighPrecisionOutputStreamTest.cs} | 56 ++-- .../itext/kernel/pdf/canvas/PdfCanvasTest.cs | 48 ++- .../cmp_ignorePageRotationForContent.pdf | Bin 0 -> 1393 bytes .../itext/layout/RotationTest.cs | 276 ++++++++++-------- .../cmp_ignorePageRotationForContent.pdf | Bin 0 -> 1740 bytes .../itext/layout/RotationTest/rotated.pdf | Bin 0 -> 1156 bytes .../itext/forms/fields/PdfFormField.cs | 2 +- ...Stream.cs => HighPrecisionOutputStream.cs} | 8 +- itext/itext.io/itext/io/util/XmlUtil.cs | 2 +- .../itext/kernel/font/PdfType0Font.cs | 10 +- .../kernel/pdf/PageContentRotationHelper.cs | 91 ++++++ .../itext/kernel/pdf/PdfObject.cs | 8 +- .../itext/kernel/pdf/PdfOutputStream.cs | 2 +- .../itext.kernel/itext/kernel/pdf/PdfPage.cs | 79 ++--- .../itext/kernel/pdf/canvas/PdfCanvas.cs | 6 +- .../itext/layout/element/ILargeElement.cs | 12 +- .../itext/layout/element/Table.cs | 5 - .../itext/styledxmlparser/PortUtil.cs | 2 +- port-hash | 2 +- 19 files changed, 387 insertions(+), 222 deletions(-) rename itext.tests/itext.io.tests/itext/io/source/{OutputStreamTest.cs => HighPrecisionOutputStreamTest.cs} (77%) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/PdfCanvasTest/cmp_ignorePageRotationForContent.pdf create mode 100644 itext.tests/itext.layout.tests/resources/itext/layout/RotationTest/cmp_ignorePageRotationForContent.pdf create mode 100644 itext.tests/itext.layout.tests/resources/itext/layout/RotationTest/rotated.pdf rename itext/itext.io/itext/io/source/{OutputStream.cs => HighPrecisionOutputStream.cs} (97%) create mode 100644 itext/itext.kernel/itext/kernel/pdf/PageContentRotationHelper.cs diff --git a/itext.tests/itext.io.tests/itext/io/source/OutputStreamTest.cs b/itext.tests/itext.io.tests/itext/io/source/HighPrecisionOutputStreamTest.cs similarity index 77% rename from itext.tests/itext.io.tests/itext/io/source/OutputStreamTest.cs rename to itext.tests/itext.io.tests/itext/io/source/HighPrecisionOutputStreamTest.cs index 9db0f611ef..8bc8ca928d 100644 --- a/itext.tests/itext.io.tests/itext/io/source/OutputStreamTest.cs +++ b/itext.tests/itext.io.tests/itext/io/source/HighPrecisionOutputStreamTest.cs @@ -28,13 +28,13 @@ You should have received a copy of the GNU Affero General Public License using iText.Test.Attributes; namespace iText.IO.Source { - public class OutputStreamTest : ExtendedITextTest { + public class HighPrecisionOutputStreamTest : ExtendedITextTest { private static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext .CurrentContext.TestDirectory) + "/resources/itext/io/source/OSTEST.txt"; private static Stream IO_EXCEPTION_OUTPUT_STREAM; - static OutputStreamTest() { + static HighPrecisionOutputStreamTest() { try { IO_EXCEPTION_OUTPUT_STREAM = new FileStream(SOURCE_FOLDER, FileMode.Append); IO_EXCEPTION_OUTPUT_STREAM.Dispose(); @@ -49,7 +49,7 @@ public virtual void ChangePrecisionTest() { //the data is random double? expected = 2.002d; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes, false)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes, false)) { stream.SetLocalHighPrecision(true); stream.WriteDouble((double)expected); stream.Flush(); @@ -63,7 +63,7 @@ public virtual void ChangePrecisionToFalseTest() { //the data is random double? expected = 2.002d; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes, false)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes, false)) { stream.SetLocalHighPrecision(false); stream.WriteDouble((double)expected); stream.Flush(); @@ -78,7 +78,7 @@ public virtual void WriteNanTest() { //the data is random String expected = "0"; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteDouble(double.NaN); stream.Flush(); NUnit.Framework.Assert.AreEqual(expected, Encoding.UTF8.GetString(bytes.ToArray())); @@ -91,7 +91,7 @@ public virtual void WriteValidByteArrayTest() { //the data is random byte[] expected = new byte[] { (byte)68, (byte)14, (byte)173, (byte)105 }; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.Write(expected); stream.Flush(); NUnit.Framework.Assert.AreEqual(expected, bytes.ToArray()); @@ -104,7 +104,7 @@ public virtual void WriteSingleValidByteTest() { //the data is random byte expected = (byte)193; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteByte(expected); stream.Flush(); NUnit.Framework.Assert.AreEqual(new byte[] { expected }, bytes.ToArray()); @@ -117,7 +117,7 @@ public virtual void WriteSingleValidIntegerTest() { //the data is random int expected = 1695609641; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteInteger(expected); stream.Flush(); NUnit.Framework.Assert.AreEqual(JavaUtil.IntegerToString(expected), Encoding.UTF8.GetString(bytes.ToArray())); @@ -130,7 +130,7 @@ public virtual void WriteSingleValidLongTest() { //the data is random long? expected = 1695609641552L; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteLong((long)expected); stream.Flush(); NUnit.Framework.Assert.AreEqual(Convert.ToString(expected), Encoding.UTF8.GetString(bytes.ToArray())); @@ -143,7 +143,7 @@ public virtual void WriteValidFloatsArrayTest() { //the data is random float[] expected = new float[] { 12.05f, 0.001f }; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteFloats(expected); stream.Flush(); NUnit.Framework.Assert.AreEqual(expected[0] + " " + expected[1], Encoding.UTF8.GetString(bytes.ToArray())); @@ -156,7 +156,7 @@ public virtual void WriteValidBytesWithOffsetTest() { //the data is random byte[] expected = new byte[] { (byte)58, (byte)97 }; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteBytes(new byte[] { (byte)15, (byte)233, (byte)58, (byte)97 }, 2, 2); stream.Flush(); NUnit.Framework.Assert.AreEqual(expected, bytes.ToArray()); @@ -169,7 +169,7 @@ public virtual void WriteBytesIOExceptionTest() { NUnit.Framework.Assert.That(() => { byte[] bytesToWrite = new byte[] { (byte)71 }; using (Stream bytes = IO_EXCEPTION_OUTPUT_STREAM) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteBytes(bytesToWrite); } } @@ -183,7 +183,7 @@ public virtual void WriteByteIOExceptionTest() { NUnit.Framework.Assert.That(() => { byte byteToWrite = (byte)71; using (Stream bytes = IO_EXCEPTION_OUTPUT_STREAM) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteByte(byteToWrite); } } @@ -198,7 +198,7 @@ public virtual void WriteByteIntIOExceptionTest() { //the data is random int byteToWrite = 71; using (Stream bytes = IO_EXCEPTION_OUTPUT_STREAM) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteByte(byteToWrite); } } @@ -213,7 +213,7 @@ public virtual void WriteDoubleIOExceptionTest() { //the data is random double num = 55.55d; using (Stream bytes = IO_EXCEPTION_OUTPUT_STREAM) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteDouble(num); } } @@ -228,7 +228,7 @@ public virtual void WriteLongIOExceptionTest() { //the data is random long num = 55L; using (Stream bytes = IO_EXCEPTION_OUTPUT_STREAM) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteLong(num); } } @@ -241,7 +241,7 @@ public virtual void WriteLongIOExceptionTest() { public virtual void WriteValidStringTest() { String expected = "Test string to write"; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteString(expected); stream.WriteNewLine(); stream.Flush(); @@ -252,7 +252,7 @@ public virtual void WriteValidStringTest() { [NUnit.Framework.Test] public virtual void GettersAndSettersTest() { - OutputStream stream = new OutputStream(); + HighPrecisionOutputStream stream = new HighPrecisionOutputStream(); stream.SetCloseStream(true); NUnit.Framework.Assert.IsTrue(stream.IsCloseStream()); stream.SetCloseStream(false); @@ -266,7 +266,7 @@ public virtual void WriteValidBytesArrayTest() { //the data is random byte[] expected = new byte[] { (byte)15, (byte)233, (byte)58, (byte)97 }; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteBytes(expected); stream.Flush(); NUnit.Framework.Assert.AreEqual(expected, bytes.ToArray()); @@ -279,7 +279,7 @@ public virtual void AssignBytesArrayTest() { //the data is random byte[] expected = new byte[] { (byte)15, (byte)233, (byte)58, (byte)97 }; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.AssignBytes(expected, 4); NUnit.Framework.Assert.AreEqual(expected, bytes.ToArray()); } @@ -292,7 +292,7 @@ public virtual void AssignBytesExceptionTest() { //the data is random byte[] bytes = new byte[] { (byte)15, (byte)233, (byte)58, (byte)97 }; using (Stream outputStream = IO_EXCEPTION_OUTPUT_STREAM) { - using (OutputStream stream = new OutputStream(outputStream)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(outputStream)) { stream.AssignBytes(bytes, 4); } } @@ -305,7 +305,7 @@ public virtual void AssignBytesExceptionTest() { public virtual void ResetTestNoException() { byte[] expected = new byte[] { }; using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.WriteBytes(new byte[] { (byte)15, (byte)233, (byte)58, (byte)97 }); stream.Flush(); stream.Reset(); @@ -318,7 +318,7 @@ public virtual void ResetTestNoException() { public virtual void ResetExceptionTest() { NUnit.Framework.Assert.That(() => { using (Stream bytes = IO_EXCEPTION_OUTPUT_STREAM) { - using (OutputStream stream = new OutputStream(bytes)) { + using (HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes)) { stream.Reset(); } } @@ -330,15 +330,15 @@ public virtual void ResetExceptionTest() { [NUnit.Framework.Test] public virtual void LocalHighPrecisionOverridesGlobalTest() { - bool highPrecision = OutputStream.GetHighPrecision(); + bool highPrecision = HighPrecisionOutputStream.GetHighPrecision(); //the data is random double? numberToWrite = 2.002d; try { using (ByteArrayOutputStream bytes = new ByteArrayOutputStream()) { - using (OutputStream stream = - new OutputStream(bytes, false)) { - OutputStream.SetHighPrecision(true); + using (HighPrecisionOutputStream stream = + new HighPrecisionOutputStream(bytes, false)) { + HighPrecisionOutputStream.SetHighPrecision(true); stream.SetLocalHighPrecision(false); stream.WriteDouble((double)numberToWrite); stream.Flush(); @@ -347,7 +347,7 @@ public virtual void LocalHighPrecisionOverridesGlobalTest() { } } finally { - OutputStream.SetHighPrecision(highPrecision); + HighPrecisionOutputStream.SetHighPrecision(highPrecision); } } } diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/PdfCanvasTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/PdfCanvasTest.cs index 7e31bce1df..02c24e6426 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/PdfCanvasTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/PdfCanvasTest.cs @@ -57,8 +57,8 @@ public class PdfCanvasTest : ExtendedITextTest { private const String TITLE = "Empty iText Document"; - private sealed class _ContentProvider_77 : PdfCanvasTest.ContentProvider { - public _ContentProvider_77() { + private sealed class _ContentProvider_76 : PdfCanvasTest.ContentProvider { + public _ContentProvider_76() { } public void DrawOnCanvas(PdfCanvas canvas, int pageNumber) { @@ -68,7 +68,7 @@ public void DrawOnCanvas(PdfCanvas canvas, int pageNumber) { } } - private static readonly PdfCanvasTest.ContentProvider DEFAULT_CONTENT_PROVIDER = new _ContentProvider_77(); + private static readonly PdfCanvasTest.ContentProvider DEFAULT_CONTENT_PROVIDER = new _ContentProvider_76(); [NUnit.Framework.OneTimeSetUp] public static void BeforeClass() { @@ -242,12 +242,12 @@ public virtual void Create1000PagesDocumentWithText() { int pageCount = 1000; String filename = DESTINATION_FOLDER + "1000PagesDocumentWithText.pdf"; PdfWriter writer = CompareTool.CreateTestPdfWriter(filename); - CreateStandardDocument(writer, pageCount, new _ContentProvider_378()); + CreateStandardDocument(writer, pageCount, new _ContentProvider_377()); AssertStandardDocument(filename, pageCount); } - private sealed class _ContentProvider_378 : PdfCanvasTest.ContentProvider { - public _ContentProvider_378() { + private sealed class _ContentProvider_377 : PdfCanvasTest.ContentProvider { + public _ContentProvider_377() { } public void DrawOnCanvas(PdfCanvas canvas, int pageNumber) { @@ -860,7 +860,7 @@ public virtual void CanvasInitializationStampingExistingStream() { [NUnit.Framework.Test] public virtual void CanvasStreamFlushedNoException() { PdfDocument doc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream())); - PdfStream stream = new _PdfStream_1112(); + PdfStream stream = new _PdfStream_1111(); stream.Put(PdfName.Filter, new PdfName("FlateDecode")); NUnit.Framework.Assert.DoesNotThrow(() => { new PdfCanvas(stream, new PdfResources(), doc); @@ -868,8 +868,8 @@ public virtual void CanvasStreamFlushedNoException() { ); } - private sealed class _PdfStream_1112 : PdfStream { - public _PdfStream_1112() { + private sealed class _PdfStream_1111 : PdfStream { + public _PdfStream_1111() { this.isFlushed = false; } @@ -889,7 +889,7 @@ public override bool IsFlushed() { public virtual void CanvasInitializationStampingExistingStreamMemoryLimitAware() { String srcFile = SOURCE_FOLDER + "pageWithContent.pdf"; ReaderProperties properties = new ReaderProperties(); - MemoryLimitsAwareHandler handler = new _MemoryLimitsAwareHandler_1135(); + MemoryLimitsAwareHandler handler = new _MemoryLimitsAwareHandler_1134(); handler.SetMaxSizeOfSingleDecompressedPdfStream(1); properties.SetMemoryLimitsAwareHandler(handler); PdfDocument document = new PdfDocument(new PdfReader(srcFile, properties)); @@ -900,8 +900,8 @@ public virtual void CanvasInitializationStampingExistingStreamMemoryLimitAware() ); } - private sealed class _MemoryLimitsAwareHandler_1135 : MemoryLimitsAwareHandler { - public _MemoryLimitsAwareHandler_1135() { + private sealed class _MemoryLimitsAwareHandler_1134 : MemoryLimitsAwareHandler { + public _MemoryLimitsAwareHandler_1134() { } public override bool IsMemoryLimitsAwarenessRequiredOnDecompression(PdfArray filters) { @@ -1212,6 +1212,28 @@ public virtual void CreateSimpleCanvasWithPdfArrayText() { )); } + [NUnit.Framework.Test] + public virtual void IgnorePageRotationForContentTest() { + String outPdf = DESTINATION_FOLDER + "ignorePageRotationForContent.pdf"; + String cmpPdf = SOURCE_FOLDER + "cmp_ignorePageRotationForContent.pdf"; + using (PdfDocument pdfDoc = new PdfDocument(CompareTool.CreateTestPdfWriter(outPdf))) { + pdfDoc.GetDocumentInfo().SetAuthor(AUTHOR).SetCreator(CREATOR).SetTitle(TITLE); + PdfPage page = pdfDoc.AddNewPage().SetRotation(270); + // When "true": in case the page has a rotation, then new content will be automatically rotated in the + // opposite direction. On the rotated page this would look as if new content ignores page rotation. + page.SetIgnorePageRotationForContent(true); + PdfCanvas canvas = new PdfCanvas(page, false); + canvas.SaveState().BeginText().MoveText(180, 350).SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.HELVETICA + ), 30).ShowText("Page rotation is set to 270 degrees,").EndText().RestoreState(); + PdfCanvas canvas2 = new PdfCanvas(page, false); + canvas2.SaveState().BeginText().MoveText(180, 250).SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts. + HELVETICA), 30).ShowText("but new content ignores page rotation").EndText().RestoreState(); + page.Flush(); + } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outPdf, cmpPdf, DESTINATION_FOLDER, "diff_" + )); + } + private void CreateStandardDocument(PdfWriter writer, int pageCount, PdfCanvasTest.ContentProvider contentProvider ) { PdfDocument pdfDoc = new PdfDocument(writer); @@ -1229,7 +1251,7 @@ private void CreateStandardDocument(PdfWriter writer, int pageCount, PdfCanvasTe private void AssertStandardDocument(String filename, int pageCount) { PdfReader reader = CompareTool.CreateOutputReader(filename); PdfDocument pdfDocument = new PdfDocument(reader); - NUnit.Framework.Assert.AreEqual(false, reader.HasRebuiltXref(), "Rebuilt"); + NUnit.Framework.Assert.IsFalse(reader.HasRebuiltXref(), "Rebuilt"); PdfDictionary info = pdfDocument.GetTrailer().GetAsDictionary(PdfName.Info); NUnit.Framework.Assert.AreEqual(AUTHOR, info.Get(PdfName.Author).ToString(), "Author"); NUnit.Framework.Assert.AreEqual(CREATOR, info.Get(PdfName.Creator).ToString(), "Creator"); diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/PdfCanvasTest/cmp_ignorePageRotationForContent.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/PdfCanvasTest/cmp_ignorePageRotationForContent.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dbad67e477ab12742527f3c9c2877a1962205f54 GIT binary patch literal 1393 zcmc&z&ube;6h4)d4S`;B2n;d8QW|+@W_R{SVg!n0C8n_>B-K9HqRj5j%4_5uWp|`l z{R4U`6bcC?wnuHcx)P@Z$%o7r*#0G*9pSIcVN|G<@*Yw}ak` z`-5N6&#!0O;3s_h%*2-u-3#VUJG%a6-tnefswb;4xM_2!jpEwG#~U#?#T z1D2%n{^bI=k0FFb#Q>Ch$uMQ$a>DyPFuzdHTaoCp{LETU48eX0RqprKq>6=cwP;+e zk|7-loas`bf_8al?5qSHNpp#&OewElVch`}kx%uRSWaFPcl5<5F2`wf_}%P#Lg}oM zqU@P9ZJby2>%YjWhGmqu!uxW1kp4*&q)Te{8tr{1S=D1I>j?`r2pmo7Iy%52#2_F9 z2N-cBVRb-!h&jkPh8e^?hG8g0JQ53$9Q-4gWlHi#Fx!wDae#@0MqQSu^`EVRrD;N# zjZ6%EKcLJd5PKK}o&=0gnhtS8Mv>|H2En$CDDjYK1yDL!hK(!~qA>76N=!TSTv@Km zTx5GTfiS?9;|IP^OwTb1a(v&TA#@R<)U;d{8jfN5hEw|g8MO7;IOISra6@iBm;KJn kX7o7&j_h$RTZ5w7tl~d6OG^b!MAm%Aa. */ using System; +using iText.IO.Font.Constants; using iText.IO.Image; using iText.IO.Util; using iText.Kernel.Colors; +using iText.Kernel.Font; using iText.Kernel.Geom; using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas; +using iText.Kernel.Pdf.Extgstate; using iText.Kernel.Utils; using iText.Layout.Borders; using iText.Layout.Element; @@ -38,10 +41,10 @@ You should have received a copy of the GNU Affero General Public License namespace iText.Layout { [NUnit.Framework.Category("IntegrationTest")] public class RotationTest : ExtendedITextTest { - public static readonly String sourceFolder = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + public static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext .CurrentContext.TestDirectory) + "/resources/itext/layout/RotationTest/"; - public static readonly String destinationFolder = NUnit.Framework.TestContext.CurrentContext.TestDirectory + public static readonly String DESTINATION_FOLDER = NUnit.Framework.TestContext.CurrentContext.TestDirectory + "/test/itext/layout/RotationTest/"; public const String cmpPrefix = "cmp_"; @@ -62,13 +65,13 @@ public class RotationTest : ExtendedITextTest { [NUnit.Framework.OneTimeSetUp] public static void BeforeClass() { - CreateOrClearDestinationFolder(destinationFolder); + CreateOrClearDestinationFolder(DESTINATION_FOLDER); } [NUnit.Framework.Test] public virtual void FixedTextRotationTest01() { - String outFileName = destinationFolder + "fixedTextRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "fixedTextRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "fixedTextRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "fixedTextRotationTest01.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); SolidBorder border = new SolidBorder(0.5f); @@ -88,14 +91,14 @@ public virtual void FixedTextRotationTest01() { width2)); document.Add(new Paragraph(longText).SetMargin(0).SetFixedPosition(x2, y2, width2)); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void FixedTextRotationTest02() { - String outFileName = destinationFolder + "fixedTextRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "fixedTextRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "fixedTextRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "fixedTextRotationTest02.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); String longText = "loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" @@ -104,14 +107,14 @@ public virtual void FixedTextRotationTest02() { , 450)); document.Add(new Paragraph(longText).SetMargin(0).SetFixedPosition(50, 50, 450)); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void FixedTextRotationTest03() { - String outFileName = destinationFolder + "fixedTextRotationTest03.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "fixedTextRotationTest03.pdf"; + String outFileName = DESTINATION_FOLDER + "fixedTextRotationTest03.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "fixedTextRotationTest03.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); String simpleText = "text simple text"; @@ -124,14 +127,14 @@ public virtual void FixedTextRotationTest03() { PdfCanvas canvas = new PdfCanvas(pdfDocument.GetFirstPage()); DrawCross(canvas, x, y); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void FixedTextRotationTest04() { - String outFileName = destinationFolder + "fixedTextRotationTest04.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "fixedTextRotationTest04.pdf"; + String outFileName = DESTINATION_FOLDER + "fixedTextRotationTest04.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "fixedTextRotationTest04.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); String simpleText = "text simple text"; @@ -143,15 +146,15 @@ public virtual void FixedTextRotationTest04() { PdfCanvas canvas = new PdfCanvas(pdfDocument.GetFirstPage()); DrawCross(canvas, x, y); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)] [NUnit.Framework.Test] public virtual void StaticTextRotationTest01() { - String outFileName = destinationFolder + "staticTextRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "staticTextRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "staticTextRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "staticTextRotationTest01.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); Paragraph p = new Paragraph(); @@ -162,15 +165,15 @@ public virtual void StaticTextRotationTest01() { document.Add(new Paragraph("text line text line text line text line text line text line text line text line text line text line text line" )); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, Count = 2)] [NUnit.Framework.Test] public virtual void StaticTextRotationTest02() { - String outFileName = destinationFolder + "staticTextRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "staticTextRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "staticTextRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "staticTextRotationTest02.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); document.Add(new Paragraph(para1Text)); @@ -179,15 +182,15 @@ public virtual void StaticTextRotationTest02() { (-Math.PI / 12)).SetBackgroundColor(ColorConstants.BLUE)); document.Add(new Paragraph(para3Text)); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)] [NUnit.Framework.Test] public virtual void StaticTextRotationTest03() { - String outFileName = destinationFolder + "staticTextRotationTest03.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "staticTextRotationTest03.pdf"; + String outFileName = DESTINATION_FOLDER + "staticTextRotationTest03.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "staticTextRotationTest03.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); document.Add(new Paragraph(para1Text)); @@ -196,14 +199,14 @@ public virtual void StaticTextRotationTest03() { document.Add(new Paragraph(para2Text).SetRotationAngle((-Math.PI / 3))); document.Add(new Paragraph(para3Text)); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void StaticTextRotationTest04() { - String outFileName = destinationFolder + "staticTextRotationTest04.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "staticTextRotationTest04.pdf"; + String outFileName = DESTINATION_FOLDER + "staticTextRotationTest04.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "staticTextRotationTest04.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); document.Add(new Paragraph(para1Text)); @@ -211,14 +214,14 @@ public virtual void StaticTextRotationTest04() { .RED)); document.Add(new Paragraph(para3Text)); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void SplitTextRotationTest01() { - String outFileName = destinationFolder + "splitTextRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "splitTextRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "splitTextRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "splitTextRotationTest01.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); document.Add(new Paragraph(para1Text)); @@ -227,15 +230,15 @@ public virtual void SplitTextRotationTest01() { document.Add(new Paragraph(para2Text).SetRotationAngle((-Math.PI / 3))); document.Add(new Paragraph(para3Text)); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, Count = 2)] [NUnit.Framework.Test] public virtual void SplitTextRotationTest02() { - String outFileName = destinationFolder + "splitTextRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "splitTextRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "splitTextRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "splitTextRotationTest02.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document document = new Document(pdfDocument); document.Add(new Paragraph(para1Text)); @@ -248,21 +251,21 @@ public virtual void SplitTextRotationTest02() { document.Add(new Paragraph(extremelyLongText).SetRotationAngle(Math.PI / 2)); document.Add(new Paragraph(extremelyLongText).SetRotationAngle(Math.PI / 4)); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void RotationInfiniteLoopTest01() { String fileName = "rotationInfiniteLoopTest01.pdf"; - String outFileName = destinationFolder + fileName; - String cmpFileName = sourceFolder + cmpPrefix + fileName; + String outFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + fileName; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); pdfDocument.SetDefaultPageSize(PageSize.A5.Rotate()); Document document = new Document(pdfDocument); document.Add(new Paragraph(para1Text).SetRotationAngle((Math.PI / 2))); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } @@ -270,22 +273,22 @@ public virtual void RotationInfiniteLoopTest01() { [NUnit.Framework.Test] public virtual void RotationInfiniteLoopTest02() { String fileName = "rotationInfiniteLoopTest02.pdf"; - String outFileName = destinationFolder + fileName; - String cmpFileName = sourceFolder + cmpPrefix + fileName; + String outFileName = DESTINATION_FOLDER + fileName; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + fileName; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); pdfDocument.SetDefaultPageSize(PageSize.A5.Rotate()); Document document = new Document(pdfDocument); document.Add(new List().Add(para1Text).SetRotationAngle((Math.PI / 2))); document.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(iText.IO.Logs.IoLogMessageConstant.TABLE_WIDTH_IS_MORE_THAN_EXPECTED_DUE_TO_MIN_WIDTH)] [NUnit.Framework.Test] public virtual void TableRotationTest02() { - String outFileName = destinationFolder + "tableRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "tableRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "tableRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "tableRotationTest02.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); Table table = new Table(new float[] { 50, 50 }); @@ -296,15 +299,15 @@ public virtual void TableRotationTest02() { SetRotationAngle((Math.PI)))); doc.Add(table); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)] [NUnit.Framework.Test] public virtual void TableRotationTest03() { - String outFileName = destinationFolder + "tableRotationTest03.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "tableRotationTest03.pdf"; + String outFileName = DESTINATION_FOLDER + "tableRotationTest03.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "tableRotationTest03.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); Table table = new Table(new float[] { 25, 50 }); @@ -316,14 +319,14 @@ public virtual void TableRotationTest03() { ((Math.PI)))); doc.Add(table); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void CellRotationTest01() { - String outFileName = destinationFolder + "cellRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "cellRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "cellRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "cellRotationTest01.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); Table table = new Table(UnitValue.CreatePercentArray(1)).UseAllAvailableWidth(); @@ -332,14 +335,14 @@ public virtual void CellRotationTest01() { (ColorConstants.GREEN)); doc.Add(table); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void CellRotationTest02() { - String outFileName = destinationFolder + "cellRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "cellRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "cellRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "cellRotationTest02.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); Table table = new Table(UnitValue.CreatePercentArray(new float[] { 5, 95 })); @@ -348,14 +351,14 @@ public virtual void CellRotationTest02() { ))); doc.Add(table); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void CellRotationTest03() { - String outFileName = destinationFolder + "cellRotationTest03.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "cellRotationTest03.pdf"; + String outFileName = DESTINATION_FOLDER + "cellRotationTest03.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "cellRotationTest03.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); Table table = new Table(UnitValue.CreatePointArray(new float[] { -1, -1 })); @@ -364,14 +367,14 @@ public virtual void CellRotationTest03() { ))); doc.Add(table); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void CellRotationDependsOnNeighbourCell() { - String outFileName = destinationFolder + "cellRotationDependsOnNeighbourCell.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "cellRotationDependsOnNeighbourCell.pdf"; + String outFileName = DESTINATION_FOLDER + "cellRotationDependsOnNeighbourCell.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "cellRotationDependsOnNeighbourCell.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc, new PageSize(300, 180)); doc.Add(CreateTable(60)); @@ -380,7 +383,7 @@ public virtual void CellRotationDependsOnNeighbourCell() { doc.Add(new AreaBreak()); doc.Add(CreateTable(100)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } @@ -388,8 +391,8 @@ public virtual void CellRotationDependsOnNeighbourCell() { public virtual void CellRotationParagraphIsGone() { // TODO DEVSIX-5029 Content of the first cell is missing String testName = "cellRotationParagraphIsGone.pdf"; - String outFileName = destinationFolder + testName; - String cmpFileName = sourceFolder + cmpPrefix + testName; + String outFileName = DESTINATION_FOLDER + testName; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + testName; PdfDocument pdf = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdf); Table table = new Table(2); @@ -405,7 +408,7 @@ public virtual void CellRotationParagraphIsGone() { table.AddCell(cell); doc.Add(table); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } @@ -423,8 +426,8 @@ private Table CreateTable(float height) { [NUnit.Framework.Test] public virtual void DivRotationTest01() { - String outFileName = destinationFolder + "divRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "divRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "divRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "divRotationTest01.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); Div div = new Div().SetBackgroundColor(ColorConstants.GREEN); @@ -434,15 +437,15 @@ public virtual void DivRotationTest01() { div.Add(new Paragraph(para1Text)).SetRotationAngle(Math.PI / 2); doc.Add(div); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, Count = 2)] [NUnit.Framework.Test] public virtual void DivRotationTest02() { - String outFileName = destinationFolder + "divRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "divRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "divRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "divRotationTest02.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); doc.Add(new Paragraph(para1Text)); @@ -455,14 +458,14 @@ public virtual void DivRotationTest02() { doc.Add(new Div().Add(new Paragraph(extremelyLongText)).SetRotationAngle(Math.PI / 2)); doc.Add(new Div().Add(new Paragraph(extremelyLongText)).SetRotationAngle(Math.PI / 4)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void ListRotationTest01() { - String outFileName = destinationFolder + "listRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "listRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "listRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "listRotationTest01.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); doc.Add(new Paragraph(para1Text)); @@ -473,15 +476,15 @@ public virtual void ListRotationTest01() { doc.Add(list); doc.Add(new Paragraph(para2Text)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)] [NUnit.Framework.Test] public virtual void ListRotationTest02() { - String outFileName = destinationFolder + "listRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "listRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "listRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "listRotationTest02.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); doc.Add(new Paragraph(para1Text)); @@ -495,14 +498,14 @@ public virtual void ListRotationTest02() { doc.Add(list); doc.Add(new Paragraph(para2Text)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void AlignedTextRotationTest01() { - String outFileName = destinationFolder + "alignedTextRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "alignedTextRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "alignedTextRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "alignedTextRotationTest01.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); doc.Add(new Paragraph(para1Text)); @@ -513,29 +516,29 @@ public virtual void AlignedTextRotationTest01() { doc.Add(p); doc.Add(new Paragraph(para3Text)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void InnerRotationTest01() { - String outFileName = destinationFolder + "innerRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "innerRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "innerRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "innerRotationTest01.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); doc.Add(new Div().SetBackgroundColor(ColorConstants.GREEN).SetHeight(300).SetWidth(300).Add(new Div().SetBackgroundColor (ColorConstants.RED).SetHeight(100).SetWidth(100).SetRotationAngle(Math.PI / 4)).SetRotationAngle(Math .PI / 8)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, Count = 3)] [NUnit.Framework.Test] public virtual void InnerRotationTest02() { - String outFileName = destinationFolder + "innerRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "innerRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "innerRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "innerRotationTest02.pdf"; PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc, new PageSize(6400, 6400)); String longText = para1Text + para2Text + para3Text; @@ -545,14 +548,14 @@ public virtual void InnerRotationTest02() { ))).Add(new Paragraph("smaaaaaaaaaaaaaaaaaaaall taaaaaaaaaaaaaaaaaaalk")).Add(new Paragraph("smaaaaaaaaaaaaaaaaaaaall taaaaaaaaaaaaaaaaaaalk" )).SetRotationAngle(Math.PI / 8)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void FixedWidthRotationTest01() { - String outFileName = destinationFolder + "fixedWidthRotationTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "fixedWidthRotationTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "fixedWidthRotationTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "fixedWidthRotationTest01.pdf"; Document doc = new Document(new PdfDocument(new PdfWriter(outFileName))); Text text = new Text("Hello. I am a fairly long paragraph. I really want you to process me correctly. You heard that? Correctly!!! Even if you will have to wrap me." ); @@ -561,14 +564,14 @@ public virtual void FixedWidthRotationTest01() { .BLUE, 5)); doc.Add(d.Add(p)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void FixedWidthRotationTest02() { - String outFileName = destinationFolder + "fixedWidthRotationTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "fixedWidthRotationTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "fixedWidthRotationTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "fixedWidthRotationTest02.pdf"; Document doc = new Document(new PdfDocument(new PdfWriter(outFileName))); Text text = new Text("Hello. I am a fairly long paragraph. I really want you to process me correctly. You heard that? Correctly!!! Even if you will have to wrap me." ); @@ -577,14 +580,14 @@ public virtual void FixedWidthRotationTest02() { (ColorConstants.BLUE, 5)); doc.Add(d.Add(p)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void FixedWidthRotationTest03() { - String outFileName = destinationFolder + "fixedWidthRotationTest03.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "fixedWidthRotationTest03.pdf"; + String outFileName = DESTINATION_FOLDER + "fixedWidthRotationTest03.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "fixedWidthRotationTest03.pdf"; Document doc = new Document(new PdfDocument(new PdfWriter(outFileName))); Text text = new Text("Hello. I am a fairly long paragraph. I really want you to process me correctly. You heard that? Correctly!!! Even if you will have to wrap me." ); @@ -593,17 +596,17 @@ public virtual void FixedWidthRotationTest03() { SolidBorder(ColorConstants.BLUE, 5)); doc.Add(d.Add(d1)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void ImageInRotatedBlockTest01() { - String outFileName = destinationFolder + "imageInRotatedBlockTest01.pdf"; - String cmpFileName = sourceFolder + "cmp_imageInRotatedBlockTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "imageInRotatedBlockTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_imageInRotatedBlockTest01.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDocument); - iText.Layout.Element.Image image = new Image(ImageDataFactory.Create(sourceFolder + "Desert.jpg")); + iText.Layout.Element.Image image = new Image(ImageDataFactory.Create(SOURCE_FOLDER + "Desert.jpg")); image.SetWidth(200); Div div = new Div(); div.SetRotationAngle(Math.PI / 2); @@ -612,7 +615,7 @@ public virtual void ImageInRotatedBlockTest01() { doc.Add(div); doc.Add(new Paragraph("Hello!!!").SetBackgroundColor(ColorConstants.RED)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } @@ -621,12 +624,12 @@ public virtual void ImageInRotatedBlockTest01() { [LogMessage(iText.IO.Logs.IoLogMessageConstant.ROTATION_WAS_NOT_CORRECTLY_PROCESSED_FOR_RENDERER, Count = 2)] public virtual void ImageInRotatedBlockTest02() { - String outFileName = destinationFolder + "imageInRotatedBlockTest02.pdf"; - String cmpFileName = sourceFolder + "cmp_imageInRotatedBlockTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "imageInRotatedBlockTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_imageInRotatedBlockTest02.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDocument); - iText.Layout.Element.Image image = new iText.Layout.Element.Image(ImageDataFactory.Create(sourceFolder + "Desert.jpg" - )); + iText.Layout.Element.Image image = new iText.Layout.Element.Image(ImageDataFactory.Create(SOURCE_FOLDER + + "Desert.jpg")); image.SetWidth(200); Div div = new Div(); div.SetHeight(100); @@ -636,14 +639,14 @@ public virtual void ImageInRotatedBlockTest02() { doc.Add(div); doc.Add(new Paragraph("Hello!!!").SetBackgroundColor(ColorConstants.RED)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void BlockWithBorderBoxSizingTest01() { - String outFileName = destinationFolder + "blockWithBorderBoxSizingTest01.pdf"; - String cmpFileName = sourceFolder + "cmp_blockWithBorderBoxSizingTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "blockWithBorderBoxSizingTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_blockWithBorderBoxSizingTest01.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDocument); Div div = new Div(); @@ -656,15 +659,15 @@ public virtual void BlockWithBorderBoxSizingTest01() { div.SetProperty(Property.BOX_SIZING, BoxSizingPropertyValue.BORDER_BOX); doc.Add(div); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void MarginsRotatedTest01() { //TODO: currently is incorrect. See DEVSIX-989 - String outFileName = destinationFolder + "marginsRotatedTest01.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "marginsRotatedTest01.pdf"; + String outFileName = DESTINATION_FOLDER + "marginsRotatedTest01.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "marginsRotatedTest01.pdf"; Document doc = new Document(new PdfDocument(new PdfWriter(outFileName))); Text text = new Text("Hello. I am a fairly long paragraph. I really want you to process me correctly. You heard that? Correctly!!! Even if you will have to wrap me." ); @@ -673,15 +676,15 @@ public virtual void MarginsRotatedTest01() { , 100, 10).SetBorder(new SolidBorder(ColorConstants.BLUE, 5)); doc.Add(d.Add(d1)); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void MarginsRotatedTest02() { //TODO: currently is incorrect. See DEVSIX-989 - String outFileName = destinationFolder + "marginsRotatedTest02.pdf"; - String cmpFileName = sourceFolder + cmpPrefix + "marginsRotatedTest02.pdf"; + String outFileName = DESTINATION_FOLDER + "marginsRotatedTest02.pdf"; + String cmpFileName = SOURCE_FOLDER + cmpPrefix + "marginsRotatedTest02.pdf"; Document doc = new Document(new PdfDocument(new PdfWriter(outFileName))); doc.SetProperty(Property.COLLAPSING_MARGINS, true); Text text = new Text("Hello. I am a fairly long paragraph. I really want you to process me correctly. You heard that? Correctly!!! Even if you will have to wrap me." @@ -692,15 +695,15 @@ public virtual void MarginsRotatedTest02() { doc.Add(d.Add(d1).Add(new Paragraph("Hello").SetMargin(50).SetBorder(new SolidBorder(ColorConstants.GREEN, 5)))); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER , "diff")); } [NUnit.Framework.Test] public virtual void ZeroDegreeRotatedWithAlignmentParagraphInDivTest() { //TODO: update cmp file after fixing DEVSIX-4458 - String outFileName = destinationFolder + "zeroDegreeRotatedWithAlignmentParagraphInDiv.pdf"; - String cmpFileName = sourceFolder + "cmp_zeroDegreeRotatedWithAlignmentParagraphInDiv.pdf"; + String outFileName = DESTINATION_FOLDER + "zeroDegreeRotatedWithAlignmentParagraphInDiv.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_zeroDegreeRotatedWithAlignmentParagraphInDiv.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDocument); Div div = new Div().SetBorder(new SolidBorder(ColorConstants.BLACK, 1)); @@ -713,15 +716,15 @@ public virtual void ZeroDegreeRotatedWithAlignmentParagraphInDivTest() { (MathUtil.ToRadians(0))); doc.Add(div); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER )); } [NUnit.Framework.Test] public virtual void Rotated180DegreesWithAlignmentParagraphInDivTest() { //TODO: update cmp file after fixing DEVSIX-4458 - String outFileName = destinationFolder + "rotated180DegreesWithAlignmentParagraphInDiv.pdf"; - String cmpFileName = sourceFolder + "cmp_rotated180DegreesWithAlignmentParagraphInDiv.pdf"; + String outFileName = DESTINATION_FOLDER + "rotated180DegreesWithAlignmentParagraphInDiv.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_rotated180DegreesWithAlignmentParagraphInDiv.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDocument); Div div = new Div().SetBorder(new SolidBorder(ColorConstants.BLACK, 1)); @@ -734,15 +737,15 @@ public virtual void Rotated180DegreesWithAlignmentParagraphInDivTest() { (MathUtil.ToRadians(180))); doc.Add(div); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER )); } [NUnit.Framework.Test] public virtual void Rotated90DegreesWithAlignmentParagraphInDivTest() { //TODO: update cmp file after fixing DEVSIX-4458 - String outFileName = destinationFolder + "rotated90DegreesWithAlignmentParagraphInDiv.pdf"; - String cmpFileName = sourceFolder + "cmp_rotated90DegreesWithAlignmentParagraphInDiv.pdf"; + String outFileName = DESTINATION_FOLDER + "rotated90DegreesWithAlignmentParagraphInDiv.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_rotated90DegreesWithAlignmentParagraphInDiv.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDocument); Div div = new Div().SetBorder(new SolidBorder(ColorConstants.BLACK, 1)); @@ -755,15 +758,15 @@ public virtual void Rotated90DegreesWithAlignmentParagraphInDivTest() { (MathUtil.ToRadians(90))); doc.Add(div); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER )); } [NUnit.Framework.Test] public virtual void RotatedWithAlignmentCellInTableTest() { //TODO: update cmp file after fixing DEVSIX-4458 - String outFileName = destinationFolder + "rotatedWithAlignmentCellInTable.pdf"; - String cmpFileName = sourceFolder + "cmp_rotatedWithAlignmentCellInTable.pdf"; + String outFileName = DESTINATION_FOLDER + "rotatedWithAlignmentCellInTable.pdf"; + String cmpFileName = SOURCE_FOLDER + "cmp_rotatedWithAlignmentCellInTable.pdf"; PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDocument); Table table = new Table(1); @@ -776,8 +779,41 @@ public virtual void RotatedWithAlignmentCellInTableTest() { table.AddCell(cell); doc.Add(table); doc.Close(); - NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, DESTINATION_FOLDER + )); + } + + [NUnit.Framework.Test] + public virtual void IgnorePageRotationForContentTest() { + String inputFile = SOURCE_FOLDER + "rotated.pdf"; + String compareFile = SOURCE_FOLDER + "cmp_ignorePageRotationForContent.pdf"; + String outputFile = DESTINATION_FOLDER + "ignorePageRotationForContent.pdf"; + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputFile), new PdfWriter(outputFile))) { + using (Document doc = new Document(pdfDoc)) { + PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.5f); + PdfFont font = PdfFontFactory.CreateFont(StandardFonts.HELVETICA); + Paragraph paragraph = new Paragraph("My watermark (text)").SetFont(font).SetFontSize(30); + PdfPage pdfPage = pdfDoc.GetPage(1); + Rectangle pageSize = pdfPage.GetPageSizeWithRotation(); + // When "true": in case the page has a rotation, then new content will be automatically rotated in the + // opposite direction. On the rotated page this would look as if new content ignores page rotation. + pdfPage.SetIgnorePageRotationForContent(true); + float x = (pageSize.GetLeft() + pageSize.GetRight()) / 2; + float y = (pageSize.GetTop() + pageSize.GetBottom()) / 2; + PdfCanvas over = new PdfCanvas(pdfPage); + over.SaveState(); + over.SetExtGState(gs1); + // Each showTextAligned call creates new PdfCanvas instance for the same page. + doc.ShowTextAligned(paragraph, x, y + 100, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0); + doc.ShowTextAligned(paragraph, x, y, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0); + doc.ShowTextAligned(paragraph, x, y - 100, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0); + over.RestoreState(); + } + } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outputFile, compareFile, DESTINATION_FOLDER )); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareVisually(outputFile, compareFile, DESTINATION_FOLDER + , "diff_")); } private void DrawCross(PdfCanvas canvas, float x, float y) { diff --git a/itext.tests/itext.layout.tests/resources/itext/layout/RotationTest/cmp_ignorePageRotationForContent.pdf b/itext.tests/itext.layout.tests/resources/itext/layout/RotationTest/cmp_ignorePageRotationForContent.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04824ffaa34055ddb3e899c2667960f6e601fd8e GIT binary patch literal 1740 zcmcIk&ub(_6dnX+>44}(!BYhjk`R-ARn^r$Gz^*qx1WBtd;};B*Q}{2yBe<-DzmHWyil`Bq*B?ZRkB*Vf-scJ zd66l8(c1iY{QhI5(u2|)mP%yTs8=QiJ5DVBa4gz@rF(1%8t}RE`1?QHX>GR_23y}p z*6!|gYjCXf#L0NzshMAXYb*`SPP{mv6sWsXe!IZF~F1J2x-i zzVpeA4{ud!*3OmmW@Rg^uboT6b6-@hR_kkX^{cy4?U|idPh3Dx{!#rP_J+>Cj-D;q zZ+m-3={h~SGig$&q{x?zK#Rzfb`hEDEUwsRl#F>L-CPE}X8}XLLsskt&$I&~24gR( zJZ)z}yJkkWMG>dTtVWN{zDR&L5P*ZJ!yIoM=m@~bn0+Rd{Qw6uU2kzCw6e{nk(5c)EFZg=8 z+5?*!cZ*lyxiTu)HMM?86|vyk5L&UrwJk$OMhj2y4 z<8_spceOr?mZzwcienloKLo`D4ILga*TJB?hztM{NH9S0bwrc$YF|P#& literal 0 HcmV?d00001 diff --git a/itext.tests/itext.layout.tests/resources/itext/layout/RotationTest/rotated.pdf b/itext.tests/itext.layout.tests/resources/itext/layout/RotationTest/rotated.pdf new file mode 100644 index 0000000000000000000000000000000000000000..54fd51c3d0c2f9c9989fca1a71773aed0843352d GIT binary patch literal 1156 zcmc&zJ#P~+814eYb%B52h(<|N((}jpK2Q|VCJn7h+bD@(Xe#8p^QDKvIl6PIlo>`O z#K6Resh5q}h-qewlK9>2w~`*#f4 z%9%4bh*UG3iBVgLKZ(hd#Y3LzAF(^*EEr&H zhjxT)b2 zEY~8O2R_Cg@$3Je!LGTUL;~pl(NSMWsGiA}-S{pCj(X2x-jP+^-qk kids) { private static PdfString GenerateDefaultAppearance(PdfName font, float fontSize, Color textColor) { System.Diagnostics.Debug.Assert(font != null); MemoryStream output = new MemoryStream(); - PdfOutputStream pdfStream = new PdfOutputStream(new OutputStream(output)); + PdfOutputStream pdfStream = new PdfOutputStream(new HighPrecisionOutputStream(output)); byte[] g = new byte[] { (byte)'g' }; byte[] rg = new byte[] { (byte)'r', (byte)'g' }; byte[] k = new byte[] { (byte)'k' }; diff --git a/itext/itext.io/itext/io/source/OutputStream.cs b/itext/itext.io/itext/io/source/HighPrecisionOutputStream.cs similarity index 97% rename from itext/itext.io/itext/io/source/OutputStream.cs rename to itext/itext.io/itext/io/source/HighPrecisionOutputStream.cs index 8a7d5c3d36..2db1cd39cf 100644 --- a/itext/itext.io/itext/io/source/OutputStream.cs +++ b/itext/itext.io/itext/io/source/HighPrecisionOutputStream.cs @@ -24,7 +24,7 @@ You should have received a copy of the GNU Affero General Public License using System.IO; namespace iText.IO.Source { - public class OutputStream : Stream + public class HighPrecisionOutputStream : Stream where T : Stream { private readonly ByteBuffer numBuffer = new ByteBuffer(32); @@ -58,17 +58,17 @@ public void SetLocalHighPrecision(bool value) this.localHighPrecision = value; } - public OutputStream() + public HighPrecisionOutputStream() : base() { } - public OutputStream(Stream outputStream) + public HighPrecisionOutputStream(Stream outputStream) : base() { this.outputStream = outputStream; } - public OutputStream(Stream outputStream, bool localHighPrecision) + public HighPrecisionOutputStream(Stream outputStream, bool localHighPrecision) : base() { this.outputStream = outputStream; diff --git a/itext/itext.io/itext/io/util/XmlUtil.cs b/itext/itext.io/itext/io/util/XmlUtil.cs index 2d08a4f4d2..51fcc3ffe2 100644 --- a/itext/itext.io/itext/io/util/XmlUtil.cs +++ b/itext/itext.io/itext/io/util/XmlUtil.cs @@ -25,7 +25,7 @@ You should have received a copy of the GNU Affero General Public License namespace iText.IO.Util { /// /// This file is a helper class for internal usage only. - /// Be aware that its API and functionality may be changed in future. + /// Be aware that its API and functionality may be changed in the future. /// public class XmlUtil { /// diff --git a/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs b/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs index 2ee225f9e6..661ec8ff9b 100644 --- a/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs +++ b/itext/itext.kernel/itext/kernel/font/PdfType0Font.cs @@ -920,7 +920,8 @@ protected internal virtual PdfDictionary GetCidFont(PdfDictionary fontDescriptor private PdfObject GenerateWidthsArray() { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - OutputStream stream = new OutputStream(bytes); + HighPrecisionOutputStream stream = new HighPrecisionOutputStream(bytes); stream.WriteByte('['); int lastNumber = -10; bool firstTime = true; @@ -953,8 +954,8 @@ private PdfObject GenerateWidthsArray() { /// Creates a ToUnicode CMap to allow copy and paste from Acrobat. /// the stream representing this CMap or null public virtual PdfStream GetToUnicode() { - OutputStream stream = new OutputStream(new ByteArrayOutputStream - ()); + HighPrecisionOutputStream stream = new HighPrecisionOutputStream(new ByteArrayOutputStream()); stream.WriteString("/CIDInit /ProcSet findresource begin\n" + "12 dict begin\n" + "begincmap\n" + "/CIDSystemInfo\n" + "<< /Registry (Adobe)\n" + "/Ordering (UCS)\n" + "/Supplement 0\n" + ">> def\n" + "/CMapName /Adobe-Identity-UCS def\n" + "/CMapType 2 def\n" + "1 begincodespacerange\n" + "<0000>\n" + "endcodespacerange\n"); @@ -979,7 +980,8 @@ public virtual PdfStream GetToUnicode() { return new PdfStream(((ByteArrayOutputStream)stream.GetOutputStream()).ToArray()); } - private int WriteBfrange(OutputStream stream, IList range) { + private static int WriteBfrange(HighPrecisionOutputStream stream, IList range + ) { if (range.IsEmpty()) { return 0; } diff --git a/itext/itext.kernel/itext/kernel/pdf/PageContentRotationHelper.cs b/itext/itext.kernel/itext/kernel/pdf/PageContentRotationHelper.cs new file mode 100644 index 0000000000..7b88756e07 --- /dev/null +++ b/itext/itext.kernel/itext/kernel/pdf/PageContentRotationHelper.cs @@ -0,0 +1,91 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +namespace iText.Kernel.Pdf { + /// + /// Helper class to specify or check whether inverse matrix is already applied to the page content stream in case + /// page rotation is applied and + /// + /// is set to + /// . + /// + /// + /// Helper class to specify or check whether inverse matrix is already applied to the page content stream in case + /// page rotation is applied and + /// + /// is set to + /// . + /// + /// Page rotation inverse matrix rotates content into the opposite direction from page rotation direction + /// in order to give the impression of the not rotated text. It should be applied only once for the page. + /// + public sealed class PageContentRotationHelper { + /// + /// Checks if page rotation inverse matrix (which rotates content into the opposite direction from the page rotation + /// direction in order to give the impression of the not rotated text) is already applied to the page content stream. + /// + /// + /// Checks if page rotation inverse matrix (which rotates content into the opposite direction from the page rotation + /// direction in order to give the impression of the not rotated text) is already applied to the page content stream. + /// See + /// . + /// + /// + /// + /// + /// to check applied content rotation for + /// + /// + /// + /// + /// if inverse matrix is already applied, + /// + /// otherwise + /// + public static bool IsPageRotationInverseMatrixWritten(PdfPage page) { + return page.IsPageRotationInverseMatrixWritten(); + } + + /// + /// Specify that inverse matrix (which rotates content into the opposite direction from the page rotation + /// direction in order to give the impression of the not rotated text) is applied to the page content stream. + /// + /// + /// Specify that inverse matrix (which rotates content into the opposite direction from the page rotation + /// direction in order to give the impression of the not rotated text) is applied to the page content stream. + /// See + /// . + /// + /// + /// + /// + /// for which to specify that content rotation is applied + /// + public static void SetPageRotationInverseMatrixWritten(PdfPage page) { + page.SetPageRotationInverseMatrixWritten(); + } + + private PageContentRotationHelper() { + } + // Private constructor will prevent the instantiation of this class directly. + } +} diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfObject.cs b/itext/itext.kernel/itext/kernel/pdf/PdfObject.cs index d37e58079a..1ca9f748a9 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfObject.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfObject.cs @@ -71,11 +71,11 @@ public abstract class PdfObject { /// protected internal const short ORIGINAL_OBJECT_STREAM = 1 << 4; - /// For internal usage only. + /// Marks objects that shall be written to the output document. /// - /// For internal usage only. Marks objects that shall be written to the output document. - /// Option is needed to build the correct PDF objects tree when closing the document. - /// As a result it avoids writing unused (removed) objects. + /// Marks objects that shall be written to the output document. Shouldn't be used on purpose + /// since this flag is handled internally: option is needed to build the correct PDF objects + /// tree when closing the document. As a result it avoids writing unused (removed) objects. /// protected internal const short MUST_BE_FLUSHED = 1 << 5; diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfOutputStream.cs b/itext/itext.kernel/itext/kernel/pdf/PdfOutputStream.cs index 8354e35b1e..0b6638f918 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfOutputStream.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfOutputStream.cs @@ -30,7 +30,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Kernel.Pdf.Filters; namespace iText.Kernel.Pdf { - public class PdfOutputStream : OutputStream { + public class PdfOutputStream : HighPrecisionOutputStream { private static readonly byte[] stream = ByteUtils.GetIsoBytes("stream\n"); private static readonly byte[] endstream = ByteUtils.GetIsoBytes("\nendstream"); diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs b/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs index 7cbec3d693..31ddd33550 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfPage.cs @@ -298,7 +298,9 @@ public virtual PdfStream NewContentStreamBefore() { /// /// Creates new /// - /// object and puts it at the end of Contents array + /// object and puts it at the end of + /// Contents + /// array /// (if Contents object is /// /// it will be replaced with one-element array). @@ -1532,38 +1534,6 @@ public virtual iText.Kernel.Pdf.PdfPage Remove(PdfName key) { return this; } - /// - /// This flag is meaningful for the case, when page rotation is applied and ignorePageRotationForContent - /// is set to true. - /// - /// - /// This flag is meaningful for the case, when page rotation is applied and ignorePageRotationForContent - /// is set to true. NOTE: It is needed for the internal usage. - ///

- /// This flag defines if inverse matrix (which rotates content into the opposite direction from page rotation - /// direction in order to give the impression of the not rotated text) is already applied to the page content stream. - /// See - /// - ///
- /// true, if inverse matrix is already applied, false otherwise. - public virtual bool IsPageRotationInverseMatrixWritten() { - return pageRotationInverseMatrixWritten; - } - - /// NOTE: For internal usage! Use this method only if you know what you are doing. - /// - /// NOTE: For internal usage! Use this method only if you know what you are doing. - ///

- /// This method is called when inverse matrix (which rotates content into the opposite direction from page rotation - /// direction in order to give the impression of the not rotated text) is applied to the page content stream. - /// See - /// - ///
- public virtual void SetPageRotationInverseMatrixWritten() { - // this method specifically return void to discourage it's unintended usage - pageRotationInverseMatrixWritten = true; - } - /// Adds file associated with PDF page and identifies the relationship between them. /// /// Adds file associated with PDF page and identifies the relationship between them. @@ -1645,6 +1615,49 @@ internal virtual void ReleaseInstanceFields() { } //\endcond +//\cond DO_NOT_DOCUMENT + /// + /// Checks if page rotation inverse matrix (which rotates content into the opposite direction from page rotation + /// direction in order to give the impression of the not rotated text) is already applied to the page content stream. + /// + /// + /// Checks if page rotation inverse matrix (which rotates content into the opposite direction from page rotation + /// direction in order to give the impression of the not rotated text) is already applied to the page content stream. + /// See + /// + /// and + /// . + /// + /// + /// + /// + /// if inverse matrix is already applied, + /// + /// otherwise + /// + internal virtual bool IsPageRotationInverseMatrixWritten() { + return pageRotationInverseMatrixWritten; + } +//\endcond + +//\cond DO_NOT_DOCUMENT + /// + /// Specifies that page rotation inverse matrix (which rotates content into the opposite direction from page rotation + /// direction in order to give the impression of the not rotated text) is applied to the page content stream. + /// + /// + /// Specifies that page rotation inverse matrix (which rotates content into the opposite direction from page rotation + /// direction in order to give the impression of the not rotated text) is applied to the page content stream. + /// See + /// + /// and + /// . + /// + internal virtual void SetPageRotationInverseMatrixWritten() { + pageRotationInverseMatrixWritten = true; + } +//\endcond + protected internal override bool IsWrappedObjectMustBeIndirect() { return true; } diff --git a/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs b/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs index 2265d0324e..aa67a9127d 100644 --- a/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs +++ b/itext/itext.kernel/itext/kernel/pdf/canvas/PdfCanvas.cs @@ -249,10 +249,10 @@ public PdfCanvas(PdfPage page, bool wrapOldContent) page.NewContentStreamBefore().GetOutputStream().WriteBytes(ByteUtils.GetIsoBytes("q\n")); contentStream.GetOutputStream().WriteBytes(ByteUtils.GetIsoBytes("Q\n")); } - if (page.GetRotation() != 0 && page.IsIgnorePageRotationForContent() && (wrapOldContent || !page.IsPageRotationInverseMatrixWritten - ())) { + if (page.GetRotation() != 0 && page.IsIgnorePageRotationForContent() && (wrapOldContent || !PageContentRotationHelper + .IsPageRotationInverseMatrixWritten(page))) { ApplyRotation(page); - page.SetPageRotationInverseMatrixWritten(); + PageContentRotationHelper.SetPageRotationInverseMatrixWritten(page); } this.drawingOnPage = true; } diff --git a/itext/itext.layout/itext/layout/element/ILargeElement.cs b/itext/itext.layout/itext/layout/element/ILargeElement.cs index 4cfc1af3e8..f14de47dbe 100644 --- a/itext/itext.layout/itext/layout/element/ILargeElement.cs +++ b/itext/itext.layout/itext/layout/element/ILargeElement.cs @@ -51,10 +51,16 @@ public interface ILargeElement : IElement { /// Writes the newly added content to the document. void Flush(); - /// Flushes the content which has just been added to the document. + /// Writes to the output document the content which has just been added to it. /// - /// Flushes the content which has just been added to the document. - /// This is a method for internal usage and is called automatically by the document. + /// Writes to the output document the content which has just been added to it. + /// + /// This method is called automatically for the newly added + /// + /// to be immediately placed + /// in the page contents after it is added to the + /// + /// , so it shouldn't be used in any other places. /// void FlushContent(); diff --git a/itext/itext.layout/itext/layout/element/Table.cs b/itext/itext.layout/itext/layout/element/Table.cs index 46e130abd1..312573ce56 100644 --- a/itext/itext.layout/itext/layout/element/Table.cs +++ b/itext/itext.layout/itext/layout/element/Table.cs @@ -870,11 +870,6 @@ public virtual void Flush() { } } - /// Flushes the content which has just been added to the document. - /// - /// Flushes the content which has just been added to the document. - /// This is a method for internal usage and is called automatically by the document. - /// public virtual void FlushContent() { if (lastAddedRowGroups == null || lastAddedRowGroups.IsEmpty()) { return; diff --git a/itext/itext.styledxmlparser/itext/styledxmlparser/PortUtil.cs b/itext/itext.styledxmlparser/itext/styledxmlparser/PortUtil.cs index 29690b4896..4516ba5e54 100644 --- a/itext/itext.styledxmlparser/itext/styledxmlparser/PortUtil.cs +++ b/itext/itext.styledxmlparser/itext/styledxmlparser/PortUtil.cs @@ -28,7 +28,7 @@ You should have received a copy of the GNU Affero General Public License namespace iText.StyledXmlParser { /// /// This file is a helper class for internal usage only. - /// Be aware that its API and functionality may be changed in future. + /// Be aware that its API and functionality may be changed in the future. /// public class PortUtil { private PortUtil() { diff --git a/port-hash b/port-hash index 3ebb076521..32a807d461 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -ac40d30decea70bfa2e27b027ee2cbc654368dd4 +a954103ecbd3b3c54e258611f82decabf2eada3b \ No newline at end of file