package eu.europa.esig.dss.validation.executor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.FileInputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.junit.Test; import eu.europa.esig.dss.jaxb.diagnostic.DiagnosticData; import eu.europa.esig.dss.utils.Utils; import eu.europa.esig.dss.validation.SignatureQualification; import eu.europa.esig.dss.validation.policy.EtsiValidationPolicy; import eu.europa.esig.dss.validation.policy.rules.Indication; import eu.europa.esig.dss.validation.policy.rules.SubIndication; import eu.europa.esig.dss.validation.reports.DetailedReport; import eu.europa.esig.dss.validation.reports.Reports; import eu.europa.esig.dss.validation.reports.SimpleReport; import eu.europa.esig.jaxb.policy.ConstraintsParameters; public class CustomProcessExecutorTest { @Test public void skipRevocationDataValidation() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/it.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicyNoRevoc()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.TOTAL_PASSED, simpleReport.getIndication(simpleReport.getFirstSignatureId())); } @Test public void signedDataNotFound() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/signed_data_not_found.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); assertNotNull(reports); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.INDETERMINATE, simpleReport.getIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIGNED_DATA_NOT_FOUND, simpleReport.getSubIndication(simpleReport.getFirstSignatureId())); DetailedReport detailedReport = reports.getDetailedReport(); assertEquals(Indication.INDETERMINATE, detailedReport.getBasicValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIGNED_DATA_NOT_FOUND, detailedReport.getBasicValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(0, detailedReport.getTimestampIds().size()); assertEquals(Indication.INDETERMINATE, detailedReport.getLongTermValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIGNED_DATA_NOT_FOUND, detailedReport.getLongTermValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(Indication.INDETERMINATE, detailedReport.getArchiveDataValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIGNED_DATA_NOT_FOUND, detailedReport.getArchiveDataValidationSubIndication(simpleReport.getFirstSignatureId())); } @Test public void noPoeRevokedNoTimestamp() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/no_poe_revoked_no_timestamp.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); assertNotNull(reports); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.INDETERMINATE, simpleReport.getIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.NO_POE, simpleReport.getSubIndication(simpleReport.getFirstSignatureId())); DetailedReport detailedReport = reports.getDetailedReport(); assertEquals(Indication.INDETERMINATE, detailedReport.getBasicValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.REVOKED_NO_POE, detailedReport.getBasicValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(0, detailedReport.getTimestampIds().size()); assertEquals(Indication.INDETERMINATE, detailedReport.getLongTermValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.REVOKED_NO_POE, detailedReport.getLongTermValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(Indication.INDETERMINATE, detailedReport.getArchiveDataValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.NO_POE, detailedReport.getArchiveDataValidationSubIndication(simpleReport.getFirstSignatureId())); } @Test public void passedRevokedWithTimestamp() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/passed_revoked_with_timestamp.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); assertNotNull(reports); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.TOTAL_PASSED, simpleReport.getIndication(simpleReport.getFirstSignatureId())); DetailedReport detailedReport = reports.getDetailedReport(); assertEquals(Indication.INDETERMINATE, detailedReport.getBasicValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.REVOKED_NO_POE, detailedReport.getBasicValidationSubIndication(simpleReport.getFirstSignatureId())); List<String> timestampIds = detailedReport.getTimestampIds(); assertEquals(1, timestampIds.size()); assertEquals(Indication.PASSED, detailedReport.getTimestampValidationIndication(timestampIds.get(0))); assertEquals(Indication.PASSED, detailedReport.getLongTermValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(Indication.PASSED, detailedReport.getArchiveDataValidationIndication(simpleReport.getFirstSignatureId())); } @Test public void passedOutOfBoundsWithTimestamps() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/passed_out_of_bounds_with_timestamps.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); assertNotNull(reports); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.TOTAL_PASSED, simpleReport.getIndication(simpleReport.getFirstSignatureId())); DetailedReport detailedReport = reports.getDetailedReport(); assertEquals(Indication.INDETERMINATE, detailedReport.getBasicValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.OUT_OF_BOUNDS_NO_POE, detailedReport.getBasicValidationSubIndication(simpleReport.getFirstSignatureId())); List<String> timestampIds = detailedReport.getTimestampIds(); assertEquals(5, timestampIds.size()); for (String tspId : timestampIds) { assertEquals(Indication.PASSED, detailedReport.getTimestampValidationIndication(tspId)); } assertEquals(Indication.INDETERMINATE, detailedReport.getLongTermValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.OUT_OF_BOUNDS_NO_POE, detailedReport.getLongTermValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(Indication.PASSED, detailedReport.getArchiveDataValidationIndication(simpleReport.getFirstSignatureId())); } @Test public void hashFailure() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/hash_failure.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); assertNotNull(reports); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.TOTAL_FAILED, simpleReport.getIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.HASH_FAILURE, simpleReport.getSubIndication(simpleReport.getFirstSignatureId())); DetailedReport detailedReport = reports.getDetailedReport(); assertEquals(Indication.FAILED, detailedReport.getBasicValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.HASH_FAILURE, detailedReport.getBasicValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(0, detailedReport.getTimestampIds().size()); assertEquals(Indication.FAILED, detailedReport.getLongTermValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.HASH_FAILURE, detailedReport.getLongTermValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(Indication.FAILED, detailedReport.getArchiveDataValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.HASH_FAILURE, detailedReport.getArchiveDataValidationSubIndication(simpleReport.getFirstSignatureId())); } @Test public void sigConstraintFailure() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/sig_constraint_failure.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); assertNotNull(reports); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.TOTAL_FAILED, simpleReport.getIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIG_CONSTRAINTS_FAILURE, simpleReport.getSubIndication(simpleReport.getFirstSignatureId())); DetailedReport detailedReport = reports.getDetailedReport(); assertEquals(Indication.FAILED, detailedReport.getBasicValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIG_CONSTRAINTS_FAILURE, detailedReport.getBasicValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(0, detailedReport.getTimestampIds().size()); assertEquals(Indication.FAILED, detailedReport.getLongTermValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIG_CONSTRAINTS_FAILURE, detailedReport.getLongTermValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(Indication.FAILED, detailedReport.getArchiveDataValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.SIG_CONSTRAINTS_FAILURE, detailedReport.getArchiveDataValidationSubIndication(simpleReport.getFirstSignatureId())); } @Test public void signingCertificateNotFound() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/signing_certificate_not_found.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date currentTime = sdf.parse("04/05/2016 15:55:00"); executor.setCurrentTime(currentTime); Reports reports = executor.execute(); assertNotNull(reports); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.INDETERMINATE, simpleReport.getIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.NO_SIGNING_CERTIFICATE_FOUND, simpleReport.getSubIndication(simpleReport.getFirstSignatureId())); DetailedReport detailedReport = reports.getDetailedReport(); assertEquals(Indication.INDETERMINATE, detailedReport.getBasicValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.NO_SIGNING_CERTIFICATE_FOUND, detailedReport.getBasicValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(0, detailedReport.getTimestampIds().size()); assertEquals(Indication.INDETERMINATE, detailedReport.getLongTermValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.NO_SIGNING_CERTIFICATE_FOUND, detailedReport.getLongTermValidationSubIndication(simpleReport.getFirstSignatureId())); assertEquals(Indication.INDETERMINATE, detailedReport.getArchiveDataValidationIndication(simpleReport.getFirstSignatureId())); assertEquals(SubIndication.NO_SIGNING_CERTIFICATE_FOUND, detailedReport.getArchiveDataValidationSubIndication(simpleReport.getFirstSignatureId())); } @Test public void testDSS943() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/DSS-943/NotQualified-service.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicyNoRevoc()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.TOTAL_PASSED, simpleReport.getIndication(simpleReport.getFirstSignatureId())); } @Test public void testDSS956AllValidationLevels() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/passed_revoked_with_timestamp.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); executor.setValidationLevel(ValidationLevel.BASIC_SIGNATURES); checkReports(executor.execute()); executor.setValidationLevel(ValidationLevel.TIMESTAMPS); checkReports(executor.execute()); executor.setValidationLevel(ValidationLevel.LONG_TERM_DATA); checkReports(executor.execute()); executor.setValidationLevel(ValidationLevel.ARCHIVAL_DATA); checkReports(executor.execute()); } @Test public void qualification() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/preEIDAS.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(SignatureQualification.INDETERMINATE_ADESIG_QC, simpleReport.getSignatureQualification(simpleReport.getFirstSignatureId())); } @Test public void qualificationQESig() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/qualifQESig.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(SignatureQualification.QESIG, simpleReport.getSignatureQualification(simpleReport.getFirstSignatureId())); } @Test public void qualificationNA() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/qualifNA.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(SignatureQualification.NA, simpleReport.getSignatureQualification(simpleReport.getFirstSignatureId())); } @Test public void noSigningTime() throws Exception { FileInputStream fis = new FileInputStream("src/test/resources/no-signing-date.xml"); DiagnosticData diagnosticData = getJAXBObjectFromString(fis, DiagnosticData.class, "/xsd/DiagnosticData.xsd"); assertNotNull(diagnosticData); CustomProcessExecutor executor = new CustomProcessExecutor(); executor.setDiagnosticData(diagnosticData); executor.setValidationPolicy(loadPolicy()); executor.setCurrentTime(diagnosticData.getValidationDate()); Reports reports = executor.execute(); SimpleReport simpleReport = reports.getSimpleReport(); assertEquals(Indication.INDETERMINATE, simpleReport.getIndication(simpleReport.getFirstSignatureId())); assertEquals(SignatureQualification.INDETERMINATE_ADESIG, simpleReport.getSignatureQualification(simpleReport.getFirstSignatureId())); } private void checkReports(Reports reports) { // reports.print(); assertNotNull(reports); assertNotNull(reports.getDiagnosticData()); assertNotNull(reports.getDiagnosticDataJaxb()); assertNotNull(reports.getSimpleReport()); assertNotNull(reports.getSimpleReportJaxb()); assertNotNull(reports.getDetailedReport()); assertNotNull(reports.getDetailedReportJaxb()); assertTrue(Utils.isStringNotBlank(reports.getXmlDiagnosticData())); assertTrue(Utils.isStringNotBlank(reports.getXmlSimpleReport())); assertTrue(Utils.isStringNotBlank(reports.getXmlDetailedReport())); } private EtsiValidationPolicy loadPolicy() throws Exception { FileInputStream policyFis = new FileInputStream("src/main/resources/policy/constraint.xml"); ConstraintsParameters policyJaxB = getJAXBObjectFromString(policyFis, ConstraintsParameters.class); assertNotNull(policyJaxB); return new EtsiValidationPolicy(policyJaxB); } private EtsiValidationPolicy loadPolicyNoRevoc() throws Exception { FileInputStream policyFis = new FileInputStream("src/test/resources/constraint-no-revoc.xml"); ConstraintsParameters policyJaxB = getJAXBObjectFromString(policyFis, ConstraintsParameters.class); assertNotNull(policyJaxB); return new EtsiValidationPolicy(policyJaxB); } private <T extends Object> T getJAXBObjectFromString(InputStream is, Class<T> clazz) throws Exception { return getJAXBObjectFromString(is, clazz, null); } @SuppressWarnings("unchecked") private <T extends Object> T getJAXBObjectFromString(InputStream is, Class<T> clazz, String xsd) throws Exception { JAXBContext context = JAXBContext.newInstance(clazz.getPackage().getName()); Unmarshaller unmarshaller = context.createUnmarshaller(); if (Utils.isStringNotEmpty(xsd)) { SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); InputStream inputStream = this.getClass().getResourceAsStream(xsd); Source source = new StreamSource(inputStream); Schema schema = sf.newSchema(source); unmarshaller.setSchema(schema); } return (T) unmarshaller.unmarshal(is); } }