package eu.europa.esig.dss.validation.process.qmatrix.qualification.checks.qualified;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.xml.bind.DatatypeConverter;
import org.junit.Test;
import eu.europa.esig.dss.CertificatePolicyOids;
import eu.europa.esig.dss.QCStatementOids;
import eu.europa.esig.dss.jaxb.diagnostic.XmlCertificate;
import eu.europa.esig.dss.jaxb.diagnostic.XmlOID;
import eu.europa.esig.dss.utils.Utils;
import eu.europa.esig.dss.validation.reports.wrapper.CertificateWrapper;
public class QualifiedTest {
private static final String UNKNOWN_OID = "0.0.0";
public final static Date PRE_EIDAS_DATE = DatatypeConverter.parseDateTime("2015-07-01T00:00:00.000Z").getTime();
public final static Date POST_EIDAS_DATE = DatatypeConverter.parseDateTime("2016-07-01T00:00:00.000Z").getTime();
// --------------------- PRE EIDAS
@Test
public void testPreNoQcStatementNoCertPolicy() {
CertificateWrapper signingCertificate = createPreEIDAS(Collections.<String> emptyList(), Collections.<String> emptyList());
notQC(signingCertificate);
}
@Test
public void testPreQcCompliant() {
CertificateWrapper signingCertificate = createPreEIDAS(Arrays.asList(QCStatementOids.QC_COMPLIANT.getOid()), Collections.<String> emptyList());
qc(signingCertificate);
}
@Test
public void testPreUnknownQcCompliant() {
CertificateWrapper signingCertificate = createPreEIDAS(Arrays.asList(UNKNOWN_OID), Collections.<String> emptyList());
notQC(signingCertificate);
}
@Test
public void testPreQCP() {
CertificateWrapper signingCertificate = createPreEIDAS(Collections.<String> emptyList(), Arrays.asList(CertificatePolicyOids.QCP_PUBLIC.getOid()));
qc(signingCertificate);
}
@Test
public void testPreQCPPlus() {
CertificateWrapper signingCertificate = createPreEIDAS(Collections.<String> emptyList(),
Arrays.asList(CertificatePolicyOids.QCP_PUBLIC_WITH_SSCD.getOid()));
qc(signingCertificate);
}
@Test
public void testPreUnknownCertPolicy() {
CertificateWrapper signingCertificate = createPreEIDAS(Collections.<String> emptyList(), Arrays.asList(UNKNOWN_OID));
notQC(signingCertificate);
}
@Test
public void testPreQcTypeEsigOnly() {
CertificateWrapper signingCertificate = createPreEIDAS(Collections.<String> emptyList(), Collections.<String> emptyList(),
Arrays.asList(QCStatementOids.QTC_ESIGN.getOid()));
notQC(signingCertificate);
}
// --------------------- POST EIDAS
@Test
public void testPostNoQcStatementNoCertPolicy() {
CertificateWrapper signingCertificate = createPostEIDAS(Collections.<String> emptyList(), Collections.<String> emptyList());
notQC(signingCertificate);
}
@Test
public void testPostQcCompliant() {
CertificateWrapper signingCertificate = createPostEIDAS(Arrays.asList(QCStatementOids.QC_COMPLIANT.getOid()), Collections.<String> emptyList());
qc(signingCertificate);
}
@Test
public void testPostUnknownQcCompliant() {
CertificateWrapper signingCertificate = createPostEIDAS(Arrays.asList(UNKNOWN_OID), Collections.<String> emptyList());
notQC(signingCertificate);
}
@Test
public void testPostQCP() {
CertificateWrapper signingCertificate = createPostEIDAS(Collections.<String> emptyList(), Arrays.asList(CertificatePolicyOids.QCP_PUBLIC.getOid()));
notQC(signingCertificate); // QcCompliant is missing
}
@Test
public void testPostQcCompliantQCP() {
CertificateWrapper signingCertificate = createPostEIDAS(Arrays.asList(QCStatementOids.QC_COMPLIANT.getOid()),
Arrays.asList(CertificatePolicyOids.QCP_PUBLIC.getOid()));
qc(signingCertificate);
}
@Test
public void testPostQCPPlus() {
CertificateWrapper signingCertificate = createPostEIDAS(Collections.<String> emptyList(),
Arrays.asList(CertificatePolicyOids.QCP_PUBLIC_WITH_SSCD.getOid()));
notQC(signingCertificate); // QcCompliant is missing
}
@Test
public void testPostQcCompliantQCPPlus() {
CertificateWrapper signingCertificate = createPostEIDAS(Arrays.asList(QCStatementOids.QC_COMPLIANT.getOid()),
Arrays.asList(CertificatePolicyOids.QCP_PUBLIC_WITH_SSCD.getOid()));
qc(signingCertificate);
}
@Test
public void testPostQcTypeEsigOnly() {
CertificateWrapper signingCertificate = createPostEIDAS(Collections.<String> emptyList(), Collections.<String> emptyList(),
Arrays.asList(QCStatementOids.QTC_ESIGN.getOid()));
notQC(signingCertificate);
}
@Test
public void testPostQcCompliantQcTypeEsig() {
CertificateWrapper signingCertificate = createPostEIDAS(Arrays.asList(QCStatementOids.QC_COMPLIANT.getOid()), Collections.<String> emptyList(),
Arrays.asList(QCStatementOids.QTC_ESIGN.getOid()));
qc(signingCertificate);
}
@Test
public void testPostQcCompliantQcTypeEseals() {
CertificateWrapper signingCertificate = createPostEIDAS(Arrays.asList(QCStatementOids.QC_COMPLIANT.getOid()), Collections.<String> emptyList(),
Arrays.asList(QCStatementOids.QTC_ESEAL.getOid()));
qc(signingCertificate);
}
private CertificateWrapper createPreEIDAS(List<String> qcStatementIds, List<String> certificatePolicyIds) {
return createPreEIDAS(qcStatementIds, certificatePolicyIds, Collections.<String> emptyList());
}
private CertificateWrapper createPreEIDAS(List<String> qcStatementIds, List<String> certificatePolicyIds, List<String> qcTypeIds) {
XmlCertificate xmlCert = new XmlCertificate();
xmlCert.setNotBefore(PRE_EIDAS_DATE);
xmlCert.setQCStatementIds(toOids(qcStatementIds));
xmlCert.setCertificatePolicyIds(toOids(certificatePolicyIds));
xmlCert.setQCTypes(toOids(qcTypeIds));
return new CertificateWrapper(xmlCert);
}
private CertificateWrapper createPostEIDAS(List<String> qcStatementIds, List<String> certificatePolicyIds) {
return createPostEIDAS(qcStatementIds, certificatePolicyIds, Collections.<String> emptyList());
}
private CertificateWrapper createPostEIDAS(List<String> qcStatementIds, List<String> certificatePolicyIds, List<String> qcTypeIds) {
XmlCertificate xmlCert = new XmlCertificate();
xmlCert.setNotBefore(POST_EIDAS_DATE);
xmlCert.setQCStatementIds(toOids(qcStatementIds));
xmlCert.setCertificatePolicyIds(toOids(certificatePolicyIds));
xmlCert.setQCTypes(toOids(qcTypeIds));
return new CertificateWrapper(xmlCert);
}
private List<XmlOID> toOids(List<String> oids) {
List<XmlOID> result = new ArrayList<XmlOID>();
if (Utils.isCollectionNotEmpty(oids)) {
for (String oid : oids) {
XmlOID xmlOid = new XmlOID();
xmlOid.setValue(oid);
result.add(xmlOid);
}
}
return result;
}
private void notQC(CertificateWrapper signingCertificate) {
QualificationStrategy strategy = QualificationStrategyFactory.createQualificationFromCert(signingCertificate);
assertFalse(QualifiedStatus.isQC(strategy.getQualifiedStatus()));
}
private void qc(CertificateWrapper signingCertificate) {
QualificationStrategy strategy = QualificationStrategyFactory.createQualificationFromCert(signingCertificate);
assertTrue(QualifiedStatus.isQC(strategy.getQualifiedStatus()));
}
}