diff --git a/pgpainless-core/src/test/java/investigations/SignMessageWithCreationTimeOffsetTest.java b/pgpainless-core/src/test/java/investigations/SignMessageWithCreationTimeOffsetTest.java index 67ef5123..4077408e 100644 --- a/pgpainless-core/src/test/java/investigations/SignMessageWithCreationTimeOffsetTest.java +++ b/pgpainless-core/src/test/java/investigations/SignMessageWithCreationTimeOffsetTest.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Date; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; public class SignMessageWithCreationTimeOffsetTest { @@ -74,4 +75,53 @@ public class SignMessageWithCreationTimeOffsetTest { MessageMetadata metadata = decIn.getMetadata(); assertTrue(metadata.isVerifiedSignedBy(key.toCertificate())); } + + @Test + public void testSignMessageInFuture() throws PGPException, IOException { + PGPainless api = PGPainless.getInstance(); + Date now = new Date(); + Date inOneHour = new Date(now.getTime() + 1000 * 60 * 60); + + OpenPGPKey key = api.generateKey().modernKeyRing("Alice "); + + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + EncryptionStream encOut = api.generateMessage() + .onOutputStream(bOut) + .withOptions(ProducerOptions.sign(SigningOptions.get() + .addInlineSignature(SecretKeyRingProtector.unprotectedKeys(), key, null, DocumentSignatureType.BINARY_DOCUMENT, new BaseSignatureSubpackets.Callback() { + @Override + public void modifyHashedSubpackets(@NotNull BaseSignatureSubpackets hashedSubpackets) { + hashedSubpackets.setSignatureCreationTime(inOneHour); + } + }))); + + encOut.write("Hello, World!\n".getBytes(StandardCharsets.UTF_8)); + encOut.close(); + + ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray()); + DecryptionStream decIn = api.processMessage() + .onInputStream(bIn) + .withOptions(ConsumerOptions.get() + .addVerificationCert(key.toCertificate())); + + Streams.drain(decIn); + decIn.close(); + + MessageMetadata metadata = decIn.getMetadata(); + assertFalse(metadata.isVerifiedSignedBy(key.toCertificate())); + + // Try again, adjusting validity period + bIn = new ByteArrayInputStream(bOut.toByteArray()); + decIn = api.processMessage() + .onInputStream(bIn) + .withOptions(ConsumerOptions.get() + .verifyNotAfter(inOneHour) // is set to 'now' by default, so to allow verifying future sigs, we need to adjust + .addVerificationCert(key.toCertificate())); + + Streams.drain(decIn); + decIn.close(); + + metadata = decIn.getMetadata(); + assertTrue(metadata.isVerifiedSignedBy(key.toCertificate())); + } }