/* 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.ddoc;
import ee.sk.digidoc.CertValue;
import org.digidoc4j.Signature;
import org.digidoc4j.SignatureValidationResult;
import org.digidoc4j.X509Cert;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.exceptions.NotYetImplementedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.digidoc4j.SignatureProfile;
/**
* Signature implementation. Provides an interface for handling a signature and the
* corresponding OCSP response properties.
*/
public class DDocSignature implements Signature {
private static final Logger logger = LoggerFactory.getLogger(DDocSignature.class);
private X509Cert certificate;
private final ee.sk.digidoc.Signature origin;
private int indexInArray;
/**
* @param signature add description
*/
public DDocSignature(ee.sk.digidoc.Signature signature) {
logger.debug("");
this.origin = signature;
}
public void setCertificate(X509Cert cert) {
logger.debug("");
this.certificate = cert;
}
@Override
public String getCity() {
logger.debug("");
String city = null;
if (origin.getSignedProperties().getSignatureProductionPlace() != null) {
city = origin.getSignedProperties().getSignatureProductionPlace().getCity();
}
return city;
}
@Override
public String getCountryName() {
logger.debug("");
String countryName = null;
if (origin.getSignedProperties().getSignatureProductionPlace() != null) {
countryName = origin.getSignedProperties().getSignatureProductionPlace().getCountryName();
}
return countryName;
}
@Override
public String getId() {
logger.debug("");
return origin.getId();
}
@Override
public byte[] getOCSPNonce() {
logger.debug("");
return null;
}
@Override
public X509Cert getOCSPCertificate() {
logger.debug("");
return origin.findResponderCert() != null ? new X509Cert(origin.findResponderCert()) : null;
}
@Override
@Deprecated
public String getPolicy() {
logger.debug("");
return "";
}
@Override
public String getPostalCode() {
logger.debug("");
String postalCode = null;
if (origin.getSignedProperties().getSignatureProductionPlace() != null) {
postalCode = origin.getSignedProperties().getSignatureProductionPlace().getPostalCode();
}
return postalCode;
}
@Override
public Date getOCSPResponseCreationTime() {
logger.debug("");
Date date = origin.getSignatureProducedAtTime();
logger.debug("OCSP response creation time: " + date);
return date;
}
@Override
@Deprecated
public Date getProducedAt() {
return getOCSPResponseCreationTime();
}
@Override
public Date getTimeStampCreationTime() {
logger.warn("Not yet implemented");
throw new NotYetImplementedException();
}
@Override
public Date getTrustedSigningTime() {
return getOCSPResponseCreationTime();
}
@Override
public SignatureProfile getProfile() {
logger.debug("Profile is LT_TM");
return SignatureProfile.LT_TM;
}
@Override
public String getSignatureMethod() {
logger.debug("");
String signatureMethod = origin.getSignedInfo().getSignatureMethod();
logger.debug("Signature method: " + signatureMethod);
return signatureMethod;
}
@Override
public List<String> getSignerRoles() {
logger.debug("");
List<String> roles = new ArrayList<>();
int numberOfRoles = origin.getSignedProperties().countClaimedRoles();
for (int i = 0; i < numberOfRoles; i++) {
roles.add(origin.getSignedProperties().getClaimedRole(i));
}
return roles;
}
@Override
public X509Cert getSigningCertificate() {
logger.debug("");
return certificate;
}
@Override
public Date getClaimedSigningTime() {
logger.debug("");
return origin.getSignedProperties().getSigningTime();
}
@Override
public Date getSigningTime() {
return getClaimedSigningTime();
}
@Override
@Deprecated
public URI getSignaturePolicyURI() {
logger.debug("");
return null;
}
@Override
public String getStateOrProvince() {
logger.debug("");
String stateOrProvince = null;
if (origin.getSignedProperties().getSignatureProductionPlace() != null) {
stateOrProvince = origin.getSignedProperties().getSignatureProductionPlace().getStateOrProvince();;
}
return stateOrProvince;
}
@Override
public X509Cert getTimeStampTokenCertificate() {
logger.warn("Not yet implemented");
throw new NotYetImplementedException();
}
@Override
public SignatureValidationResult validateSignature() {
logger.debug("");
List<DigiDoc4JException> validationErrors = new ArrayList<>();
ArrayList validationResult = origin.verify(origin.getSignedDoc(), true, true);
for (Object exception : validationResult) {
String errorMessage = exception.toString();
logger.info(errorMessage);
validationErrors.add(new DigiDoc4JException(errorMessage));
}
logger.info("Signature has " + validationErrors.size() + " validation errors");
SignatureValidationResult result = new SignatureValidationResult();
result.setErrors(validationErrors);
return result;
}
@Override
@Deprecated
public List<DigiDoc4JException> validate() {
return validateSignature().getErrors();
}
/**
* Retrieves CertValue element with the desired type
*
* @param type CertValue type
* @return CertValue element or null if not found
*/
public CertValue getCertValueOfType(int type) {
logger.debug("type: " + type);
return origin.getCertValueOfType(type);
}
@Override
public byte[] getAdESSignature() {
logger.debug("");
return origin.getOrigContent();
}
@Override
@Deprecated
public byte[] getRawSignature() {
return getAdESSignature();
}
public int getIndexInArray() {
return indexInArray;
}
public void setIndexInArray(int indexInArray) {
this.indexInArray = indexInArray;
}
}