From cb466e9783799e028fda12891f6e94d43a8249d7 Mon Sep 17 00:00:00 2001 From: kaggis Date: Fri, 18 Sep 2020 13:18:15 +0300 Subject: [PATCH] Revert "ET-29 TL source trust source" --- Jenkinsfile | 50 ----- README.md | 110 ---------- eseal/.gitignore | 4 - eseal/pom.xml | 108 ---------- .../java/gr/grnet/eseal/KeyStoreType.java | 9 - .../gr/grnet/eseal/KeystoreTrustSource.java | 54 ----- .../java/gr/grnet/eseal/PDFValidator.java | 153 -------------- .../java/gr/grnet/eseal/TLTrustSource.java | 113 ---------- .../java/gr/grnet/eseal/TrustedListURL.java | 24 --- .../java/gr/grnet/eseal/ValidationLevel.java | 16 -- .../java/gr/grnet/eseal/ValidationReport.java | 82 -------- .../java/gr/grnet/eseal/ValidationResult.java | 38 ---- .../eseal/X509CertificateTrustSource.java | 55 ----- .../grnet/eseal/TestKeystoreTrustSource.java | 64 ------ .../java/gr/grnet/eseal/TestPDFValidator.java | 195 ------------------ .../eseal/TestX509CertificateTrustSource.java | 71 ------- eseal/src/test/resources/declaration.pdf | Bin 80099 -> 0 bytes eseal/src/test/resources/simple-no-sign.pdf | Bin 3028 -> 0 bytes .../trustsource/eseal.truststore.jks | Bin 2204 -> 0 bytes .../test/resources/x509source/unknownCA.pem | 28 --- .../src/test/resources/x509source/x509CA.cer | Bin 2137 -> 0 bytes 21 files changed, 1174 deletions(-) delete mode 100644 Jenkinsfile delete mode 100644 eseal/.gitignore delete mode 100644 eseal/pom.xml delete mode 100644 eseal/src/main/java/gr/grnet/eseal/KeyStoreType.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/KeystoreTrustSource.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/PDFValidator.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/TLTrustSource.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/TrustedListURL.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/ValidationLevel.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/ValidationReport.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/ValidationResult.java delete mode 100644 eseal/src/main/java/gr/grnet/eseal/X509CertificateTrustSource.java delete mode 100644 eseal/src/test/java/gr/grnet/eseal/TestKeystoreTrustSource.java delete mode 100644 eseal/src/test/java/gr/grnet/eseal/TestPDFValidator.java delete mode 100644 eseal/src/test/java/gr/grnet/eseal/TestX509CertificateTrustSource.java delete mode 100644 eseal/src/test/resources/declaration.pdf delete mode 100644 eseal/src/test/resources/simple-no-sign.pdf delete mode 100644 eseal/src/test/resources/trustsource/eseal.truststore.jks delete mode 100644 eseal/src/test/resources/x509source/unknownCA.pem delete mode 100644 eseal/src/test/resources/x509source/x509CA.cer diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 98284da..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,50 +0,0 @@ - -pipeline { - agent none - options { - checkoutToSubdirectory('gr.grnet.eseal') - newContainerPerStage() - } - environment { - PROJECT_DIR='gr.grnet.eseal' - } - stages { - stage('Library Testing & Packaging') { - agent { - docker { - image 'argo.registry:5000/epel-7-java18' - args '-u jenkins:jenkins' - } - } - steps { - echo 'Eseal library Packaging & Testing' - sh """ - mvn clean package cobertura:cobertura -Dcobertura.report.format=xml -f ${PROJECT_DIR}/eseal/pom.xml - """ - junit '**/target/surefire-reports/*.xml' - cobertura coberturaReportFile: '**/target/site/cobertura/coverage.xml' - } - post { - always { - cleanWs() - } - } - } - } - post { - success { - script{ - if ( env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'devel' ) { - slackSend( message: ":rocket: New version for <$BUILD_URL|$PROJECT_DIR>:$BRANCH_NAME Job: $JOB_NAME !") - } - } - } - failure { - script{ - if ( env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'devel' ) { - slackSend( message: ":rain_cloud: Build Failed for <$BUILD_URL|$PROJECT_DIR>:$BRANCH_NAME Job: $JOB_NAME") - } - } - } - } -} \ No newline at end of file diff --git a/README.md b/README.md index d2a77b8..204d37b 100644 --- a/README.md +++ b/README.md @@ -1,112 +1,2 @@ # gr.grnet.eseal E-signature library - -### PDF Validation using an X509 certificate - -```java -import gr.grnet.eseal.PDFValidator; -import gr.grnet.eseal.ValidationLevel; -import gr.grnet.eseal.ValidationReport; -import gr.grnet.eseal.X509CertificateTrustSource; - -public class Example -{ - public static void main( String[] args ) { - - // Initialise the pdf validator from a file source - PDFValidator pdf = new PDFValidator("/path/to/pdf/file"); - - - try { - - // Initialise the x509 trust source from a file source - X509CertificateTrustSource x509CertificateTrustSource = new X509CertificateTrustSource("/path/to/cert"); - - // Validate the document based on the provided trust source(x509 cert) and the validation severity - ValidationReport r = pdf.validate(ValidationLevel.BASIC_SIGNATURES, x509CertificateTrustSource); - - // get the result of the validation process - System.out.println(r.getValidationResult()); - - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } -} -``` - -### PDF Validation using a Java trustore - -```java -import gr.grnet.eseal.KeyStoreType; -import gr.grnet.eseal.KeystoreTrustSource; -import gr.grnet.eseal.PDFValidator; -import gr.grnet.eseal.ValidationReport; -import gr.grnet.eseal.ValidationLevel; - -public class Example2 -{ - public static void main( String[] args ) { - - // Initialise the pdf validator from a file source - PDFValidator pdf = new PDFValidator("/path/to/pdf"); - - - try { - - String keystorePath = "/path/to/trustore"; - String password = "eseal12345"; - - // Initialise the trustore trust source from a file source - KeystoreTrustSource keystoreTrustSource = new KeystoreTrustSource(keystorePath, password, KeyStoreType.JKS); - - // Validate the document based on the provided trust source(trustore) and the validation severity - ValidationReport r = pdf.validate(ValidationLevel.BASIC_SIGNATURES, keystoreTrustSource); - - // get the result of the validation process - System.out.println(r.getValidationResult()); - - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } -} - -``` - -### PDF Validation using a Trusted List - -```java -import gr.grnet.eseal.PDFValidator; -import gr.grnet.eseal.TLTrustSource; -import gr.grnet.eseal.ValidationLevel; -import gr.grnet.eseal.ValidationReport; -import gr.grnet.eseal.TrustedListURL; - -public class Example3 { - - public static void main( String[] args ) { - - // Initialise the pdf validator from a file source - PDFValidator pdf = new PDFValidator("/path/to/pdf"); - - - try { - - // Initialise the trusted list source with the greek trusted list( https://www.eett.gr/tsl/EL-TSL.xml) - TLTrustSource tlTrustSource = new TLTrustSource(TrustedListURL.GREECE); - - // Validate the document based on the provided trust source(trusted list) and the validation severity - ValidationReport r = pdf.validate(ValidationLevel.BASIC_SIGNATURES, tlTrustSource); - - // get the result of the validation process - System.out.println(r.getValidationResult()); - - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } -} - -``` - diff --git a/eseal/.gitignore b/eseal/.gitignore deleted file mode 100644 index 2658748..0000000 --- a/eseal/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.iml -/target/ -dependency-reduced-pom.xml -.idea diff --git a/eseal/pom.xml b/eseal/pom.xml deleted file mode 100644 index 998a6d7..0000000 --- a/eseal/pom.xml +++ /dev/null @@ -1,108 +0,0 @@ - - 4.0.0 - gr.grnet.eseal - eseal - jar - 0.1 - eseal - A wrapper library for the DSS framework - http://maven.apache.org - - - - UTF-8 - 1.8 - 1.8 - - - - - - - junit - junit - 4.13 - test - - - org.hamcrest - hamcrest-all - 1.3 - test - - - eu.europa.ec.joinup.sd-dss - dss-tsl-validation - 5.7 - - - eu.europa.ec.joinup.sd-dss - dss-pades - 5.7 - - - eu.europa.ec.joinup.sd-dss - dss-pades-pdfbox - 5.7 - - - eu.europa.ec.joinup.sd-dss - dss-utils-apache-commons - 5.7 - - - eu.europa.ec.joinup.sd-dss - dss-model - 5.7 - - - eu.europa.ec.joinup.sd-dss - dss-service - 5.7 - - - - - - cefdigital - cefdigital - https://ec.europa.eu/cefdigital/artifact/content/repositories/esignaturedss/ - - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.0 - - - - package - - shade - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - META-INF/*.DES - - - - - - - - - - diff --git a/eseal/src/main/java/gr/grnet/eseal/KeyStoreType.java b/eseal/src/main/java/gr/grnet/eseal/KeyStoreType.java deleted file mode 100644 index b10e122..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/KeyStoreType.java +++ /dev/null @@ -1,9 +0,0 @@ -package gr.grnet.eseal; - -public enum KeyStoreType { - JKS, - PKCS12; - - private KeyStoreType() { - } -} \ No newline at end of file diff --git a/eseal/src/main/java/gr/grnet/eseal/KeystoreTrustSource.java b/eseal/src/main/java/gr/grnet/eseal/KeystoreTrustSource.java deleted file mode 100644 index 0fd35b0..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/KeystoreTrustSource.java +++ /dev/null @@ -1,54 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.spi.x509.CommonTrustedCertificateSource; -import eu.europa.esig.dss.spi.x509.KeyStoreCertificateSource; -import java.io.File; -import java.io.IOException; - -/** - *

- * Trust source that will be supplied to the pdf validation process based on a Java keystore. - *

- */ -public class KeystoreTrustSource { - - private KeyStoreCertificateSource truststore; - private CommonTrustedCertificateSource commonTrustedCertificateSource; - - /** Creates a keystore trust source validator from the given keystore(path to keystore). - * @param filepath path to the keystore file. - * @param password password for the keystore - * @param type of the keystore - */ - public KeystoreTrustSource(String filepath, String password, KeyStoreType type) throws IOException{ - this.truststore = new KeyStoreCertificateSource(filepath, type.name(), password); - this.buildSource(); - } - - /** Creates a keystore trust source validator from the given keystore(path to keystore). - * @param file representing the keystore file. - * @param password password for the keystore - * @param type of the keystore - */ - public KeystoreTrustSource(File file, String password, KeyStoreType type) throws IOException{ - this.truststore = new KeyStoreCertificateSource(file, type.name(), password); - this.buildSource(); - } - - /** - * Builds the dss common trusted certificate source with the present keystore - */ - private void buildSource() { - this.commonTrustedCertificateSource = new CommonTrustedCertificateSource(); - this.commonTrustedCertificateSource.importAsTrusted(this.truststore); - } - - public CommonTrustedCertificateSource getCommonTrustedCertificateSource() { - return commonTrustedCertificateSource; - } - - public KeyStoreCertificateSource getTruststore() { - return truststore; - } -} - diff --git a/eseal/src/main/java/gr/grnet/eseal/PDFValidator.java b/eseal/src/main/java/gr/grnet/eseal/PDFValidator.java deleted file mode 100644 index bf5709a..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/PDFValidator.java +++ /dev/null @@ -1,153 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.model.FileDocument; -import eu.europa.esig.dss.pades.validation.PDFDocumentValidator; -import eu.europa.esig.dss.service.crl.OnlineCRLSource; -import eu.europa.esig.dss.service.http.commons.CommonsDataLoader; -import eu.europa.esig.dss.service.ocsp.OnlineOCSPSource; -import eu.europa.esig.dss.spi.tsl.TrustedListsCertificateSource; -import eu.europa.esig.dss.validation.CertificateVerifier; -import eu.europa.esig.dss.validation.CommonCertificateVerifier; -import eu.europa.esig.dss.validation.reports.Reports; -import java.io.File; - -/** - *

- * PDFValidator is the main building block of the validation process. - *

- */ -public class PDFValidator { - - private FileDocument pdfDocument; - - /** Creates a pdf validator from the given pdf(path to pdf). - * @param filepath path to the file. - */ - public PDFValidator(String filepath) { - this.pdfDocument = new FileDocument(filepath); - } - - /** Creates a pdf validator from the given pdf(File object). - * @param file java.io.File object representing the pdf document. - */ - public PDFValidator(File file) { - this.pdfDocument = new FileDocument(file); - } - - /** Gets the pdf document. - * @return A FileDocument representing the pdf of the validation - */ - public FileDocument getPdfDocument() { - return this.pdfDocument; - } - - /** - * Performs the validation process with the given trust source - * @param validationLevel the level of validation severity - * @param x509CertificateTrustSource the trust source that will be used to validate the document - * @return ValidationReport that contains information regarding the validation process - */ - public ValidationReport validate(ValidationLevel validationLevel, X509CertificateTrustSource x509CertificateTrustSource) { - - // build the certificate verifier for the pdf validator - CertificateVerifier cv = new CommonCertificateVerifier(); - CommonsDataLoader commonsDataLoader = new CommonsDataLoader(); - cv.setCrlSource(new OnlineCRLSource()); - cv.setOcspSource(new OnlineOCSPSource()); - cv.setDataLoader(commonsDataLoader); - cv.setTrustedCertSources(x509CertificateTrustSource.getCommonTrustedCertificateSource()); - - // initialize the dss validator - PDFDocumentValidator dssValidator = new PDFDocumentValidator(this.pdfDocument); - dssValidator.setValidationLevel(determineLevel(validationLevel)); - dssValidator.setCertificateVerifier(cv); - - Reports r = dssValidator.validateDocument(); - - return new ValidationReport(r); - } - - /** - * Performs the validation process with the given trust source - * @param validationLevel the level of validation severity - * @param tlTrustSource the trust source that will be used to validate the document - * @return ValidationReport that contains information regarding the validation process - */ - public ValidationReport validate(ValidationLevel validationLevel, TLTrustSource tlTrustSource) { - - TrustedListsCertificateSource trustedListsCertificateSource = new TrustedListsCertificateSource(); - - // build the certificate verifier for the pdf validator - CertificateVerifier cv = new CommonCertificateVerifier(); - CommonsDataLoader commonsDataLoader = new CommonsDataLoader(); - cv.setCrlSource(new OnlineCRLSource()); - cv.setOcspSource(new OnlineOCSPSource()); - cv.setDataLoader(commonsDataLoader); - cv.setTrustedCertSources(trustedListsCertificateSource); - - tlTrustSource.getJob().setTrustedListCertificateSource(trustedListsCertificateSource); - tlTrustSource.getJob().onlineRefresh(); - - // initialize the dss validator - PDFDocumentValidator dssValidator = new PDFDocumentValidator(this.pdfDocument); - dssValidator.setValidationLevel(determineLevel(validationLevel)); - dssValidator.setCertificateVerifier(cv); - - Reports r = dssValidator.validateDocument(); - - return new ValidationReport(r); - } - - /** - * Performs the validation process with the given trust source - * @param validationLevel the level of validation severity - * @param keystoreTrustSource the trust source that will be used to validate the document - * @return ValidationReport that contains information regarding the validation process - */ - public ValidationReport validate(ValidationLevel validationLevel, KeystoreTrustSource keystoreTrustSource) { - - // build the certificate verifier for the pdf validator - CertificateVerifier cv = new CommonCertificateVerifier(); - CommonsDataLoader commonsDataLoader = new CommonsDataLoader(); - cv.setCrlSource(new OnlineCRLSource()); - cv.setOcspSource(new OnlineOCSPSource()); - cv.setDataLoader(commonsDataLoader); - cv.setTrustedCertSources(keystoreTrustSource.getCommonTrustedCertificateSource()); - - // initialize the dss validator - PDFDocumentValidator dssValidator = new PDFDocumentValidator(this.pdfDocument); - dssValidator.setValidationLevel(determineLevel(validationLevel)); - dssValidator.setCertificateVerifier(cv); - - Reports r = dssValidator.validateDocument(); - - return new ValidationReport(r); - } - - /** - * Maps the library's validation level to the proper dss one - * @param validationLevel validation level to be mapped - * @return eu.europa.esig.dss.validation.executor.ValidationLevel dss validation level - */ - public eu.europa.esig.dss.validation.executor.ValidationLevel determineLevel(ValidationLevel validationLevel) { - - eu.europa.esig.dss.validation.executor.ValidationLevel vl = eu.europa.esig.dss.validation.executor.ValidationLevel.BASIC_SIGNATURES; - - switch ( validationLevel) { - case BASIC_SIGNATURES: - return vl; - case TIMESTAMPS: - vl = eu.europa.esig.dss.validation.executor.ValidationLevel.TIMESTAMPS; - return vl; - case LONG_TERM_DATA: - vl = eu.europa.esig.dss.validation.executor.ValidationLevel.LONG_TERM_DATA; - return vl; - case ARCHIVAL_DATA: - vl = eu.europa.esig.dss.validation.executor.ValidationLevel.ARCHIVAL_DATA; - return vl; - } - - return vl; - } - -} diff --git a/eseal/src/main/java/gr/grnet/eseal/TLTrustSource.java b/eseal/src/main/java/gr/grnet/eseal/TLTrustSource.java deleted file mode 100644 index 762da26..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/TLTrustSource.java +++ /dev/null @@ -1,113 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.service.http.commons.CommonsDataLoader; -import eu.europa.esig.dss.service.http.commons.FileCacheDataLoader; -import eu.europa.esig.dss.spi.client.http.DSSFileLoader; -import eu.europa.esig.dss.spi.client.http.IgnoreDataLoader; -import eu.europa.esig.dss.spi.tsl.TrustedListsCertificateSource; -import eu.europa.esig.dss.spi.x509.CommonCertificateSource; -import eu.europa.esig.dss.tsl.alerts.TLAlert; -import eu.europa.esig.dss.tsl.alerts.detections.TLExpirationDetection; -import eu.europa.esig.dss.tsl.alerts.detections.TLSignatureErrorDetection; -import eu.europa.esig.dss.tsl.alerts.handlers.log.LogTLExpirationAlertHandler; -import eu.europa.esig.dss.tsl.alerts.handlers.log.LogTLSignatureErrorAlertHandler; -import eu.europa.esig.dss.tsl.cache.CacheCleaner; -import eu.europa.esig.dss.tsl.job.TLValidationJob; -import eu.europa.esig.dss.tsl.source.TLSource; -import eu.europa.esig.dss.tsl.sync.AcceptAllStrategy; -import java.io.File; -import java.util.Arrays; - -/** - *

- * Trust source that will be supplied to the pdf validation process based on a trusted list. - *

- */ -public class TLTrustSource { - - private TLValidationJob job; - - /** Creates a trusted list trust source. - */ - public TLTrustSource(TrustedListURL trustedListURL) { - this(trustedListURL.toString()); - } - - /** Creates a trusted list trust source from the provided trusted list. - * @param url for the trusted list. - */ - - public TLTrustSource(String url) { - this.job = this.buildSource(url); - } - - public TLValidationJob getJob() { - return job; - } - - private TLValidationJob buildSource(String url) { - TLValidationJob job = new TLValidationJob(); - job.setOfflineDataLoader(offlineLoader()); - job.setOnlineDataLoader(onlineLoader()); - job.setTrustedListCertificateSource(new TrustedListsCertificateSource()); - job.setSynchronizationStrategy(new AcceptAllStrategy()); - job.setCacheCleaner(cacheCleaner()); - - TLSource tlSource = new TLSource(); - tlSource.setUrl(url); - tlSource.setCertificateSource(new CommonCertificateSource()); - job.setTrustedListSources(tlSource); - job.setTLAlerts(Arrays.asList(tlSigningAlert(), tlExpirationDetection())); - - return job; - } - - - private static DSSFileLoader onlineLoader() { - FileCacheDataLoader onlineFileLoader = new FileCacheDataLoader(); - onlineFileLoader.setCacheExpirationTime(100); - onlineFileLoader.setDataLoader(new CommonsDataLoader()); - onlineFileLoader.setFileCacheDirectory(tlCacheDirectory()); - - return onlineFileLoader; - } - - private static File tlCacheDirectory() { - File rootFolder = new File(System.getProperty("java.io.tmpdir")); - File tslCache = new File(rootFolder, "dss-tsl-loader2"); - if (tslCache.mkdirs()) { - System.out.println(tslCache.getAbsolutePath()); - } - return tslCache; - } - - private static TLAlert tlSigningAlert() { - TLSignatureErrorDetection signingDetection = new TLSignatureErrorDetection(); - LogTLSignatureErrorAlertHandler handler = new LogTLSignatureErrorAlertHandler(); - return new TLAlert(signingDetection, handler); - } - - private static TLAlert tlExpirationDetection() { - TLExpirationDetection expirationDetection = new TLExpirationDetection(); - LogTLExpirationAlertHandler handler = new LogTLExpirationAlertHandler(); - return new TLAlert(expirationDetection, handler); - } - - private static CacheCleaner cacheCleaner() { - CacheCleaner cacheCleaner = new CacheCleaner(); - cacheCleaner.setCleanFileSystem(true); - cacheCleaner.setCleanMemory(true); - cacheCleaner.setDSSFileLoader(offlineLoader()); - return cacheCleaner; - } - - private static DSSFileLoader offlineLoader() { - FileCacheDataLoader offlineFileLoader = new FileCacheDataLoader(); - offlineFileLoader.setDataLoader(new IgnoreDataLoader()); - offlineFileLoader.setCacheExpirationTime(100); - offlineFileLoader.setFileCacheDirectory(tlCacheDirectory()); - return offlineFileLoader; - } - -} - diff --git a/eseal/src/main/java/gr/grnet/eseal/TrustedListURL.java b/eseal/src/main/java/gr/grnet/eseal/TrustedListURL.java deleted file mode 100644 index cb3bd6f..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/TrustedListURL.java +++ /dev/null @@ -1,24 +0,0 @@ -package gr.grnet.eseal; - -/** - * Enum that contains available trusted lists. - * - *

- * For example, {@link #GREECE} contains the greek trusted list. - *

- */ -public enum TrustedListURL { - - GREECE("https://www.eett.gr/tsl/EL-TSL.xml"); - - private final String name; - - private TrustedListURL(String s) { - name = s; - } - - public String toString() { - return this.name; - } - -} diff --git a/eseal/src/main/java/gr/grnet/eseal/ValidationLevel.java b/eseal/src/main/java/gr/grnet/eseal/ValidationLevel.java deleted file mode 100644 index a7f5e25..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/ValidationLevel.java +++ /dev/null @@ -1,16 +0,0 @@ -package gr.grnet.eseal; - -/** - *

- * Validation level dictates the severity of the validation process. - *

- */ -public enum ValidationLevel { - BASIC_SIGNATURES, - TIMESTAMPS, - LONG_TERM_DATA, - ARCHIVAL_DATA; - - private ValidationLevel() { - } -} \ No newline at end of file diff --git a/eseal/src/main/java/gr/grnet/eseal/ValidationReport.java b/eseal/src/main/java/gr/grnet/eseal/ValidationReport.java deleted file mode 100644 index eb751ea..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/ValidationReport.java +++ /dev/null @@ -1,82 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.validation.reports.Reports; - -/** - *

- * ValidationReport holds information regarding the result of the validation process. - *

- * - */ -public class ValidationReport { - - private Reports rawDDSReport; - private ValidationResult validationResult ; - private String xmlSimpleReport; - private String xmlDetailedReport; - private String[] errors ; - private String[] warnings ; - - - /** Creates a validation report based on the result of a dss validator. - * @param ddsReport The dss report after the validation process. - */ - public ValidationReport(Reports ddsReport) { - this.rawDDSReport = ddsReport; - this.errors = new String[0]; - this.warnings = new String[0]; - this.xmlDetailedReport = ddsReport.getXmlDetailedReport(); - this.xmlSimpleReport = ddsReport.getXmlSimpleReport(); - - String signatureId = ddsReport.getDetailedReport().getFirstSignatureId(); - if (signatureId == null) { - this.validationResult = ValidationResult.NO_SIGNATURE; - } else { - String indication = ddsReport.getSimpleReport().getIndication(signatureId).name(); - - this.errors = new String[ddsReport.getDetailedReport().getErrors(signatureId).size()]; - ddsReport.getDetailedReport().getErrors(signatureId).toArray(this.errors); - - this.warnings = new String[ddsReport.getDetailedReport().getWarnings(signatureId).size()]; - ddsReport.getDetailedReport().getWarnings(signatureId).toArray(this.warnings); - - switch (indication) { - case "TOTAL_FAIL": - this.validationResult = ValidationResult.TOTAL_FAIL; - break; - case "INDETERMINATE": - this.validationResult = ValidationResult.INDETERMINATE; - break; - case "TOTAL_PASSED": - this.validationResult = ValidationResult.TOTAL_PASSED; - break; - } - } - } - - public Reports getRawDDSReport() { - return rawDDSReport; - } - - public ValidationResult getValidationResult() { - return validationResult; - } - - - public String getXmlSimpleReport() { - return xmlSimpleReport; - } - - - public String getXmlDetailedReport() { - return xmlDetailedReport; - } - - public String[] getErrors() { - return errors; - } - - public String[] getWarnings() { - return warnings; - } -} diff --git a/eseal/src/main/java/gr/grnet/eseal/ValidationResult.java b/eseal/src/main/java/gr/grnet/eseal/ValidationResult.java deleted file mode 100644 index 07459be..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/ValidationResult.java +++ /dev/null @@ -1,38 +0,0 @@ -package gr.grnet.eseal; - -/** - *

- * Validation Results that can be used to determine the outcome of a pdf validation process. - *

- * - *

- * Generally and following ETSI standard, the validation process of an electronic signature - * must provide one of these three following statuses: TOTAL-FAILED, TOTAL-PASSED or INDETERMINATE. - *

- * - *

- * A {@link #TOTAL_PASSED} response indicates that the signature has passed verification and it complies with the signature validation policy. - *

- * - *

- * A {@link #TOTAL_FAIL} response indicates that either the signature format is incorrect or that the digital signature value fails the verification. - *

- * - *

- * An {@link #INDETERMINATE} validation response indicates that the format and digital signature verifications have not failed - * but there is an insufficient information to determine if the electronic signature is valid. - *

- * - * *

- * An {@link #NO_SIGNATURE} validation response indicates that the document contained no signatures - *

- */ -public enum ValidationResult { - TOTAL_PASSED, - TOTAL_FAIL, - INDETERMINATE, - NO_SIGNATURE; - - private ValidationResult() { - } -} \ No newline at end of file diff --git a/eseal/src/main/java/gr/grnet/eseal/X509CertificateTrustSource.java b/eseal/src/main/java/gr/grnet/eseal/X509CertificateTrustSource.java deleted file mode 100644 index d0e5cad..0000000 --- a/eseal/src/main/java/gr/grnet/eseal/X509CertificateTrustSource.java +++ /dev/null @@ -1,55 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.model.x509.CertificateToken; -import eu.europa.esig.dss.spi.x509.CommonTrustedCertificateSource; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; - -/** - *

- * Trust source that will be supplied to the pdf validation process based on a x509 certificate source. - *

- */ -public class X509CertificateTrustSource { - - private X509Certificate cert; - private CommonTrustedCertificateSource commonTrustedCertificateSource; - - /** Creates an x509 certificate trust source validator from the given certificate(path to certificate). - * @param filepath path to the cert file. - */ - public X509CertificateTrustSource(String filepath) throws FileNotFoundException, CertificateException { - InputStream inStream = new FileInputStream(filepath); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - this.cert = (X509Certificate)cf.generateCertificate(inStream); - this.buildSource(); - } - - /** Creates an x509 certificate trust source validator from the given certificate. - * @param cert X509 certificate - */ - public X509CertificateTrustSource(X509Certificate cert) { - this.cert = cert; - this.buildSource(); - } - - public CommonTrustedCertificateSource getCommonTrustedCertificateSource() { - return commonTrustedCertificateSource; - } - - /** - * Builds the dss common trusted certificate source with the present x509 cert - */ - private void buildSource() { - CommonTrustedCertificateSource ctsf = new CommonTrustedCertificateSource(); - CertificateToken certificateToken = new CertificateToken(this.cert); - ctsf.addCertificate(certificateToken); - this.commonTrustedCertificateSource = ctsf; - } - -} diff --git a/eseal/src/test/java/gr/grnet/eseal/TestKeystoreTrustSource.java b/eseal/src/test/java/gr/grnet/eseal/TestKeystoreTrustSource.java deleted file mode 100644 index f00eda1..0000000 --- a/eseal/src/test/java/gr/grnet/eseal/TestKeystoreTrustSource.java +++ /dev/null @@ -1,64 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.spi.x509.CommonTrustedCertificateSource; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; - -public class TestKeystoreTrustSource { - - @Test - public void testX509CertificateTrustSourceFilePath() { - try { - KeystoreTrustSource keystoreTrustSource = - new KeystoreTrustSource( - TestX509CertificateTrustSource.class.getResource( - "/trustsource/eseal.truststore.jks").getFile(), - "eseal12345", - KeyStoreType.JKS); - - CommonTrustedCertificateSource commonTrustedCertificateSource = keystoreTrustSource.getCommonTrustedCertificateSource(); - assertEquals("Number of added certificates" , 1 ,commonTrustedCertificateSource.getNumberOfCertificates()); - assertEquals("Certificate info", - "C=GR,L=Athens,O=Ministry of Digital Governance,2.5.4.97=VATGR-997001671,OU=Class B - Private Key created and stored in software CSP,CN=Ministry of Digital Governance\\, Hellenic Republic,E=sec@mindigital.gr", - commonTrustedCertificateSource.getCertificates().get(0).getCertificate().getSubjectDN().getName()); - - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } - - @Test - public void testX509CertificateTrustSourceFile() { - try { - KeystoreTrustSource keystoreTrustSource = - new KeystoreTrustSource( - new File(TestX509CertificateTrustSource.class.getResource( - "/trustsource/eseal.truststore.jks").getFile()), - "eseal12345", - KeyStoreType.JKS); - - CommonTrustedCertificateSource commonTrustedCertificateSource = keystoreTrustSource.getCommonTrustedCertificateSource(); - assertEquals("Number of added certificates" , 1 ,commonTrustedCertificateSource.getNumberOfCertificates()); - assertEquals("Certificate info", - "C=GR,L=Athens,O=Ministry of Digital Governance,2.5.4.97=VATGR-997001671,OU=Class B - Private Key created and stored in software CSP,CN=Ministry of Digital Governance\\, Hellenic Republic,E=sec@mindigital.gr", - commonTrustedCertificateSource.getCertificates().get(0).getCertificate().getSubjectDN().getName()); - - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } - - @Test(expected = IOException.class) - public void testX509CertificateTrustSourceFileNotFound() throws IOException { - KeystoreTrustSource keystoreTrustSource = - new KeystoreTrustSource( - "/not/found", - "eseal12345", - KeyStoreType.JKS); - - } -} diff --git a/eseal/src/test/java/gr/grnet/eseal/TestPDFValidator.java b/eseal/src/test/java/gr/grnet/eseal/TestPDFValidator.java deleted file mode 100644 index 375cbce..0000000 --- a/eseal/src/test/java/gr/grnet/eseal/TestPDFValidator.java +++ /dev/null @@ -1,195 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.validation.executor.ValidationLevel; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import eu.europa.esig.dss.model.DSSException; -import org.junit.rules.ExpectedException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - - -public class TestPDFValidator { - - static final String testPDFpath = "/declaration.pdf"; - - @Rule - public ExpectedException exceptionRule = ExpectedException.none(); - - @BeforeClass - public static void setUpBeforeClass() { - // Assert that files are present - assertNotNull("PDF file declaration.pdf is missing", TestPDFValidator.class.getResource(testPDFpath)); - } - - @Test - public void testPdfLoadFromPath() { - // check that the pdf validator loads a file from a path - PDFValidator pdfValidator = new PDFValidator(TestPDFValidator.class.getResource(testPDFpath).getFile()); - assertNotNull("Loading of the pdf document from path", pdfValidator.getPdfDocument()); - } - - @Test - public void testPDFLoadFromFile() { - // check that the pdf validator loads a file from a File object - File pdfFile = new File(TestPDFValidator.class.getResource(testPDFpath).getFile()); - PDFValidator pdfValidator = new PDFValidator(pdfFile); - assertNotNull("Loading of the pdf document from file", pdfValidator.getPdfDocument()); - } - - @Test(expected = DSSException.class) - public void testPDFLoadInvalidPath() { - try { - // error when the pdf path is not valid - PDFValidator pdfValidator = new PDFValidator("/unknown/path"); - assertNotNull("Loading of the pdf document from file", pdfValidator.getPdfDocument()); - } catch (DSSException dsse) { - assertEquals("File not found exception", "File Not Found: /unknown/path", dsse.getMessage()); - throw dsse; - } - } - - @Test - public void testDetermineLevel() { - PDFValidator pdfValidator = new PDFValidator(TestPDFValidator.class.getResource(testPDFpath).getFile()); - assertEquals("Test BASIC_SIGNATURES mapping", ValidationLevel.BASIC_SIGNATURES, pdfValidator.determineLevel(gr.grnet.eseal.ValidationLevel.BASIC_SIGNATURES)); - assertEquals("Test TIMESTAMPS mapping",ValidationLevel.TIMESTAMPS, pdfValidator.determineLevel(gr.grnet.eseal.ValidationLevel.TIMESTAMPS)); - assertEquals("TEST LONG_TERM_DATA mapping",ValidationLevel.LONG_TERM_DATA, pdfValidator.determineLevel(gr.grnet.eseal.ValidationLevel.LONG_TERM_DATA)); - assertEquals("TEST ARCHIVAL_DATA mapping",ValidationLevel.ARCHIVAL_DATA, pdfValidator.determineLevel(gr.grnet.eseal.ValidationLevel.ARCHIVAL_DATA)); - } - - @Test - public void testValidateWithX509CertificateTrustSourceTotalPASS() { - - PDFValidator pdfValidator = new PDFValidator(TestPDFValidator.class.getResource(testPDFpath).getFile()); - X509Certificate cert = null ; - - try { - InputStream inStream = new FileInputStream(TestPDFValidator.class.getResource("/x509source/x509CA.cer").getFile()); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - cert = (X509Certificate) cf.generateCertificate(inStream); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - - X509CertificateTrustSource x509source = new X509CertificateTrustSource(cert); - - ValidationReport vr = pdfValidator.validate(gr.grnet.eseal.ValidationLevel.BASIC_SIGNATURES, x509source); - String[] errors = new String[]{"Unable to build a certificate chain until a trusted list!"}; - assertEquals(ValidationResult.TOTAL_PASSED, vr.getValidationResult()); - Assert.assertArrayEquals("Expected detailed warnings", new String[0], vr.getWarnings()); - Assert.assertArrayEquals("Expected detailed errors", errors, vr.getErrors()); - } - - @Test - public void testValidateWithX509CertificateTrustSourceINDETERMINATEandTIMESTAMPS() { - - PDFValidator pdfValidator = new PDFValidator(TestPDFValidator.class.getResource(testPDFpath).getFile()); - X509Certificate cert = null ; - - try { - InputStream inStream = new FileInputStream(TestPDFValidator.class.getResource("/x509source/unknownCA.pem").getFile()); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - cert = (X509Certificate) cf.generateCertificate(inStream); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - - X509CertificateTrustSource x509source = new X509CertificateTrustSource(cert); - - ValidationReport vr = pdfValidator.validate(gr.grnet.eseal.ValidationLevel.TIMESTAMPS, x509source); - - String[] warnings = new String[]{ - "The signature/seal is an INDETERMINATE AdES digital signature!", - "The signed attribute: 'signing-certificate' is present more than once!" - }; - - String[] errors = new String[]{ - "Unable to build a certificate chain until a trusted list!", - "The result of the Basic validation process is not conclusive!", - "The certificate chain for signature is not trusted, it does not contain a trust anchor.", - "The result of the timestamps validation process is not conclusive!", - "The certificate chain for timestamp is not trusted, it does not contain a trust anchor.", - }; - - assertEquals(ValidationResult.INDETERMINATE, vr.getValidationResult()); - Assert.assertArrayEquals("Expected detailed warnings", warnings, vr.getWarnings()); - Assert.assertArrayEquals("Expected detailed errors", errors, vr.getErrors()); - assertEquals(ValidationResult.INDETERMINATE, vr.getValidationResult()); - } - - @Test - public void testValidateWithX509CertificateTrustSourceNoSign() { - - PDFValidator pdfValidator = new PDFValidator(TestPDFValidator.class.getResource("/simple-no-sign.pdf").getFile()); - X509Certificate cert = null ; - - try { - InputStream inStream = new FileInputStream(TestPDFValidator.class.getResource("/x509source/x509CA.cer").getFile()); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - cert = (X509Certificate) cf.generateCertificate(inStream); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - - X509CertificateTrustSource x509source = new X509CertificateTrustSource(cert); - - ValidationReport vr = pdfValidator.validate(gr.grnet.eseal.ValidationLevel.BASIC_SIGNATURES, x509source); - assertEquals(ValidationResult.NO_SIGNATURE, vr.getValidationResult()); - Assert.assertArrayEquals("Expected detailed warnings", new String[0], vr.getWarnings()); - Assert.assertArrayEquals("Expected detailed errors", new String[0], vr.getErrors()); - } - - @Test - public void testValidateWithKeystoreTrustSourceTotalPASS() { - - PDFValidator pdfValidator = new PDFValidator(TestPDFValidator.class.getResource(testPDFpath).getFile()); - KeystoreTrustSource keystoreTrustSource = null ; - - try { - keystoreTrustSource = - new KeystoreTrustSource( - new File(TestX509CertificateTrustSource.class.getResource( - "/trustsource/eseal.truststore.jks").getFile()), - "eseal12345", - KeyStoreType.JKS); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - - ValidationReport vr = pdfValidator.validate(gr.grnet.eseal.ValidationLevel.BASIC_SIGNATURES, keystoreTrustSource); - String[] errors = new String[]{"Unable to build a certificate chain until a trusted list!"}; - assertEquals(ValidationResult.TOTAL_PASSED, vr.getValidationResult()); - Assert.assertArrayEquals("Expected detailed warnings", new String[0], vr.getWarnings()); - Assert.assertArrayEquals("Expected detailed errors", errors, vr.getErrors()); - } - - @Test - public void testValidateWithTLTrustSourceTotalPASS() { - - PDFValidator pdfValidator = new PDFValidator(TestPDFValidator.class.getResource(testPDFpath).getFile()); - - TLTrustSource tlTrustSource = new TLTrustSource(TrustedListURL.GREECE); - - ValidationReport vr = pdfValidator.validate(gr.grnet.eseal.ValidationLevel.BASIC_SIGNATURES, tlTrustSource); - String[] errors = new String[]{}; - String[] warnings = new String[]{ - "The certificate is not for eSig at issuance time!", - "The private key does not reside in a QSCD at issuance time!", - "The certificate is not for eSig at (best) signing time!", - "The private key does not reside in a QSCD at (best) signing time!", - "The trusted list is not well signed!", - "The signer's certificate does not have an expected key-usage!" - }; - assertEquals(ValidationResult.TOTAL_PASSED, vr.getValidationResult()); - Assert.assertArrayEquals("Expected detailed warnings", warnings, vr.getWarnings()); - Assert.assertArrayEquals("Expected detailed errors", errors, vr.getErrors()); - } -} diff --git a/eseal/src/test/java/gr/grnet/eseal/TestX509CertificateTrustSource.java b/eseal/src/test/java/gr/grnet/eseal/TestX509CertificateTrustSource.java deleted file mode 100644 index c0bb085..0000000 --- a/eseal/src/test/java/gr/grnet/eseal/TestX509CertificateTrustSource.java +++ /dev/null @@ -1,71 +0,0 @@ -package gr.grnet.eseal; - -import eu.europa.esig.dss.spi.x509.CommonTrustedCertificateSource; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; - -public class TestX509CertificateTrustSource { - - @Test - public void testX509CertificateTrustSourceFile() { - try { - X509CertificateTrustSource x509CertificateTrustSource = - new X509CertificateTrustSource(TestX509CertificateTrustSource.class.getResource("/x509source/x509CA.cer").getFile()); - - CommonTrustedCertificateSource commonTrustedCertificateSource = x509CertificateTrustSource.getCommonTrustedCertificateSource(); - assertEquals("Number of added certificates" , 1 ,commonTrustedCertificateSource.getNumberOfCertificates()); - assertEquals("Certificate info", - "EMAILADDRESS=sec@mindigital.gr, CN=\"Ministry of Digital Governance, Hellenic Republic\", OU=Class B - Private Key created and stored in software CSP, OID.2.5.4.97=VATGR-997001671, O=Ministry of Digital Governance, L=Athens, C=GR", - commonTrustedCertificateSource.getCertificates().get(0).getCertificate().getSubjectDN().getName()); - - } catch (Exception e) { - System.out.println(e.getMessage()); - } - } - - @Test - public void testX509CertificateTrustSourceCERTObj() { - - X509Certificate cert = null; - - try { - InputStream inStream = new FileInputStream(TestX509CertificateTrustSource.class.getResource("/x509source/x509CA.cer").getFile()); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - cert = (X509Certificate) cf.generateCertificate(inStream); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - - X509CertificateTrustSource x509CertificateTrustSource = new X509CertificateTrustSource(cert); - - CommonTrustedCertificateSource commonTrustedCertificateSource = x509CertificateTrustSource.getCommonTrustedCertificateSource(); - assertEquals("Number of added certificates", 1, commonTrustedCertificateSource.getNumberOfCertificates()); - assertEquals("Certificate info", - "EMAILADDRESS=sec@mindigital.gr, CN=\"Ministry of Digital Governance, Hellenic Republic\", OU=Class B - Private Key created and stored in software CSP, OID.2.5.4.97=VATGR-997001671, O=Ministry of Digital Governance, L=Athens, C=GR", - commonTrustedCertificateSource.getCertificates().get(0).getCertificate().getSubjectDN().getName()); - } - - @Test(expected = FileNotFoundException.class) - public void testX509CertificateTrustSourceNotFound() throws Exception{ - try { - X509CertificateTrustSource x509CertificateTrustSource = new X509CertificateTrustSource("/not/found"); - } catch (Exception e) { - throw e; - } - } - - @Test(expected = CertificateException.class) - public void testX509CertificateTrustSourceNoCert() throws Exception{ - try { - X509CertificateTrustSource x509CertificateTrustSource = new X509CertificateTrustSource(TestX509CertificateTrustSource.class.getResource("/declaration.pdf").getFile()); - } catch (Exception e) { - throw e; - } - } -} diff --git a/eseal/src/test/resources/declaration.pdf b/eseal/src/test/resources/declaration.pdf deleted file mode 100644 index f769a3356096c797469b84f6743e8452af9c3fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80099 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

*AUUM7hrX?g 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 V|3G7pqgI;In>K0EwO=>W{{;#A4VeG{ diff --git a/eseal/src/test/resources/simple-no-sign.pdf b/eseal/src/test/resources/simple-no-sign.pdf deleted file mode 100644 index dbf091df9a607221e000593a8b5a97b5ea5fb073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3028 zcmd5;+iK%D7``|79sZj_3mw^3d>n>>rft|$r=<Gl zWIx$CH11?D%do5oLHZ^AN9p^&qnnG-8;=ca>*%k)|M=6kY|A5;iigj(_3oW*IpgQ0 zB;?N?G}O?F~e-o&fdSbEveGxxNVs&T}_+wIC);wN|S3_`=^Ym z?y1Je_6W!5=Pa%0o_u4M!sh=IbybO>E+wq5{dR6;Rn+AKku*_{3aqswkCH}v ztJ}FLi^-kT6dU1Mb|uqH42vhacOeZu&Rl#HCGFr-xBWM-|+e^~95C3kuyCa8Nz&=d3 zPw9GoO7mhx4-J@*eqI7o0NLmbm9D2#M#EZ@Dl~~|vk9Y>(382@*~jiaPA^4vloGW^${BO z&|L0&$FyZ34q1)S0TXjiAeyzye;HJqPhX+oj`M@hIuz@m%ZWTgO?gR!qsqvQPqV zVBwTl{djT$Lm)?KJ&`!^p- zB?yU29^x`|s{JSof_pN9Oqel#YyZFw~B0kRS*9GB0?&&kJAg z<34|7m-_(#cV8b5!0fg%+X9aQc`Db0`!4$;o1mTB0`JJMabTnKqnZ}rgzd~^$`C_Q S>NZV0@_bPEqs!}&ZT$n`rwj1_ diff --git a/eseal/src/test/resources/trustsource/eseal.truststore.jks b/eseal/src/test/resources/trustsource/eseal.truststore.jks deleted file mode 100644 index bfd4768e219eb73e8a48588d314fb6422462191d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2204 zcmbVN4OA0X7S2p234{PDf@Li*208pmctJD<7en}wP!KT?7Zq2AWFS*RlFm$|Xsaaa zQjb(UsQk2BDS{PO&vv5=T_eR}r6Oh3YFD=_pjOH@ZZTv*T30CSgul9H_iXoc&Y3g! z=e_&xz2A4=Ogx@=%wn-%=7pxd{9-~+P&8Sp#uyV_ogaIF#mN<|08$pqZ4(4e8Fl3uG8UqLXFDRm7KAC}%Csaoy1|6$h(ZF_pc!}(rbAQo%w__o&}>ry z<5n&Qfr~t209Y=Th+|g7#;)4Ts4D zXdF$)OHnn6Googy6BKPA8IjPVl%bF=!AKlU%FYtUfmPF`i~n~P%h0(7D{-T#Ku4&> zC4NZiNFff3ZGpU5jGYf#Ac*y+&@=5756w@@tp?;u z6eqH^U1qzVKg!$uLD|qvbaaI*%5D^;)GqE@=15tyq;<=N4WB8G#`Wg$=6Q+@jr;Ef z*`N?%0BP?KVKymiR~Pch(V?2eKe{VgI(eay{f^1N1wD)GTZZ97A8vaX6#dX`w@fX+ zl{T+k^&3pG&8;aQRYBvfp^2s-sM#rzLjTu zG8~)3v9o<8}%Z@bBBYn=T%hv?g~t z{Qfpl`}w@jo+z(W^bA?j8~JZvoxcZ4f8&n#ZB24$ZSzul&o-D1v7kl^I|^9X;UI`X zA|M!H@Ge_8+IzW~)A{u4{C1Yf$$z^-Cpg{(%w=4+NG`Hsd6YiZgT z7adLFMuSL;k%Ss!Ac$5oT&JQHQ+le-P=M*?$UVjFDMl-oi_|0ymdu5N%6(_T8Pt^V zhj8FUSB~=$U*Kc@FL;~3a=B5&+zZTqWd@gruqp-4&*aVq<_iGK zo(4mHOI@c?|CznUpf(lbdZvP;tZZQZ_1qR1lnP36v;_6sth&aUnOe1r{#uMe3vgVI zrcsoM;eA0V%G?;}hMepyRG3QQ_;ysKCzu(drUyF{r%Mdvb~G$irN`-TAzDJvT9g?$ zRBtLSz)3VE14yMHW)(B$Aly}D2qFaNY(8vwPC~f+sY)#pK3f3HcV-5q2o-*L`L&W=jS6d5&z zJ}|ETsR1%(0_Z@xs|P^{a{+^d`Ze`GFOQocjGEN_z?c7vcsdZ^3g(6QAq(@ZV!1MT z^Y{CcDkG|d|HwFhTi^g*F1I%XO(F;z=F~rbr7(X9wgrY*#wX`qcxCIKeT^OsEwX+sDts?&G?mJ&;Xs*5Z(xRsBK}Xuk8^)33*f?%yXYM_x^UDK|GF$AQ z2adk`&w&M{3o`Uy%TM0Qc_+cr6JA%|tBih7UKJB9t@Izv`RX;#GhK~aytN~-;a{Ev zt;;m3_P$%|FIf)$eY{yzWbb?9i+kt7_8naN+Kz#+qDS?0Pj^@U!C6!*DeSr7bZ=Hr zzFy-I-v*x>Nj&xOyDg?8PK9B>9x55G`xW-AZ{xBC|ISa1neO#p)HUAqtqXV9{q4Rb z4HGZET6z3Z%W#aN|9~y8Zl|nl>xs3_j@x^X>c!O$$c0gr&fPWR!h|F4RUW*d^AE!O zd$qf)hf7(_nR~+0Lmc@XhcDa@r-W6PPsZ0!rzf2YR`UBK0k-78*5dt1EE+zRF+T8K zTkAC$@71GZ)%jD6F{j>Nvi;_jZPK{hZ}wG=ID*IcC%W?%_j7#O?(ZG$z~8A*y;+xY zDz$yBxymN|IIr2deqiGvS*6r~nJVHJmmF#{5APZKv^DbXhZ9CiO$dKSCc`oTq5zzGc1k{qZ)jTgP|S%%BtZe!DNCYw{!BFKrz~#s|N?SG&i#bv^+8_l!2M#?pn8xjTlyDB_k?r0k?$;w8fy<|deriMq9)@G PF0k&t{_GcF^wxg?ojVzP diff --git a/eseal/src/test/resources/x509source/unknownCA.pem b/eseal/src/test/resources/x509source/unknownCA.pem deleted file mode 100644 index 81ef9a6..0000000 --- a/eseal/src/test/resources/x509source/unknownCA.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEzTCCAzWgAwIBAgIQaMurbevAmTVsNpiUsvE0ITANBgkqhkiG9w0BAQsFADB/ -MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExKjAoBgNVBAsMIWFnZWxv -c0BBbmdlbG9zcy1NYWNCb29rLVByby5sb2NhbDExMC8GA1UEAwwobWtjZXJ0IGFn -ZWxvc0BBbmdlbG9zcy1NYWNCb29rLVByby5sb2NhbDAeFw0xODEyMTkxOTE2NDJa -Fw0yODEyMTkxOTE2NDJaMH8xHjAcBgNVBAoTFW1rY2VydCBkZXZlbG9wbWVudCBD -QTEqMCgGA1UECwwhYWdlbG9zQEFuZ2Vsb3NzLU1hY0Jvb2stUHJvLmxvY2FsMTEw -LwYDVQQDDChta2NlcnQgYWdlbG9zQEFuZ2Vsb3NzLU1hY0Jvb2stUHJvLmxvY2Fs -MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAy5l/JqCnGKZ7hidVlAYX -6LGVEmuuOkBFEdcmj/im3/PX5a30VUXFY9HAyK+PWXvfA3rz+OLAiGnE0ZUCR8Xu -b0UN+UhzshVL4qtXi9CyMcrqct1zvGB4rlHX75PThH2scO/Uzv30F8Lx2TyjkPWk -CJIBI7JQyrtTY1puFB/LmyysjOMZ6XXRMba0a9PdwUVwC182j6JUcHD9gp4FMjBW -g5jddqrJmYBh1hC0fG7thC+fEwDWkaHS9p/fcHhLcDiJssK738GfMaspbCClCetH -zwhFfqY2Q0IE7Wj9QERoX+WnhFrgIs4bIc6KO5FLyqUGv4k14YMJmB4Ivp7eEwdA -45/3/DM+pJj72vBZUrPfo8sPUnThBUuL05toVmJtHYzM/HrdWn/usgz9tufgbd9/ -KTzxs++ZI1bK4kGcAETNjckWHJg9nDMyAf8u+nwdkq9K+t+hWSGstEvahGr6Sneg -Jgw9Jp+V5zHxDMZBT7IMo1oAO4shum4hoH59Nzp7UcgbAgMBAAGjRTBDMA4GA1Ud -DwEB/wQEAwICBDASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRABUeAfGZ1 -/6tsMYeSuWSNBQoFDzANBgkqhkiG9w0BAQsFAAOCAYEADs72GyWsaSvJFC/y4BmX -16+B3+PxKjx94778wuXoDAG359cwoQOaCMbVuIqFnHRLf1Mvla4InFHuDAZj1fbQ -TeATv8f3zMvvSNLswG/Neuc3ibqsgjcrQbNcwJgimaFP13Z9GUyp7oMbdc44vYsN -OrGmkOHM3JEFrFC2nrpS6jx3bBeQe2lbQehtH2ixABwICulV83IsQvDTCi0clWv/ -0jSRIKSC0Zz+5PM/Hi7M7o/ed7+8se1UZyuGk2PpWR1GlwMNDCfLD7mfOPz1yhW/ -UTIE0CFvYFjmI2+PYXiJNyrX1KfnJWpNmzsRi6Ef1SlXblDlA4AQoq7K4GzNwd0y -e20/7Z+BvUEks/rRXitjasKUtc7/YYOxjykHTkbgE2FOJiqk0S8G7fZqdH3DP7xs -YeBqLtiuGPYK+bQPJt6kYEd9R4B8lnjDHWFgOhjHazo/5PpS52x0RieMLvzZd/2o -klaGnnQ9P4srwQ73Usyi2/31mAX9InDyij7nDYP/gAhZ ------END CERTIFICATE----- diff --git a/eseal/src/test/resources/x509source/x509CA.cer b/eseal/src/test/resources/x509source/x509CA.cer deleted file mode 100644 index 82569d9abe5764b191149b9536e17b9e1338d304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2137 zcmbVNe^?Xu8P8oV34{PDf@KysgFO6_@I9o);4nl$LP5kpe5}&RaXHAC8sFkv&D-9V)>k5@!_*M68&)TQ=*Zbq{ z{l4$}`Fy?y>|T0c7biCeVF-rjF)=M4q&OOr!~LvZQID=J2fkwOm`ZKsH@*<$BN6~x zE#?Ef#X>zI4uCUsm_Ppl??_}~4QC{27E1$bJOQa}m6kM_NSY#04S^fTQr^I61F9og z5@!e_nn|-9#aTJZOtWYz$#4o(W95uyhT_UG48(h?2xU=PjV?1)gKn_mCaRbs4QMu5 zf}7BEn*W$0Sv1dD#HV%3LFgji1OS#}N-W{2#Ke`Gc{hP~SAeN!Gq6MO540W$BBomp zT}ROr%Q5Asxfo5ON+^y$F~hu_WN4fwNbCs^42h=ZszV#;@(9NV!dnL`5#-(IAXRA|xE)@vc}n)_1u@)b;T5!VZDeEq%4hBs<;>Y!za!STQ6L zNgxQ}00Y*|`T(xf7&*?86d%u!7PG>LGZcaI5X2Ka*V%aOl%HWT7vZKka!+x4iqX2| z3WDLllDTqFW#CLXGr?NEF9)9V^f(_01Oc}Hfw%25PZ~vReZclNUbqrOP&JeSLBQ4{ zmhqhzIP$8y#>JRX)qMD)N>m9-`yL`gte5U`3X{U^MLJFbDzMVTvnEEq}a!_ z>X9|CTEatrBhI2lBuS&0ENkU?UsR6rHwL;PKQ9-RXD}qW4b{^WuQ7I7*f}IuW@fgb zQ5kxgnKA;A19Y|@Av|XxV(HYRcBND( z1GbN66Oa(G@ep1CfwK`Gcy>jZ5DdJ;VnlFYEx)XQ8B08!=3`LAq* zZtOpC&P~gUOV3eQ48;L3N&nOW*)s)9Aj`9ZFoeH=K}y5whM!j^%@BrQOyBe6M-k5i zLOjL%kRW7XVKb)DrEUIhUutzsjr^b47jDU1z|WKRhoDIW5yGN|$FCIrFCnzUkihcb z{1eYV`ai=xEY|MDky&PVM%u=d66gHa`4G}J%b zb@Y$!k~(E^?{&9#i3{QT&e)9=3CYCY`Mng^Yc%8~kC;@|dfT-F%e^}Z#? zyWx}irrUw_(Jp7OGq9}j(UUJ!AHUQ(lHeNH?p{{uL#9DXft=-7c#YgWk3*)NY zyJ{!oDTlpld?dpc?nMRn8Fw}xDi^fm?2gKca20kQdh2d9E3dhHGP#yLGwEKiLfWqk zaioQ|mF`OwaPYD0iNQD8+pei4FC1ZNE}U*kIQ{!2+iqOhs!H1Q<=*O1SNOQ}L{Guu z0Z~Bv-900nSL*XmXLPK!)i~tu7PK_4AKZ9QU9B?X)~e*iWe3}BBfH1nZ;QSC z_9KhEHbS~RcDyxkxGYAf8?gFcF3`4#f8BiTyW{PcSLZj)IbkR6{C00l_vAa0UpP8T zEcbqQ^^ED*x?}bI%B<&Vmx^zkGk&$Mf4pJ+g!ny)-YhlnAjV(DKY(*x0& KCaJqPZv5XXtOFtd