package eu.europa.esig.dss.validation.process.bbb.cv.checks;
import java.util.ArrayList;
import java.util.List;
import eu.europa.esig.dss.jaxb.detailedreport.XmlCV;
import eu.europa.esig.dss.jaxb.diagnostic.XmlContainerInfo;
import eu.europa.esig.dss.jaxb.diagnostic.XmlManifestFile;
import eu.europa.esig.dss.jaxb.diagnostic.XmlSignatureScope;
import eu.europa.esig.dss.utils.Utils;
import eu.europa.esig.dss.validation.policy.rules.Indication;
import eu.europa.esig.dss.validation.policy.rules.SubIndication;
import eu.europa.esig.dss.validation.process.ChainItem;
import eu.europa.esig.dss.validation.process.MessageTag;
import eu.europa.esig.dss.validation.reports.wrapper.SignatureWrapper;
import eu.europa.esig.jaxb.policy.LevelConstraint;
public class AllFilesSignedCheck extends ChainItem<XmlCV> {
private final SignatureWrapper signature;
private final XmlContainerInfo containerInfo;
public AllFilesSignedCheck(XmlCV result, SignatureWrapper signature, XmlContainerInfo containerInfo, LevelConstraint constraint) {
super(result, constraint);
this.signature = signature;
this.containerInfo = containerInfo;
}
@Override
protected boolean process() {
/* ASiC-S -> nb files = 1 */
if ("ASiC-S".equals(containerInfo.getContainerType())) {
return 1 == Utils.collectionSize(containerInfo.getContentFiles());
} else if ("ASiC-E".equals(containerInfo.getContainerType())) {
String signatureFilename = signature.getSignatureFilename();
List<String> coveredFiles = getCoveredFilesBySignatureFilename(signatureFilename);
List<String> contentFiles = containerInfo.getContentFiles();
// check manifest <> content
if (!sameContent(coveredFiles, contentFiles)) {
return false;
}
// XAdES -> check signature scope
if (signature.getFormat().startsWith("XAdES")) {
List<String> coveredFilesFromScrope = getCoveredFilesFromScrope();
return sameContent(coveredFilesFromScrope, contentFiles);
}
// CAdES -> manifest file is signed
return true;
}
return false;
}
private boolean sameContent(List<String> coveredFiles, List<String> contentFiles) {
if (Utils.collectionSize(coveredFiles) == Utils.collectionSize(contentFiles)) {
boolean findAll = true;
for (String content : contentFiles) {
findAll &= coveredFiles.contains(content);
}
if (findAll) {
for (String covered : coveredFiles) {
findAll &= contentFiles.contains(covered);
}
}
return findAll;
}
return false;
}
private List<String> getCoveredFilesBySignatureFilename(String signatureFilename) {
List<XmlManifestFile> manifestFiles = containerInfo.getManifestFiles();
for (XmlManifestFile xmlManifestFile : manifestFiles) {
if (Utils.areStringsEqual(signatureFilename, xmlManifestFile.getSignatureFilename())) {
return xmlManifestFile.getEntries();
}
}
return new ArrayList<String>();
}
private List<String> getCoveredFilesFromScrope() {
List<String> result = new ArrayList<String>();
List<XmlSignatureScope> signatureScopes = signature.getSignatureScopes();
for (XmlSignatureScope xmlSignatureScope : signatureScopes) {
result.add(xmlSignatureScope.getName());
}
return result;
}
@Override
protected MessageTag getMessageTag() {
return MessageTag.BBB_CV_IAFS;
}
@Override
protected MessageTag getErrorMessageTag() {
return MessageTag.BBB_CV_IAFS_ANS;
}
@Override
protected Indication getFailedIndicationForConclusion() {
return Indication.FAILED;
}
@Override
protected SubIndication getFailedSubIndicationForConclusion() {
return SubIndication.SIG_CRYPTO_FAILURE;
}
}