org.digidoc4j.impl.bdoc.BDocSignature.java Source code

Java tutorial

Introduction

Here is the source code for org.digidoc4j.impl.bdoc.BDocSignature.java

Source

/* 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 eu.europa.ec.markt.dss.ASiCNamespaces;
import eu.europa.ec.markt.dss.DSSXMLUtils;
import eu.europa.ec.markt.dss.signature.SignatureLevel;
import eu.europa.ec.markt.dss.signature.asic.ASiCService;
import eu.europa.ec.markt.dss.signature.validation.TimestampToken;
import eu.europa.ec.markt.dss.validation102853.CertificateToken;
import eu.europa.ec.markt.dss.validation102853.bean.SignatureProductionPlace;
import eu.europa.ec.markt.dss.validation102853.xades.XAdESSignature;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.cert.ocsp.RespID;
import org.digidoc4j.Signature;
import org.digidoc4j.X509Cert;
import org.digidoc4j.exceptions.CertificateNotFoundException;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.exceptions.NotYetImplementedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;

import java.net.URI;
import java.util.*;

import static eu.europa.ec.markt.dss.DSSXMLUtils.createDocument;

import org.digidoc4j.SignatureProfile;
import static org.digidoc4j.SignatureProfile.*;

/**
 * BDoc signature implementation.
 */
public class BDocSignature implements Signature {
    private static final Logger logger = LoggerFactory.getLogger(BDocSignature.class);
    private XAdESSignature origin;
    private SignatureProductionPlace signerLocation;
    private List<DigiDoc4JException> validationErrors = new ArrayList<>();
    private static final Map<SignatureLevel, SignatureProfile> signatureProfileMap = new HashMap<SignatureLevel, SignatureProfile>() {
        {
            put(SignatureLevel.XAdES_BASELINE_B, B_BES);
            put(SignatureLevel.XAdES_BASELINE_T, LT);
            put(SignatureLevel.XAdES_BASELINE_LT, LT);
            put(SignatureLevel.XAdES_BASELINE_LTA, LTA);
            put(SignatureLevel.XAdES_A, LTA);
        }
    };

    /**
     * Create a new BDoc signature.
     *
     * @param signature XAdES signature to use for the BDoc signature
     */
    public BDocSignature(XAdESSignature signature) {
        logger.debug("");
        origin = signature;
        signerLocation = signature.getSignatureProductionPlace();
        logger.debug("New BDoc signature created");
    }

    /**
     * * Create a new BDOC signature.
     *
     * @param signature        XAdES signature to use for the BDoc signature
     * @param validationErrors list of DigiDoc4J exceptions to add to the signature
     */
    public BDocSignature(XAdESSignature signature, List<DigiDoc4JException> validationErrors) {
        logger.debug("");
        origin = signature;
        signerLocation = signature.getSignatureProductionPlace();
        this.validationErrors = validationErrors;
        logger.debug("New BDoc signature created");
    }

    @Override
    public void setCertificate(X509Cert cert) {
        logger.warn("Not yet implemented");
        throw new NotYetImplementedException();
    }

    @Override
    public String getCity() {
        logger.debug("");
        return signerLocation == null ? null : signerLocation.getCity();
    }

    @Override
    public String getCountryName() {
        logger.debug("");
        return signerLocation == null ? null : signerLocation.getCountryName();
    }

    @Override
    public String getId() {
        logger.debug("");
        return origin.getId();
    }

    @Override
    public byte[] getOcspNonce() {
        logger.warn("Not yet implemented");
        throw new NotYetImplementedException();
    }

    @Override
    public X509Cert getOCSPCertificate() {
        logger.debug("");

        if (origin.getOCSPSource().getContainedOCSPResponses().size() == 0)
            return null;

        String ocspCN = getOCSPCommonName();
        for (CertificateToken cert : origin.getCertPool().getCertificateTokens()) {
            String value = getCN(new X500Name(cert.getSubjectX500Principal().getName()));
            if (value.equals(ocspCN))
                return new X509Cert(cert.getCertificate());
        }
        CertificateNotFoundException exception = new CertificateNotFoundException(
                "Certificate for " + ocspCN + " not found in TSL");
        logger.error(exception.getMessage());
        throw exception;
    }

    private String getOCSPCommonName() {
        logger.debug("");
        RespID responderId = origin.getOCSPSource().getContainedOCSPResponses().get(0).getResponderId();
        String commonName = getCN(responderId.toASN1Object().getName());
        logger.debug("OCSP common name: " + commonName);
        return commonName;
    }

    private String getCN(X500Name x500Name) {
        logger.debug("");
        String name = x500Name.getRDNs(new ASN1ObjectIdentifier("2.5.4.3"))[0].getTypesAndValues()[0].getValue()
                .toString();
        logger.debug("Common name: " + name);
        return name;
    }

    @Override
    @Deprecated
    public String getPolicy() {
        logger.warn("Not yet implemented");
        throw new NotYetImplementedException();
    }

    @Override
    public String getPostalCode() {
        logger.debug("");
        return signerLocation == null ? null : signerLocation.getPostalCode();
    }

    @Override
    public Date getOCSPResponseCreationTime() {
        logger.debug("");
        Date date = origin.getOCSPSource().getContainedOCSPResponses().get(0).getProducedAt();
        logger.debug("Produced at date: " + date.toString());
        return date;
    }

    @Override
    @Deprecated
    public Date getProducedAt() {
        return getOCSPResponseCreationTime();
    }

    @Override
    public Date getTimeStampCreationTime() {
        logger.debug("");
        List<TimestampToken> signatureTimestamps = origin.getSignatureTimestamps();
        if (signatureTimestamps.size() == 0) {
            return null;
        }
        return signatureTimestamps.get(0).getGenerationTime();
    }

    @Override
    public SignatureProfile getProfile() {
        SignatureLevel dataFoundUpToLevel = origin.getDataFoundUpToLevel();
        logger.debug("getting profile for: " + dataFoundUpToLevel);
        return signatureProfileMap.get(dataFoundUpToLevel);
    }

    @Override
    public String getSignatureMethod() {
        logger.debug("");

        String xmlId = origin.getDigestAlgorithm().getXmlId();
        logger.debug("Signature method: " + xmlId);
        return xmlId;
    }

    @Override
    public List<String> getSignerRoles() {
        logger.debug("");
        String[] claimedSignerRoles = origin.getClaimedSignerRoles();
        return claimedSignerRoles == null ? null : Arrays.asList(claimedSignerRoles);
    }

    @Override
    public X509Cert getSigningCertificate() {
        logger.debug("");
        return new X509Cert(origin.getSigningCertificateToken().getCertificate());
    }

    @Override
    public Date getSigningTime() {
        logger.debug("");
        Date signingTime = origin.getSigningTime();
        logger.debug("Signing time: " + signingTime);
        return signingTime;
    }

    @Override
    @Deprecated
    public URI getSignaturePolicyURI() {
        logger.warn("Not yet implemented");
        throw new NotYetImplementedException();
    }

    @Override
    public String getStateOrProvince() {
        logger.debug("");
        return signerLocation == null ? null : signerLocation.getStateOrProvince();
    }

    @Override
    public X509Cert getTimeStampTokenCertificate() {
        logger.debug("");
        if (origin.getSignatureTimestamps() == null || origin.getSignatureTimestamps().size() == 0) {
            CertificateNotFoundException exception = new CertificateNotFoundException(
                    "TimeStamp certificate not found");
            logger.error(exception.getMessage());
            throw exception;
        }
        return new X509Cert(origin.getSignatureTimestamps().get(0).getIssuerToken().getCertificate());
    }

    @Override
    public List<DigiDoc4JException> validate(Validate validationType) {
        logger.debug("");
        return validationErrors;
    }

    @Override
    public List<DigiDoc4JException> validate() {
        logger.debug("");
        return validate(Validate.VALIDATE_FULL);
    }

    @Override
    public byte[] getRawSignature() {
        logger.debug("");
        Document document = createDocument(ASiCNamespaces.ASiC, ASiCService.ASICS_NS, origin.getSignatureElement());
        return DSSXMLUtils.transformDomToByteArray(document);
    }

    XAdESSignature getOrigin() {
        return origin;
    }
}