diff --git a/.travis.yml b/.travis.yml index a36449234..fc4313780 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,7 @@ dist: xenial language: java jdk: -- openjdk7 - openjdk8 -- openjdk11 branches: only: - develop diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 226d328c6..9fe286f70 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,5 +1,24 @@ DigiDoc4J Java library release notes ------------------------------------ + +Release 3.1.1 +------------------ +Summary of the major changes since 3.1.0 +------------------------------------------ +* Fix for BDOC/ASIC-E container detection +* Fix for not able to remove signatures from ASIC-E container +* Performance improvement +* New LOTL signer certs added to truststore + +Known issues +------------ +* While upgrading from version older than 2.1.1 be sure that your integration : + - doesn't use Xalan or XercesImpl dependencies + - uses a patched Java version (JDK7u40+, JDK8 or higher) + Xalan and XercesImpl were used to patch XML vulnerabilities in older java versions. They should be discarded with higher versions because they override default Java XML security. + If it is not possible to remove Xalan, then you can set your system property to override TransformerFactory : System.setProperty("javax.xml.transform.TransformerFactory","com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"); + + Release 3.1.0 ------------------ Summary of the major changes since 3.0.0 diff --git a/ddoc4j/pom.xml b/ddoc4j/pom.xml index 480027578..2f6d71428 100644 --- a/ddoc4j/pom.xml +++ b/ddoc4j/pom.xml @@ -6,7 +6,7 @@ org.digidoc4j ddoc4j jar - 3.1.0 + 3.1.1 DDoc4J DDoc4J is Java Library for validating DDOC documents. It's not recommended to use it directly but rather through DigiDoc4J's API. @@ -15,7 +15,7 @@ digidoc4j-parent org.digidoc4j - 3.1.0 + 3.1.1 @@ -50,6 +50,17 @@ org.apache.maven.plugins maven-javadoc-plugin + + + attach-javadocs + + jar + + + ${javadocOpt} + + + org.apache.maven.plugins @@ -61,4 +72,4 @@ - \ No newline at end of file + diff --git a/digidoc4j/pom.xml b/digidoc4j/pom.xml index 9e9e26bb2..0a33b1065 100644 --- a/digidoc4j/pom.xml +++ b/digidoc4j/pom.xml @@ -7,7 +7,7 @@ org.digidoc4j digidoc4j jar - 3.1.0 + 3.1.1 DigiDoc4j DigiDoc4j is a Java library for digitally signing documents and creating digital signature containers @@ -18,7 +18,7 @@ digidoc4j-parent org.digidoc4j - 3.1.0 + 3.1.1 @@ -43,7 +43,7 @@ ddoc4j org.digidoc4j - 3.1.0 + 3.1.1 @@ -58,7 +58,7 @@ commons-codec commons-codec - + commons-cli commons-cli @@ -634,9 +634,7 @@ jar - - ${javadocOpt} - + ${javadocOpt} diff --git a/digidoc4j/src/main/java/org/digidoc4j/ContainerBuilder.java b/digidoc4j/src/main/java/org/digidoc4j/ContainerBuilder.java index 254a2696b..5daf9f719 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/ContainerBuilder.java +++ b/digidoc4j/src/main/java/org/digidoc4j/ContainerBuilder.java @@ -10,20 +10,19 @@ package org.digidoc4j; -import java.io.File; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import eu.europa.esig.dss.DigestAlgorithm; import org.apache.commons.lang3.StringUtils; import org.digidoc4j.exceptions.DigiDoc4JException; import org.digidoc4j.exceptions.InvalidDataFileException; import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.impl.CustomContainerBuilder; +import org.digidoc4j.impl.asic.AsicContainer; +import org.digidoc4j.impl.asic.AsicParseResult; +import org.digidoc4j.impl.asic.asice.AsicEContainer; import org.digidoc4j.impl.asic.asice.AsicEContainerBuilder; +import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer; import org.digidoc4j.impl.asic.asice.bdoc.BDocContainerBuilder; +import org.digidoc4j.impl.asic.asics.AsicSContainer; import org.digidoc4j.impl.asic.asics.AsicSContainerBuilder; import org.digidoc4j.impl.ddoc.DDocContainerBuilder; import org.digidoc4j.impl.pades.PadesContainerBuilder; @@ -32,7 +31,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DigestAlgorithm; +import java.io.File; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Class for creating and opening containers. @@ -130,9 +134,9 @@ public static ContainerBuilder aContainer(Container.DocumentType type) { */ public Container build() { if (shouldOpenContainerFromFile()) { - return openContainerFromFile(); + return overrideContainerIfNeeded(openContainerFromFile()); } else if (shouldOpenContainerFromStream()) { - return openContainerFromStream(); + return overrideContainerIfNeeded(openContainerFromStream()); } Container container = createNewContainer(); addDataFilesToContainer(container); @@ -373,4 +377,38 @@ private void validateFileName() { } } } + + /** + * DD4J-414 - hackish solution for building BDoc container from existing container with no signatures. + * ContainerOpener considers any Asic container without signatures that is not ASiCS, a ASiCE by default. + * In the future ContainerOpener should take container type as an input to force BDoc when needed. + * At the moment did not want to change ContainerOpener API, that will be done with major release with + * more API changes. + * + * TODO: Should be refactored away in task - + */ + private Container overrideContainerIfNeeded(Container container) { + if (container instanceof AsicContainer && container.getSignatures().isEmpty()) { + return overrideContainerIfDifferentType((AsicContainer) container); + } else { + return container; + } + } + + private Container overrideContainerIfDifferentType(AsicContainer container) { + if (container instanceof AsicSContainer || containerType.equalsIgnoreCase(container.getType())) { + return container; + } else { + AsicParseResult containerParseResult = container.getContainerParseResult(); + Configuration configuration = container.getConfiguration(); + + if (containerType.equals(Container.DocumentType.BDOC.name())) { + return new BDocContainer(containerParseResult, configuration); + } else if (containerType.equals(Container.DocumentType.ASICE.name())) { + return new AsicEContainer(containerParseResult, configuration); + } else { + return container; + } + } + } } diff --git a/digidoc4j/src/main/java/org/digidoc4j/ContainerOpener.java b/digidoc4j/src/main/java/org/digidoc4j/ContainerOpener.java index 533f36162..eb10b0b8f 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/ContainerOpener.java +++ b/digidoc4j/src/main/java/org/digidoc4j/ContainerOpener.java @@ -10,23 +10,29 @@ package org.digidoc4j; -import java.io.BufferedInputStream; -import java.io.EOFException; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -import org.apache.commons.io.IOUtils; +import eu.europa.esig.dss.MimeType; import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.impl.asic.AsicFileContainerParser; +import org.digidoc4j.impl.asic.AsicParseResult; +import org.digidoc4j.impl.asic.AsicStreamContainerParser; import org.digidoc4j.impl.asic.asice.AsicEContainer; import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer; import org.digidoc4j.impl.asic.asics.AsicSContainer; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.impl.ddoc.DDocOpener; import org.digidoc4j.impl.pades.PadesContainer; import org.digidoc4j.utils.Helper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.BufferedInputStream; +import java.io.EOFException; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; + /** * Helper class for opening containers. The proper way of opening containers would be using {@link ContainerBuilder}, * for example using {@link ContainerBuilder#fromExistingFile(String)} and {@link ContainerBuilder#fromStream(InputStream)}. @@ -52,7 +58,7 @@ public static Container open(String path, Configuration configuration) throws Di if (Helper.isPdfFile(path)){ return openPadesContainer(path, configuration); } else if (Helper.isZipFile(new File(path))) { - return openBDocContainer(path, configuration); + return openAsicContainer(path, configuration); } else { return new DDocOpener().open(path, configuration); } @@ -85,24 +91,7 @@ public static Container open(String path) throws DigiDoc4JException { * @see ContainerBuilder */ public static Container open(InputStream stream, boolean actAsBigFilesSupportEnabled) { - logger.debug("Opening container from stream"); - BufferedInputStream bufferedInputStream = new BufferedInputStream(stream); - try { - if (Helper.isZipFile(bufferedInputStream)) { - if (Helper.isAsicSContainer(bufferedInputStream)){ - return new AsicSContainer(bufferedInputStream); - } else if (Helper.isAsicEContainer(bufferedInputStream)) { - return new AsicEContainer(bufferedInputStream); - } - return new BDocContainer(bufferedInputStream); - } else { - return new DDocOpener().open(bufferedInputStream); - } - } catch (IOException e) { - throw new DigiDoc4JException(e); - } finally { - IOUtils.closeQuietly(bufferedInputStream); - } + return open(stream, Configuration.getInstance()); } /** @@ -115,33 +104,36 @@ public static Container open(InputStream stream, boolean actAsBigFilesSupportEna */ public static Container open(InputStream stream, Configuration configuration) { logger.debug("Opening container from stream"); - BufferedInputStream bufferedInputStream = new BufferedInputStream(stream); - try { + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(stream)) { if (Helper.isZipFile(bufferedInputStream)) { - if (Helper.isAsicSContainer(bufferedInputStream)){ - return new AsicSContainer(bufferedInputStream, configuration); - } else if (Helper.isAsicEContainer(bufferedInputStream)) { - return new AsicEContainer(bufferedInputStream, configuration); + AsicParseResult parseResult = new AsicStreamContainerParser(bufferedInputStream, configuration).read(); + if (isAsicSContainer(parseResult)){ + return new AsicSContainer(parseResult, configuration); + } + if (isBDocContainer(parseResult)) { + return new BDocContainer(parseResult, configuration); } - return new BDocContainer(bufferedInputStream, configuration); + + return new AsicEContainer(parseResult, configuration); } else { return new DDocOpener().open(bufferedInputStream, configuration); } } catch (IOException e) { throw new DigiDoc4JException(e); - } finally { - IOUtils.closeQuietly(bufferedInputStream); } } - private static Container openBDocContainer(String path, Configuration configuration) { + private static Container openAsicContainer(String path, Configuration configuration) { configuration.loadConfiguration("digidoc4j.yaml", false); - if (Helper.isAsicSContainer(path)){ - return new AsicSContainer(path, configuration); - } else if (Helper.isAsicEContainer(path)) { - return new AsicEContainer(path, configuration); + AsicParseResult parseResult = new AsicFileContainerParser(path, configuration).read(); + if (isAsicSContainer(parseResult)){ + return new AsicSContainer(parseResult, configuration); + } + if (isBDocContainer(parseResult)) { + return new BDocContainer(parseResult, configuration); } - return new BDocContainer(path, configuration); + + return new AsicEContainer(parseResult, configuration); } private static Container openPadesContainer(String path, Configuration configuration) { @@ -149,4 +141,22 @@ private static Container openPadesContainer(String path, Configuration configura return new PadesContainer(configuration, path); } + private static boolean isAsicSContainer(AsicParseResult parseResult) { + return parseResult.getMimeType().equals(MimeType.ASICS.getMimeTypeString()); + } + + private static boolean isBDocContainer(AsicParseResult parseResult) { + return hasBDocOnlySignature(parseResult.getSignatures()); + } + + private static boolean hasBDocOnlySignature(List signatureWrappers) { + for (XadesSignatureWrapper signatureWrapper : signatureWrappers) { + if (SignatureContainerMatcherValidator.isBDocOnlySignature(signatureWrapper.getSignature().getProfile())) { + return true; + } + } + + return false; + } + } diff --git a/digidoc4j/src/main/java/org/digidoc4j/DetachedXadesSignatureBuilder.java b/digidoc4j/src/main/java/org/digidoc4j/DetachedXadesSignatureBuilder.java index 27c2e0e6c..fa87b562c 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/DetachedXadesSignatureBuilder.java +++ b/digidoc4j/src/main/java/org/digidoc4j/DetachedXadesSignatureBuilder.java @@ -1,9 +1,21 @@ +/* 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; +import static eu.europa.esig.dss.DigestAlgorithm.SHA256; import static eu.europa.esig.dss.SignatureLevel.XAdES_BASELINE_B; import static eu.europa.esig.dss.SignatureLevel.XAdES_BASELINE_LT; import static eu.europa.esig.dss.SignatureLevel.XAdES_BASELINE_LTA; import static java.util.Arrays.asList; +import static org.apache.commons.codec.binary.Base64.decodeBase64; import static org.apache.commons.lang3.StringUtils.isEmpty; import java.security.cert.X509Certificate; @@ -24,14 +36,16 @@ import org.digidoc4j.exceptions.TechnicalException; import org.digidoc4j.impl.SKOnlineOCSPSource; import org.digidoc4j.impl.SignatureFinalizer; +import org.digidoc4j.impl.asic.AsicSignatureParser; import org.digidoc4j.impl.asic.DetachedContentCreator; import org.digidoc4j.impl.asic.SkDataLoader; -import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.AsicESignatureOpener; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignatureOpener; import org.digidoc4j.impl.asic.xades.XadesSignature; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.impl.asic.xades.XadesSigningDssFacade; +import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; import org.digidoc4j.utils.Helper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -378,22 +392,28 @@ protected Signature createSignature(DSSDocument signedDocument) { throw new DigiDoc4JException(e); } List detachedContents = detachedContentCreator.getDetachedContentList(); - Signature signature = null; - if (SignatureProfile.LT_TM.equals(this.signatureParameters.getSignatureProfile())) { - BDocSignatureOpener signatureOpener = new BDocSignatureOpener(detachedContents, configuration); - List signatureList = signatureOpener.parse(signedDocument); - signature = signatureList.get(0); //Only one signature was created + XadesSignatureWrapper signatureWrapper = parseSignatureWrapper(signedDocument, detachedContents); + + Signature signature; + if (SignatureContainerMatcherValidator.isBDocOnlySignature(signatureParameters.getSignatureProfile())) { + BDocSignatureOpener signatureOpener = new BDocSignatureOpener(configuration); + signature = signatureOpener.open(signatureWrapper); validateOcspResponse(((BDocSignature) signature).getOrigin()); } else { - AsicESignatureOpener signatureOpener = new AsicESignatureOpener(detachedContents, configuration); - List signatureList = signatureOpener.parse(signedDocument); - signature = signatureList.get(0); //Only one signature was created + AsicESignatureOpener signatureOpener = new AsicESignatureOpener(configuration); + signature = signatureOpener.open(signatureWrapper); } policyDefinedByUser = null; logger.info("Signing detached XadES successfully completed"); return signature; } + private XadesSignatureWrapper parseSignatureWrapper(DSSDocument signedDocument, List detachedContents) { + AsicSignatureParser signatureParser = new AsicSignatureParser(detachedContents, configuration); + XadesSignature xadesSignature = signatureParser.parse(signedDocument); + return new XadesSignatureWrapper(xadesSignature, signedDocument); + } + protected void validateOcspResponse(XadesSignature xadesSignature) { if (isBaselineSignatureProfile()) { return; @@ -534,6 +554,20 @@ protected void setSignaturePolicy() { if (policyDefinedByUser != null && isDefinedAllPolicyValues()) { facade.setSignaturePolicy(policyDefinedByUser); } + + if (SignatureContainerMatcherValidator.isBDocOnlySignature(signatureParameters.getSignatureProfile())) { + facade.setSignaturePolicy(constructTMPolicy()); + } + } + + private Policy constructTMPolicy() { + Policy signaturePolicy = new Policy(); + signaturePolicy.setId("urn:oid:" + XadesSignatureValidator.TM_POLICY); + signaturePolicy.setDigestValue(decodeBase64("7pudpH4eXlguSZY2e/pNbKzGsq+fu//woYL1SZFws1A=")); + signaturePolicy.setQualifier("OIDAsURN"); + signaturePolicy.setDigestAlgorithm(SHA256); + signaturePolicy.setSpuri("https://www.sk.ee/repository/bdoc-spec21.pdf"); + return signaturePolicy; } protected void setSigningDate() { diff --git a/digidoc4j/src/main/java/org/digidoc4j/SignatureContainerMatcherValidator.java b/digidoc4j/src/main/java/org/digidoc4j/SignatureContainerMatcherValidator.java new file mode 100644 index 000000000..f54ab8093 --- /dev/null +++ b/digidoc4j/src/main/java/org/digidoc4j/SignatureContainerMatcherValidator.java @@ -0,0 +1,16 @@ +package org.digidoc4j; + +import java.util.Arrays; +import java.util.List; + +public class SignatureContainerMatcherValidator { + + private static final List BDOC_ONLY_SIGNATURE_PROFILES = Arrays.asList(SignatureProfile.LT_TM, SignatureProfile.B_EPES); + + public static boolean isBDocOnlySignature(SignatureProfile signatureProfile) { + if (signatureProfile == null) { + return false; + } + return BDOC_ONLY_SIGNATURE_PROFILES.contains(signatureProfile); + } +} diff --git a/digidoc4j/src/main/java/org/digidoc4j/exceptions/IllegalSignatureProfileException.java b/digidoc4j/src/main/java/org/digidoc4j/exceptions/IllegalSignatureProfileException.java new file mode 100644 index 000000000..b898c8be0 --- /dev/null +++ b/digidoc4j/src/main/java/org/digidoc4j/exceptions/IllegalSignatureProfileException.java @@ -0,0 +1,8 @@ +package org.digidoc4j.exceptions; + +public class IllegalSignatureProfileException extends DigiDoc4JException { + + public IllegalSignatureProfileException(String message) { + super(message); + } +} diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java index 2ebc3f743..cffeb6002 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java @@ -1,16 +1,16 @@ -package org.digidoc4j.impl.asic; +/* 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 + */ -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +package org.digidoc4j.impl.asic; +import eu.europa.esig.dss.DSSDocument; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.digidoc4j.Configuration; @@ -41,11 +41,22 @@ import org.digidoc4j.impl.asic.asics.AsicSSignature; import org.digidoc4j.impl.asic.manifest.AsicManifest; import org.digidoc4j.impl.asic.xades.SignatureExtender; +import org.digidoc4j.impl.asic.xades.XadesSignature; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.utils.Helper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * Created by Andrei on 7.11.2017. @@ -133,6 +144,19 @@ public AsicContainer(InputStream stream, Configuration configuration, String con this.openContainer(stream); } + /** + * ASicContainer constructor + * + * @param containerParseResult container parsed result + * @param configuration configuration + * @param containerType container type + */ + public AsicContainer(AsicParseResult containerParseResult, Configuration configuration, String containerType) { + this.configuration = configuration; + this.containerType = containerType; + this.populateContainerWithParseResult(containerParseResult); + } + @Override public ContainerValidationResult validate() { if (this.validationResult == null) { @@ -197,8 +221,15 @@ public Configuration getConfiguration() { return configuration; } - protected abstract List parseSignatureFiles(List signatureFiles, - List detachedContents); + private List openSignatures(List signatureWrappers) { + List signatures = new ArrayList<>(signatureWrappers.size()); + for (XadesSignatureWrapper signatureWrapper : signatureWrappers) { + signatures.add(getSignatureOpener().open(signatureWrapper)); + } + return signatures; + } + + protected abstract AsicSignatureOpener getSignatureOpener(); @Override public InputStream saveAsStream() { @@ -233,11 +264,23 @@ protected List extendAllSignatureProfile(SignatureProfile profile, Li List detachedContentList = detachedContentCreator.getDetachedContentList(); SignatureExtender signatureExtender = new SignatureExtender(getConfiguration(), detachedContentList); List extendedSignatureDocuments = signatureExtender.extend(signatures, profile); - List extendedSignatures = parseSignatureFiles(extendedSignatureDocuments, detachedContentList); + + List parsedSignatures = parseSignaturesWrappers(extendedSignatureDocuments, detachedContentList); + List extendedSignatures = openSignatures(parsedSignatures); LOGGER.debug("Finished extending all signatures"); return extendedSignatures; } + private List parseSignaturesWrappers(List signatureDocuments, List detachedContent) { + AsicSignatureParser signatureParser = new AsicSignatureParser(detachedContent, configuration); + List parsedSignatures = new ArrayList<>(); + for (DSSDocument signatureDocument : signatureDocuments) { + XadesSignature signature = signatureParser.parse(signatureDocument); + parsedSignatures.add(new XadesSignatureWrapper(signature, signatureDocument)); + } + return parsedSignatures; + } + protected void validateDataFilesRemoval() { if (!getSignatures().isEmpty()) { LOGGER.error("Datafiles cannot be removed from an already signed container"); @@ -292,10 +335,10 @@ private void populateContainerWithParseResult(AsicParseResult parseResult) { this.containerParseResult = parseResult; this.dataFiles.addAll(parseResult.getDataFiles()); this.timeStampToken = parseResult.getTimeStampToken(); - this.signatures.addAll(this.parseSignatureFiles(parseResult.getSignatures(), parseResult.getDetachedContents())); + this.signatures.addAll(this.openSignatures(parseResult.getSignatures())); } - private void removeExistingSignature(BDocSignature signature) { + private void removeExistingSignature(AsicSignature signature) { DSSDocument signatureDocument = signature.getSignatureDocument(); if (signatureDocument == null) { return; @@ -322,7 +365,7 @@ private void removeExistingFileFromContainer(String filePath) { private void removeAllExistingSignaturesFromContainer() { LOGGER.debug("Removing all existing signatures"); for (Signature signature : signatures) { - removeExistingSignature((BDocSignature) signature); + removeExistingSignature((AsicSignature) signature); } } @@ -402,11 +445,6 @@ private void validateSignatureId(Signature signature) { } } - private byte[] getDigest() { - DataFile dataFile = getDataFiles().get(0); - return dataFile.getBytes(); - } - /** * Controlls if timestamp token is defined * @@ -450,7 +488,7 @@ public void removeSignature(Signature signature) { boolean wasIncludedInContainer = signatures.remove(signature); if (wasIncludedInContainer && !wasNewlyAddedSignature) { LOGGER.debug("This signature was included in the container before the container was opened"); - removeExistingSignature((BDocSignature) signature); + removeExistingSignature((AsicSignature) signature); } } else { signatures.remove(signature); @@ -699,4 +737,8 @@ public Signature signRaw(byte[] rawSignature) { public void setSignatureProfile(SignatureProfile profile) { throw new NotSupportedException("Setting signature profile method is not supported by Asic container"); } + + public AsicParseResult getContainerParseResult() { + return containerParseResult; + } } diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java index ad77be764..c207a2923 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java @@ -10,18 +10,9 @@ package org.digidoc4j.impl.asic; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; - +import eu.europa.esig.dss.DSSDocument; +import eu.europa.esig.dss.InMemoryDocument; +import eu.europa.esig.dss.MimeType; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.BOMInputStream; import org.apache.commons.lang3.StringUtils; @@ -35,13 +26,23 @@ import org.digidoc4j.impl.StreamDocument; import org.digidoc4j.impl.asic.manifest.ManifestEntry; import org.digidoc4j.impl.asic.manifest.ManifestParser; +import org.digidoc4j.impl.asic.xades.XadesSignature; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.utils.MimeTypeUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; -import eu.europa.esig.dss.InMemoryDocument; -import eu.europa.esig.dss.MimeType; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; /** * Abstract class for parsing ASiC containers. @@ -54,6 +55,7 @@ public abstract class AsicContainerParser { //Matches META-INF/*signatures*.xml where the last * is a number private static final String SIGNATURES_FILE_REGEX = "META-INF/(.*)signatures(.*).xml"; private static final Pattern SIGNATURE_FILE_ENDING_PATTERN = Pattern.compile("(\\d+).xml"); + private final Configuration configuration; private AsicParseResult parseResult = new AsicParseResult(); private List signatures = new ArrayList<>(); private LinkedHashMap dataFiles = new LinkedHashMap<>(); @@ -70,6 +72,7 @@ public abstract class AsicContainerParser { private DataFile timestampToken; protected AsicContainerParser(Configuration configuration) { + this.configuration = configuration; storeDataFilesOnlyInMemory = configuration.storeDataFilesOnlyInMemory(); maxDataFileCachedInBytes = configuration.getMaxDataFileCachedInBytes(); } @@ -220,9 +223,9 @@ private void validateDataFile(String fileName) { private void populateParseResult() { Collection files = dataFiles.values(); parseResult.setDataFiles(new ArrayList<>(files)); - parseResult.setSignatures(signatures); parseResult.setCurrentUsedSignatureFileIndex(currentSignatureFileIndex); parseResult.setDetachedContents(detachedContents); + parseResult.setSignatures(parseSignatures()); parseResult.setManifestParser(manifestParser); parseResult.setZipFileComment(zipFileComment); parseResult.setAsicEntries(asicEntries); @@ -230,6 +233,16 @@ private void populateParseResult() { parseResult.setMimeType(mimeType); } + private List parseSignatures() { + AsicSignatureParser signatureParser = new AsicSignatureParser(parseResult.getDetachedContents(), configuration); + List parsedSignatures = new ArrayList<>(); + for (DSSDocument signatureDocument : signatures) { + XadesSignature signature = signatureParser.parse(signatureDocument); + parsedSignatures.add(new XadesSignatureWrapper(signature, signatureDocument)); + } + return parsedSignatures; + } + private boolean isMimeType(String entryName) { return StringUtils.equalsIgnoreCase("mimetype", entryName); } diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicParseResult.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicParseResult.java index f85d2d64d..7fbe2594d 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicParseResult.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicParseResult.java @@ -10,20 +10,20 @@ package org.digidoc4j.impl.asic; -import java.io.Serializable; -import java.util.List; - +import eu.europa.esig.dss.DSSDocument; import org.digidoc4j.DataFile; import org.digidoc4j.impl.asic.manifest.ManifestParser; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; -import eu.europa.esig.dss.DSSDocument; +import java.io.Serializable; +import java.util.List; /** * ASIC parse result */ public class AsicParseResult implements Serializable { - private List signatures; + private List signatures; private List dataFiles; private List detachedContents; private Integer currentUsedSignatureFileIndex; @@ -50,14 +50,14 @@ public void setDataFiles(List dataFiles) { /** * @return list of signatures */ - public List getSignatures() { + public List getSignatures() { return signatures; } /** * @param signatures list of signatures */ - public void setSignatures(List signatures) { + public void setSignatures(List signatures) { this.signatures = signatures; } diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java index 8edfaa864..7b82e8521 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java @@ -10,28 +10,35 @@ package org.digidoc4j.impl.asic; -import static eu.europa.esig.dss.SignatureLevel.*; -import static org.apache.commons.lang3.StringUtils.isEmpty; import eu.europa.esig.dss.DSSDocument; import eu.europa.esig.dss.InMemoryDocument; import eu.europa.esig.dss.SignerLocation; import eu.europa.esig.dss.client.tsp.OnlineTSPSource; import eu.europa.esig.dss.xades.signature.DSSSignatureUtils; - import org.apache.commons.lang3.StringUtils; import org.bouncycastle.cert.ocsp.BasicOCSPResp; -import org.digidoc4j.*; -import org.digidoc4j.exceptions.*; +import org.digidoc4j.Configuration; +import org.digidoc4j.DataFile; +import org.digidoc4j.DataToSign; +import org.digidoc4j.EncryptionAlgorithm; +import org.digidoc4j.OCSPSourceBuilder; +import org.digidoc4j.Signature; +import org.digidoc4j.SignatureBuilder; +import org.digidoc4j.SignatureContainerMatcherValidator; +import org.digidoc4j.SignatureProfile; +import org.digidoc4j.X509Cert; +import org.digidoc4j.exceptions.ContainerWithoutFilesException; +import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.exceptions.InvalidSignatureException; +import org.digidoc4j.exceptions.OCSPRequestFailedException; +import org.digidoc4j.exceptions.SignerCertificateRequiredException; +import org.digidoc4j.exceptions.TechnicalException; import org.digidoc4j.impl.SKOnlineOCSPSource; import org.digidoc4j.impl.SignatureFinalizer; -import org.digidoc4j.impl.asic.asice.AsicEContainer; -import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.AsicESignatureOpener; -import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer; -import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignatureOpener; -import org.digidoc4j.impl.asic.asics.AsicSContainer; import org.digidoc4j.impl.asic.xades.XadesSignature; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.impl.asic.xades.XadesSigningDssFacade; import org.digidoc4j.utils.Helper; import org.slf4j.Logger; @@ -42,6 +49,11 @@ import java.util.Date; import java.util.List; +import static eu.europa.esig.dss.SignatureLevel.XAdES_BASELINE_B; +import static eu.europa.esig.dss.SignatureLevel.XAdES_BASELINE_LT; +import static eu.europa.esig.dss.SignatureLevel.XAdES_BASELINE_LTA; +import static org.apache.commons.lang3.StringUtils.isEmpty; + /** * Signature builder for Asic container. */ @@ -73,6 +85,7 @@ protected Signature invokeSigningProcess() { @Override public DataToSign buildDataToSign() throws SignerCertificateRequiredException, ContainerWithoutFilesException { byte[] dataToSign = getDataToBeSigned(); + validateSignatureCompatibilityWithContainer(); return new DataToSign(dataToSign, signatureParameters, this); } @@ -98,12 +111,17 @@ public Signature finalizeSignature(byte[] signatureValue) { logger.debug("Finalizing signature XmlDSig: " + Helper.bytesToHex(signatureValue, hexMaxlen) + " [" + String.valueOf(signatureValue.length) + "]"); populateParametersForFinalizingSignature(signatureValue); + validateSignatureCompatibilityWithContainer(); Collection dataFilesToSign = getDataFiles(); validateDataFilesToSign(dataFilesToSign); DSSDocument signedDocument = facade.signDocument(signatureValue, dataFilesToSign); return createSignature(signedDocument); } + protected void validateSignatureCompatibilityWithContainer() { + // Do nothing + } + protected Signature createSignature(DSSDocument signedDocument) { logger.debug("Opening signed document validator"); Configuration configuration = getConfiguration(); @@ -115,22 +133,28 @@ protected Signature createSignature(DSSDocument signedDocument) { throw new DigiDoc4JException(e); } List detachedContents = detachedContentCreator.getDetachedContentList(); - Signature signature = null; - if (SignatureProfile.LT_TM.equals(this.signatureParameters.getSignatureProfile())) { - BDocSignatureOpener signatureOpener = new BDocSignatureOpener(detachedContents, configuration); - List signatureList = signatureOpener.parse(signedDocument); - signature = signatureList.get(0); //Only one signature was created - validateOcspResponse(((BDocSignature) signature).getOrigin()); + XadesSignatureWrapper signatureWrapper = parseSignatureWrapper(signedDocument, detachedContents); + + AsicSignature signature; + if (SignatureContainerMatcherValidator.isBDocOnlySignature(signatureParameters.getSignatureProfile())) { + BDocSignatureOpener signatureOpener = new BDocSignatureOpener(configuration); + signature = signatureOpener.open(signatureWrapper); + validateOcspResponse(signature.getOrigin()); } else { - AsicESignatureOpener signatureOpener = new AsicESignatureOpener(detachedContents, configuration); - List signatureList = signatureOpener.parse(signedDocument); - signature = signatureList.get(0); //Only one signature was created + AsicESignatureOpener signatureOpener = new AsicESignatureOpener(configuration); + signature = signatureOpener.open(signatureWrapper); } policyDefinedByUser = null; logger.info("Signing asic successfully completed"); return signature; } + private XadesSignatureWrapper parseSignatureWrapper(DSSDocument signatureDocument, List detachedContents) { + AsicSignatureParser signatureParser = new AsicSignatureParser(detachedContents, getConfiguration()); + XadesSignature xadesSignature = signatureParser.parse(signatureDocument); + return new XadesSignatureWrapper(xadesSignature, signatureDocument); + } + protected byte[] getDataToBeSigned() { logger.info("Getting data to sign"); initSigningFacade(); @@ -172,13 +196,7 @@ protected void initSigningFacade() { } public Configuration getConfiguration() { - if (container instanceof AsicSContainer) { - return ((AsicSContainer) container).getConfiguration(); - } - if (container instanceof AsicEContainer) { - return ((AsicEContainer) container).getConfiguration(); - } - return ((BDocContainer) container).getConfiguration(); + return container.getConfiguration(); } protected List getDataFiles() { diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureOpener.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureOpener.java new file mode 100644 index 000000000..df4b86c87 --- /dev/null +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureOpener.java @@ -0,0 +1,18 @@ +/* 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.asic; + +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; + +public interface AsicSignatureOpener { + + AsicSignature open(XadesSignatureWrapper signatureWrapper); +} diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureParser.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureParser.java new file mode 100644 index 000000000..e792b8411 --- /dev/null +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/AsicSignatureParser.java @@ -0,0 +1,45 @@ +/* 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.asic; + +import eu.europa.esig.dss.DSSDocument; +import org.digidoc4j.Configuration; +import org.digidoc4j.impl.asic.xades.XadesSignature; +import org.digidoc4j.impl.asic.xades.XadesSignatureParser; +import org.digidoc4j.impl.asic.xades.XadesValidationReportGenerator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class AsicSignatureParser { + + private final static Logger logger = LoggerFactory.getLogger(AsicSignatureParser.class); + + private final List detachedContents; + private final Configuration configuration; + private final XadesSignatureParser xadesSignatureParser = new XadesSignatureParser(); + + public AsicSignatureParser(List detachedContents, Configuration configuration) { + this.configuration = configuration; + this.detachedContents = detachedContents; + } + + public XadesSignature parse(DSSDocument xadesDocument) { + logger.debug("Parsing signature from xades document"); + return createXadesSignature(xadesDocument); + } + + private XadesSignature createXadesSignature(DSSDocument xadesDocument) { + XadesValidationReportGenerator xadesReportGenerator = new XadesValidationReportGenerator(xadesDocument, detachedContents, configuration); + return xadesSignatureParser.parse(xadesReportGenerator); + } +} diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/SKCommonCertificateVerifier.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/SKCommonCertificateVerifier.java index 92666ef8d..03ec5a876 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/SKCommonCertificateVerifier.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/SKCommonCertificateVerifier.java @@ -14,10 +14,7 @@ import java.io.ObjectInputStream; import java.io.Serializable; -import org.apache.commons.lang3.SerializationUtils; import org.digidoc4j.impl.asic.tsl.LazyCertificatePool; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import eu.europa.esig.dss.client.http.DataLoader; import eu.europa.esig.dss.validation.CertificateVerifier; @@ -34,7 +31,6 @@ */ public class SKCommonCertificateVerifier implements Serializable, CertificateVerifier { - private final Logger log = LoggerFactory.getLogger(SKCommonCertificateVerifier.class); private transient CommonCertificateVerifier commonCertificateVerifier = new CommonCertificateVerifier(); private transient CertificateSource trustedCertSource; @@ -44,7 +40,7 @@ public SKCommonCertificateVerifier() { @Override public CertificateSource getTrustedCertSource() { - return SerializationUtils.clone(trustedCertSource); + return commonCertificateVerifier.getTrustedCertSource(); } @Override diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java index 6759d65e8..08eb55ef7 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java @@ -1,20 +1,35 @@ -package org.digidoc4j.impl.asic.asice; +/* 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 + */ -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; +package org.digidoc4j.impl.asic.asice; -import org.digidoc4j.*; +import org.apache.commons.lang3.StringUtils; +import org.digidoc4j.Configuration; +import org.digidoc4j.Constant; +import org.digidoc4j.Container; +import org.digidoc4j.DataFile; +import org.digidoc4j.Signature; +import org.digidoc4j.SignatureContainerMatcherValidator; +import org.digidoc4j.SignatureProfile; +import org.digidoc4j.exceptions.IllegalSignatureProfileException; import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.impl.asic.AsicContainer; import org.digidoc4j.impl.asic.AsicContainerCreator; +import org.digidoc4j.impl.asic.AsicParseResult; +import org.digidoc4j.impl.asic.AsicSignatureOpener; import org.digidoc4j.utils.Helper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; - +import java.io.InputStream; +import java.io.OutputStream; /** * Created by Andrei on 7.11.2017. @@ -121,21 +136,35 @@ protected AsicEContainer(InputStream stream, Configuration configuration, String super(stream, configuration, containerType); } + /** + * AsicEContainer constructor + * + * @param containerParseResult container parsed result + * @param configuration configuration + */ + public AsicEContainer(AsicParseResult containerParseResult, Configuration configuration) { + this(containerParseResult, configuration, Constant.ASICE_CONTAINER_TYPE); + } + + /** + * AsicEContainer constructor + * + * @param containerParseResult container parsed result + * @param configuration configuration + * @param containerType container type + */ + protected AsicEContainer(AsicParseResult containerParseResult, Configuration configuration, String containerType) { + super(containerParseResult, configuration, containerType); + } + @Override public void save(OutputStream out) { writeAsicContainer(new AsicContainerCreator(out)); } @Override - protected List parseSignatureFiles(List signatureFiles, List detachedContents) { - Configuration configuration = getConfiguration(); - AsicESignatureOpener signatureOpener = new AsicESignatureOpener(detachedContents, configuration); - List signatures = new ArrayList<>(signatureFiles.size()); - for (DSSDocument signatureFile : signatureFiles) { - List asicSignatures = signatureOpener.parse(signatureFile); - signatures.addAll(asicSignatures); - } - return signatures; + protected AsicSignatureOpener getSignatureOpener() { + return new AsicESignatureOpener(getConfiguration()); } protected String createUserAgent() { @@ -150,4 +179,17 @@ protected String createUserAgent() { public DataFile getTimeStampToken() { throw new NotSupportedException("Not for ASiC-E container"); } + + @Override + protected void validateIncomingSignature(Signature signature) { + super.validateIncomingSignature(signature); + if (SignatureContainerMatcherValidator.isBDocOnlySignature(signature.getProfile()) && isAsicEContainer()) { + throw new IllegalSignatureProfileException( + "Cannot add BDoc specific (" + signature.getProfile() + ") signature to ASiCE container"); + } + } + + private boolean isAsicEContainer() { + return StringUtils.equals(Container.DocumentType.ASICE.name(), getType()); + } } diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java index 94a13cadc..72c5155b8 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java @@ -1,5 +1,9 @@ package org.digidoc4j.impl.asic.asice; +import org.apache.commons.lang3.StringUtils; +import org.digidoc4j.Container; +import org.digidoc4j.SignatureContainerMatcherValidator; +import org.digidoc4j.exceptions.IllegalSignatureProfileException; import org.digidoc4j.impl.asic.AsicSignatureBuilder; /** @@ -9,4 +13,17 @@ public class AsicESignatureBuilder extends AsicSignatureBuilder { @Override protected void setSignaturePolicy() {} + + @Override + protected void validateSignatureCompatibilityWithContainer() { + super.validateSignatureCompatibilityWithContainer(); + if (SignatureContainerMatcherValidator.isBDocOnlySignature(signatureParameters.getSignatureProfile()) && isAsicEContainer()) { + throw new IllegalSignatureProfileException( + "Cannot add BDoc specific (" + signatureParameters.getSignatureProfile() + ") signature to ASiCE container"); + } + } + + private boolean isAsicEContainer() { + return container instanceof AsicEContainer && StringUtils.equals(Container.DocumentType.ASICE.name(), container.getType()); + } } diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java index 1bded07dd..a4d71fb9b 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java @@ -10,61 +10,49 @@ package org.digidoc4j.impl.asic.asice; -import java.util.ArrayList; -import java.util.List; - import org.digidoc4j.Configuration; +import org.digidoc4j.impl.asic.AsicSignature; +import org.digidoc4j.impl.asic.AsicSignatureOpener; import org.digidoc4j.impl.asic.xades.XadesSignature; -import org.digidoc4j.impl.asic.xades.XadesSignatureParser; -import org.digidoc4j.impl.asic.xades.XadesValidationReportGenerator; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidatorFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; - /** Class for converting Xades signature to ASiCE signature. */ -public class AsicESignatureOpener { +public class AsicESignatureOpener implements AsicSignatureOpener { private final static Logger logger = LoggerFactory.getLogger(AsicESignatureOpener.class); - private final List detachedContents; private Configuration configuration; - private XadesSignatureParser xadesSignatureParser = new XadesSignatureParser(); /** * Constructor * - * @param detachedContents list of detached content * @param configuration configuration */ - public AsicESignatureOpener(List detachedContents, Configuration configuration) { + public AsicESignatureOpener(Configuration configuration) { this.configuration = configuration; - this.detachedContents = detachedContents; } /** - * Xades document parsing method. - * @param xadesDocument Given Xades document - * @return List of ASiCE signatures + * Xades signature wrapper opening method. + * @param signatureWrapper wrapper containing signature document and it's xades signature + * @return ASiCE signature */ - public List parse(DSSDocument xadesDocument) { - logger.debug("Parsing xades document"); - List signatures = new ArrayList<>(1); - AsicESignature asicSignature = createAsicESignature(xadesDocument); - signatures.add(asicSignature); - return signatures; + @Override + public AsicSignature open(XadesSignatureWrapper signatureWrapper) { + logger.debug("Opening xades signature"); + return createAsicESignature(signatureWrapper); } - private AsicESignature createAsicESignature(DSSDocument xadesDocument) { - XadesValidationReportGenerator xadesReportGenerator = new XadesValidationReportGenerator(xadesDocument, detachedContents, configuration); - XadesSignature signature = xadesSignatureParser.parse(xadesReportGenerator); - XadesSignatureValidator xadesValidator = createSignatureValidator(signature); - AsicESignature asicSignature = new AsicESignature(signature, xadesValidator); - asicSignature.setSignatureDocument(xadesDocument); - return asicSignature; + private AsicESignature createAsicESignature(XadesSignatureWrapper signatureWrapper) { + XadesSignatureValidator xadesValidator = createSignatureValidator(signatureWrapper.getSignature()); + AsicESignature asicESignature = new AsicESignature(signatureWrapper.getSignature(), xadesValidator); + asicESignature.setSignatureDocument(signatureWrapper.getSignatureDocument()); + return asicESignature; } private XadesSignatureValidator createSignatureValidator(XadesSignature signature) { diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java index 71c3872be..86ebc7f19 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java @@ -10,22 +10,19 @@ package org.digidoc4j.impl.asic.asice.bdoc; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - import org.digidoc4j.Configuration; import org.digidoc4j.Constant; import org.digidoc4j.DataFile; -import org.digidoc4j.Signature; import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.impl.asic.AsicContainerCreator; +import org.digidoc4j.impl.asic.AsicParseResult; +import org.digidoc4j.impl.asic.AsicSignatureOpener; import org.digidoc4j.impl.asic.asice.AsicEContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; +import java.io.InputStream; +import java.io.OutputStream; /** * Offers functionality for handling data files and signatures in a container. @@ -90,20 +87,24 @@ public BDocContainer(InputStream stream, Configuration configuration) { super(stream, configuration, Constant.BDOC_CONTAINER_TYPE); } + /** + * BDocContainer constructor + * + * @param containerParseResult container parsed result + * @param configuration configuration + */ + public BDocContainer(AsicParseResult containerParseResult, Configuration configuration) { + super(containerParseResult, configuration, Constant.BDOC_CONTAINER_TYPE); + } + @Override public void save(OutputStream out) { writeAsicContainer(new AsicContainerCreator(out)); } - protected List parseSignatureFiles(List signatureFiles, List detachedContents) { - Configuration configuration = getConfiguration(); - BDocSignatureOpener signatureOpener = new BDocSignatureOpener(detachedContents, configuration); - List signatures = new ArrayList<>(signatureFiles.size()); - for (DSSDocument signatureFile : signatureFiles) { - List bDocSignatures = signatureOpener.parse(signatureFile); - signatures.addAll(bDocSignatures); - } - return signatures; + @Override + protected AsicSignatureOpener getSignatureOpener() { + return new BDocSignatureOpener(getConfiguration()); } @Override diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureOpener.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureOpener.java index bfd2c63b3..0692bc84a 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureOpener.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureOpener.java @@ -10,57 +10,46 @@ package org.digidoc4j.impl.asic.asice.bdoc; -import java.util.ArrayList; -import java.util.List; - import org.digidoc4j.Configuration; +import org.digidoc4j.impl.asic.AsicSignature; +import org.digidoc4j.impl.asic.AsicSignatureOpener; import org.digidoc4j.impl.asic.xades.XadesSignature; -import org.digidoc4j.impl.asic.xades.XadesSignatureParser; -import org.digidoc4j.impl.asic.xades.XadesValidationReportGenerator; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidatorFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; - /** * BDOC signature opener */ -public class BDocSignatureOpener { +public class BDocSignatureOpener implements AsicSignatureOpener { private final static Logger logger = LoggerFactory.getLogger(BDocSignatureOpener.class); - private final List detachedContents; private Configuration configuration; - private XadesSignatureParser xadesSignatureParser = new XadesSignatureParser(); /** - * @param detachedContents list of detached content * @param configuration configuration */ - public BDocSignatureOpener(List detachedContents, Configuration configuration) { + public BDocSignatureOpener(Configuration configuration) { this.configuration = configuration; - this.detachedContents = detachedContents; } /** - * @param xadesDocument XADES document - * @return list of BDOC signatures + * Xades signature wrapper opening method. + * @param signatureWrapper wrapper containing signature document and it's xades signature + * @return BDoc signature */ - public List parse(DSSDocument xadesDocument) { - logger.debug("Parsing xades document"); - List signatures = new ArrayList<>(1); - BDocSignature bDocSignature = createBDocSignature(xadesDocument); - signatures.add(bDocSignature); - return signatures; + @Override + public AsicSignature open(XadesSignatureWrapper signatureWrapper) { + logger.debug("Opening xades signature"); + return createBDocSignature(signatureWrapper); } - private BDocSignature createBDocSignature(DSSDocument xadesDocument) { - XadesValidationReportGenerator xadesReportGenerator = new XadesValidationReportGenerator(xadesDocument, detachedContents, configuration); - XadesSignature signature = xadesSignatureParser.parse(xadesReportGenerator); - XadesSignatureValidator xadesValidator = createSignatureValidator(signature); - BDocSignature bDocSignature = new BDocSignature(signature, xadesValidator); - bDocSignature.setSignatureDocument(xadesDocument); + private BDocSignature createBDocSignature(XadesSignatureWrapper signatureWrapper) { + XadesSignatureValidator xadesValidator = createSignatureValidator(signatureWrapper.getSignature()); + BDocSignature bDocSignature = new BDocSignature(signatureWrapper.getSignature(), xadesValidator); + bDocSignature.setSignatureDocument(signatureWrapper.getSignatureDocument()); return bDocSignature; } diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java index f418f1a3c..dc0ada65c 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java @@ -1,24 +1,32 @@ -package org.digidoc4j.impl.asic.asics; +/* 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 + */ -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; +package org.digidoc4j.impl.asic.asics; -import org.apache.commons.io.IOUtils; -import org.digidoc4j.*; -import org.digidoc4j.exceptions.InvalidSignatureException; +import org.digidoc4j.Configuration; +import org.digidoc4j.Constant; +import org.digidoc4j.DataFile; +import org.digidoc4j.Signature; +import org.digidoc4j.SignatureProfile; import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.impl.asic.AsicContainer; import org.digidoc4j.impl.asic.AsicContainerCreator; -import org.digidoc4j.impl.asic.asice.AsicESignature; +import org.digidoc4j.impl.asic.AsicParseResult; +import org.digidoc4j.impl.asic.AsicSignatureOpener; import org.digidoc4j.impl.asic.asice.AsicESignatureOpener; import org.digidoc4j.utils.Helper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; +import java.io.InputStream; +import java.io.OutputStream; /** * Created by Andrei on 7.11.2017. @@ -70,6 +78,16 @@ public AsicSContainer(InputStream stream, Configuration configuration) { super(stream, configuration, Constant.ASICS_CONTAINER_TYPE); } + /** + * AsicSContainer constructor + * + * @param containerParseResult container parsed result + * @param configuration configuration + */ + public AsicSContainer(AsicParseResult containerParseResult, Configuration configuration) { + super(containerParseResult, configuration, Constant.ASICS_CONTAINER_TYPE); + } + @Override public DataFile getTimeStampToken() { return timeStampToken; @@ -81,15 +99,8 @@ public void save(OutputStream out) { } @Override - protected List parseSignatureFiles(List signatureFiles, List detachedContents) { - Configuration configuration = getConfiguration(); - AsicESignatureOpener signatureOpener = new AsicESignatureOpener(detachedContents, configuration); - List signatures = new ArrayList<>(signatureFiles.size()); - for (DSSDocument signatureFile : signatureFiles) { - List asicSignatures = signatureOpener.parse(signatureFile); - signatures.addAll(asicSignatures); - } - return signatures; + protected AsicSignatureOpener getSignatureOpener() { + return new AsicESignatureOpener(getConfiguration()); } /** diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/tsl/ClonedTslCertificateSource.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/tsl/ClonedTslCertificateSource.java deleted file mode 100644 index 87cd88d03..000000000 --- a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/tsl/ClonedTslCertificateSource.java +++ /dev/null @@ -1,98 +0,0 @@ -/* 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.asic.tsl; - -import java.util.List; - -import javax.security.auth.x500.X500Principal; - -import eu.europa.esig.dss.x509.CertificateSourceType; -import org.apache.commons.lang3.SerializationUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import eu.europa.esig.dss.tsl.TrustedListsCertificateSource; -import eu.europa.esig.dss.x509.CertificatePool; -import eu.europa.esig.dss.x509.CertificateSource; -import eu.europa.esig.dss.x509.CertificateToken; - -/** - * Uses a cloned TSL object so that each signature creation and validation process would - * use its own separate TSL object. This avoids polluting certificate pool with certificates - * found within signatures. - */ -public class ClonedTslCertificateSource implements CertificateSource { - - private static final Logger logger = LoggerFactory.getLogger(ClonedTslCertificateSource.class); - private CertificateSource certificateSource; - private CertificateSource clonedCertificateSource; - private TrustedListsCertificateSource trustedListsCertificateSource; - - /** - * @param certificateSource source of certificate - */ - public ClonedTslCertificateSource(CertificateSource certificateSource) { - logger.debug("Instantiating cloned tsl cert source"); - this.certificateSource = certificateSource; - } - - private CertificateSource getCertificateSource() { - logger.debug("Accessing TSL"); - if (clonedCertificateSource == null) { - initializeClonedTsl(); - } - return clonedCertificateSource; - } - - private void initializeClonedTsl() { - if (certificateSource instanceof LazyTslCertificateSource) { - ((LazyTslCertificateSource) certificateSource).refreshIfCacheExpired(); - trustedListsCertificateSource = ((LazyTslCertificateSource) certificateSource).getTslLoader().getTslCertificateSource(); - } - logger.debug("Cloning TSL"); - clonedCertificateSource = (CertificateSource) SerializationUtils.clone(certificateSource); - logger.debug("Finished cloning TSL"); - } - - /** - * Get TrustedListsCertificateSource object defined in TslLoader. - * - * @return TrustedListsCertificateSource - */ - public TrustedListsCertificateSource getTrustedListsCertificateSource(){ - return trustedListsCertificateSource; - } - - @Override - public CertificatePool getCertificatePool() { - return getCertificateSource().getCertificatePool(); - } - - @Override - public CertificateToken addCertificate(CertificateToken certificate) { - return getCertificateSource().addCertificate(certificate); - } - - @Override - public List get(X500Principal x500Principal) { - return getCertificateSource().get(x500Principal); - } - - @Override - public CertificateSourceType getCertificateSourceType() { - return CertificateSourceType.TRUSTED_LIST; - } - - @Override - public List getCertificates() { - return getCertificateSource().getCertificates(); - } -} diff --git a/digidoc4j/src/main/java/org/digidoc4j/impl/asic/xades/XadesSignatureWrapper.java b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/xades/XadesSignatureWrapper.java new file mode 100644 index 000000000..b77363754 --- /dev/null +++ b/digidoc4j/src/main/java/org/digidoc4j/impl/asic/xades/XadesSignatureWrapper.java @@ -0,0 +1,34 @@ +/* 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.asic.xades; + +import eu.europa.esig.dss.DSSDocument; + +import java.io.Serializable; + +public class XadesSignatureWrapper implements Serializable { + + private final XadesSignature signature; + private final DSSDocument signatureDocument; + + public XadesSignatureWrapper(XadesSignature signature, DSSDocument signatureDocument) { + this.signature = signature; + this.signatureDocument = signatureDocument; + } + + public XadesSignature getSignature() { + return signature; + } + + public DSSDocument getSignatureDocument() { + return signatureDocument; + } +} diff --git a/digidoc4j/src/main/java/org/digidoc4j/utils/Helper.java b/digidoc4j/src/main/java/org/digidoc4j/utils/Helper.java index b4d17ff76..219d7c0ee 100644 --- a/digidoc4j/src/main/java/org/digidoc4j/utils/Helper.java +++ b/digidoc4j/src/main/java/org/digidoc4j/utils/Helper.java @@ -10,10 +10,31 @@ package org.digidoc4j.utils; -import static java.lang.Math.min; -import static java.nio.file.Files.deleteIfExists; +import eu.europa.esig.dss.DSSDocument; +import eu.europa.esig.dss.DSSUtils; +import eu.europa.esig.dss.MimeType; +import eu.europa.esig.dss.SignatureLevel; +import eu.europa.esig.dss.validation.SignaturePolicyProvider; +import eu.europa.esig.dss.xades.DSSXMLUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.filefilter.CanReadFileFilter; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.digidoc4j.Container; +import org.digidoc4j.ContainerBuilder; +import org.digidoc4j.DataFile; +import org.digidoc4j.SignatureProfile; +import org.digidoc4j.Version; +import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.io.BufferedInputStream; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.File; @@ -44,37 +65,9 @@ import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import java.util.zip.ZipInputStream; - -import javax.swing.filechooser.FileNameExtensionFilter; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.filefilter.CanReadFileFilter; -import org.apache.commons.io.input.BOMInputStream; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.digidoc4j.Container; -import org.digidoc4j.ContainerBuilder; -import org.digidoc4j.DataFile; -import org.digidoc4j.SignatureProfile; -import org.digidoc4j.Version; -import org.digidoc4j.exceptions.DigiDoc4JException; -import org.digidoc4j.exceptions.TechnicalException; -import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import eu.europa.esig.dss.DSSDocument; -import eu.europa.esig.dss.DSSUtils; -import eu.europa.esig.dss.InMemoryDocument; -import eu.europa.esig.dss.MimeType; -import eu.europa.esig.dss.SignatureLevel; -import eu.europa.esig.dss.validation.SignaturePolicyProvider; -import eu.europa.esig.dss.xades.DSSXMLUtils; +import static java.lang.Math.min; +import static java.nio.file.Files.deleteIfExists; /** * Class of helper methods. @@ -547,107 +540,6 @@ public boolean accept(File dir, String name) { } } - /** - * Checks that it's AsicE container - * - * @param path - * @return true if AsicE container - */ - public static boolean isAsicEContainer(String path) { - String extension = FilenameUtils.getExtension(path); - if ("sce".equals(extension) || "asice".equals(extension)) { - return true; - } else if ("zip".equals(extension)) { - try { - return parseAsicContainer(new BufferedInputStream(new FileInputStream(path)), MimeType.ASICE); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return false; - } - - /** - * Checks that it's AsicS container - * - * @param stream - * @return true if AsicS container - */ - public static boolean isAsicEContainer(BufferedInputStream stream) { - boolean isAsic = false; - try { - isAsic = parseAsicContainer(stream, MimeType.ASICE); - } catch (IOException e) { - e.printStackTrace(); - } - return isAsic; - } - - /** - * Checks that it's AsicS container - * - * @param path - * @return true if AsicS container - */ - public static boolean isAsicSContainer(String path) { - String extension = FilenameUtils.getExtension(path); - if ("scs".equals(extension) || "asics".equals(extension)) { - return true; - } else if ("zip".equals(extension)) { - try { - return parseAsicContainer(new BufferedInputStream(new FileInputStream(path)), MimeType.ASICS); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return false; - } - - /** - * Checks that it's AsicS container - * - * @param stream - * @return true if AsicS container - */ - public static boolean isAsicSContainer(BufferedInputStream stream) { - boolean isAsic = false; - try { - isAsic = parseAsicContainer(stream, MimeType.ASICS); - } catch (IOException e) { - e.printStackTrace(); - } - return isAsic; - } - - private static boolean parseAsicContainer(BufferedInputStream stream, MimeType mtype) throws IOException { - stream.mark(stream.available() + 1); - ZipInputStream zipInputStream = new ZipInputStream(stream); - try { - ZipEntry entry; - while ((entry = zipInputStream.getNextEntry()) != null) { - if (StringUtils.equalsIgnoreCase("mimetype", entry.getName())) { - InputStream zipFileInputStream = zipInputStream; - BOMInputStream bomInputStream = new BOMInputStream(zipFileInputStream); - DSSDocument document = new InMemoryDocument(bomInputStream); - String mimeType = StringUtils.trim(IOUtils.toString(IOUtils.toByteArray(document.openStream()), "UTF-8")); - if (StringUtils.equalsIgnoreCase(mimeType, mtype.getMimeTypeString())) { - return true; - } - } - } - } catch (IOException e) { - logger.error("Error reading asic container stream: " + e.getMessage()); - throw new TechnicalException("Error reading asic container stream: ", e); - } finally { - stream.reset(); - } - return false; - } - /** * Checks that it's pades container * diff --git a/digidoc4j/src/main/resources/keystore/keystore.jks b/digidoc4j/src/main/resources/keystore/keystore.jks index e83a9b5d0..056ea2458 100644 Binary files a/digidoc4j/src/main/resources/keystore/keystore.jks and b/digidoc4j/src/main/resources/keystore/keystore.jks differ diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.2.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.2.crt new file mode 100644 index 000000000..1cbe6fbfb --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.2.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.3.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.3.crt new file mode 100644 index 000000000..357270ca6 --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.3.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.4.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.4.crt new file mode 100644 index 000000000..8f8a986aa --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.4.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.5.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.5.crt new file mode 100644 index 000000000..b4fd514b6 --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.5.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.6.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.6.crt new file mode 100644 index 000000000..a6c235ef2 --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.6.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.7.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.7.crt new file mode 100644 index 000000000..fbaa4498a --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.7.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +MIIG3jCCBMagAwIBAgIUGuqe9pHg6UIaItA5/9FCYe0jS3IwDQYJKoZIhvcNAQELBQAwczELMAkGA1UEBhMCQkUxGTAXBgNVBGEMEE5UUkJFLTA1Mzc2OTgzMTgxIDAeBgNVBAoMF1F1b1ZhZGlzIFRydXN0bGluayBCVkJBMScwJQYDVQQDDB5RdW9WYWRpcyBCZWxnaXVtIElzc3VpbmcgQ0EgRzIwHhcNMTgwMzA3MTYwMTQzWhcNMjEwMzA3MTYxMTAwWjBxMQswCQYDVQQGEwJCRTEUMBIGA1UECwwLSW5mb3JtYXRpY3MxGzAZBgNVBGEMElZBVEJFLTA5NDkuMzgzLjM0MjEcMBoGA1UECgwTRXVyb3BlYW4gQ29tbWlzc2lvbjERMA8GA1UEAwwIRUNfRElHSVQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnRky4DfnlZEM8p9TbPr2Rw4FiMVKNEBG1PMymxuvpRJOUFYpMt0fksGm6sQui2mCNdyOJV6BSXiwZktKYCQUhzizrrsV5sja8r2NN/vJEvs+x9TsG6l6Sq1XK+RfU3D8UNvHtcklrcPdr0LWdATOm4SDwLNidKF4HunHFTo3fkRlGh7grrt/WCPNXqEZiPtWA7AoGEK+VVYwVU8PopoL9gg1acSZHoCKgh3tTVziX15fvn/DiP3TAQGITVVY/66UFZy15pcdMSzMiumP/etNEQm9a6yz9nXVTXfZdR0dHeu2jlhr5ATZBirgkUrxqWkUdoq8H6dNcAaYFfUglnxmbAgMBAAGjggJqMIICZjB3BggrBgEFBQcBAQRrMGkwOAYIKwYBBQUHMAKGLGh0dHA6Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZiZWNhZzIuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8vdXcub2NzcC5xdW92YWRpc2dsb2JhbC5jb20wHQYDVR0OBBYEFM8doj2/7+PpPvEU6kOk0Dty0hTzMB8GA1UdIwQYMBaAFIfJvDGXEnpzu37APUVRtAEllVGrMFoGA1UdIARTMFEwRAYKKwYBBAG+WAGDEDA2MDQGCCsGAQUFBwIBFihodHRwOi8vd3d3LnF1b3ZhZGlzZ2xvYmFsLmNvbS9yZXBvc2l0b3J5MAkGBwQAi+xAAQMwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5xdW92YWRpc2dsb2JhbC5jb20vcXZiZWNhZzIuY3JsMA4GA1UdDwEB/wQEAwIGwDApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisGAQQBgjcKAwwwEwYKKoZIhvcvAQEJAgQFMAMCAQEwNAYKKoZIhvcvAQEJAQQmMCQCAQGGH2h0dHA6Ly90cy5xdW92YWRpc2dsb2JhbC5jb20vYmUwgYsGCCsGAQUFBwEDBH8wfTAVBggrBgEFBQcLAjAJBgcEAIvsSQECMAgGBgQAjkYBATAIBgYEAI5GAQQwEwYGBACORgEGMAkGBwQAjkYBBgIwOwYGBACORgEFMDEwLxYpaHR0cHM6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL3JlcG9zaXRvcnkTAmVuMA0GCSqGSIb3DQEBCwUAA4ICAQADskuxFuqHe4hUCFe41oYX+7NP+MBPqtpyNbi1S4TIyVvXL1xxF1pa/qJmFnpJ7aui4DXqjU0VkLpDV6vO0SQEFNcrnVCU8bG/31k2DLgssDo0d1jCmGWK+8C5GCrZlU7dyaeaMZY2bj+OJ85Ab7jYFFTuT8J53xUR8SMb+kn0qLsuQAzII4tYW4rG1cqwHreGjSzMDCWwgMRyAM6L8g9VmXH/BBb6p6vD6uwnKiQQy45qieBTIrjo1tkDVJRm1OYxT4hYxR+3qAL9PMNuA1CqZJ7FDnQ0zm3Ojd936JFGA/YBdnoRDRR+W5Pua2uwGp9ESVsiDAcFRmg0Ol/j8JrH3KnZCfNSbKbiizFZDLsROZnC4mqROdFZxnl2HDqKGl8Hp+LfJS8dgOkJYNuAJPtk4gtsbUvEmO0zC4u4BN5J2vpvrcd9QERRadNFsfkQIxKqvE7/SehvlFPeQJP7iQ+jNftafu7LOQMe4KyrT6HR/hRb2jwqE4zpytYQ3uKQdYwif+PlKdbDn9jOiWBJ50miecTCh6oAvDjsONLMhKLQm7cn7P7s8S/uadkcHJ07T/BjMqak2JQYruREK3K3A8y7NM4pSydW+S/Iq5AzNWmwUSlfiVXOAMJEktjiPA6z9RZaDHoPA9ybzRLl2WL9xHQVfdiKzUJl1hTDp4qApm6VRQ== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.8.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.8.crt new file mode 100644 index 000000000..1e2fa6839 --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.8.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.crt b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.crt new file mode 100644 index 000000000..cd228d530 --- /dev/null +++ b/digidoc4j/src/main/resources/keystore/keystore_certs/ec.europa.eu.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/digidoc4j/src/test/java/org/digidoc4j/AbstractTest.java b/digidoc4j/src/test/java/org/digidoc4j/AbstractTest.java index b984119f7..d15384103 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/AbstractTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/AbstractTest.java @@ -1,37 +1,33 @@ package org.digidoc4j; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.RandomAccessFile; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.util.Collections; -import java.util.List; - +import eu.europa.esig.dss.DSSDocument; +import eu.europa.esig.dss.DSSUtils; +import eu.europa.esig.dss.client.tsp.OnlineTSPSource; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; -import org.digidoc4j.impl.ConfigurationSingeltonHolder; import org.digidoc4j.impl.CommonOCSPSource; +import org.digidoc4j.impl.ConfigurationSingeltonHolder; import org.digidoc4j.impl.asic.AsicFileContainerParser; import org.digidoc4j.impl.asic.AsicParseResult; import org.digidoc4j.impl.asic.AsicStreamContainerParser; import org.digidoc4j.impl.asic.SkDataLoader; +import org.digidoc4j.impl.asic.asice.AsicEContainer; +import org.digidoc4j.impl.asic.asice.AsicESignature; +import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer; +import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; +import org.digidoc4j.impl.asic.asics.AsicSContainer; import org.digidoc4j.impl.asic.xades.XadesSigningDssFacade; +import org.digidoc4j.impl.ddoc.DDocContainer; import org.digidoc4j.signers.PKCS12SignatureToken; import org.digidoc4j.test.TargetTemporaryFolderRule; -import org.digidoc4j.test.util.TestTSLUtil; import org.digidoc4j.test.util.TestDataBuilderUtil; import org.digidoc4j.test.util.TestSigningUtil; +import org.digidoc4j.test.util.TestTSLUtil; import org.digidoc4j.utils.Helper; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.internal.AssumptionViolatedException; @@ -42,9 +38,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.europa.esig.dss.DSSDocument; -import eu.europa.esig.dss.DSSUtils; -import eu.europa.esig.dss.client.tsp.OnlineTSPSource; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Collections; +import java.util.List; + +import static org.digidoc4j.Container.DocumentType.ASICE; +import static org.digidoc4j.Container.DocumentType.ASICS; +import static org.digidoc4j.Container.DocumentType.BDOC; +import static org.digidoc4j.Container.DocumentType.DDOC; /** * @author Janar Rahumeel (CGI Estonia) @@ -53,6 +64,16 @@ public abstract class AbstractTest extends ConfigurationSingeltonHolder { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractTest.class); + + protected static final String BDOC_WITH_TM_SIG = "src/test/resources/testFiles/valid-containers/valid-bdoc-tm.bdoc"; + protected static final String BDOC_WITH_TM_AND_TS_SIG = "src/test/resources/testFiles/valid-containers/bdoc-with-tm-and-ts-signature.bdoc"; + protected static final String BDOC_WITH_B_EPES_SIG = "src/test/resources/testFiles/valid-containers/bdoc-with-b-epes-signature.bdoc"; + protected static final String ASIC_WITH_NO_SIG = "src/test/resources/testFiles/valid-containers/container_without_signatures.bdoc"; + protected static final String ASICE_WITH_TS_SIG_BUT_BDOC_EXTENSION = "src/test/resources/testFiles/valid-containers/one_signature.bdoc"; + protected static final String ASICE_WITH_TS_SIG = "src/test/resources/testFiles/valid-containers/valid-asice.asice"; + protected static final String ASICS_WITH_TS = "src/test/resources/testFiles/valid-containers/ddoc-valid.asics"; + protected static final String DDOC_TEST_FILE = "src/test/resources/testFiles/valid-containers/ddoc_for_testing.ddoc"; + protected final PKCS12SignatureToken pkcs12SignatureToken = new PKCS12SignatureToken("src/test/resources/testFiles/p12/signout.p12", "test".toCharArray()); protected final PKCS12SignatureToken pkcs12EccSignatureToken = new PKCS12SignatureToken("src/test/resources/testFiles/p12/MadDogOY.p12", "test".toCharArray()); protected final PKCS12SignatureToken pkcs12Esteid2018SignatureToken = new PKCS12SignatureToken("src/test/resources/testFiles/p12/sign_ESTEID2018.p12", "1234".toCharArray()); @@ -429,4 +450,58 @@ private OnlineTSPSource createTSPSource() { return source; } + protected void assertBDocContainer(Container container) { + Assert.assertNotNull(container); + Assert.assertTrue(container instanceof BDocContainer); + Assert.assertEquals(BDOC.name(), container.getType()); + } + + protected void assertAsicEContainer(Container container) { + Assert.assertNotNull(container); + Assert.assertTrue(container instanceof AsicEContainer); + Assert.assertEquals(ASICE.name(), container.getType()); + } + + protected void assertAsicSContainer(Container container) { + Assert.assertNotNull(container); + Assert.assertTrue(container instanceof AsicSContainer); + Assert.assertEquals(ASICS.name(), container.getType()); + } + + protected void assertDDocContainer(Container container) { + Assert.assertNotNull(container); + Assert.assertTrue(container instanceof DDocContainer); + Assert.assertEquals(DDOC.name(), container.getType()); + } + + protected void assertTimemarkSignature(Signature signature) { + Assert.assertNotNull(signature); + Assert.assertTrue(signature instanceof BDocSignature); + Assert.assertEquals(SignatureProfile.LT_TM, signature.getProfile()); + } + + protected void assertTimestampSignature(Signature signature) { + Assert.assertNotNull(signature); + Assert.assertTrue(signature instanceof AsicESignature); + Assert.assertEquals(SignatureProfile.LT, signature.getProfile()); + } + + protected void assertArchiveTimestampSignature(Signature signature) { + Assert.assertNotNull(signature); + Assert.assertTrue(signature instanceof AsicESignature); + Assert.assertEquals(SignatureProfile.LTA, signature.getProfile()); + } + + protected void assertBEpesSignature(Signature signature) { + Assert.assertNotNull(signature); + Assert.assertTrue(signature instanceof BDocSignature); + Assert.assertEquals(SignatureProfile.B_EPES, signature.getProfile()); + } + + protected void assertBBesSignature(Signature signature) { + Assert.assertNotNull(signature); + Assert.assertTrue(signature instanceof AsicESignature); + Assert.assertEquals(SignatureProfile.B_BES, signature.getProfile()); + } + } diff --git a/digidoc4j/src/test/java/org/digidoc4j/ContainerBuilderTest.java b/digidoc4j/src/test/java/org/digidoc4j/ContainerBuilderTest.java index 409966758..749268aad 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/ContainerBuilderTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/ContainerBuilderTest.java @@ -10,17 +10,11 @@ package org.digidoc4j; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.util.zip.ZipFile; - import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.digidoc4j.exceptions.InvalidDataFileException; import org.digidoc4j.exceptions.NotSupportedException; -import org.digidoc4j.impl.asic.asice.AsicEContainer; import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer; import org.digidoc4j.impl.ddoc.DDocContainer; import org.digidoc4j.test.CustomConfiguration; @@ -31,10 +25,17 @@ import org.junit.Ignore; import org.junit.Test; -public class ContainerBuilderTest extends AbstractTest { +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.util.zip.ZipFile; - private static final String BDOC_TEST_FILE = "src/test/resources/testFiles/valid-containers/one_signature.bdoc"; - private static final String DDOC_TEST_FILE = "src/test/resources/testFiles/valid-containers/ddoc_for_testing.ddoc"; +import static org.digidoc4j.Container.DocumentType.ASICE; +import static org.digidoc4j.Container.DocumentType.ASICS; +import static org.digidoc4j.Container.DocumentType.BDOC; +import static org.digidoc4j.Container.DocumentType.DDOC; + +public class ContainerBuilderTest extends AbstractTest { @Test public void buildEmptyContainer() throws Exception { @@ -47,7 +48,7 @@ public void buildEmptyContainer() throws Exception { @Test(expected = NotSupportedException.class) public void buildEmptyDDocContainer() throws Exception { - ContainerBuilder.aContainer(Container.DocumentType.DDOC).build(); + ContainerBuilder.aContainer(DDOC).build(); } @Test @@ -209,7 +210,7 @@ public void createCustomContainerWithCustomConfiguration() throws Exception { @Test public void openDefaultContainerFromFile() throws Exception { - Container container = ContainerBuilder.aContainer().fromExistingFile(BDOC_TEST_FILE).build(); + Container container = ContainerBuilder.aContainer().fromExistingFile(BDOC_WITH_TM_SIG).build(); TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); } @@ -218,7 +219,7 @@ public void openDefaultContainerFromFileWithConfiguration() throws Exception { this.configuration = new Configuration(Configuration.Mode.TEST); this.configuration.setTspSource("test-value"); Container container = ContainerBuilder.aContainer().withConfiguration(this.configuration). - fromExistingFile(BDOC_TEST_FILE).build(); + fromExistingFile(BDOC_WITH_TM_SIG).build(); TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); Assert.assertEquals("test-value", ((BDocContainer) container).getConfiguration().getTspSource()); } @@ -226,13 +227,13 @@ public void openDefaultContainerFromFileWithConfiguration() throws Exception { @Test public void openDDocContainerFromFile_whenUsingDefaultContainer() throws Exception { Container container = ContainerBuilder.aContainer().fromExistingFile(DDOC_TEST_FILE).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.DDOC); + TestAssert.assertContainerIsOpened(container, DDOC); } @Test public void openDDocContainerFromFile() throws Exception { Container container = ContainerBuilder.aContainer("DDOC").fromExistingFile(DDOC_TEST_FILE).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.DDOC); + TestAssert.assertContainerIsOpened(container, DDOC); } @Test @@ -270,57 +271,144 @@ public void openCustomContainerFromFile_withCustomConfiguration() throws Excepti @Test public void openBDocContainerFromStream() throws Exception { - try (InputStream stream = FileUtils.openInputStream(new File(BDOC_TEST_FILE))) { + try (InputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_TM_SIG))) { Container container = ContainerBuilder.aContainer().fromStream(stream).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.ASICE); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); + } + } + + @Test + public void openBDocContainerWithTMAndTSSignaturesFromStream() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_TM_AND_TS_SIG))) { + Container container = ContainerBuilder.aContainer().fromStream(stream).build(); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); } } - // When reading from stream there are no major difference between BDOC and ASICE @Test public void openBDocContainerFromStream_withConfiguration() throws Exception { this.configuration = new Configuration(Configuration.Mode.TEST); this.configuration.setTspSource("test-value"); - InputStream stream = FileUtils.openInputStream(new File(BDOC_TEST_FILE)); - Container container = ContainerBuilder.aContainer(Container.DocumentType.ASICE). + InputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_TM_SIG)); + Container container = ContainerBuilder.aContainer(Container.DocumentType.BDOC). withConfiguration(this.configuration). fromStream(stream).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.ASICE); - Assert.assertEquals("test-value", ((AsicEContainer) container).getConfiguration().getTspSource()); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); + assertBDocContainer(container); + Assert.assertEquals("test-value", container.getConfiguration().getTspSource()); + } + + @Test + public void openBDocContainerWithBEpesSignatureFromStream_withConfiguration() throws Exception { + InputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_B_EPES_SIG)); + Container container = ContainerBuilder.aContainer(Container.DocumentType.BDOC) + .withConfiguration(this.configuration) + .fromStream(stream) + .build(); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); + assertBDocContainer(container); + assertBEpesSignature(container.getSignatures().get(0)); + } + + @Test + public void openBDocContainerWithSignaturesEvenWhenBuilderInputRequestsAsice() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(ASICE_WITH_TS_SIG))) { + Container container = ContainerBuilder.aContainer(ASICE).fromStream(stream).build(); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + } + } + + @Test + public void openAsicEContainerFromStream() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(ASICE_WITH_TS_SIG))) { + Container container = ContainerBuilder.aContainer().fromStream(stream).build(); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + TestAssert.assertContainerIsOpened(container, ASICE); + } + } + + @Test + public void openAsicContainerWithNoSignaturesFromStream_requiringBDoc_returnedBDoc() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(ASIC_WITH_NO_SIG))) { + Container container = ContainerBuilder.aContainer(BDOC).fromStream(stream).build(); + assertBDocContainer(container); + Assert.assertSame(0, container.getSignatures().size()); + } + } + + @Test + public void openAsicContainerWithNoSignaturesFromStream_requiringAsicE_returnedAsicE() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(ASIC_WITH_NO_SIG))) { + Container container = ContainerBuilder.aContainer(ASICE).fromStream(stream).build(); + assertAsicEContainer(container); + Assert.assertSame(0, container.getSignatures().size()); + } + } + + @Test + public void openAsicContainerWithNoSignaturesFromStream_requiringAsicS_returnedAsicE() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(ASIC_WITH_NO_SIG))) { + Container container = ContainerBuilder.aContainer(ASICS).fromStream(stream).build(); + assertAsicEContainer(container); + Assert.assertSame(0, container.getSignatures().size()); + } + } + + @Test + public void openAsiceContainerWithSignaturesEvenWhenBuilderInputRequestsBDoc() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(ASICE_WITH_TS_SIG))) { + Container container = ContainerBuilder.aContainer(BDOC).fromStream(stream).build(); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + } + } + + @Test + public void openAsiceContainerWithBDocFileExtension() throws Exception { + try (InputStream stream = FileUtils.openInputStream(new File(ASICE_WITH_TS_SIG_BUT_BDOC_EXTENSION))) { + Container container = ContainerBuilder.aContainer().fromStream(stream).build(); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + } } @Test public void openDDocContainerFromStream() throws Exception { InputStream stream = FileUtils.openInputStream(new File(DDOC_TEST_FILE)); Container container = ContainerBuilder.aContainer().fromStream(stream).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.DDOC); + TestAssert.assertContainerIsOpened(container, DDOC); } @Test public void openDDocContainerFromStream_withConfiguration() throws Exception { this.configuration = Configuration.of(Configuration.Mode.TEST); try (InputStream stream = FileUtils.openInputStream(new File(DDOC_TEST_FILE))) { - Container container = ContainerBuilder.aContainer(Container.DocumentType.DDOC).withConfiguration(this.configuration). + Container container = ContainerBuilder.aContainer(DDOC).withConfiguration(this.configuration). fromStream(stream).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.DDOC); + TestAssert.assertContainerIsOpened(container, DDOC); Assert.assertSame(this.configuration, ((DDocContainer) container).getDDoc4JFacade().getConfiguration()); } } - @Test - public void openDefaultContainerFromStream_withBDOC() throws Exception { - InputStream stream = FileUtils.openInputStream(new File(BDOC_TEST_FILE)); - Container container = ContainerBuilder.aContainer().withConfiguration(Configuration.of(Configuration.Mode.TEST)). - fromStream(stream).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.ASICE); - } - @Test public void openDefaultContainerFromStream_withDDOC() throws Exception { InputStream stream = FileUtils.openInputStream(new File(DDOC_TEST_FILE)); Container container = ContainerBuilder.aContainer().withConfiguration(Configuration.of(Configuration.Mode.TEST)). fromStream(stream).build(); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.DDOC); + TestAssert.assertContainerIsOpened(container, DDOC); } @Test @@ -360,7 +448,7 @@ public void openCustomContainerFromStream_withCustomConfiguration() throws Excep public void openDDocContainerWithTempDirectory() throws Exception { File folder = this.testFolder.newFolder(); Assert.assertTrue(folder.list().length == 0); - ContainerBuilder.aContainer(Container.DocumentType.DDOC). + ContainerBuilder.aContainer(DDOC). fromExistingFile("src/test/resources/testFiles/valid-containers/ddoc_for_testing.ddoc"). usingTempDirectory(folder.getPath()).build(); Assert.assertTrue(folder.list().length > 0); @@ -370,7 +458,7 @@ public void openDDocContainerWithTempDirectory() throws Exception { public void openDDocContainerWithTempDirectoryAndConfiguration() throws Exception { File folder = this.testFolder.newFolder(); Assert.assertTrue(folder.list().length == 0); - ContainerBuilder.aContainer(Container.DocumentType.DDOC). + ContainerBuilder.aContainer(DDOC). fromExistingFile("src/test/resources/testFiles/valid-containers/ddoc_for_testing.ddoc"). withConfiguration(Configuration.of(Configuration.Mode.TEST)).usingTempDirectory(folder.getPath()).build(); Assert.assertTrue(folder.list().length > 0); @@ -381,7 +469,7 @@ public void openDDocContainerFromStreamWithTempDirectory() throws Exception { File folder = this.testFolder.newFolder(); Assert.assertTrue(folder.list().length == 0); InputStream stream = FileUtils.openInputStream(new File(DDOC_TEST_FILE)); - ContainerBuilder.aContainer(Container.DocumentType.DDOC).fromStream(stream). + ContainerBuilder.aContainer(DDOC).fromStream(stream). usingTempDirectory(folder.getPath()).build(); Assert.assertTrue(folder.list().length > 0); } @@ -391,8 +479,8 @@ public void openDDocContainerFromStreamWithTempDirectoryAndConfiguration() throw File folder = this.testFolder.newFolder(); Assert.assertTrue(folder.list().length == 0); InputStream stream = FileUtils.openInputStream(new File(DDOC_TEST_FILE)); - ContainerBuilder.aContainer(Container.DocumentType.DDOC).withConfiguration(Configuration.of(Configuration.Mode.TEST)) - .fromStream(stream).usingTempDirectory(folder.getPath()).build(); + ContainerBuilder.aContainer(DDOC).withConfiguration(Configuration.of(Configuration.Mode.TEST)) + .fromStream(stream).usingTempDirectory(folder.getPath()).build(); Assert.assertTrue(folder.list().length > 0); } @@ -404,5 +492,4 @@ public void openDDocContainerFromStreamWithTempDirectoryAndConfiguration() throw protected void after() { ContainerBuilder.removeCustomContainerImplementations(); } - } diff --git a/digidoc4j/src/test/java/org/digidoc4j/ContainerOpenerTest.java b/digidoc4j/src/test/java/org/digidoc4j/ContainerOpenerTest.java index 24d11547f..238d09391 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/ContainerOpenerTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/ContainerOpenerTest.java @@ -10,9 +10,6 @@ package org.digidoc4j; -import java.io.File; -import java.io.FileInputStream; - import org.apache.commons.io.FileUtils; import org.digidoc4j.exceptions.DigiDoc4JException; import org.digidoc4j.test.TestAssert; @@ -20,27 +17,85 @@ import org.junit.Ignore; import org.junit.Test; -public class ContainerOpenerTest extends AbstractTest { +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; - private static final String BDOC_TEST_FILE = "src/test/resources/testFiles/valid-containers/one_signature.bdoc"; - private static final String DDOC_TEST_FILE = "src/test/resources/testFiles/valid-containers/ddoc_for_testing.ddoc"; +public class ContainerOpenerTest extends AbstractTest { @Test public void openBDocContainer() throws Exception { - Container container = ContainerOpener.open(BDOC_TEST_FILE, this.configuration); + Container container = ContainerOpener.open(BDOC_WITH_TM_SIG, this.configuration); + assertBDocContainer(container); TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); } + @Test + public void openAsicEContainer() { + Container container = ContainerOpener.open(ASICE_WITH_TS_SIG, this.configuration); + assertAsicEContainer(container); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.ASICE); + } + + @Test + public void openAsicSContainer() { + Container container = ContainerOpener.open(ASICS_WITH_TS, this.configuration); + assertAsicSContainer(container); + Assert.assertTrue(container.getSignatures().isEmpty()); + } + @Test public void openDDocContainer() throws Exception { Container container = ContainerOpener.open(DDOC_TEST_FILE, this.configuration); + assertDDocContainer(container); TestAssert.assertContainerIsOpened(container, Container.DocumentType.DDOC); } + @Test + public void openAsicContainerWithNoSignatures_alwaysReturnsAsicEContainer() { + Container container = ContainerOpener.open(ASIC_WITH_NO_SIG, this.configuration); + assertAsicEContainer(container); + Assert.assertTrue(container.getSignatures().isEmpty()); + } + @Test public void openBDocContainerAsStream() throws Exception { - FileInputStream stream = FileUtils.openInputStream(new File(BDOC_TEST_FILE)); + FileInputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_TM_SIG)); + Container container = ContainerOpener.open(stream, this.configuration); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); + } + + @Test + public void openBDocContainerWithTMAndTSSignaturesAsStream() throws Exception { + FileInputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_TM_AND_TS_SIG)); + Container container = ContainerOpener.open(stream, this.configuration); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); + } + + @Test + public void openBDocContainerWithBEpesSignaturesAsStream() throws Exception { + FileInputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_B_EPES_SIG)); Container container = ContainerOpener.open(stream, this.configuration); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertBEpesSignature(container.getSignatures().get(0)); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); + } + + @Test + public void openAsicEContainerAsStream() throws Exception { + FileInputStream stream = FileUtils.openInputStream(new File(ASICE_WITH_TS_SIG)); + Container container = ContainerOpener.open(stream, this.configuration); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); TestAssert.assertContainerIsOpened(container, Container.DocumentType.ASICE); } @@ -48,14 +103,24 @@ public void openBDocContainerAsStream() throws Exception { public void openDDocContainerAsStream() throws Exception { FileInputStream stream = FileUtils.openInputStream(new File(DDOC_TEST_FILE)); Container container = ContainerOpener.open(stream, this.configuration); + assertDDocContainer(container); TestAssert.assertContainerIsOpened(container, Container.DocumentType.DDOC); } + @Test + public void openAsicContainerWithNoSignaturesAsStream_alwaysReturnsAsicEContainer() throws IOException { + FileInputStream stream = FileUtils.openInputStream(new File(ASIC_WITH_NO_SIG)); + Container container = ContainerOpener.open(stream, this.configuration); + assertAsicEContainer(container); + Assert.assertTrue(container.getSignatures().isEmpty()); + } + @Test public void openBDocContainerAsStream_WithBigFilesNotSupported() throws Exception { - FileInputStream stream = FileUtils.openInputStream(new File(BDOC_TEST_FILE)); + FileInputStream stream = FileUtils.openInputStream(new File(BDOC_WITH_TM_SIG)); Container container = ContainerOpener.open(stream, false); - TestAssert.assertContainerIsOpened(container, Container.DocumentType.ASICE); + assertBDocContainer(container); + TestAssert.assertContainerIsOpened(container, Container.DocumentType.BDOC); } @Test diff --git a/digidoc4j/src/test/java/org/digidoc4j/DetachedXadesSignatureBuilderTest.java b/digidoc4j/src/test/java/org/digidoc4j/DetachedXadesSignatureBuilderTest.java index 8c684d039..cddfb0fbe 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/DetachedXadesSignatureBuilderTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/DetachedXadesSignatureBuilderTest.java @@ -80,12 +80,52 @@ public void signWithLT_TMProfile() throws Exception { byte[] digest = MessageDigest.getInstance("SHA-256").digest("hello".getBytes()); DigestDataFile digestDataFile = new DigestDataFile("hello.txt", DigestAlgorithm.SHA256, digest); + Signature signature = DetachedXadesSignatureBuilder.withConfiguration(new Configuration()) + .withDataFile(digestDataFile) + .withSignatureToken(pkcs12EccSignatureToken) + .withSignatureProfile(SignatureProfile.LT_TM) + .invokeSigningProcess(); + Assert.assertTrue(signature.validateSignature().isValid()); + assertTimemarkSignature(signature); + } + + @Test + public void signWithB_EPESProfile() throws Exception { + byte[] digest = MessageDigest.getInstance("SHA-256").digest("hello".getBytes()); + DigestDataFile digestDataFile = new DigestDataFile("hello.txt", DigestAlgorithm.SHA256, digest); + Signature signature = DetachedXadesSignatureBuilder.withConfiguration(new Configuration()) .withDataFile(digestDataFile) .withSignatureToken(pkcs12EccSignatureToken) - .withSignatureProfile(SignatureProfile.LT_TM) + .withSignatureProfile(SignatureProfile.B_EPES) .invokeSigningProcess(); - Assert.assertTrue(signature.validateSignature().isValid()); + assertBEpesSignature(signature); + } + + @Test + public void signWithLTProfile() throws Exception { + byte[] digest = MessageDigest.getInstance("SHA-256").digest("hello".getBytes()); + DigestDataFile digestDataFile = new DigestDataFile("hello.txt", DigestAlgorithm.SHA256, digest); + + Signature signature = DetachedXadesSignatureBuilder.withConfiguration(new Configuration()) + .withDataFile(digestDataFile) + .withSignatureToken(pkcs12EccSignatureToken) + .withSignatureProfile(SignatureProfile.LT) + .invokeSigningProcess(); + assertTimestampSignature(signature); + } + + @Test + public void signWithLTAProfile() throws Exception { + byte[] digest = MessageDigest.getInstance("SHA-256").digest("hello".getBytes()); + DigestDataFile digestDataFile = new DigestDataFile("hello.txt", DigestAlgorithm.SHA256, digest); + + Signature signature = DetachedXadesSignatureBuilder.withConfiguration(new Configuration()) + .withDataFile(digestDataFile) + .withSignatureToken(pkcs12EccSignatureToken) + .withSignatureProfile(SignatureProfile.LTA) + .invokeSigningProcess(); + assertArchiveTimestampSignature(signature); } @Test diff --git a/digidoc4j/src/test/java/org/digidoc4j/FileWritingOperationsTest.java b/digidoc4j/src/test/java/org/digidoc4j/FileWritingOperationsTest.java index 758897070..35cc06681 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/FileWritingOperationsTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/FileWritingOperationsTest.java @@ -105,6 +105,7 @@ public void openingExistingContainer_withLarge2MbFile_shouldStoreDataFilesOnDisk } @Test + @Ignore //This test fails in Travis public void openingExistingContainer_withLarge2MbFile_shouldNotStoreDataFilesOnDisk() throws Exception { this.configuration = Configuration.of(Configuration.Mode.TEST); configuration.setMaxFileSizeCachedInMemoryInMB(4); diff --git a/digidoc4j/src/test/java/org/digidoc4j/SignatureBuilderTest.java b/digidoc4j/src/test/java/org/digidoc4j/SignatureBuilderTest.java index 60c24ee9e..2a794b575 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/SignatureBuilderTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/SignatureBuilderTest.java @@ -10,18 +10,16 @@ package org.digidoc4j; -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.security.Security; -import java.util.List; - +import eu.europa.esig.dss.validation.TimestampToken; +import eu.europa.esig.dss.x509.SignaturePolicy; import org.apache.commons.io.FileUtils; import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.digidoc4j.exceptions.IllegalSignatureProfileException; import org.digidoc4j.exceptions.InvalidSignatureException; import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.exceptions.SignatureTokenMissingException; import org.digidoc4j.impl.asic.asice.AsicESignature; +import org.digidoc4j.impl.asic.asice.bdoc.BDocContainerBuilder; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; import org.digidoc4j.signers.PKCS12SignatureToken; @@ -33,8 +31,16 @@ import org.junit.Assert; import org.junit.Test; -import eu.europa.esig.dss.validation.TimestampToken; -import eu.europa.esig.dss.x509.SignaturePolicy; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Paths; +import java.security.Security; +import java.util.List; + +import static org.digidoc4j.Container.DocumentType.ASICE; +import static org.digidoc4j.Container.DocumentType.BDOC; +import static org.junit.Assert.fail; public class SignatureBuilderTest extends AbstractTest { @@ -394,6 +400,43 @@ public void invokeSigningForCustomContainer() throws Exception { Assert.assertNotNull(signature); } + @Test + public void invokingSigningBBesSignatureForAsicEContainer() { + Container container = buildContainer(ASICE, ASICE_WITH_TS_SIG); + assertAsicEContainer(container); + + Signature signature = SignatureBuilder.aSignature(container) + .withSignatureDigestAlgorithm(DigestAlgorithm.SHA256) + .withSignatureProfile(SignatureProfile.B_BES) + .withSignatureToken(this.pkcs12SignatureToken) + .invokeSigning(); + assertBBesSignature(signature); + } + + @Test(expected = IllegalSignatureProfileException.class) + public void invokingSigningTMSignatureForAsicEContainer_throwsException() { + Container container = buildContainer(ASICE, ASICE_WITH_TS_SIG); + assertAsicEContainer(container); + + SignatureBuilder.aSignature(container) + .withSignatureDigestAlgorithm(DigestAlgorithm.SHA256) + .withSignatureProfile(SignatureProfile.LT_TM) + .withSignatureToken(this.pkcs12SignatureToken) + .invokeSigning(); + } + + @Test(expected = IllegalSignatureProfileException.class) + public void invokingSigningBEpesSignatureForAsicEContainer_throwsException() { + Container container = buildContainer(ASICE, ASICE_WITH_TS_SIG); + assertAsicEContainer(container); + + SignatureBuilder.aSignature(container) + .withSignatureDigestAlgorithm(DigestAlgorithm.SHA256) + .withSignatureProfile(SignatureProfile.B_EPES) + .withSignatureToken(this.pkcs12SignatureToken) + .invokeSigning(); + } + @Test public void invokeSigning_whenOverridingBDocContainerFormat() { CustomContainer.type = "BDOC"; @@ -405,6 +448,276 @@ public void invokeSigning_whenOverridingBDocContainerFormat() { CustomContainer.resetType(); } + @Test + public void buildingBEpesSignatureResultsWithBDocSignature() { + Container container = buildContainer(BDOC, ASIC_WITH_NO_SIG); + DataToSign dataToSign = SignatureBuilder.aSignature(container) + .withSigningCertificate(this.pkcs12SignatureToken.getCertificate()) + .withSignatureDigestAlgorithm(DigestAlgorithm.SHA256) + .withSignatureProfile(SignatureProfile.B_EPES) + .buildDataToSign(); + + Signature signature = dataToSign.finalize(this.pkcs12SignatureToken.sign(dataToSign.getDigestAlgorithm(), dataToSign.getDataToSign())); + assertBEpesSignature(signature); + } + + @Test + public void bDocContainerWithTMSignature_signWithTimemarkSignature_shouldSucceed() { + Container container = buildContainer(BDOC_WITH_TM_SIG); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT_TM); + assertTimemarkSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimemarkSignature(container.getSignatures().get(1)); + } + + @Test + public void bDocContainerWithTMSignature_signWithTimestampSignature_shouldSucceed() { + Container container = buildContainer(BDOC_WITH_TM_SIG); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT); + assertTimestampSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + } + + @Test + public void bDocContainerWithTMSignature_signWithBEpesSignature_shouldSucceed() { + Container container = buildContainer(BDOC_WITH_TM_SIG); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.B_EPES); + assertBEpesSignature(signature); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertBEpesSignature(container.getSignatures().get(1)); + } + + @Test + public void bDocContainerWithTMAndTSSignature_signWithTimestampSignature_shouldSucceed() { + Container container = buildContainer(BDOC_WITH_TM_AND_TS_SIG); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT); + assertTimestampSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(3, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + assertTimestampSignature(container.getSignatures().get(2)); + } + + @Test + public void bDocContainerWithTMAndTSSignature_signWithTimemarkSignature_shouldSucceed() { + Container container = buildContainer(BDOC_WITH_TM_AND_TS_SIG); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT_TM); + assertTimemarkSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(3, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + assertTimemarkSignature(container.getSignatures().get(2)); + } + + @Test + public void bDocContainerWithTMAndTSSignature_signWithArchiveTimestampSignature_shouldSucceed() { + Container container = buildContainer(BDOC_WITH_TM_AND_TS_SIG); + assertBDocContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LTA); + assertArchiveTimestampSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(3, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + assertArchiveTimestampSignature(container.getSignatures().get(2)); + } + + @Test + public void bDocContainerWithoutSignatures_signWithTimestampSignature_shouldSucceed() { + Container container = buildContainer(BDOC, ASIC_WITH_NO_SIG); + assertBDocContainer(container); + Assert.assertTrue(container.getSignatures().isEmpty()); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT); + assertTimestampSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + } + + @Test + public void bDocContainerWithoutSignatures_signWithTimemarkSignature_shouldSucceed() { + Container container = buildContainer(BDOC, ASIC_WITH_NO_SIG); + assertBDocContainer(container); + Assert.assertTrue(container.getSignatures().isEmpty()); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT_TM); + assertTimemarkSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertBDocContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimemarkSignature(container.getSignatures().get(0)); + } + + @Test + public void asiceContainerWithoutSignatures_signWithTimestampSignature_shouldSucceed() { + Container container = buildContainer(ASICE, ASIC_WITH_NO_SIG); + assertAsicEContainer(container); + Assert.assertTrue(container.getSignatures().isEmpty()); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT); + assertTimestampSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + } + + @Test(expected = IllegalSignatureProfileException.class) + public void asiceContainerWithoutSignatures_signWithTimemarkSignature_shouldFail() { + Container container = buildContainer(ASICE, ASIC_WITH_NO_SIG); + assertAsicEContainer(container); + + Assert.assertTrue(container.getSignatures().isEmpty()); + + buildDataToSign(container, SignatureProfile.LT_TM); + } + + @Test + public void asicEContainerWithTSSignature_signWithTimestampSignature_shouldSucceed() { + Container container = buildContainer(ASICE_WITH_TS_SIG); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LT); + assertTimestampSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertAsicEContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + assertTimestampSignature(container.getSignatures().get(1)); + } + + @Test + public void asicEContainerWithTSSignature_signWithArchiveTimestampSignature_shouldSucceed() { + Container container = buildContainer(ASICE_WITH_TS_SIG); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + + Signature signature = signContainerWithSignature(container, SignatureProfile.LTA); + assertArchiveTimestampSignature(signature); + Assert.assertTrue(signature.validateSignature().isValid()); + + container.addSignature(signature); + assertAsicEContainer(container); + Assert.assertSame(2, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + assertArchiveTimestampSignature(container.getSignatures().get(1)); + } + + @Test(expected = IllegalSignatureProfileException.class) + public void asicEContainerWithTSSignature_signWithTimemarkSignature_shouldFail() { + Container container = buildContainer(ASICE_WITH_TS_SIG); + assertAsicEContainer(container); + Assert.assertSame(1, container.getSignatures().size()); + assertTimestampSignature(container.getSignatures().get(0)); + + buildDataToSign(container, SignatureProfile.LT_TM); + } + + private Signature signContainerWithSignature(Container container, SignatureProfile signatureProfile) { + DataToSign dataToSign = buildDataToSign(container, signatureProfile); + Assert.assertNotNull(dataToSign); + Assert.assertEquals(signatureProfile, dataToSign.getSignatureParameters().getSignatureProfile()); + + return dataToSign.finalize(this.pkcs12SignatureToken.sign(dataToSign.getDigestAlgorithm(), dataToSign.getDataToSign())); + } + + private DataToSign buildDataToSign(Container container, SignatureProfile signatureProfile) { + return SignatureBuilder.aSignature(container) + .withSigningCertificate(this.pkcs12SignatureToken.getCertificate()) + .withSignatureDigestAlgorithm(DigestAlgorithm.SHA256) + .withSignatureProfile(signatureProfile) + .buildDataToSign(); + } + + private Container buildContainer(Container.DocumentType documentType, String path) { + try (InputStream stream = FileUtils.openInputStream(new File(path))) { + return BDocContainerBuilder + .aContainer(documentType) + .fromStream(stream) + .build(); + } catch (IOException e) { + fail("Failed to read container from stream"); + throw new IllegalStateException(e); + } + } + + private Container buildContainer(String path) { + try (InputStream stream = FileUtils.openInputStream(new File(path))) { + return BDocContainerBuilder + .aContainer(Container.DocumentType.BDOC) + .fromStream(stream) + .build(); + } catch (IOException e) { + fail("Failed to read container from stream"); + throw new IllegalStateException(e); + } + } + /* * RESTRICTED METHODS */ diff --git a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java index 2385ef0b2..559a03fb5 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java @@ -10,19 +10,10 @@ package org.digidoc4j.impl.bdoc; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.zip.ZipFile; - +import eu.europa.esig.dss.DomUtils; +import eu.europa.esig.dss.Policy; +import eu.europa.esig.dss.x509.SignaturePolicy; +import eu.europa.esig.dss.xades.validation.XAdESSignature; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -33,7 +24,6 @@ import org.digidoc4j.ContainerBuilder; import org.digidoc4j.ContainerOpener; import org.digidoc4j.ContainerValidationResult; -import org.digidoc4j.SignatureValidationResult; import org.digidoc4j.DataFile; import org.digidoc4j.DataToSign; import org.digidoc4j.DigestAlgorithm; @@ -41,12 +31,18 @@ import org.digidoc4j.Signature; import org.digidoc4j.SignatureBuilder; import org.digidoc4j.SignatureProfile; -import org.digidoc4j.exceptions.*; +import org.digidoc4j.SignatureValidationResult; +import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.exceptions.DuplicateDataFileException; +import org.digidoc4j.exceptions.IllegalSignatureProfileException; +import org.digidoc4j.exceptions.InvalidSignatureException; +import org.digidoc4j.exceptions.OCSPRequestFailedException; +import org.digidoc4j.exceptions.TechnicalException; +import org.digidoc4j.impl.asic.AsicSignature; import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; -import org.digidoc4j.signers.PKCS11SignatureToken; import org.digidoc4j.signers.PKCS12SignatureToken; import org.digidoc4j.test.TestAssert; import org.digidoc4j.utils.Helper; @@ -58,10 +54,18 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import eu.europa.esig.dss.DomUtils; -import eu.europa.esig.dss.Policy; -import eu.europa.esig.dss.x509.SignaturePolicy; -import eu.europa.esig.dss.xades.validation.XAdESSignature; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.zip.ZipFile; public class BDocContainerTest extends AbstractTest { @@ -331,7 +335,7 @@ public void removeNewlyAddedSignatureFromExistingContainer() throws Exception { } @Test - public void removeSignatureFromExistingContainer() throws Exception { + public void removeSignatureFromExistingAsicEContainer() throws Exception { Container container = ContainerOpener.open("src/test/resources/testFiles/valid-containers/asics_testing_two_signatures.bdoc"); Assert.assertEquals(2, container.getSignatures().size()); container.removeSignature(container.getSignatures().get(0)); @@ -342,6 +346,18 @@ public void removeSignatureFromExistingContainer() throws Exception { Assert.assertEquals(1, container.getSignatures().size()); } + @Test + public void removeSignatureFromExistingBDocTMContainer() { + Container container = ContainerOpener.open("src/test/resources/testFiles/valid-containers/valid-bdoc-tm.bdoc"); + Assert.assertEquals(1, container.getSignatures().size()); + container.removeSignature(container.getSignatures().get(0)); + Assert.assertEquals(0, container.getSignatures().size()); + String file = this.getFileBy("bdoc"); + container.saveAsFile(file); + container = ContainerOpener.open(file); + Assert.assertEquals(0, container.getSignatures().size()); + } + @Test public void testSaveDocumentWithOneSignature() throws Exception { Assert.assertTrue(Files.exists(Paths.get(this.createSignedContainerBy("bdoc")))); @@ -859,6 +875,28 @@ public void addSingatureWithDuplicateId_throwsException() throws Exception { container.addSignature(signature); } + @Test(expected = IllegalSignatureProfileException.class) + public void addTimemarkSignatureToAsicEContainer_throwsException() { + Container bdocContainer = ContainerOpener.open(BDOC_WITH_TM_SIG); + Signature timemarkSignature = bdocContainer.getSignature(0); + assertTimemarkSignature(timemarkSignature); + + Container asicEContainer = ContainerOpener.open(ASICE_WITH_TS_SIG); + assertAsicEContainer(asicEContainer); + asicEContainer.addSignature(timemarkSignature); + } + + @Test(expected = IllegalSignatureProfileException.class) + public void addBEpesSignatureToAsicEContainer_throwsException() { + Container bdocContainer = ContainerOpener.open(BDOC_WITH_B_EPES_SIG); + Signature bEpesSignature = bdocContainer.getSignature(0); + assertBEpesSignature(bEpesSignature); + + Container asicEContainer = ContainerOpener.open(ASICE_WITH_TS_SIG); + assertAsicEContainer(asicEContainer); + asicEContainer.addSignature(bEpesSignature); + } + @Test public void whenSigningContainer_withSignatureNameContainingNonNumericCharacters_shouldCreateSignatureFileName_inSequence() throws Exception { ZipFile zip = new ZipFile("src/test/resources/testFiles/valid-containers/valid-bdoc-ts-signature-file-name-with-non-numeric-characters.asice"); @@ -999,8 +1037,8 @@ public void settingUpOwnSignaturePolicy() throws Exception { String file = this.getFileBy("bdoc"); container.saveAsFile(file); container = ContainerOpener.open(file); - BDocSignature bdocSignature = (BDocSignature) container.getSignatures().get(0); - SignaturePolicy policyId = bdocSignature.getOrigin().getDssSignature().getPolicyId(); + AsicSignature asicSignature = (AsicSignature) container.getSignatures().get(0); + SignaturePolicy policyId = asicSignature.getOrigin().getDssSignature().getPolicyId(); Assert.assertEquals(spuri, policyId.getUrl()); Assert.assertEquals(signatureId, policyId.getIdentifier()); Assert.assertEquals(digestAlgorithm, policyId.getDigestAlgorithm()); diff --git a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocSignatureOpenerTest.java b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocSignatureOpenerTest.java index 9fecb55d0..a6d3fef5a 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocSignatureOpenerTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/BDocSignatureOpenerTest.java @@ -10,36 +10,39 @@ package org.digidoc4j.impl.bdoc; -import java.io.File; -import java.util.Collections; -import java.util.Date; -import java.util.List; - +import eu.europa.esig.dss.DSSDocument; +import eu.europa.esig.dss.FileDocument; +import eu.europa.esig.dss.InMemoryDocument; +import eu.europa.esig.dss.validation.SignedDocumentValidator; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.digidoc4j.AbstractTest; import org.digidoc4j.Configuration; +import org.digidoc4j.Signature; import org.digidoc4j.SignatureProfile; +import org.digidoc4j.impl.asic.AsicSignatureParser; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignatureOpener; +import org.digidoc4j.impl.asic.xades.XadesSignature; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.digidoc4j.utils.Helper; import org.junit.Assert; import org.junit.Test; -import eu.europa.esig.dss.DSSDocument; -import eu.europa.esig.dss.FileDocument; -import eu.europa.esig.dss.InMemoryDocument; -import eu.europa.esig.dss.validation.SignedDocumentValidator; +import java.io.File; +import java.util.Collections; +import java.util.Date; public class BDocSignatureOpenerTest extends AbstractTest { + private AsicSignatureParser signatureParser; private BDocSignatureOpener signatureOpener; @Test public void openBesSignature() throws Exception { - List signatures = this.signatureOpener.parse(new FileDocument("src/test/resources/testFiles/xades/test-bes-signature.xml")); - Assert.assertEquals("Assert 1", 1, signatures.size()); - BDocSignature signature = signatures.get(0); + Signature signature = this.signatureOpener.open( + constructXadesSignatureWrapper(new FileDocument("src/test/resources/testFiles/xades/test-bes-signature.xml"))); + Assert.assertTrue(signature instanceof BDocSignature); Assert.assertEquals("Assert 2", "id-693869a500c60f0dc262f7287f033d5d", signature.getId()); Assert.assertEquals(SignatureProfile.B_BES, signature.getProfile()); Assert.assertEquals("Assert 3", "id-693869a500c60f0dc262f7287f033d5d", signature.getId()); @@ -67,8 +70,8 @@ public void openBesSignature() throws Exception { public void openXadesSignature() throws Exception { Date date_2016_29_1_time_19_58_36 = new Date(1454090316000L); Date date_2016_29_1_time_19_58_37 = new Date(1454090317000L); - List signatures = this.signatureOpener.parse(new FileDocument("src/test/resources/testFiles/xades/test-bdoc-ts.xml")); - BDocSignature signature = signatures.get(0); + Signature signature = this.signatureOpener.open( + constructXadesSignatureWrapper(new FileDocument("src/test/resources/testFiles/xades/test-bdoc-ts.xml"))); Assert.assertNotNull("Assert 1", signature); Assert.assertEquals("Assert 2", "S0", signature.getId()); Assert.assertEquals("Assert 3", SignatureProfile.LT, signature.getProfile()); @@ -86,8 +89,8 @@ public void openXadesSignature() throws Exception { @Test public void serializeBDocSignature() throws Exception { - List signatures = this.signatureOpener.parse(new FileDocument("src/test/resources/testFiles/xades/test-bdoc-ts.xml")); - BDocSignature signature = signatures.get(0); + Signature signature = this.signatureOpener.open( + constructXadesSignatureWrapper(new FileDocument("src/test/resources/testFiles/xades/test-bdoc-ts.xml"))); String serializedPath = this.getFileBy("ser"); Helper.serialize(signature, serializedPath); signature = Helper.deserializer(serializedPath); @@ -97,8 +100,9 @@ public void serializeBDocSignature() throws Exception { @Test public void openXadesSignature_withoutXmlPreamble_shouldBeValid() throws Exception { byte[] signatureBytes = FileUtils.readFileToByteArray(new File("src/test/resources/testFiles/xades/bdoc-tm-jdigidoc-mobile-id.xml")); - List signatures = this.signatureOpener.parse(new InMemoryDocument(signatureBytes)); - Assert.assertEquals("S935237", signatures.get(0).getId()); + Signature signature = this.signatureOpener.open( + constructXadesSignatureWrapper(new InMemoryDocument(signatureBytes))); + Assert.assertEquals("S935237", signature.getId()); } /* @@ -108,8 +112,14 @@ public void openXadesSignature_withoutXmlPreamble_shouldBeValid() throws Excepti @Override protected void before() { this.configuration = Configuration.of(Configuration.Mode.TEST); - this.signatureOpener = new BDocSignatureOpener(Collections.singletonList( - new FileDocument("src/test/resources/testFiles/helper-files/test.txt")), this.configuration); + this.signatureOpener = new BDocSignatureOpener(this.configuration); + this.signatureParser = new AsicSignatureParser(Collections.singletonList( + new FileDocument("src/test/resources/testFiles/helper-files/test.txt")), this.configuration); + } + + private XadesSignatureWrapper constructXadesSignatureWrapper(DSSDocument document) { + XadesSignature signature = signatureParser.parse(document); + return new XadesSignatureWrapper(signature, document); } } diff --git a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicContainerParserTest.java b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicContainerParserTest.java index ce91c32ed..fa993c825 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicContainerParserTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicContainerParserTest.java @@ -10,10 +10,6 @@ package org.digidoc4j.impl.bdoc.asic; -import java.io.FileInputStream; -import java.nio.file.Paths; -import java.util.List; - import org.digidoc4j.AbstractTest; import org.digidoc4j.Configuration; import org.digidoc4j.DataFile; @@ -23,6 +19,10 @@ import org.junit.Assert; import org.junit.Test; +import java.io.FileInputStream; +import java.nio.file.Paths; +import java.util.List; + public class AsicContainerParserTest extends AbstractTest { @Test @@ -59,7 +59,7 @@ public void parseBdocContainerStream() throws Exception { public void parseBDoc_containingSignaturesFile_withNonNumericCharacters() throws Exception { AsicParseResult result = this.getParseResultFromFile(Paths.get("src/test/resources/testFiles/valid-containers/valid-bdoc-ts-signature-file-name-with-non-numeric-characters.asice")); this.assertIsAsiceContainer(result); - Assert.assertEquals("META-INF/l77Tsignaturesn00B.xml", result.getSignatures().get(0).getName()); + Assert.assertEquals("META-INF/l77Tsignaturesn00B.xml", result.getSignatures().get(0).getSignatureDocument().getName()); Assert.assertNull(result.getCurrentUsedSignatureFileIndex()); } @@ -89,8 +89,8 @@ public void parseBdocFromStream() throws Exception { private void assertParseResultValid(AsicParseResult result) { Assert.assertEquals("test.txt", result.getDataFiles().get(0).getName()); - Assert.assertEquals("META-INF/signatures0.xml", result.getSignatures().get(0).getName()); - Assert.assertEquals("META-INF/signatures1.xml", result.getSignatures().get(1).getName()); + Assert.assertEquals("META-INF/signatures0.xml", result.getSignatures().get(0).getSignatureDocument().getName()); + Assert.assertEquals("META-INF/signatures1.xml", result.getSignatures().get(1).getSignatureDocument().getName()); Assert.assertEquals(Integer.valueOf(1), result.getCurrentUsedSignatureFileIndex()); this.assertIsAsiceContainer(result); } diff --git a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/manifest/ManifestValidatorTest.java b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/manifest/ManifestValidatorTest.java index 4e3d1a5ac..80082a42f 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/manifest/ManifestValidatorTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/manifest/ManifestValidatorTest.java @@ -10,34 +10,38 @@ package org.digidoc4j.impl.bdoc.manifest; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import eu.europa.esig.dss.DSSDocument; +import eu.europa.esig.dss.FileDocument; +import eu.europa.esig.dss.InMemoryDocument; +import eu.europa.esig.dss.MimeType; import org.digidoc4j.Configuration; import org.digidoc4j.DataFile; import org.digidoc4j.Signature; -import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; +import org.digidoc4j.impl.asic.AsicSignature; +import org.digidoc4j.impl.asic.AsicSignatureParser; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignatureOpener; import org.digidoc4j.impl.asic.manifest.AsicManifest; import org.digidoc4j.impl.asic.manifest.ManifestEntry; import org.digidoc4j.impl.asic.manifest.ManifestErrorMessage; import org.digidoc4j.impl.asic.manifest.ManifestParser; import org.digidoc4j.impl.asic.manifest.ManifestValidator; +import org.digidoc4j.impl.asic.xades.XadesSignature; +import org.digidoc4j.impl.asic.xades.XadesSignatureWrapper; import org.junit.Assert; import org.junit.Test; -import eu.europa.esig.dss.DSSDocument; -import eu.europa.esig.dss.FileDocument; -import eu.europa.esig.dss.InMemoryDocument; -import eu.europa.esig.dss.MimeType; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; public class ManifestValidatorTest { + private final Configuration configuration = new Configuration(Configuration.Mode.TEST); + @Test public void validateEntries() throws Exception { Map entriesFromManifest = new HashMap() {{ @@ -184,8 +188,13 @@ public void container_withSpecialDataFileCharacters_shouldBeValid() throws Excep */ private List openSignature(String signaturePath, List detachedContents) { - BDocSignatureOpener signatureOpener = new BDocSignatureOpener(detachedContents, new Configuration(Configuration.Mode.TEST)); - BDocSignature signature = signatureOpener.parse(new FileDocument(signaturePath)).get(0); + AsicSignatureParser signatureParser = new AsicSignatureParser(detachedContents, configuration); + FileDocument signatureDocument = new FileDocument(signaturePath); + XadesSignature xadesSignature = signatureParser.parse(signatureDocument); + XadesSignatureWrapper signatureWrapper = new XadesSignatureWrapper(xadesSignature, signatureDocument); + + BDocSignatureOpener signatureOpener = new BDocSignatureOpener(configuration); + AsicSignature signature = signatureOpener.open(signatureWrapper); signature.getOrigin().getDssSignature().checkSignatureIntegrity(); List signatureList = new ArrayList<>(1); signatureList.add(signature); diff --git a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/tsl/TslLoaderTest.java b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/tsl/TslLoaderTest.java index e8495ebb6..920bebf9c 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/tsl/TslLoaderTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/impl/bdoc/tsl/TslLoaderTest.java @@ -10,10 +10,8 @@ package org.digidoc4j.impl.bdoc.tsl; -import eu.europa.esig.dss.tsl.TSLValidationModel; -import eu.europa.esig.dss.tsl.service.TSLRepository; -import eu.europa.esig.dss.tsl.service.TSLValidationJob; -import eu.europa.esig.dss.validation.policy.rules.Indication; +import java.util.Map; + import org.digidoc4j.AbstractTest; import org.digidoc4j.Configuration; import org.digidoc4j.impl.asic.tsl.TslLoader; @@ -23,7 +21,10 @@ import org.junit.Ignore; import org.junit.Test; -import java.util.Map; +import eu.europa.esig.dss.tsl.TSLValidationModel; +import eu.europa.esig.dss.tsl.service.TSLRepository; +import eu.europa.esig.dss.tsl.service.TSLValidationJob; +import eu.europa.esig.dss.validation.policy.rules.Indication; public class TslLoaderTest extends AbstractTest { diff --git a/digidoc4j/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java b/digidoc4j/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java index 0dd402fff..8e9558fd2 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java @@ -11,7 +11,12 @@ package org.digidoc4j.main; import org.apache.commons.io.FileUtils; -import org.digidoc4j.*; +import org.digidoc4j.AbstractTest; +import org.digidoc4j.Configuration; +import org.digidoc4j.Constant; +import org.digidoc4j.Container; +import org.digidoc4j.ContainerOpener; +import org.digidoc4j.SignatureProfile; import org.digidoc4j.ddoc.DigiDocException; import org.digidoc4j.ddoc.SignedDoc; import org.digidoc4j.exceptions.DigiDoc4JException; @@ -187,7 +192,8 @@ public void createsContainerWithTypeSettingBDoc() throws Exception { "-add", "src/test/resources/testFiles/helper-files/test.txt", "text/plain", "-pkcs12", "src/test/resources/testFiles/p12/signout.p12", "test"}; TestDigiDoc4JUtil.call(parameters); - Assert.assertEquals("BDOC", ContainerOpener.open(file).getType()); + Container container = ContainerOpener.open(file); + assertAsicEContainer(container); } @Test @@ -214,7 +220,7 @@ public void createsContainerWithTypeSettingBasedOnFileExtensionBDoc() throws Exc "src/test/resources/testFiles/p12/signout.p12", "test"}; TestDigiDoc4JUtil.call(parameters); Container container = ContainerOpener.open(file); - Assert.assertEquals("BDOC", container.getType()); + assertAsicEContainer(container); } @Test @@ -224,7 +230,8 @@ public void createsContainerWithTypeSettingBDocIfNoSuitableFileExtensionAndNoTyp "-add", "src/test/resources/testFiles/helper-files/test.txt", "text/plain", "-pkcs12", "src/test/resources/testFiles/p12/signout.p12", "test"}; TestDigiDoc4JUtil.call(parameters); - Assert.assertEquals("BDOC", ContainerOpener.open(file).getType()); + Container container = ContainerOpener.open(file); + assertAsicEContainer(container); } @Test diff --git a/digidoc4j/src/test/java/org/digidoc4j/utils/HelperTest.java b/digidoc4j/src/test/java/org/digidoc4j/utils/HelperTest.java index 10ece18f4..9bcb92845 100644 --- a/digidoc4j/src/test/java/org/digidoc4j/utils/HelperTest.java +++ b/digidoc4j/src/test/java/org/digidoc4j/utils/HelperTest.java @@ -214,20 +214,6 @@ public void testGetFilesFromContainer() { this.compareFileSize(folder, helperFolder); } - @Test - public void testIsAsicSContainer() { - String asics = "test.asics"; - String scs = "test.scs"; - String sce = "test.sce"; - String asice = "tets.asice"; - Assert.assertTrue(Helper.isAsicSContainer(asics)); - Assert.assertTrue(Helper.isAsicSContainer(scs)); - Assert.assertTrue(Helper.isAsicSContainer("src/test/resources/testFiles/valid-containers/testasics.zip")); - Assert.assertFalse(Helper.isAsicSContainer(sce)); - Assert.assertFalse(Helper.isAsicSContainer(asice)); - Assert.assertFalse(Helper.isAsicSContainer("src/test/resources/testFiles/valid-containers/one_signature.bdoc")); - } - @Test public void testPDFContainer() { Assert.assertTrue(Helper.isPdfFile("src/test/resources/testFiles/invalid-containers/EE_AS-P-BpLT-V-009.pdf")); diff --git a/digidoc4j/src/test/resources/logback-test.xml b/digidoc4j/src/test/resources/logback-test.xml index 29e3cf888..f479f74ec 100644 --- a/digidoc4j/src/test/resources/logback-test.xml +++ b/digidoc4j/src/test/resources/logback-test.xml @@ -23,7 +23,7 @@ - + diff --git a/digidoc4j/src/test/resources/testFiles/valid-containers/bdoc-with-b-epes-signature.bdoc b/digidoc4j/src/test/resources/testFiles/valid-containers/bdoc-with-b-epes-signature.bdoc new file mode 100644 index 000000000..254b92f9c Binary files /dev/null and b/digidoc4j/src/test/resources/testFiles/valid-containers/bdoc-with-b-epes-signature.bdoc differ diff --git a/digidoc4j/src/test/resources/testFiles/valid-containers/bdoc-with-tm-and-ts-signature.bdoc b/digidoc4j/src/test/resources/testFiles/valid-containers/bdoc-with-tm-and-ts-signature.bdoc new file mode 100644 index 000000000..130132ca1 Binary files /dev/null and b/digidoc4j/src/test/resources/testFiles/valid-containers/bdoc-with-tm-and-ts-signature.bdoc differ diff --git a/pom.xml b/pom.xml index ca665885f..2213bf2b1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.digidoc4j digidoc4j-parent - 3.1.0 + 3.1.1 pom DigiDoc4J parent @@ -124,7 +124,7 @@ 1.7 1.7.25 1.60 - -Xdoclint:none + none @@ -158,7 +158,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + 3.8.0 ${project.build.sourceEncoding} ${maven.compiler.source} @@ -182,7 +182,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.0.1 + 3.1.0 attach-javadocs @@ -190,9 +190,7 @@ jar - - ${javadocOpt} - + ${javadocOpt} @@ -299,4 +297,4 @@ - \ No newline at end of file + diff --git a/publish.sh b/publish.sh index eea6c96ef..5068942e9 100755 --- a/publish.sh +++ b/publish.sh @@ -1,6 +1,6 @@ #!/bin/bash -version="3.1.0" +version="3.1.1" staging_url="https://oss.sonatype.org/service/local/staging/deploy/maven2/" repositoryId="ossrh"