package eu.europa.esig.dss.asic.validation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.europa.esig.dss.ASiCContainerType;
import eu.europa.esig.dss.DSSDocument;
import eu.europa.esig.dss.asic.ASiCUtils;
import eu.europa.esig.dss.asic.ASiCWithCAdESContainerExtractor;
import eu.europa.esig.dss.asic.AbstractASiCContainerExtractor;
import eu.europa.esig.dss.validation.DocumentValidator;
import eu.europa.esig.dss.validation.ManifestFile;
/**
* This class is an implementation to validate ASiC containers with CAdES signature(s)
*
*/
public class ASiCContainerWithCAdESValidator extends AbstractASiCContainerValidator {
private static final Logger LOG = LoggerFactory.getLogger(ASiCContainerWithCAdESValidator.class);
private ASiCContainerWithCAdESValidator() {
super(null);
}
public ASiCContainerWithCAdESValidator(final DSSDocument asicContainer) {
super(asicContainer);
analyseEntries();
}
@Override
public boolean isSupported(DSSDocument dssDocument) {
return ASiCUtils.isASiCContainer(dssDocument) && ASiCUtils.isArchiveContainsCorrectSignatureExtension(dssDocument, ".p7s");
}
@Override
AbstractASiCContainerExtractor getArchiveExtractor() {
return new ASiCWithCAdESContainerExtractor(document);
}
@Override
List<DocumentValidator> getValidators() {
if (validators == null) {
validators = new ArrayList<DocumentValidator>();
for (final DSSDocument signature : getSignatureDocuments()) {
CMSDocumentForASiCValidator cadesValidator = new CMSDocumentForASiCValidator(signature);
cadesValidator.setCertificateVerifier(certificateVerifier);
cadesValidator.setProcessExecutor(processExecutor);
cadesValidator.setSignaturePolicyProvider(signaturePolicyProvider);
cadesValidator.setValidationCertPool(validationCertPool);
cadesValidator.setDetachedContents(getSignedDocuments(signature));
validators.add(cadesValidator);
}
}
return validators;
}
private List<DSSDocument> getSignedDocuments(DSSDocument signature) {
ASiCContainerType type = getContainerType();
if (ASiCContainerType.ASiC_S == type) {
return getSignedDocuments(); // Collection size should be equals 1
} else if (ASiCContainerType.ASiC_E == type) {
// the manifest file is signed
// we need first to check the manifest file and its digests
ASiCEWithCAdESManifestValidator manifestValidator = new ASiCEWithCAdESManifestValidator(signature, getManifestDocuments(), getSignedDocuments());
DSSDocument linkedManifest = manifestValidator.getLinkedManifest();
if (linkedManifest != null) {
return Arrays.asList(linkedManifest);
} else {
return Collections.emptyList();
}
} else {
LOG.warn("Unknown asic container type (returns all signed documents)");
return getSignedDocuments();
}
}
@Override
protected List<ManifestFile> getManifestFilesDecriptions() {
List<ManifestFile> descriptions = new ArrayList<ManifestFile>();
List<DSSDocument> manifestDocuments = getManifestDocuments();
for (DSSDocument manifestDocument : manifestDocuments) {
ASiCEWithCAdESManifestParser parser = new ASiCEWithCAdESManifestParser(manifestDocument);
descriptions.add(parser.getDescription());
}
return descriptions;
}
}