package eu.europa.esig.dss.validation.process.qmatrix.qualification;
import eu.europa.esig.dss.DSSException;
import eu.europa.esig.dss.validation.SignatureQualification;
import eu.europa.esig.dss.validation.policy.rules.Indication;
import eu.europa.esig.dss.validation.process.qmatrix.qualification.checks.type.Type;
public final class QualificationMatrix {
private QualificationMatrix() {
}
private static final int NOT_ADES = 0;
private static final int ADES = 1;
private static final int INDETERMINATE_ADES = 2;
private static final int NOT_QC = 0;
private static final int QC = 1;
private static final int ESIG = 0;
private static final int ESEAL = 1;
private static final int UNKNOWN = 2;
private static final int NOT_QSCD = 0;
private static final int QSCD = 1;
private static final SignatureQualification[][][][] QUALIFS = new SignatureQualification[3][2][3][2];
static {
// AdES
QUALIFS[ADES][QC][ESIG][QSCD] = SignatureQualification.QESIG;
QUALIFS[ADES][QC][ESEAL][QSCD] = SignatureQualification.QESEAL;
QUALIFS[ADES][QC][UNKNOWN][QSCD] = SignatureQualification.QES;
QUALIFS[ADES][QC][ESIG][NOT_QSCD] = SignatureQualification.ADESIG_QC;
QUALIFS[ADES][QC][ESEAL][NOT_QSCD] = SignatureQualification.ADESEAL_QC;
QUALIFS[ADES][QC][UNKNOWN][NOT_QSCD] = SignatureQualification.ADES_QC;
QUALIFS[ADES][NOT_QC][ESIG][NOT_QSCD] = SignatureQualification.ADESIG;
QUALIFS[ADES][NOT_QC][ESEAL][NOT_QSCD] = SignatureQualification.ADESEAL;
QUALIFS[ADES][NOT_QC][UNKNOWN][NOT_QSCD] = SignatureQualification.ADES;
QUALIFS[ADES][NOT_QC][ESIG][QSCD] = SignatureQualification.ADESIG;
QUALIFS[ADES][NOT_QC][ESEAL][QSCD] = SignatureQualification.ADESEAL;
QUALIFS[ADES][NOT_QC][UNKNOWN][QSCD] = SignatureQualification.ADES;
// Indeterminate AdES
QUALIFS[INDETERMINATE_ADES][QC][ESIG][QSCD] = SignatureQualification.INDETERMINATE_QESIG;
QUALIFS[INDETERMINATE_ADES][QC][ESEAL][QSCD] = SignatureQualification.INDETERMINATE_QESEAL;
QUALIFS[INDETERMINATE_ADES][QC][UNKNOWN][QSCD] = SignatureQualification.INDETERMINATE_QES;
QUALIFS[INDETERMINATE_ADES][QC][ESIG][NOT_QSCD] = SignatureQualification.INDETERMINATE_ADESIG_QC;
QUALIFS[INDETERMINATE_ADES][QC][ESEAL][NOT_QSCD] = SignatureQualification.INDETERMINATE_ADESEAL_QC;
QUALIFS[INDETERMINATE_ADES][QC][UNKNOWN][NOT_QSCD] = SignatureQualification.INDETERMINATE_ADES_QC;
QUALIFS[INDETERMINATE_ADES][NOT_QC][ESIG][NOT_QSCD] = SignatureQualification.INDETERMINATE_ADESIG;
QUALIFS[INDETERMINATE_ADES][NOT_QC][ESEAL][NOT_QSCD] = SignatureQualification.INDETERMINATE_ADESEAL;
QUALIFS[INDETERMINATE_ADES][NOT_QC][UNKNOWN][NOT_QSCD] = SignatureQualification.INDETERMINATE_ADES;
QUALIFS[INDETERMINATE_ADES][NOT_QC][ESIG][QSCD] = SignatureQualification.INDETERMINATE_ADESIG;
QUALIFS[INDETERMINATE_ADES][NOT_QC][ESEAL][QSCD] = SignatureQualification.INDETERMINATE_ADESEAL;
QUALIFS[INDETERMINATE_ADES][NOT_QC][UNKNOWN][QSCD] = SignatureQualification.INDETERMINATE_ADES;
// Not AdES
QUALIFS[NOT_ADES][QC][ESIG][QSCD] = SignatureQualification.NOT_ADES_QC_QSCD;
QUALIFS[NOT_ADES][QC][ESEAL][QSCD] = SignatureQualification.NOT_ADES_QC_QSCD;
QUALIFS[NOT_ADES][QC][UNKNOWN][QSCD] = SignatureQualification.NOT_ADES_QC_QSCD;
QUALIFS[NOT_ADES][QC][ESIG][NOT_QSCD] = SignatureQualification.NOT_ADES_QC;
QUALIFS[NOT_ADES][QC][ESEAL][NOT_QSCD] = SignatureQualification.NOT_ADES_QC;
QUALIFS[NOT_ADES][QC][UNKNOWN][NOT_QSCD] = SignatureQualification.NOT_ADES_QC;
QUALIFS[NOT_ADES][NOT_QC][ESIG][NOT_QSCD] = SignatureQualification.NOT_ADES;
QUALIFS[NOT_ADES][NOT_QC][ESEAL][NOT_QSCD] = SignatureQualification.NOT_ADES;
QUALIFS[NOT_ADES][NOT_QC][UNKNOWN][NOT_QSCD] = SignatureQualification.NOT_ADES;
QUALIFS[NOT_ADES][NOT_QC][ESIG][QSCD] = SignatureQualification.NOT_ADES;
QUALIFS[NOT_ADES][NOT_QC][ESEAL][QSCD] = SignatureQualification.NOT_ADES;
QUALIFS[NOT_ADES][NOT_QC][UNKNOWN][QSCD] = SignatureQualification.NOT_ADES;
}
public static SignatureQualification getSignatureQualification(Indication ades, boolean qc, Type type, boolean qscd) {
return QUALIFS[getInt(ades)][getInt(qc)][getInt(type)][getInt(qscd)];
}
private static int getInt(Type type) {
switch (type) {
case ESIGN:
return ESIG;
case ESEAL:
case WSA:
return ESEAL;
default:
return UNKNOWN;
}
}
private static int getInt(boolean bool) {
return bool ? 1 : 0;
}
private static int getInt(Indication indication) {
switch (indication) {
case FAILED:
case TOTAL_FAILED:
return 0;
case PASSED:
case TOTAL_PASSED:
return 1;
case INDETERMINATE:
return 2;
default:
throw new DSSException("Unsupported indication " + indication);
}
}
}