package eu.europa.esig.dss.signature;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import eu.europa.esig.dss.ASiCContainerType;
import eu.europa.esig.dss.AbstractSignatureParameters;
import eu.europa.esig.dss.DSSDocument;
import eu.europa.esig.dss.DSSException;
import eu.europa.esig.dss.DSSUtils;
import eu.europa.esig.dss.InMemoryDocument;
import eu.europa.esig.dss.RemoteCertificate;
import eu.europa.esig.dss.RemoteDocument;
import eu.europa.esig.dss.RemoteSignatureParameters;
import eu.europa.esig.dss.SignatureForm;
import eu.europa.esig.dss.asic.ASiCWithCAdESSignatureParameters;
import eu.europa.esig.dss.asic.ASiCWithXAdESSignatureParameters;
import eu.europa.esig.dss.cades.CAdESSignatureParameters;
import eu.europa.esig.dss.pades.PAdESSignatureParameters;
import eu.europa.esig.dss.utils.Utils;
import eu.europa.esig.dss.x509.CertificateToken;
import eu.europa.esig.dss.xades.XAdESSignatureParameters;
public class AbstractRemoteSignatureServiceImpl {
protected AbstractSignatureParameters getASiCSignatureParameters(AbstractSignatureParameters parameters, ASiCContainerType asicContainerType,
SignatureForm signatureForm) {
switch (signatureForm) {
case CAdES:
ASiCWithCAdESSignatureParameters asicWithCAdESParameters = new ASiCWithCAdESSignatureParameters();
asicWithCAdESParameters.aSiC().setContainerType(asicContainerType);
parameters = asicWithCAdESParameters;
break;
case XAdES:
ASiCWithXAdESSignatureParameters asicWithXAdESParameters = new ASiCWithXAdESSignatureParameters();
asicWithXAdESParameters.aSiC().setContainerType(asicContainerType);
parameters = asicWithXAdESParameters;
break;
default:
throw new DSSException("Unrecognized format (XAdES or CAdES are allowed with ASiC) : " + signatureForm);
}
return parameters;
}
protected AbstractSignatureParameters createParameters(RemoteSignatureParameters remoteParameters) {
AbstractSignatureParameters parameters = null;
ASiCContainerType asicContainerType = remoteParameters.getAsicContainerType();
SignatureForm signatureForm = remoteParameters.getSignatureLevel().getSignatureForm();
if (asicContainerType != null) {
parameters = getASiCSignatureParameters(parameters, asicContainerType, signatureForm);
} else {
switch (signatureForm) {
case CAdES:
parameters = new CAdESSignatureParameters();
break;
case PAdES:
PAdESSignatureParameters padesParams = new PAdESSignatureParameters();
padesParams.setSignatureSize(9472 * 2); // double reserved space for signature
parameters = padesParams;
break;
case XAdES:
parameters = new XAdESSignatureParameters();
break;
default:
throw new DSSException("Unsupported signature form : " + signatureForm);
}
}
fillParameters(parameters, remoteParameters);
return parameters;
}
protected void fillParameters(AbstractSignatureParameters parameters, RemoteSignatureParameters remoteParameters) {
parameters.setBLevelParams(remoteParameters.bLevel());
parameters.setDetachedContents(createDSSDocuments(remoteParameters.getDetachedContents()));
parameters.setDigestAlgorithm(remoteParameters.getDigestAlgorithm());
parameters.setEncryptionAlgorithm(remoteParameters.getEncryptionAlgorithm());
parameters.setSignatureLevel(remoteParameters.getSignatureLevel());
parameters.setSignaturePackaging(remoteParameters.getSignaturePackaging());
parameters.setSignatureTimestampParameters(remoteParameters.getSignatureTimestampParameters());
parameters.setArchiveTimestampParameters(remoteParameters.getArchiveTimestampParameters());
parameters.setContentTimestampParameters(remoteParameters.getContentTimestampParameters());
parameters.setSignWithExpiredCertificate(remoteParameters.isSignWithExpiredCertificate());
RemoteCertificate signingCertificate = remoteParameters.getSigningCertificate();
if (signingCertificate != null) { // extends do not require signing certificate
CertificateToken loadCertificate = DSSUtils.loadCertificate(signingCertificate.getEncodedCertificate());
parameters.setSigningCertificate(loadCertificate);
}
List<RemoteCertificate> remoteCertificateChain = remoteParameters.getCertificateChain();
if (Utils.isCollectionNotEmpty(remoteCertificateChain)) {
Set<CertificateToken> certificateChain = new HashSet<CertificateToken>();
for (RemoteCertificate remoteCertificate : remoteCertificateChain) {
certificateChain.add(DSSUtils.loadCertificate(remoteCertificate.getEncodedCertificate()));
}
parameters.setCertificateChain(certificateChain);
}
}
protected List<DSSDocument> createDSSDocuments(List<RemoteDocument> remoteDocuments) {
if (Utils.isCollectionNotEmpty(remoteDocuments)) {
List<DSSDocument> dssDocuments = new ArrayList<DSSDocument>();
for (RemoteDocument remoteDocument : remoteDocuments) {
dssDocuments.add(createDSSDocument(remoteDocument));
}
return dssDocuments;
}
return null;
}
protected InMemoryDocument createDSSDocument(RemoteDocument remoteDocument) {
if (remoteDocument != null) {
InMemoryDocument dssDocument = new InMemoryDocument(remoteDocument.getBytes());
dssDocument.setMimeType(remoteDocument.getMimeType());
dssDocument.setAbsolutePath(remoteDocument.getAbsolutePath());
dssDocument.setName(remoteDocument.getName());
return dssDocument;
}
return null;
}
}