From 6184fb533c85c88a2c48ef9b145917e2b7bae083 Mon Sep 17 00:00:00 2001 From: DevOps Date: Thu, 3 Sep 2026 04:56:39 +0000 Subject: [PATCH] Copy from IronPolyglot 2026-09-03 --- .../ironsoftware/ironpdf/RCTests2026_09.java | 36 +++++++++++++++++++ .../internal/staticapi/Signature_Api.java | 7 +++- .../ironsoftware/ironpdf/RCTests2026_09.java | 36 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/IronPdf.SmokeTests/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java b/IronPdf.SmokeTests/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java index 76604f7..01c7f89 100644 --- a/IronPdf.SmokeTests/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java +++ b/IronPdf.SmokeTests/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java @@ -9,6 +9,8 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; /** @@ -75,6 +77,40 @@ public final void Test02_SignatureHashAlgorithm_Default_UsesSha256() throws IOEx "Did not expect the SHA-512 digest OID when the default is used"); } + // ==================== PDF-2253: cold-session DigiCert-timestamped verify ==================== + + // Reproduces PDF-2253: sign with a DigiCert RFC3161 timestamp, save, reload, and verify. The + // defect only surfaces when this is the first document operation in a fresh engine session, so + // run this method IN ISOLATION (its own JVM) to exercise the cold-session path. VerifyPdfSignatures + // must return true; the escalation saw it silently return false on the first attempts. + @Test + public final void Test06_PDF2253_DigicertTimestamp_ColdSessionVerifies() throws IOException { + final String DIGICERT_TSA = "http://timestamp.digicert.com"; + final int attempts = 3; + java.util.List failures = new java.util.ArrayList<>(); + + for (int i = 0; i < attempts; i++) { + PdfDocument pdf = PdfDocument.renderHtmlAsPdf( + "

PDF-2253 DigiCert

Attempt " + (i + 1) + "

"); + Signature signature = new Signature(getTestFile("/Data/IronSoftware.pfx"), "123456"); + signature.setTimeStampUrl(DIGICERT_TSA); + pdf.getSignature().SignPdfWithSignature(signature); + + Path pdfPath = Files.createTempFile("pdf2253_digicert_" + i + "_", ".pdf"); + try { + pdf.saveAs(pdfPath); + PdfDocument reloaded = PdfDocument.fromFile(pdfPath); + if (!reloaded.getSignature().VerifyPdfSignatures()) { + failures.add("Attempt " + (i + 1) + ": signature failed to verify after save+reload"); + } + } finally { + Files.deleteIfExists(pdfPath); + } + } + + Assertions.assertTrue(failures.isEmpty(), "PDF-2253 verification failures: " + failures); + } + // ==================== SetImageAltText ==================== @Test diff --git a/ironpdf/src/main/java/com/ironsoftware/ironpdf/internal/staticapi/Signature_Api.java b/ironpdf/src/main/java/com/ironsoftware/ironpdf/internal/staticapi/Signature_Api.java index f45b5b0..2f2f048 100644 --- a/ironpdf/src/main/java/com/ironsoftware/ironpdf/internal/staticapi/Signature_Api.java +++ b/ironpdf/src/main/java/com/ironsoftware/ironpdf/internal/staticapi/Signature_Api.java @@ -19,6 +19,8 @@ public final class Signature_Api { public static List getVerifiedSignatures(InternalPdfDocument internalPdfDocument) { RpcClient client = Access.ensureConnection(); + byte[] documentBytes = PdfDocument_Api.getBytes(internalPdfDocument, false); + final CountDownLatch finishLatch = new CountDownLatch(1); ArrayList resultChunks = new ArrayList<>(); @@ -28,7 +30,10 @@ public static List getVerifiedSignatures(InternalPdfDocument requestStream.onNext(PdfiumGetVerifiedSignatureRequestStreamP.newBuilder().setInfo(infoP).build()); - //don't send DataChunk (pdf byte[]) and let Server get the pdf byte[] inside the server to prevent too much grpc call + for (Iterator it = Utils_Util.chunk(documentBytes); it.hasNext(); ) { + requestStream.onNext(PdfiumGetVerifiedSignatureRequestStreamP.newBuilder() + .setDataChunk(ByteString.copyFrom(it.next())).build()); + } requestStream.onCompleted(); diff --git a/ironpdf/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java b/ironpdf/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java index 76604f7..01c7f89 100644 --- a/ironpdf/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java +++ b/ironpdf/src/test/java/com/ironsoftware/ironpdf/RCTests2026_09.java @@ -9,6 +9,8 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; /** @@ -75,6 +77,40 @@ public final void Test02_SignatureHashAlgorithm_Default_UsesSha256() throws IOEx "Did not expect the SHA-512 digest OID when the default is used"); } + // ==================== PDF-2253: cold-session DigiCert-timestamped verify ==================== + + // Reproduces PDF-2253: sign with a DigiCert RFC3161 timestamp, save, reload, and verify. The + // defect only surfaces when this is the first document operation in a fresh engine session, so + // run this method IN ISOLATION (its own JVM) to exercise the cold-session path. VerifyPdfSignatures + // must return true; the escalation saw it silently return false on the first attempts. + @Test + public final void Test06_PDF2253_DigicertTimestamp_ColdSessionVerifies() throws IOException { + final String DIGICERT_TSA = "http://timestamp.digicert.com"; + final int attempts = 3; + java.util.List failures = new java.util.ArrayList<>(); + + for (int i = 0; i < attempts; i++) { + PdfDocument pdf = PdfDocument.renderHtmlAsPdf( + "

PDF-2253 DigiCert

Attempt " + (i + 1) + "

"); + Signature signature = new Signature(getTestFile("/Data/IronSoftware.pfx"), "123456"); + signature.setTimeStampUrl(DIGICERT_TSA); + pdf.getSignature().SignPdfWithSignature(signature); + + Path pdfPath = Files.createTempFile("pdf2253_digicert_" + i + "_", ".pdf"); + try { + pdf.saveAs(pdfPath); + PdfDocument reloaded = PdfDocument.fromFile(pdfPath); + if (!reloaded.getSignature().VerifyPdfSignatures()) { + failures.add("Attempt " + (i + 1) + ": signature failed to verify after save+reload"); + } + } finally { + Files.deleteIfExists(pdfPath); + } + } + + Assertions.assertTrue(failures.isEmpty(), "PDF-2253 verification failures: " + failures); + } + // ==================== SetImageAltText ==================== @Test