Skip to content

Commit 4950196

Browse files
author
Alexandr Pliushchou
committed
add country specific LOTL parsing
DEVSIX-9201
1 parent b08821e commit 4950196

26 files changed

+53770
-248
lines changed

sharpenConfiguration.xml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -539,9 +539,13 @@
539539
<file path="com/itextpdf/signatures/testutils/report/xml/ReportNamespaceContext.java"/>
540540
<file path="com/itextpdf/signatures/testutils/report/xml/XmlReportTestTool.java"/>
541541
</fileset>
542-
<fileset reason="Different xml reading implementation on .NET and java">
543-
<file path="com/itextpdf/signatures/XmlCertificateRetriever.java"/>
544-
<file path="com/itextpdf/signatures/XmlCertificateHandler.java"/>
542+
<fileset reason="Different xml SAX reading implementation on .NET and java">
543+
<file path="com/itextpdf/signatures/validation/AbstractXmlCertificateHandler.java"/>
544+
<file path="com/itextpdf/signatures/validation/XmlCertificateRetriever.java"/>
545+
</fileset>
546+
<fileset reason="LocalDateTime and DateTime have different constructors and parsing">
547+
<file path="com/itextpdf/signatures/validation/ServiceStatusInfo.java"/>
548+
<file path="com/itextpdf/signatures/validation/XmlCertificateRetrieverTest.java"/>
545549
</fileset>
546550
<!-- jsoup -->
547551
<file path="com/itextpdf/styledxmlparser/jsoup/PortUtil.java" />

sign/src/main/java/com/itextpdf/signatures/XmlCertificateHandler.java

Lines changed: 0 additions & 73 deletions
This file was deleted.

sign/src/main/java/com/itextpdf/signatures/XmlCertificateRetriever.java

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.itextpdf.signatures.validation;
2+
3+
import com.itextpdf.bouncycastleconnector.BouncyCastleFactoryCreator;
4+
import com.itextpdf.commons.bouncycastle.IBouncyCastleFactory;
5+
import com.itextpdf.commons.bouncycastle.cert.IX509CertificateHolder;
6+
import com.itextpdf.commons.bouncycastle.cert.jcajce.IJcaX509CertificateConverter;
7+
import com.itextpdf.kernel.exceptions.PdfException;
8+
import com.itextpdf.signatures.exceptions.SignExceptionMessageConstant;
9+
import org.xml.sax.helpers.DefaultHandler;
10+
import org.xml.sax.Attributes;
11+
12+
import java.io.IOException;
13+
import java.security.cert.Certificate;
14+
import java.security.cert.CertificateException;
15+
import java.util.Base64;
16+
import java.util.List;
17+
18+
abstract class AbstractXmlCertificateHandler extends DefaultHandler {
19+
20+
private static final IBouncyCastleFactory BOUNCY_CASTLE_FACTORY = BouncyCastleFactoryCreator.getFactory();
21+
22+
private static final IJcaX509CertificateConverter X509_CERTIFICATE_CONVERTER = BOUNCY_CASTLE_FACTORY
23+
.createJcaX509CertificateConverter().setProvider(BOUNCY_CASTLE_FACTORY.getProvider());
24+
25+
abstract IServiceContext getServiceContext(Certificate certificate);
26+
27+
abstract List<Certificate> getCertificateList();
28+
29+
@Override
30+
public void startElement(String uri, String localName, String qName, Attributes attributes) {}
31+
32+
@Override
33+
public void endElement(String uri, String localName, String qName) {}
34+
35+
@Override
36+
public void characters(char[] ch, int start, int length) {}
37+
38+
Certificate getCertificateFromEncodedData(String certificateString) {
39+
try {
40+
byte[] bytes = Base64.getDecoder().decode(certificateString);
41+
IX509CertificateHolder certificateHolder = BOUNCY_CASTLE_FACTORY
42+
.createX509CertificateHolder(bytes);
43+
return X509_CERTIFICATE_CONVERTER.getCertificate(certificateHolder);
44+
} catch (CertificateException | IOException e) {
45+
throw new PdfException(SignExceptionMessageConstant.FAILED_TO_RETRIEVE_CERTIFICATE, e);
46+
}
47+
}
48+
49+
abstract void clear();
50+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.itextpdf.signatures.validation;
2+
3+
import java.security.cert.Certificate;
4+
import java.time.LocalDateTime;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
class CountryServiceContext implements IServiceContext {
9+
10+
private List<Certificate> certificates;
11+
12+
private String serviceType;
13+
14+
//It is expected that service statuses are ordered starting from the newest one.
15+
private final List<ServiceStatusInfo> serviceStatusInfos = new ArrayList<>();
16+
17+
CountryServiceContext() {
18+
//empty constructor
19+
}
20+
21+
@Override
22+
public List<Certificate> getCertificates() {
23+
return new ArrayList<>(certificates);
24+
}
25+
26+
@Override
27+
public void addCertificate(Certificate certificate) {
28+
if (certificates == null) {
29+
certificates = new ArrayList<>();
30+
}
31+
32+
certificates.add(certificate);
33+
}
34+
35+
void setServiceType(String serviceType) {
36+
this.serviceType = serviceType;
37+
}
38+
39+
String getServiceType() {
40+
return serviceType;
41+
}
42+
43+
void addNewServiceStatus(ServiceStatusInfo serviceStatusInfo) {
44+
serviceStatusInfos.add(serviceStatusInfo);
45+
}
46+
47+
String getServiceStatusByDate(LocalDateTime time) {
48+
for (ServiceStatusInfo serviceStatusInfo: serviceStatusInfos) {
49+
if (serviceStatusInfo.getServiceStatusStartingTime().isBefore(time)) {
50+
return serviceStatusInfo.getServiceStatus();
51+
}
52+
}
53+
54+
return null;
55+
}
56+
57+
ServiceStatusInfo getCurrentStatusInfo() {
58+
return serviceStatusInfos.get(0);
59+
}
60+
61+
int getServiceStatusInfosSize() {
62+
return serviceStatusInfos.size();
63+
}
64+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.itextpdf.signatures.validation;
2+
3+
import java.security.cert.Certificate;
4+
import java.util.List;
5+
6+
interface IServiceContext {
7+
8+
List<Certificate> getCertificates();
9+
10+
void addCertificate(Certificate certificate);
11+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.itextpdf.signatures.validation;
2+
3+
import java.time.LocalDateTime;
4+
import java.time.format.DateTimeFormatter;
5+
6+
class ServiceStatusInfo {
7+
8+
private String serviceStatus;
9+
10+
//Local time is used here because it is required to use UTC in a trusted lists, so no offset shall be presented.
11+
private LocalDateTime serviceStatusStartingTime;
12+
13+
private final DateTimeFormatter statusStartDateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
14+
15+
ServiceStatusInfo() {
16+
// empty constructor
17+
}
18+
19+
ServiceStatusInfo(String serviceStatus, LocalDateTime serviceStatusStartingTime) {
20+
this.serviceStatus = serviceStatus;
21+
this.serviceStatusStartingTime = serviceStatusStartingTime;
22+
}
23+
24+
void setServiceStatus(String serviceStatus) {
25+
this.serviceStatus = serviceStatus;
26+
}
27+
28+
String getServiceStatus() {
29+
return serviceStatus;
30+
}
31+
32+
void setServiceStatusStartingTime(String timeString) {
33+
this.serviceStatusStartingTime = statusStartDateFormat.parse(timeString, LocalDateTime::from);
34+
}
35+
36+
37+
void setServiceStatusStartingTime(LocalDateTime serviceStatusStartingTime) {
38+
this.serviceStatusStartingTime = serviceStatusStartingTime;
39+
}
40+
41+
LocalDateTime getServiceStatusStartingTime() {
42+
return serviceStatusStartingTime;
43+
}
44+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.itextpdf.signatures.validation;
2+
3+
import java.security.cert.Certificate;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
class SimpleServiceContext implements IServiceContext {
8+
9+
private List<Certificate> certificates;
10+
11+
SimpleServiceContext(Certificate certificate) {
12+
this.certificates = new ArrayList<>();
13+
certificates.add(certificate);
14+
}
15+
16+
@Override
17+
public List<Certificate> getCertificates() {
18+
return new ArrayList<>(certificates);
19+
}
20+
21+
@Override
22+
public void addCertificate(Certificate certificate) {
23+
if (certificates == null) {
24+
certificates = new ArrayList<>();
25+
}
26+
27+
certificates.add(certificate);
28+
}
29+
}

0 commit comments

Comments
 (0)