@@ -27,13 +27,15 @@ This file is part of the iText (R) project.
2727import com .itextpdf .commons .bouncycastle .operator .AbstractOperatorCreationException ;
2828import com .itextpdf .commons .bouncycastle .pkcs .AbstractPKCSException ;
2929import com .itextpdf .commons .utils .DateTimeUtil ;
30+ import com .itextpdf .signatures .CertificateUtil ;
3031import com .itextpdf .signatures .IssuingCertificateRetriever ;
3132import com .itextpdf .signatures .testutils .PemFileHelper ;
3233import com .itextpdf .signatures .testutils .TimeTestUtil ;
3334import com .itextpdf .signatures .testutils .builder .TestCrlBuilder ;
3435import com .itextpdf .signatures .testutils .builder .TestOcspResponseBuilder ;
3536import com .itextpdf .signatures .testutils .client .TestCrlClient ;
3637import com .itextpdf .signatures .testutils .client .TestOcspClient ;
38+ import com .itextpdf .signatures .validation .SignatureValidationProperties .OnlineFetching ;
3739import com .itextpdf .signatures .validation .context .CertificateSource ;
3840import com .itextpdf .signatures .validation .context .CertificateSources ;
3941import com .itextpdf .signatures .validation .context .TimeBasedContext ;
@@ -44,6 +46,10 @@ This file is part of the iText (R) project.
4446import com .itextpdf .signatures .validation .report .ReportItem ;
4547import com .itextpdf .signatures .validation .report .ValidationReport ;
4648import com .itextpdf .test .ExtendedITextTest ;
49+
50+ import java .security .cert .X509CRL ;
51+ import java .time .Duration ;
52+ import java .util .Date ;
4753import org .junit .jupiter .api .BeforeEach ;
4854import org .junit .jupiter .api .BeforeAll ;
4955import org .junit .jupiter .api .Test ;
@@ -61,6 +67,10 @@ public class RevocationDataValidatorIntegrationTest extends ExtendedITextTest {
6167 private static final IBouncyCastleFactory FACTORY = BouncyCastleFactoryCreator .getFactory ();
6268 private static final String SOURCE_FOLDER =
6369 "./src/test/resources/com/itextpdf/signatures/validation/RevocationDataValidatorTest/" ;
70+
71+ private static final String CRL_TEST_SOURCE_FOLDER =
72+ "./src/test/resources/com/itextpdf/signatures/validation/CRLValidatorTest/" ;
73+
6474 private static final char [] PASSWORD = "testpassphrase" .toCharArray ();
6575
6676
@@ -140,4 +150,101 @@ public void crlWithOnlySomeReasonsTest() throws Exception {
140150 ));
141151
142152 }
153+
154+ @ Test
155+ public void crlSignerIsValidatedCertificate () throws Exception {
156+
157+ String rootCertFileName = CRL_TEST_SOURCE_FOLDER + "happyPath/ca.cert.pem" ;
158+ String crlSignerKeyFileName = CRL_TEST_SOURCE_FOLDER + "keys/crl-key.pem" ;
159+ String crlSignerFileName = CRL_TEST_SOURCE_FOLDER + "happyPath/crl-issuer.cert.pem" ;
160+ String checkCertFileName = CRL_TEST_SOURCE_FOLDER + "happyPath/sign.cert.pem" ;
161+
162+ X509Certificate caCert = (X509Certificate ) PemFileHelper .readFirstChain (rootCertFileName )[0 ];
163+ X509Certificate crlSigner = (X509Certificate ) PemFileHelper .readFirstChain (crlSignerFileName )[0 ];
164+ PrivateKey crlPrivateKey = PemFileHelper .readFirstKey (crlSignerKeyFileName , PASSWORD );
165+ X509Certificate checkCert = (X509Certificate ) PemFileHelper .readFirstChain (checkCertFileName )[0 ];
166+
167+
168+ certificateRetriever .addTrustedCertificates (Collections .singletonList (caCert ));
169+ certificateRetriever .addKnownCertificates (Collections .singletonList (crlSigner ));
170+
171+ Date checkDate = TimeTestUtil .TEST_DATE_TIME ;
172+ Date revocationDate = DateTimeUtil .addDaysToDate (checkDate , -1 );
173+ TestCrlBuilder builder = new TestCrlBuilder (crlSigner , crlPrivateKey , checkDate );
174+ builder .setNextUpdate (DateTimeUtil .addDaysToDate (checkDate , 10 ));
175+ //builder.addCrlEntry(caCert, revocationDate, FACTORY.createCRLReason().getKeyCompromise());
176+ //TestCrlClientWrapper crlClient = new TestCrlClientWrapper(new TestCrlClient().addBuilderForCertIssuer(builder));
177+
178+ ValidationCrlClient crlClient = (ValidationCrlClient ) parameters .getCrlClients ().get (0 );
179+ crlClient .addCrl ((X509CRL ) CertificateUtil .parseCrlFromBytes (builder .makeCrl ()), checkDate , TimeBasedContext .HISTORICAL );
180+
181+ ValidationReport report = new ValidationReport ();
182+ certificateRetriever .addTrustedCertificates (Collections .singletonList (caCert ));
183+
184+ parameters .setRevocationOnlineFetching (ValidatorContexts .all (), CertificateSources .all (), TimeBasedContexts .all (), OnlineFetching .FETCH_IF_NO_OTHER_DATA_AVAILABLE );
185+ parameters .setFreshness (ValidatorContexts .all (), CertificateSources .all (), TimeBasedContexts .all (),Duration .ofDays (0 ));
186+
187+
188+ RevocationDataValidator validator = validatorChainBuilder .buildRevocationDataValidator ();
189+ validatorChainBuilder .withRevocationDataValidatorFactory (()->validator );
190+
191+ validator .validate (report , baseContext , crlSigner , checkDate );
192+
193+ AssertValidationReport .assertThat (report , a -> a
194+ .hasNumberOfFailures (1 )
195+ .hasLogItem (l -> l .withMessage (CRLValidator .CERTIFICATE_IN_ISSUER_CHAIN ))
196+ );
197+ }
198+
199+ @ Test
200+ public void crlSignerIssuerIsValidatedCertificate () throws Exception {
201+
202+ String rootCertFileName = CRL_TEST_SOURCE_FOLDER + "crlSignerInValidatedChain/ca.cert.pem" ;
203+ String intermediateFileName = CRL_TEST_SOURCE_FOLDER + "crlSignerInValidatedChain/intermediate.cert.pem" ;
204+ String intermediate2FileName = CRL_TEST_SOURCE_FOLDER + "crlSignerInValidatedChain/intermediate2.cert.pem" ;
205+ String crlSignerKeyFileName = CRL_TEST_SOURCE_FOLDER + "keys/crl-key.pem" ;
206+ String crlSignerFileName = CRL_TEST_SOURCE_FOLDER + "crlSignerInValidatedChain/crl-issuer.cert.pem" ;
207+ String checkCertFileName = CRL_TEST_SOURCE_FOLDER + "crlSignerInValidatedChain/sign.cert.pem" ;
208+
209+ X509Certificate caCert = (X509Certificate ) PemFileHelper .readFirstChain (rootCertFileName )[0 ];
210+ X509Certificate intermediateCert = (X509Certificate ) PemFileHelper .readFirstChain (intermediateFileName )[0 ];
211+ X509Certificate intermediate2Cert = (X509Certificate ) PemFileHelper .readFirstChain (intermediate2FileName )[0 ];
212+ X509Certificate crlSigner = (X509Certificate ) PemFileHelper .readFirstChain (crlSignerFileName )[0 ];
213+ PrivateKey crlPrivateKey = PemFileHelper .readFirstKey (crlSignerKeyFileName , PASSWORD );
214+ X509Certificate checkCert = (X509Certificate ) PemFileHelper .readFirstChain (checkCertFileName )[0 ];
215+
216+
217+ certificateRetriever .addTrustedCertificates (Collections .singletonList (caCert ));
218+ certificateRetriever .addKnownCertificates (Collections .singletonList (crlSigner ));
219+ certificateRetriever .addKnownCertificates (Collections .singletonList (intermediateCert ));
220+ certificateRetriever .addKnownCertificates (Collections .singletonList (intermediate2Cert ));
221+
222+ Date checkDate = TimeTestUtil .TEST_DATE_TIME ;
223+ Date revocationDate = DateTimeUtil .addDaysToDate (checkDate , -1 );
224+ TestCrlBuilder builder = new TestCrlBuilder (crlSigner , crlPrivateKey , checkDate );
225+ builder .setNextUpdate (DateTimeUtil .addDaysToDate (checkDate , 10 ));
226+ //builder.addCrlEntry(caCert, revocationDate, FACTORY.createCRLReason().getKeyCompromise());
227+ //TestCrlClientWrapper crlClient = new TestCrlClientWrapper(new TestCrlClient().addBuilderForCertIssuer(builder));
228+
229+ ValidationCrlClient crlClient = (ValidationCrlClient ) parameters .getCrlClients ().get (0 );
230+ crlClient .addCrl ((X509CRL ) CertificateUtil .parseCrlFromBytes (builder .makeCrl ()), checkDate , TimeBasedContext .HISTORICAL );
231+
232+ ValidationReport report = new ValidationReport ();
233+ //certificateRetriever.addTrustedCertificates(Collections.singletonList(caCert));
234+
235+ parameters .setRevocationOnlineFetching (ValidatorContexts .all (), CertificateSources .all (), TimeBasedContexts .all (), OnlineFetching .FETCH_IF_NO_OTHER_DATA_AVAILABLE );
236+ parameters .setFreshness (ValidatorContexts .all (), CertificateSources .all (), TimeBasedContexts .all (),Duration .ofDays (0 ));
237+
238+
239+ RevocationDataValidator validator = validatorChainBuilder .buildRevocationDataValidator ();
240+ validatorChainBuilder .withRevocationDataValidatorFactory (()->validator );
241+
242+ validator .validate (report , baseContext , intermediateCert , checkDate );
243+
244+ AssertValidationReport .assertThat (report , a -> a
245+ .hasNumberOfFailures (1 )
246+ .hasLogItem (l -> l .withMessage (CRLValidator .CERTIFICATE_IN_ISSUER_CHAIN ))
247+ );
248+ }
143249}
250+
0 commit comments