/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/
package org.digidoc4j.impl.bdoc;
import java.io.IOException;
import java.net.URI;
import java.util.Date;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.digidoc4j.Signature;
import org.digidoc4j.SignatureProfile;
import org.digidoc4j.SignatureValidationResult;
import org.digidoc4j.X509Cert;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.exceptions.NotYetImplementedException;
import org.digidoc4j.exceptions.TechnicalException;
import org.digidoc4j.impl.bdoc.xades.XadesSignature;
import org.digidoc4j.impl.bdoc.xades.validation.SignatureValidator;
import org.digidoc4j.impl.bdoc.xades.validation.XadesValidationResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.europa.esig.dss.DSSDocument;
import eu.europa.esig.dss.DigestAlgorithm;
/**
* BDoc signature implementation.
*/
public class BDocSignature implements Signature {
private static final Logger logger = LoggerFactory.getLogger(BDocSignature.class);
private SignatureValidationResult validationResult;
private XadesSignature xadesSignature;
private SignatureValidator validator;
private DSSDocument signatureDocument;
public BDocSignature(XadesSignature xadesSignature, SignatureValidator validator) {
this.xadesSignature = xadesSignature;
this.validator = validator;
logger.debug("New BDoc signature created");
}
@Override
public String getCity() {
return xadesSignature.getCity();
}
@Override
public String getCountryName() {
return xadesSignature.getCountryName();
}
@Override
public String getId() {
return xadesSignature.getId();
}
@Override
public byte[] getOCSPNonce() {
logger.warn("Not yet implemented");
throw new NotYetImplementedException();
}
@Override
public X509Cert getOCSPCertificate() {
return xadesSignature.getOCSPCertificate();
}
@Override
@Deprecated
public String getPolicy() {
logger.warn("Not yet implemented");
throw new NotYetImplementedException();
}
@Override
public String getPostalCode() {
return xadesSignature.getPostalCode();
}
@Override
public Date getOCSPResponseCreationTime() {
return xadesSignature.getOCSPResponseCreationTime();
}
@Override
@Deprecated
public Date getProducedAt() {
return getOCSPResponseCreationTime();
}
@Override
public Date getTimeStampCreationTime() {
return xadesSignature.getTimeStampCreationTime();
}
/**
* Trusted signing time should be taken based on the profile:
* BES should return null,
* LT_TM should return OCSP response creation time and
* LT should return Timestamp creation time.
*
* @return signing time backed by a trusted service (not just a user's computer clock time).
*/
@Override
public Date getTrustedSigningTime() {
return xadesSignature.getTrustedSigningTime();
}
@Override
public SignatureProfile getProfile() {
return xadesSignature.getProfile();
}
@Override
public String getSignatureMethod() {
return xadesSignature.getSignatureMethod();
}
@Override
public List<String> getSignerRoles() {
return xadesSignature.getSignerRoles();
}
@Override
public X509Cert getSigningCertificate() {
return xadesSignature.getSigningCertificate();
}
@Override
public Date getClaimedSigningTime() {
return xadesSignature.getSigningTime();
}
@Override
public Date getSigningTime() {
return getClaimedSigningTime();
}
@Override
@Deprecated
public URI getSignaturePolicyURI() {
logger.warn("Not yet implemented");
throw new NotYetImplementedException();
}
@Override
public String getStateOrProvince() {
return xadesSignature.getStateOrProvince();
}
@Override
public X509Cert getTimeStampTokenCertificate() {
return xadesSignature.getTimeStampTokenCertificate();
}
@Override
public SignatureValidationResult validateSignature() {
logger.debug("Validating signature");
if (validationResult == null) {
validationResult = validator.extractValidationErrors();
logger.info("Signature has " + validationResult.getErrors().size() + " validation errors and " + validationResult.getWarnings().size() + " warnings");
} else {
logger.debug("Using existing validation errors with " + validationResult.getErrors().size() + " validation errors and " + validationResult.getWarnings().size() + " warnings");
}
return validationResult;
}
@Override
@Deprecated
public List<DigiDoc4JException> validate() {
return validateSignature().getErrors();
}
@Override
public byte[] getAdESSignature() {
logger.debug("Getting full XAdES signature byte array");
try {
return IOUtils.toByteArray(signatureDocument.openStream());
} catch (IOException e) {
throw new TechnicalException("Error parsing xades signature: " + e.getMessage(), e);
}
}
@Override
@Deprecated
public byte[] getRawSignature() {
return getAdESSignature();
}
public XadesSignature getOrigin() {
return xadesSignature;
}
public void setSignatureDocument(DSSDocument signatureDocument) {
this.signatureDocument = signatureDocument;
}
public XadesValidationResult getDssValidationReport() {
return xadesSignature.validate();
}
public DSSDocument getSignatureDocument() {
return signatureDocument;
}
DigestAlgorithm getSignatureDigestAlgorithm() {
return xadesSignature.getDssSignature().getDigestAlgorithm();
}
}