@@ -27,13 +27,15 @@ This file is part of the iText (R) project.
27
27
import com .itextpdf .commons .bouncycastle .operator .AbstractOperatorCreationException ;
28
28
import com .itextpdf .commons .bouncycastle .pkcs .AbstractPKCSException ;
29
29
import com .itextpdf .commons .utils .DateTimeUtil ;
30
+ import com .itextpdf .signatures .CertificateUtil ;
30
31
import com .itextpdf .signatures .IssuingCertificateRetriever ;
31
32
import com .itextpdf .signatures .testutils .PemFileHelper ;
32
33
import com .itextpdf .signatures .testutils .TimeTestUtil ;
33
34
import com .itextpdf .signatures .testutils .builder .TestCrlBuilder ;
34
35
import com .itextpdf .signatures .testutils .builder .TestOcspResponseBuilder ;
35
36
import com .itextpdf .signatures .testutils .client .TestCrlClient ;
36
37
import com .itextpdf .signatures .testutils .client .TestOcspClient ;
38
+ import com .itextpdf .signatures .validation .SignatureValidationProperties .OnlineFetching ;
37
39
import com .itextpdf .signatures .validation .context .CertificateSource ;
38
40
import com .itextpdf .signatures .validation .context .CertificateSources ;
39
41
import com .itextpdf .signatures .validation .context .TimeBasedContext ;
@@ -44,6 +46,10 @@ This file is part of the iText (R) project.
44
46
import com .itextpdf .signatures .validation .report .ReportItem ;
45
47
import com .itextpdf .signatures .validation .report .ValidationReport ;
46
48
import com .itextpdf .test .ExtendedITextTest ;
49
+
50
+ import java .security .cert .X509CRL ;
51
+ import java .time .Duration ;
52
+ import java .util .Date ;
47
53
import org .junit .jupiter .api .BeforeEach ;
48
54
import org .junit .jupiter .api .BeforeAll ;
49
55
import org .junit .jupiter .api .Test ;
@@ -61,6 +67,10 @@ public class RevocationDataValidatorIntegrationTest extends ExtendedITextTest {
61
67
private static final IBouncyCastleFactory FACTORY = BouncyCastleFactoryCreator .getFactory ();
62
68
private static final String SOURCE_FOLDER =
63
69
"./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
+
64
74
private static final char [] PASSWORD = "testpassphrase" .toCharArray ();
65
75
66
76
@@ -140,4 +150,101 @@ public void crlWithOnlySomeReasonsTest() throws Exception {
140
150
));
141
151
142
152
}
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
+ }
143
249
}
250
+
0 commit comments