From 00538e5d9ade857e0edab4dc8baea357e306c383 Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Fri, 26 Jan 2018 15:07:43 +0200 Subject: [PATCH 01/15] Fix for tmp/readonly --- .../org/digidoc4j/impl/StreamDocumentTest.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/digidoc4j/impl/StreamDocumentTest.java b/src/test/java/org/digidoc4j/impl/StreamDocumentTest.java index aefb3aa96..d7d21ed02 100644 --- a/src/test/java/org/digidoc4j/impl/StreamDocumentTest.java +++ b/src/test/java/org/digidoc4j/impl/StreamDocumentTest.java @@ -43,13 +43,17 @@ public class StreamDocumentTest { StreamDocument document; + private static final String roDir = "src/test/resources/testFiles/tmp/readonly"; @BeforeClass public static void setUpDir() throws IOException { - if (Files.isWritable(Paths.get("src/test/resources/testFiles/tmp/readonly"))) { + if (Files.notExists(Paths.get(roDir))) { + Files.createDirectory(Paths.get(roDir)); + } + if (Files.isWritable(Paths.get(roDir))) { // setting directory testFiles/tmp/readonly permissions to "read only" if (System.getProperty("os.name").startsWith("Windows")) { - File file = new File("src/test/resources/testFiles/tmp/readonly"); + File file = new File(roDir); // deny write permission for all the users System.out.println("icacls "+file.getAbsolutePath()+" /deny Everyone:(WD,WA) /T /Q"); Runtime.getRuntime().exec("icacls "+file.getAbsolutePath()+" /deny Everyone:(WD,WA) /T /Q"); @@ -64,7 +68,7 @@ public static void setUpDir() throws IOException { //add others permissions perms.add(PosixFilePermission.OTHERS_READ); perms.add(PosixFilePermission.OTHERS_EXECUTE); - Files.setPosixFilePermissions(Paths.get("src/test/resources/testFiles/tmp/readonly"), perms); + Files.setPosixFilePermissions(Paths.get(roDir), perms); } } } @@ -82,7 +86,7 @@ public void setUp() throws IOException { @AfterClass public static void resetTemporaryRODir() throws IOException { if (System.getProperty("os.name").startsWith("Windows")) { - File file = new File("src/test/resources/testFiles/tmp/readonly"); + File file = new File(roDir); Runtime.getRuntime().exec("icacls " + file.getAbsolutePath() + " /remove:d Everyone /T /Q"); } else { Set perms = new HashSet(); @@ -98,7 +102,7 @@ public static void resetTemporaryRODir() throws IOException { perms.add(PosixFilePermission.OTHERS_READ); perms.add(PosixFilePermission.OTHERS_WRITE); perms.add(PosixFilePermission.OTHERS_EXECUTE); - Files.setPosixFilePermissions(Paths.get("src/test/resources/testFiles/tmp/readonly"), perms); + Files.setPosixFilePermissions(Paths.get(roDir), perms); } } From 9981cba2e8d62145addce727ce0f34503f6f3135 Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Mon, 29 Jan 2018 12:26:58 +0200 Subject: [PATCH 02/15] Removing obsolete check and adding some javadoc Signed-off-by: Indrek Jentson --- .../impl/asic/AsicContainerParser.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java b/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java index ea3dc78c9..cb825b454 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java @@ -42,6 +42,9 @@ import eu.europa.esig.dss.InMemoryDocument; import eu.europa.esig.dss.MimeType; +/** + * Abstract class for parsing ASiC containers. + */ public abstract class AsicContainerParser { public static final String MANIFEST = "META-INF/manifest.xml"; @@ -70,6 +73,10 @@ protected AsicContainerParser(Configuration configuration) { maxDataFileCachedInBytes = configuration.getMaxDataFileCachedInBytes(); } + /** + * Method for parsing and validating ASiC container. + * @return parsing result + */ public AsicParseResult read() { parseContainer(); validateParseResult(); @@ -185,8 +192,8 @@ protected String getDataFileMimeType(String fileName) { ManifestEntry manifestEntry = manifestFileItems.get(fileName); return manifestEntry.getMimeType(); } else { - MimeType mimeType = MimeType.fromFileName(fileName); - return mimeType.getMimeTypeString(); + MimeType mimetype = MimeType.fromFileName(fileName); + return mimetype.getMimeTypeString(); } } @@ -194,11 +201,8 @@ private void validateParseResult() { if (!StringUtils.equalsIgnoreCase(MimeType.ASICE.getMimeTypeString(), mimeType) && !StringUtils.equalsIgnoreCase(MimeType.ASICS.getMimeTypeString(), mimeType)) { logger.error("Container mime type is not " + MimeType.ASICE.getMimeTypeString() + " but is " + mimeType); - throw new UnsupportedFormatException("Container mime type is not " + MimeType.ASICE.getMimeTypeString() + - " OR " + MimeType.ASICS.getMimeTypeString() + " but is " + mimeType); - } - if (!this.signatures.isEmpty() && this.dataFiles.isEmpty()) { - throw new DigiDoc4JException("Signatures found, but no any data files detected"); + throw new UnsupportedFormatException("Container mime type is not " + MimeType.ASICE.getMimeTypeString() + + " OR " + MimeType.ASICS.getMimeTypeString() + " but is " + mimeType); } } From 0cac815d6d5ab408d1f6c889129d547ed1b14447 Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Wed, 24 Jan 2018 16:19:40 +0200 Subject: [PATCH 03/15] Preparing for release 2.0.0.RC.1 Signed-off-by: Indrek Jentson --- AUTHORS | 6 ++++-- RELEASE-NOTES.txt | 9 +++++++++ pom.xml | 2 +- .../impl/bdoc/asic/AsicSContainerTest.java | 5 +++-- .../impl/bdoc/asic/TimeStampTokenTest.java | 5 ++++- src/test/resources/testFiles/tmp/.read.me | 1 - .../testFiles/tmp/newTestTimestamp.asics | Bin 3308 -> 0 bytes .../resources/testFiles/tmp/readonly/.read.me | 2 -- 8 files changed, 21 insertions(+), 9 deletions(-) delete mode 100644 src/test/resources/testFiles/tmp/.read.me delete mode 100644 src/test/resources/testFiles/tmp/newTestTimestamp.asics delete mode 100644 src/test/resources/testFiles/tmp/readonly/.read.me diff --git a/AUTHORS b/AUTHORS index e463c96df..67573a1fe 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,5 +6,7 @@ Developers: Rainer Villido Allan Juhanson Andrei Smirnov - Indrek Jentson - Margus Kamlat \ No newline at end of file + Indrek Jentson + Margus Kamlat + Priit Serk + Janar Rahumeel diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 1b711a25b..e4285d56e 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,5 +1,14 @@ DigiDoc4J Java library release notes ------------------------------------ +Release 2.0.0.RC.1 +------------------ +Summary of the major changes since 1.0.8.beta.2 +------------------------------------------ +* Start of using semantic versioning (1.0.8 --> 2.0.0) +* Fixed validation of containers where mime type has wrong format. +* Added check that at least one data file is present before signing. +* Ensured that SignaturePolicyImplied element is not allowed in TM signatures. + Release 1.0.8.beta.2 ------------------ Summary of the major changes since 1.0.8.beta.1 diff --git a/pom.xml b/pom.xml index 567a4166f..a26d2b5a6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.digidoc4j digidoc4j jar - 1.0.8.beta.3.SNAPSHOT + 2.0.0.RC.1 DigiDoc4j DigiDoc4j is a Java library for digitally signing documents and creating digital signature containers of signed documents diff --git a/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicSContainerTest.java b/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicSContainerTest.java index 354f5a3ed..1ab394415 100644 --- a/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicSContainerTest.java +++ b/src/test/java/org/digidoc4j/impl/bdoc/asic/AsicSContainerTest.java @@ -41,13 +41,14 @@ public class AsicSContainerTest extends DigiDoc4JTestHelper { public TemporaryFolder testFolder = new TemporaryFolder(); @After - public void cleanUp() { + public void cleanUp() throws Exception { testFolder.delete(); + FileUtils.cleanDirectory(new File("src/test/resources/testFiles/tmp")); } @Ignore // TODO: Fix this test! @Test - public void testAsicSContainer()throws IOException{ + public void testAsicSContainer() throws IOException{ Container container = createContainerWithFile(testFolder, 1); signContainer(container); container.saveAsFile("src/test/resources/testFiles/tmp/testasics.asics"); diff --git a/src/test/java/org/digidoc4j/impl/bdoc/asic/TimeStampTokenTest.java b/src/test/java/org/digidoc4j/impl/bdoc/asic/TimeStampTokenTest.java index dc528eec3..520f0482e 100644 --- a/src/test/java/org/digidoc4j/impl/bdoc/asic/TimeStampTokenTest.java +++ b/src/test/java/org/digidoc4j/impl/bdoc/asic/TimeStampTokenTest.java @@ -7,12 +7,14 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import java.io.File; import java.io.FileInputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import org.apache.commons.io.FileUtils; import org.digidoc4j.Configuration; import org.digidoc4j.Constant; import org.digidoc4j.Container; @@ -52,8 +54,9 @@ public class TimeStampTokenTest extends DigiDoc4JTestHelper { public final SystemOutRule sout = new SystemOutRule().enableLog(); @After - public void cleanUp() { + public void cleanUp() throws Exception { testFolder.delete(); + FileUtils.cleanDirectory(new File("src/test/resources/testFiles/tmp")); } @Test diff --git a/src/test/resources/testFiles/tmp/.read.me b/src/test/resources/testFiles/tmp/.read.me deleted file mode 100644 index d6f234c9a..000000000 --- a/src/test/resources/testFiles/tmp/.read.me +++ /dev/null @@ -1 +0,0 @@ -This directory is for temporary files what are produced during unit tests. diff --git a/src/test/resources/testFiles/tmp/newTestTimestamp.asics b/src/test/resources/testFiles/tmp/newTestTimestamp.asics deleted file mode 100644 index adc460afb4d14603e2cc6e34173ca68a94a79ab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3308 zcmds(c{G%5AIERm#*!#J#KYJLGmIrPXzYfOW$dKE%oxp>F~;7a$Wjp^EtaW}rEDdn zk;;-i`@UA57A;DHhI&WmJk@*7+j;-*y3cjaeP7r8``zdFy{`NEejM#Mx%dG91OQ19 zd+kfiJfM7?zY$W@)ge< zIbi}WEQcswc}gt$67vjkCV7s8znCY9YrNtgRAC^BBx0s3=m=)1iix*@3^SOsF{C;* z?Nx$h_nV;CvN?P2XbBNB)zN~D$*swI)f84c&WU(--1(cz9H@(2SfZr{{{a7~YogwgqGDIOOG3r79x4wP-6=QS z44$1e!OuoACswDn*CZE)8+ub01LgSOrUD-nFE0z9?d0^7SJS`?Bs>JkD9`N|bo!!@ zS_sH(2rEhu+s%bDlIPNv62Wm5a6p6ty3||1K#!vXu1Ba&3QRupahsM~ zAW?DO?f`3*Dkq@3McSinENAhV9nLD9pj$J@3kgtB$&^$v3zZhPV&Y(ifhxRc&XS{- zktc_2misf9OF=qCFMUyox`W^CF<+L7RTDs+ zR}l;G)~L6I&(xA*-JpxD2>yR;}Sf!$JiEjHQ#S6&g`cX_h-1R5SE zIg@kqnlI>RtkiDgTS)S=Laob3xR^c?p>FqAKWv=g+Q)!%pJwDC(OG-qtB&cLb)26a zAf#V;bMr6R@E3^CuU;LNR-Fh|hy&iuFF2om=uqlgWw_ux-8sZ~ZUivQI5+W8ctr+r z2wsh%70DA-+x**=P$|MEz#MklNTI$$PUh&d8S?gtzK3GFAIQ^(DQ$|C$2Ux#iq&lw z?nefe>N*#l?&=XUDqeZ+H7TW)GfY{4QFiX4iFj8@dVIRIHYD9CBczhg7@vZxsdX&% z)oSB0%k~k9NgYUSe3k#$qV(AwzE&-s_|`Fka@hu{3$yGib3ba7;ysy3PKhKaUHjCc zMX7c^j#(MdZemLGBs=%Rc0zJLy=$f&@k&$`8F6ul-4prJfX5;+pTdanpY*LVL^_R$ z;a`~QHPG}6CNph1YYaCho&eo54>HPTjcH#E8A&&8uWTw&(-%svcBD2>><^F|%rFX= ze&srwt7dv{Fm>h#)z*^vWI3l>CD`Se?E|5+p4;>2eA2eYn1;b3=5XWR6USqY^v1v* zJhYMr)csWyH_H{k8ZQL~5MB&0*4*78#DHEdScXxLu8iS-6We(3`4L zVBkrW;*$b8_ENcg2d}R>s{Xw%-}=mJ!!LR66Ze`kSxLnysyp0x;U1n@CULPVrpMO4 zN!zQRJl_|;VR>M65F?SjX_vX}R-f^dEbFV8%R>+LMOMjBwwbx^3K|W^2c(Q+N0Tjs@VlqeVf_=-esszCk zc<1dm658T}eMQ>+q}rBZWOQ;u>5EFnCebyeBggs|TIe5zt{!;V&|lESn66O21&ehw z9lBsN@Sah2Sg)N$ouGMTbeYtinD>V|AMKlPv7r{{#j&(X!A}?J_!RnfIMLy{HaSZ})v3<{Vy*OyhZ*I%sv3 zPfa)XCF{E(mHFIs```6g*ZOyq!i8Y&=K@AzA}~f^ZHNIx%THSy20cK< z1Q4-cb261erhZ2V@BtSiusb0nkQ^BX-V4Q$0`+yF`Veg}(hX(wJsxaBrnykaG*vW8 z4Xm%LX-1%dU9i*$EEVjA`X3pgFg*zSTblmbdRsb(0zYZwSJU32k)JwPvY&o9?5}L{ z=Zo?yf^6~1Pf-lmZ1XR@{P{Zk`U7nN*H0aevvv5fIsOa3{zO%{*@p-KaIvp_TmaC) MK28RJKd;XJ028DVv;Y7A diff --git a/src/test/resources/testFiles/tmp/readonly/.read.me b/src/test/resources/testFiles/tmp/readonly/.read.me deleted file mode 100644 index 489433286..000000000 --- a/src/test/resources/testFiles/tmp/readonly/.read.me +++ /dev/null @@ -1,2 +0,0 @@ -This directory is for testing purposes only. -Directory must be read only so that tests can not write here. From ab65a0e7fca087ce0a0703edf3947c1614a1b07c Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Mon, 29 Jan 2018 15:15:19 +0200 Subject: [PATCH 04/15] dd4j-130: Fixed Policy validation with LT profile Signed-off-by: Andrei Smirnov --- .../asic/xades/validation/XadesSignatureValidator.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/digidoc4j/impl/asic/xades/validation/XadesSignatureValidator.java b/src/main/java/org/digidoc4j/impl/asic/xades/validation/XadesSignatureValidator.java index c9a9b26b4..fbb7e6f5d 100644 --- a/src/main/java/org/digidoc4j/impl/asic/xades/validation/XadesSignatureValidator.java +++ b/src/main/java/org/digidoc4j/impl/asic/xades/validation/XadesSignatureValidator.java @@ -116,14 +116,17 @@ protected XAdESSignature getDssSignature() { private void addPolicyValidationErrors() { logger.debug("Extracting policy validation errors"); - SignaturePolicy policy = getDssSignature().getPolicyId(); - if (policy != null) { + XAdESSignature dssSignature = getDssSignature(); + SignaturePolicy policy = dssSignature.getPolicyId(); + if (policy != null && dssSignature.getSignatureTimestamps().isEmpty()) { String policyIdentifier = Helper.getIdentifier(policy.getIdentifier()); if (!StringUtils.equals(TM_POLICY, policyIdentifier)) { addValidationError(new WrongPolicyIdentifierException("Wrong policy identifier: " + policyIdentifier)); } else { addPolicyIdentifierQualifierValidationErrors(); } + } else if (policy != null && !dssSignature.getSignatureTimestamps().isEmpty()) { + logger.debug("Signature profile is not LT_TM, but has defined policy"); } } From f528142459ea74dcd3406dd85a1fc0bc2a771c4b Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Tue, 30 Jan 2018 17:06:36 +0200 Subject: [PATCH 05/15] Some corrections for container types and tests Signed-off-by: Indrek Jentson --- .../java/org/digidoc4j/ContainerBuilder.java | 14 +++--- .../java/org/digidoc4j/ContainerOpener.java | 9 +++- .../java/org/digidoc4j/SignatureBuilder.java | 4 ++ .../ContainerWithoutFilesException.java | 4 ++ .../digidoc4j/impl/asic/AsicContainer.java | 5 +- .../impl/asic/AsicContainerParser.java | 4 ++ .../impl/asic/asice/AsicEContainer.java | 11 +++-- .../impl/asic/asice/bdoc/BDocContainer.java | 7 +++ .../impl/asic/asics/AsicSContainer.java | 13 +++--- src/main/java/org/digidoc4j/utils/Helper.java | 46 +++++++++++++++++-- .../org/digidoc4j/ContainerBuilderTest.java | 10 ++-- .../org/digidoc4j/ContainerOpenerTest.java | 4 +- .../impl/bdoc/BDocContainerTest.java | 1 + 13 files changed, 99 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/digidoc4j/ContainerBuilder.java b/src/main/java/org/digidoc4j/ContainerBuilder.java index 1105b6ae2..e4845552b 100644 --- a/src/main/java/org/digidoc4j/ContainerBuilder.java +++ b/src/main/java/org/digidoc4j/ContainerBuilder.java @@ -78,16 +78,16 @@ public static ContainerBuilder aContainer() { /** * Create a new container builder based on a container type. * - * @param containerType a type of container to be created, e.g. "BDOC(ASICE)" , "ASICS" or "DDOC". + * @param cType a type of container to be created, e.g. "BDOC(ASICE)" , "ASICS" or "DDOC". * * @return builder for creating a container. */ - public static ContainerBuilder aContainer(String containerType) { - ContainerBuilder.containerType = containerType; - if (isCustomContainerType(containerType)) { - return new CustomContainerBuilder(containerType); + public static ContainerBuilder aContainer(String cType) { + ContainerBuilder.containerType = cType; + if (isCustomContainerType(cType)) { + return new CustomContainerBuilder(cType); } - switch (containerType) { + switch (cType) { case Constant.BDOC_CONTAINER_TYPE: return new BDocContainerBuilder(); case Constant.DDOC_CONTAINER_TYPE: @@ -99,7 +99,7 @@ public static ContainerBuilder aContainer(String containerType) { case Constant.PADES_CONTAINER_TYPE: return new PadesContainerBuilder(); } - throw new NotSupportedException("Container type is not supported: " + containerType); + throw new NotSupportedException("Container type is not supported: " + cType); } /** diff --git a/src/main/java/org/digidoc4j/ContainerOpener.java b/src/main/java/org/digidoc4j/ContainerOpener.java index 9280979fd..ceaeca67f 100644 --- a/src/main/java/org/digidoc4j/ContainerOpener.java +++ b/src/main/java/org/digidoc4j/ContainerOpener.java @@ -18,6 +18,7 @@ import org.apache.commons.io.IOUtils; import org.digidoc4j.exceptions.DigiDoc4JException; +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.ddoc.DDocOpener; @@ -34,7 +35,7 @@ */ public class ContainerOpener { - private final static Logger logger = LoggerFactory.getLogger(ContainerOpener.class); + private static final Logger logger = LoggerFactory.getLogger(ContainerOpener.class); /** * Open container from a file. Use {@link ContainerBuilder#fromExistingFile(String)} instead. @@ -95,6 +96,8 @@ public static Container open(InputStream stream, boolean actAsBigFilesSupportEna 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 { @@ -124,6 +127,8 @@ public static Container open(InputStream stream, Configuration configuration) { if (Helper.isZipFile(bufferedInputStream)) { if (Helper.isAsicSContainer(bufferedInputStream)){ return new AsicSContainer(bufferedInputStream, configuration); + } else if (Helper.isAsicEContainer(bufferedInputStream)) { + return new AsicEContainer(bufferedInputStream, configuration); } return new BDocContainer(bufferedInputStream, configuration); } else { @@ -141,6 +146,8 @@ private static Container openBDocContainer(String path, Configuration configurat configuration.loadConfiguration("digidoc4j.yaml", false); if (Helper.isAsicSContainer(path)){ return new AsicSContainer(path, configuration); + } else if (Helper.isAsicEContainer(path)) { + return new AsicEContainer(path, configuration); } return new BDocContainer(path, configuration); } diff --git a/src/main/java/org/digidoc4j/SignatureBuilder.java b/src/main/java/org/digidoc4j/SignatureBuilder.java index b2fbe2c60..f10f578d4 100644 --- a/src/main/java/org/digidoc4j/SignatureBuilder.java +++ b/src/main/java/org/digidoc4j/SignatureBuilder.java @@ -11,6 +11,7 @@ package org.digidoc4j; import static java.util.Arrays.asList; +import static org.digidoc4j.Constant.ASICE_CONTAINER_TYPE; import static org.digidoc4j.Constant.ASICS_CONTAINER_TYPE; import static org.digidoc4j.Constant.BDOC_CONTAINER_TYPE; import static org.digidoc4j.Constant.DDOC_CONTAINER_TYPE; @@ -27,6 +28,7 @@ import org.digidoc4j.exceptions.SignerCertificateRequiredException; import org.digidoc4j.exceptions.TechnicalException; import org.digidoc4j.impl.asic.AsicSignatureBuilder; +import org.digidoc4j.impl.asic.asice.AsicESignatureBuilder; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignatureBuilder; import org.digidoc4j.impl.ddoc.DDocSignatureBuilder; import org.slf4j.Logger; @@ -87,6 +89,8 @@ private static SignatureBuilder createBuilder(Container container) { return createCustomSignatureBuilder(containerType); } else if (isContainerType(containerType, BDOC_CONTAINER_TYPE)) { return new BDocSignatureBuilder(); + } else if (isContainerType(containerType, ASICE_CONTAINER_TYPE)) { + return new AsicESignatureBuilder(); } else if (isContainerType(containerType, ASICS_CONTAINER_TYPE)) { return new AsicSignatureBuilder(); } else if (isContainerType(containerType, DDOC_CONTAINER_TYPE)) { diff --git a/src/main/java/org/digidoc4j/exceptions/ContainerWithoutFilesException.java b/src/main/java/org/digidoc4j/exceptions/ContainerWithoutFilesException.java index 0ca8ddbe2..9291469ac 100644 --- a/src/main/java/org/digidoc4j/exceptions/ContainerWithoutFilesException.java +++ b/src/main/java/org/digidoc4j/exceptions/ContainerWithoutFilesException.java @@ -17,4 +17,8 @@ public class ContainerWithoutFilesException extends DigiDoc4JException { public ContainerWithoutFilesException() { super(MESSAGE); } + + public ContainerWithoutFilesException(String message) { + super(message); + } } diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java b/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java index b178fa258..59197f583 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java @@ -408,7 +408,7 @@ private List extendAllSignaturesProfile(SignatureProfile profile, Lis if (Constant.ASICS_CONTAINER_TYPE.equals(getType())){ extendedSignatures = extendAllSignatureProfile(profile, signatures, Arrays.asList(dataFiles.get(0))); } else{ - extendedSignatures = extendAllSignatureProfile(profile, signatures, dataFiles); + extendedSignatures = extendAllSignatureProfile(profile, signatures, dataFiles); } return extendedSignatures; } @@ -444,7 +444,6 @@ public void removeSignature(int signatureId) { } - //method is deprecated in case of new container @Override public void removeDataFile(String fileName) { if (!isNewContainer()) { @@ -672,4 +671,4 @@ public Signature signRaw(byte[] rawSignature) { public void setSignatureProfile(SignatureProfile profile) { throw new NotSupportedException("Setting signature profile method is not supported by Asic container"); } -} \ No newline at end of file +} diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java b/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java index cb825b454..ad77be764 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicContainerParser.java @@ -27,6 +27,7 @@ import org.apache.commons.lang3.StringUtils; import org.digidoc4j.Configuration; import org.digidoc4j.DataFile; +import org.digidoc4j.exceptions.ContainerWithoutFilesException; import org.digidoc4j.exceptions.DigiDoc4JException; import org.digidoc4j.exceptions.DuplicateDataFileException; import org.digidoc4j.exceptions.TechnicalException; @@ -204,6 +205,9 @@ private void validateParseResult() { throw new UnsupportedFormatException("Container mime type is not " + MimeType.ASICE.getMimeTypeString() + " OR " + MimeType.ASICS.getMimeTypeString() + " but is " + mimeType); } + if (!this.signatures.isEmpty() && this.dataFiles.isEmpty()) { + throw new ContainerWithoutFilesException("The reference data object(s) is not found!"); + } } private void validateDataFile(String fileName) { diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java b/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java index a48e34d62..8b502cb0a 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java @@ -25,6 +25,7 @@ public class AsicEContainer extends AsicContainer { */ public AsicEContainer() { super(); + setType(Constant.ASICE_CONTAINER_TYPE); } /** @@ -34,6 +35,7 @@ public AsicEContainer() { */ public AsicEContainer(Configuration configuration) { super(configuration); + setType(Constant.ASICE_CONTAINER_TYPE); } /** @@ -43,6 +45,7 @@ public AsicEContainer(Configuration configuration) { */ public AsicEContainer(String containerPath) { super(containerPath); + setType(Constant.ASICE_CONTAINER_TYPE); } /** @@ -53,6 +56,7 @@ public AsicEContainer(String containerPath) { */ public AsicEContainer(String containerPath, Configuration configuration) { super(containerPath, configuration); + setType(Constant.ASICE_CONTAINER_TYPE); } /** @@ -62,6 +66,7 @@ public AsicEContainer(String containerPath, Configuration configuration) { */ public AsicEContainer(InputStream stream) { super(stream); + setType(Constant.ASICE_CONTAINER_TYPE); } /** @@ -72,11 +77,7 @@ public AsicEContainer(InputStream stream) { */ public AsicEContainer(InputStream stream, Configuration configuration) { super(stream, configuration); - } - - @Override - public String getType() { - return Constant.BDOC_CONTAINER_TYPE; + setType(Constant.ASICE_CONTAINER_TYPE); } @Override diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java index f8d850de6..fdf273169 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java @@ -14,6 +14,7 @@ import java.io.OutputStream; import org.digidoc4j.Configuration; +import org.digidoc4j.Constant; import org.digidoc4j.impl.asic.AsicContainerCreator; import org.digidoc4j.impl.asic.asice.AsicEContainer; import org.slf4j.Logger; @@ -31,6 +32,7 @@ public class BDocContainer extends AsicEContainer { */ public BDocContainer() { super(); + setType(Constant.BDOC_CONTAINER_TYPE); } /** @@ -40,6 +42,7 @@ public BDocContainer() { */ public BDocContainer(Configuration configuration) { super(configuration); + setType(Constant.BDOC_CONTAINER_TYPE); } /** @@ -49,6 +52,7 @@ public BDocContainer(Configuration configuration) { */ public BDocContainer(String containerPath) { super(containerPath); + setType(Constant.BDOC_CONTAINER_TYPE); } /** @@ -59,6 +63,7 @@ public BDocContainer(String containerPath) { */ public BDocContainer(String containerPath, Configuration configuration) { super(containerPath, configuration); + setType(Constant.BDOC_CONTAINER_TYPE); } /** @@ -68,6 +73,7 @@ public BDocContainer(String containerPath, Configuration configuration) { */ public BDocContainer(InputStream stream) { super(stream); + setType(Constant.BDOC_CONTAINER_TYPE); } /** @@ -78,6 +84,7 @@ public BDocContainer(InputStream stream) { */ public BDocContainer(InputStream stream, Configuration configuration) { super(stream, configuration); + setType(Constant.BDOC_CONTAINER_TYPE); } @Override diff --git a/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java b/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java index 5d83585a6..21f9d0554 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java @@ -13,8 +13,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; - - /** * Created by Andrei on 7.11.2017. */ @@ -24,31 +22,32 @@ public class AsicSContainer extends AsicContainer { public AsicSContainer() { super(); + setType(Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(Configuration configuration) { super(configuration); + setType(Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(String containerPath) { super(containerPath); + setType(Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(String containerPath, Configuration configuration) { super(containerPath, configuration); + setType(Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(InputStream stream) { super(stream); + setType(Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(InputStream stream, Configuration configuration) { super(stream, configuration); - } - - @Override - public String getType() { - return Constant.ASICS_CONTAINER_TYPE; + setType(Constant.ASICS_CONTAINER_TYPE); } @Override diff --git a/src/main/java/org/digidoc4j/utils/Helper.java b/src/main/java/org/digidoc4j/utils/Helper.java index 439739d73..432a9d51a 100644 --- a/src/main/java/org/digidoc4j/utils/Helper.java +++ b/src/main/java/org/digidoc4j/utils/Helper.java @@ -422,6 +422,44 @@ 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 * @@ -434,7 +472,7 @@ public static boolean isAsicSContainer(String path) { return true; } else if ("zip".equals(extension)){ try { - return parseContainer(new BufferedInputStream(new FileInputStream(path))); + return parseAsicContainer(new BufferedInputStream(new FileInputStream(path)), MimeType.ASICS); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { @@ -453,14 +491,14 @@ public static boolean isAsicSContainer(String path) { public static boolean isAsicSContainer(BufferedInputStream stream) { boolean isAsic = false; try { - isAsic = parseContainer(stream); + isAsic = parseAsicContainer(stream, MimeType.ASICS); } catch (IOException e) { e.printStackTrace(); } return isAsic; } - private static boolean parseContainer(BufferedInputStream stream) throws IOException { + private static boolean parseAsicContainer(BufferedInputStream stream, MimeType mtype) throws IOException { stream.mark(stream.available() + 1); ZipInputStream zipInputStream = new ZipInputStream(stream); try { @@ -471,7 +509,7 @@ private static boolean parseContainer(BufferedInputStream stream) throws IOExcep 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, MimeType.ASICS.getMimeTypeString())){ + if (StringUtils.equalsIgnoreCase(mimeType, mtype.getMimeTypeString())){ return true; } } diff --git a/src/test/java/org/digidoc4j/ContainerBuilderTest.java b/src/test/java/org/digidoc4j/ContainerBuilderTest.java index 5c2e71821..282482117 100644 --- a/src/test/java/org/digidoc4j/ContainerBuilderTest.java +++ b/src/test/java/org/digidoc4j/ContainerBuilderTest.java @@ -29,6 +29,7 @@ import org.apache.commons.io.IOUtils; import org.digidoc4j.exceptions.InvalidDataFileException; import org.digidoc4j.impl.DigiDoc4JTestHelper; +import org.digidoc4j.impl.asic.asice.AsicEContainer; import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer; import org.digidoc4j.impl.ddoc.DDocContainer; import org.digidoc4j.impl.ddoc.DDocSignature; @@ -405,9 +406,10 @@ public void openBDocContainerFromStream() throws Exception { aContainer("BDOC"). fromStream(stream). build(); - assertContainerOpened(container, "BDOC"); + assertContainerOpened(container, "ASICE"); } + // When reading from stream there are no major difference between BDOC and ASICE @Test public void openBDocContainerFromStream_withConfiguration() throws Exception { Configuration configuration = new Configuration(Configuration.Mode.TEST); @@ -418,8 +420,8 @@ public void openBDocContainerFromStream_withConfiguration() throws Exception { withConfiguration(configuration). fromStream(stream). build(); - assertContainerOpened(container, "BDOC"); - assertEquals("test-value", ((BDocContainer) container).getConfiguration().getTspSource()); + assertContainerOpened(container, "ASICE"); + assertEquals("test-value", ((AsicEContainer)container).getConfiguration().getTspSource()); } @Test @@ -452,7 +454,7 @@ public void openDefaultContainerFromStream_withBDOC() throws Exception { withConfiguration(TEST_CONFIGURATION). fromStream(stream). build(); - assertContainerOpened(container, "BDOC"); + assertContainerOpened(container, "ASICE"); } @Test diff --git a/src/test/java/org/digidoc4j/ContainerOpenerTest.java b/src/test/java/org/digidoc4j/ContainerOpenerTest.java index 42a4ffc93..c74f77059 100644 --- a/src/test/java/org/digidoc4j/ContainerOpenerTest.java +++ b/src/test/java/org/digidoc4j/ContainerOpenerTest.java @@ -45,7 +45,7 @@ public void openDDocContainer() throws Exception { public void openBDocContainerAsStream() throws Exception { FileInputStream stream = FileUtils.openInputStream(new File(BDOC_TEST_FILE)); Container container = ContainerOpener.open(stream, configuration); - assertContainerOpened(container, "BDOC"); + assertContainerOpened(container, "ASICE"); } @Test @@ -60,7 +60,7 @@ public void openBDocContainerAsStream_WithBigFilesNotSupported() throws Exceptio boolean bigFilesSupportEnabled = false; FileInputStream stream = FileUtils.openInputStream(new File(BDOC_TEST_FILE)); Container container = ContainerOpener.open(stream, bigFilesSupportEnabled); - assertContainerOpened(container, "BDOC"); + assertContainerOpened(container, "ASICE"); } private void assertContainerOpened(Container container, String containerType) { diff --git a/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java b/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java index 9485a5b3f..2e8b60a6b 100644 --- a/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java +++ b/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java @@ -1063,6 +1063,7 @@ public void whenOpeningContainer_withSignatureInfo_butNoSignedDataObject_shouldT .fromExistingFile("src/test/resources/testFiles/invalid-containers/3863_bdoc21_TM_no_datafile.bdoc") .withConfiguration(new Configuration(Configuration.Mode.TEST)) .build(); + // ValidationResult result = container.validate(); } @Test From e2a012b3f4adb9bf2c1537cf90451581ad82c550 Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Fri, 15 Sep 2017 13:31:27 +0300 Subject: [PATCH 06/15] dd4j-40: first version of loading tsps from yaml file Signed-off-by: Andrei Smirnov --- .../java/org/digidoc4j/Configuration.java | 17 ++ test/TmpTSP.java | 71 +++++++ .../digidoc_test_conf_tsp_source.yaml | 182 ++++++++++++++++++ 3 files changed, 270 insertions(+) create mode 100644 test/TmpTSP.java create mode 100644 testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml diff --git a/src/main/java/org/digidoc4j/Configuration.java b/src/main/java/org/digidoc4j/Configuration.java index 464742ded..38a8be4c5 100644 --- a/src/main/java/org/digidoc4j/Configuration.java +++ b/src/main/java/org/digidoc4j/Configuration.java @@ -506,6 +506,23 @@ public String getTspSource() { return this.getConfigurationParameter(ConfigurationParameter.TspSource); } + /** + * Get the TSP country + * + * @return TSP country + */ + public List getTspC() { + logger.debug("Key: TSP_C"); + List countryValues = new ArrayList<>(); + for (Map.Entry entry : configuration.entrySet()){ + if (entry.getKey().startsWith("TSP_C_")){ + countryValues.add(entry.getValue()); + } + } + logger.debug("Value: " + countryValues.toString()); + return countryValues; + } + /** * Set HTTP connection timeout * diff --git a/test/TmpTSP.java b/test/TmpTSP.java new file mode 100644 index 000000000..cfb68b429 --- /dev/null +++ b/test/TmpTSP.java @@ -0,0 +1,71 @@ +import java.io.FileInputStream; +import java.security.KeyStore; +import java.security.cert.X509Certificate; + +import org.digidoc4j.Configuration; +import org.digidoc4j.Container; +import org.digidoc4j.ContainerBuilder; +import org.digidoc4j.DigestAlgorithm; +import org.digidoc4j.Signature; +import org.digidoc4j.SignatureBuilder; +import org.digidoc4j.X509Cert; +import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.signers.PKCS12SignatureToken; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by Andrei on 11.09.2017. + */ +public class TmpTSP { + + @Test + public void conf(){ + Configuration configuration = new Configuration(); + configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); + configuration.getTsps(); + } + + @Test + public void signature(){ + Configuration configuration = new Configuration(Configuration.Mode.TEST); + configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); + configuration.getTsps(); + + Container container = ContainerBuilder + .aContainer() + .withConfiguration(configuration) + .build(); + + container.addDataFile("testFiles/helper-files/test.txt", "text/plain"); + + X509Certificate signerCert = getSignerCert(); + + Signature signature = SignatureBuilder. + aSignature(container). + withSignatureDigestAlgorithm(DigestAlgorithm.SHA512). + withSignatureToken(new PKCS12SignatureToken("testFiles/p12/signout.p12", "test".toCharArray())). + //withSigningCertificate(signerCert). + invokeSigning(); + + X509Cert cert = signature.getSigningCertificate(); + String subjectName = cert.getSubjectName(X509Cert.SubjectName.C); + if(configuration.getTspC().contains(subjectName)){ + + } + container.addSignature(signature); + Assert.assertTrue(container.validate().isValid()); + } + + private static X509Certificate getSignerCert() { + try { + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + try (FileInputStream stream = new FileInputStream("testFiles/p12/signout.p12")) { + keyStore.load(stream, "test".toCharArray()); + } + return (X509Certificate) keyStore.getCertificate("1"); + } catch (Exception e) { + throw new DigiDoc4JException("Loading signer cert failed"); + } + } +} diff --git a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml new file mode 100644 index 000000000..34546be17 --- /dev/null +++ b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml @@ -0,0 +1,182 @@ +TSP_SOURCE: http://demo.sk.ee/tsa +TSPS: + - TSP: + TSP_C: EE + TSP_SOURCE: http://demo.sk.ee/tsa + TSP_KEYSTORE_PATH: tspkeystorepath + TSP_KEYSTORE_TYPE: tspkeystoretype + TSP_KEYSTORE_PASSWORD: tspkeystorepassword + - TSP: + TSP_C: LV + TSP_SOURCE: http://demo.sk.ee/tsa + TSP_KEYSTORE_PATH: tspkeystorepath + TSP_KEYSTORE_TYPE: tspkeystoretype + TSP_KEYSTORE_PASSWORD: tspkeystorepassword + - TSP: + TSP_C: LT + TSP_SOURCE: http://demo.sk.ee/tsa + TSP_KEYSTORE_PATH: tspkeystorepath + TSP_KEYSTORE_TYPE: tspkeystoretype + TSP_KEYSTORE_PASSWORD: tspkeystorepassword + +DIGIDOC_CAS: +- DIGIDOC_CA: + NAME: AS Sertifitseerimiskeskus + TRADENAME: SK + CERTS: + - jar://certs/EID-SK.crt + - jar://certs/ESTEID-SK.crt + - jar://certs/ESTEID-SK 2007.crt + - jar://certs/EID-SK 2007.crt + - jar://certs/JUUR-SK.crt + - jar://certs/KLASS3-SK.crt + - jar://certs/EECCRCA.crt + - jar://certs/ESTEID-SK 2011.crt + - jar://certs/ESTEID-SK 2015.crt + - jar://certs/EID-SK 2011.crt + - jar://certs/KLASS3-SK 2010.crt + - jar://certs/KLASS3-SK 2010 EECCRCA.crt + - jar://certs/TEST-SK.crt + - jar://certs/TEST EECCRCA.crt + - jar://certs/TEST ESTEID-SK 2011.crt + - jar://certs/TEST ESTEID-SK 2015.crt + - jar://certs/TEST EID-SK 2011.crt + - jar://certs/TEST KLASS3 2010.crt + - jar://certs/TEST Juur-SK.crt + + OCSPS: + - OCSP: + CA_CN: ESTEID-SK + CA_CERT: jar://certs/ESTEID-SK 2007.crt + CN: ESTEID-SK 2007 OCSP RESPONDER + CERTS: + - jar://certs/ESTEID-SK 2007 OCSP.crt + URL: http://ocsp.sk.ee + - OCSP: + CA_CN: KLASS3-SK + CA_CERT: jar://certs/KLASS3-SK.crt + CN: KLASS3-SK OCSP RESPONDER + CERTS: + - jar://certs/KLASS3-SK OCSP.crt + - jar://certs/KLASS3-SK OCSP 2006.crt + URL: http://ocsp.sk.ee + - OCSP: + CA_CN: EID-SK + CA_CERT: jar://certs/EID-SK 2007.crt + CN: EID-SK 2007 OCSP RESPONDER + CERTS: + - jar://certs/EID-SK 2007 OCSP.crt + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK 2007 OCSP.crt + CN: EID-SK OCSP RESPONDER 2007 + CA_CERT: jar://certs/EID-SK 2007.crt + CA_CN: EID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CN: ESTEID-SK 2007 OCSP RESPONDER + CERTS: + - jar://certs/ESTEID-SK 2007 OCSP.crt + CA_CERT: jar://certs/ESTEID-SK 2007.crt + CA_CN: ESTEID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CN: ESTEID-SK 2007 OCSP RESPONDER 2010 + CERTS: + - jar://certs/ESTEID-SK 2007 OCSP 2010.crt + CA_CERT: jar://certs/ESTEID-SK 2007.crt + CA_CN: ESTEID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK 2007 OCSP 2010.crt + CN: EID-SK 2007 OCSP RESPONDER 2010 + CA_CERT: jar://certs/EID-SK 2007.crt + CA_CN: EID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK 2007 OCSP.crt + CN: EID-SK 2007 OCSP RESPONDER + CA_CERT: jar://certs/EID-SK 2007.crt + CA_CN: EID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/ESTEID-SK OCSP 2005.crt + CN: ESTEID-SK OCSP RESPONDER 2005 + CA_CERT: jar://certs/ESTEID-SK.crt + CA_CN: ESTEID-SK + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/SK OCSP 2011.crt + CN: SK OCSP RESPONDER 2011 + CA_CERT: jar://certs/EECCRCA.crt + CA_CN: EE Certification Centre Root CA + URL: http://ocsp.sk.ee + - OCSP: + CA_CN: KLASS3-SK + CA_CERT: jar://certs/KLASS3-SK.crt + CN: KLASS3-SK OCSP RESPONDER 2009 + CERTS: + - jar://certs/KLASS3-SK OCSP 2009.crt + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/ESTEID-SK OCSP.crt + CN: ESTEID-SK OCSP RESPONDER + CA_CERT: jar://certs/ESTEID-SK.crt + CA_CN: ESTEID-SK + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK OCSP.crt + - jar://certs/EID-SK OCSP 2006.crt + CN: EID-SK OCSP RESPONDER + CA_CERT: jar://certs/EID-SK.crt + CA_CN: EID-SK + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/KLASS3-SK 2010 OCSP.crt + CN: KLASS3-SK 2010 OCSP RESPONDER + CA_CERT: jar://certs/KLASS3-SK 2010.crt + CA_CN: KLASS3-SK 2010 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/TEST-SK OCSP 2005.crt + CN: TEST-SK OCSP RESPONDER 2005 + CA_CERT: jar://certs/TEST-SK.crt + CA_CN: TEST-SK + URL: http://demo.sk.ee/ocsp + - OCSP: + CERTS: + - jar://certs/TEST SK OCSP 2011.crt + CN: TEST of SK OCSP RESPONDER 2011 + CA_CERT: jar://certs/TEST EECCRCA.crt + CA_CN: TEST of EE Certification Centre Root CA + URL: http://demo.sk.ee/ocsp + - OCSP: + CA_CN: TEST of ESTEID-SK 2011 + CA_CERT: jar://certs/TEST ESTEID-SK 2011.crt + CN: TEST of SK OCSP RESPONDER 2011 + CERTS: + - jar://certs/TEST SK OCSP 2011.crt + URL: http://demo.sk.ee/ocsp + - OCSP: + CERTS: + - jar://certs/TEST SK OCSP 2011.crt + CN: TEST of SK OCSP RESPONDER 2011 + CA_CERT: jar://certs/KLASS3-SK 2010.crt + CA_CN: KLASS3-SK 2010 + URL: http://demo.sk.ee/ocsp + - OCSP: + CERTS: + - jar://certs/SK_proxy_OCSP_responder_2009.pem.cer + CA_CN: KLASS3-SK + CA_CERT: jar://certs/KLASS3-SK.crt + CN: SK Proxy OCSP Responder 2009 + URL: http://ocsp.sk.ee \ No newline at end of file From 739793bb53a149801f8ffa9b8ca990970b98e347 Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Mon, 9 Oct 2017 11:44:21 +0300 Subject: [PATCH 07/15] dd4j-40: Using Baltic timestamp service fix --- .../java/org/digidoc4j/Configuration.java | 19 +++++++------------ .../impl/asic/AsicSignatureBuilder.java | 18 +++++++++++++++++- test/TmpTSP.java | 19 +++++++++++++++++-- .../digidoc_test_conf_tsp_source.yaml | 2 +- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/digidoc4j/Configuration.java b/src/main/java/org/digidoc4j/Configuration.java index 38a8be4c5..984027720 100644 --- a/src/main/java/org/digidoc4j/Configuration.java +++ b/src/main/java/org/digidoc4j/Configuration.java @@ -507,20 +507,15 @@ public String getTspSource() { } /** - * Get the TSP country + * Get the TSP source by country * - * @return TSP country + * @param country to use tsp source + * @return tspSource */ - public List getTspC() { - logger.debug("Key: TSP_C"); - List countryValues = new ArrayList<>(); - for (Map.Entry entry : configuration.entrySet()){ - if (entry.getKey().startsWith("TSP_C_")){ - countryValues.add(entry.getValue()); - } - } - logger.debug("Value: " + countryValues.toString()); - return countryValues; + public String getTspSourceByCountry(String country) { + String tspSourceUrl = getConfigurationParameter("TSP_C_" + country + "_TSP_SOURCE"); + logger.debug("TSP Source by country " + country + ": " + tspSourceUrl); + return tspSourceUrl; } /** diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java b/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java index e97f7c043..9c882b48e 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java @@ -32,6 +32,7 @@ import org.digidoc4j.Signature; import org.digidoc4j.SignatureBuilder; import org.digidoc4j.SignatureProfile; +import org.digidoc4j.X509Cert; import org.digidoc4j.exceptions.ContainerWithoutFilesException; import org.digidoc4j.exceptions.DigiDoc4JException; import org.digidoc4j.exceptions.InvalidSignatureException; @@ -69,6 +70,7 @@ public class AsicSignatureBuilder extends SignatureBuilder implements SignatureF private static final int maxTryCount = 5; protected transient XadesSigningDssFacade facade; private Date signingDate; + private boolean isLTorLTAprofile = false; @Override protected Signature invokeSigningProcess() { @@ -224,7 +226,7 @@ protected void setOcspSource(byte[] signatureValueBytes) { protected void setTimeStampProviderSource() { Configuration configuration = getConfiguration(); - OnlineTSPSource tspSource = new OnlineTSPSource(configuration.getTspSource()); + OnlineTSPSource tspSource = new OnlineTSPSource(getTspSource(configuration)); SkDataLoader dataLoader = SkDataLoader.createTimestampDataLoader(configuration); dataLoader.setUserAgentSignatureProfile(signatureParameters.getSignatureProfile()); tspSource.setDataLoader(dataLoader); @@ -275,9 +277,11 @@ protected void setSignatureProfile(SignatureProfile profile) { facade.setSignatureLevel(XAdES_BASELINE_B); break; case LTA: + isLTorLTAprofile = true; facade.setSignatureLevel(XAdES_BASELINE_LTA); break; default: + isLTorLTAprofile = true; facade.setSignatureLevel(XAdES_BASELINE_LT); } } @@ -358,4 +362,16 @@ protected boolean isEpesProfile() { } return false; } + + private String getTspSource(Configuration configuration) { + if (isLTorLTAprofile){ + X509Cert x509Cert = new X509Cert(signatureParameters.getSigningCertificate()); + String certCountry = x509Cert.getSubjectName(X509Cert.SubjectName.C); + String tspSourceByCountry = configuration.getTspSourceByCountry(certCountry); + if (StringUtils.isNotBlank(tspSourceByCountry)){ + return tspSourceByCountry; + } + } + return configuration.getTspSource(); + } } diff --git a/test/TmpTSP.java b/test/TmpTSP.java index cfb68b429..e41f671cc 100644 --- a/test/TmpTSP.java +++ b/test/TmpTSP.java @@ -1,7 +1,9 @@ import java.io.FileInputStream; import java.security.KeyStore; import java.security.cert.X509Certificate; +import java.util.List; +import org.bouncycastle.tsp.TimeStampToken; import org.digidoc4j.Configuration; import org.digidoc4j.Container; import org.digidoc4j.ContainerBuilder; @@ -14,6 +16,10 @@ import org.junit.Assert; import org.junit.Test; +import eu.europa.esig.dss.DSSUtils; +import eu.europa.esig.dss.client.http.commons.TimestampDataLoader; +import eu.europa.esig.dss.client.tsp.OnlineTSPSource; + /** * Created by Andrei on 11.09.2017. */ @@ -50,9 +56,7 @@ public void signature(){ X509Cert cert = signature.getSigningCertificate(); String subjectName = cert.getSubjectName(X509Cert.SubjectName.C); - if(configuration.getTspC().contains(subjectName)){ - } container.addSignature(signature); Assert.assertTrue(container.validate().isValid()); } @@ -68,4 +72,15 @@ private static X509Certificate getSignerCert() { throw new DigiDoc4JException("Loading signer cert failed"); } } + + @Test + public void signatureLTTSA(){ + OnlineTSPSource tspSource = new OnlineTSPSource("http://demo.sk.ee/tsa/"); + tspSource.setPolicyOid("0.4.0.2023.1.1"); + tspSource.setDataLoader(new TimestampDataLoader()); // content-type is different + + byte[] digest = DSSUtils.digest(eu.europa.esig.dss.DigestAlgorithm.SHA512, "Hello world".getBytes()); + TimeStampToken timeStampResponse = tspSource.getTimeStampResponse(eu.europa.esig.dss.DigestAlgorithm.SHA512, digest); + Assert.assertNotNull(timeStampResponse); + } } diff --git a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml index 34546be17..0877be1a8 100644 --- a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml +++ b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml @@ -14,7 +14,7 @@ TSPS: TSP_KEYSTORE_PASSWORD: tspkeystorepassword - TSP: TSP_C: LT - TSP_SOURCE: http://demo.sk.ee/tsa + TSP_SOURCE: https://tsa.balstamp.lt TSP_KEYSTORE_PATH: tspkeystorepath TSP_KEYSTORE_TYPE: tspkeystoretype TSP_KEYSTORE_PASSWORD: tspkeystorepassword From 1a4e9a990577e10b11410392833c3278b8aefe32 Mon Sep 17 00:00:00 2001 From: Janar Rahumeel Date: Fri, 26 Jan 2018 13:57:13 +0200 Subject: [PATCH 08/15] Added new unit tests & merged from master --- .gitignore | 13 +- .idea/codeStyleSettings.xml | 2 + .settings/org.apache.ivyde.eclipse.prefs | 2 - .settings/org.eclipse.core.resources.prefs | 2 - .settings/org.eclipse.jdt.core.prefs | 306 ------------------ .settings/org.eclipse.jdt.ui.prefs | 7 - ....eclipse.wst.common.project.facet.core.xml | 4 - .../java/org/digidoc4j/Configuration.java | 123 ++++--- .../org/digidoc4j/ConfigurationParameter.java | 7 +- .../org/digidoc4j/ConfigurationRegistry.java | 1 + .../java/org/digidoc4j/SignatureTest.java | 42 +++ .../digidoc4j/impl/DigiDoc4JTestHelper.java | 40 +++ src/test/resources/logback-test.xml | 13 +- .../digidoc_test_conf_tsp_source.yaml | 0 test/TmpTSP.java | 86 ----- 15 files changed, 187 insertions(+), 461 deletions(-) delete mode 100644 .settings/org.apache.ivyde.eclipse.prefs delete mode 100644 .settings/org.eclipse.core.resources.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.jdt.ui.prefs delete mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml rename {testFiles => src/test/resources/testFiles}/yaml-configurations/digidoc_test_conf_tsp_source.yaml (100%) delete mode 100644 test/TmpTSP.java diff --git a/.gitignore b/.gitignore index cc8275e7c..b51e46085 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,5 @@ /build /target -.idea/workspace.xml -.idea/uiDesigner.xml -.idea/dictionaries/xp.xml -.idea/libraries -*.log -/utility-package-lib -/zip-package-lib +.idea/* +!.idea/codeStyleSettings.xml /buildNumber.properties -/Old* -/logback.xml -!/src/main/etc/logback.xml -/lib diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml index 4959716fc..e4e3845ca 100644 --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -37,7 +37,9 @@ + diff --git a/.settings/org.apache.ivyde.eclipse.prefs b/.settings/org.apache.ivyde.eclipse.prefs deleted file mode 100644 index 610137922..000000000 --- a/.settings/org.apache.ivyde.eclipse.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -org.apache.ivyde.eclipse.standaloneretrieve= diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4824b8026..000000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 0d052db51..000000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,306 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.codeComplete.argumentPrefixes= -org.eclipse.jdt.core.codeComplete.argumentSuffixes= -org.eclipse.jdt.core.codeComplete.fieldPrefixes= -org.eclipse.jdt.core.codeComplete.fieldSuffixes= -org.eclipse.jdt.core.codeComplete.localPrefixes= -org.eclipse.jdt.core.codeComplete.localSuffixes= -org.eclipse.jdt.core.codeComplete.staticFieldPrefixes= -org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= -org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= -org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert -org.eclipse.jdt.core.formatter.comment.line_length=80 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=2 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.lineSplit=80 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=2 -org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 2323d8534..000000000 --- a/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -formatter_profile=_digidoc4j -formatter_settings_version=12 -org.eclipse.jdt.ui.exception.name=e -org.eclipse.jdt.ui.gettersetter.use.is=true -org.eclipse.jdt.ui.keywordthis=false -org.eclipse.jdt.ui.overrideannotation=true diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml deleted file mode 100644 index e4e9b7c03..000000000 --- a/.settings/org.eclipse.wst.common.project.facet.core.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/main/java/org/digidoc4j/Configuration.java b/src/main/java/org/digidoc4j/Configuration.java index 984027720..e045f0889 100644 --- a/src/main/java/org/digidoc4j/Configuration.java +++ b/src/main/java/org/digidoc4j/Configuration.java @@ -25,13 +25,16 @@ import java.net.URL; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutorService; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.digidoc4j.exceptions.ConfigurationException; import org.digidoc4j.exceptions.DigiDoc4JException; import org.digidoc4j.impl.ConfigurationSingeltonHolder; @@ -147,12 +150,14 @@ */ public class Configuration implements Serializable { - private static final Logger logger = LoggerFactory.getLogger(Configuration.class); - private transient ExecutorService threadExecutor; + private final Logger log = LoggerFactory.getLogger(Configuration.class); private final Mode mode; + private transient ExecutorService threadExecutor; private TslManager tslManager; private Hashtable jDigiDocConfiguration = new Hashtable<>(); private ConfigurationRegistry registry = new ConfigurationRegistry(); + // TODO integrate tspMap (multilevel arrays) into configuration registry + private HashMap> tspMap = new HashMap<>(); private List trustedTerritories = new ArrayList<>(); private ArrayList inputSourceParseErrors = new ArrayList<>(); private LinkedHashMap configurationFromFile; @@ -192,16 +197,16 @@ public Configuration() { * @param mode Application mode */ public Configuration(Mode mode) { - if (logger.isInfoEnabled() && !logger.isDebugEnabled()) { - logger.info("DigiDoc4J will be executed in <{}> mode", mode); + if (log.isInfoEnabled() && !log.isDebugEnabled()) { + log.info("DigiDoc4J will be executed in <{}> mode", mode); } - logger.debug("------------------------ ------------------------", mode); + log.debug("------------------------ ------------------------", mode); this.mode = mode; this.loadConfiguration("digidoc4j.yaml"); this.initDefaultValues(); - logger.debug("------------------------ ------------------------", mode); - if (!logger.isDebugEnabled()) { - logger.info("Configuration loaded ..."); + log.debug("------------------------ ------------------------", mode); + if (!log.isDebugEnabled()) { + log.info("Configuration loaded ..."); } } @@ -213,7 +218,7 @@ public Configuration(Mode mode) { public boolean isOCSPSigningConfigurationAvailable() { boolean available = StringUtils.isNotBlank(this.getOCSPAccessCertificateFileName()) && this.getOCSPAccessCertificatePassword().length != 0; - logger.debug("Is OCSP signing configuration available? {}", available); + log.debug("Is OCSP signing configuration available? {}", available); return available; } @@ -312,16 +317,16 @@ public Hashtable loadConfiguration(String file) { */ public Hashtable loadConfiguration(String file, boolean isReloadFromYaml) { if (!isReloadFromYaml) { - logger.info("Should not reload conf from yaml when open container"); + log.info("Should not reload conf from yaml when open container"); return jDigiDocConfiguration; } - logger.info("Loading configuration from file " + file); + log.info("Loading configuration from file " + file); configurationInputSourceName = file; InputStream resourceAsStream = null; try { resourceAsStream = new FileInputStream(file); } catch (FileNotFoundException e) { - logger.info("Configuration file " + file + " not found. Trying to search from jar file."); + log.info("Configuration file " + file + " not found. Trying to search from jar file."); } if (resourceAsStream == null) { resourceAsStream = getResourceAsStream(file); @@ -351,7 +356,7 @@ public Hashtable getJDigiDocConfiguration() { */ @Deprecated public void enableBigFilesSupport(long maxFileSizeCachedInMB) { - logger.debug("Set maximum datafile cached to: " + maxFileSizeCachedInMB); + log.debug("Set maximum datafile cached to: " + maxFileSizeCachedInMB); String value = Long.toString(maxFileSizeCachedInMB); if (isValidIntegerParameter("DIGIDOC_MAX_DATAFILE_CACHED", value)) { jDigiDocConfiguration.put("DIGIDOC_MAX_DATAFILE_CACHED", value); @@ -408,7 +413,7 @@ public boolean hasToBeOCSPRequestSigned() { */ public long getMaxDataFileCachedInMB() { String maxDataFileCached = jDigiDocConfiguration.get("DIGIDOC_MAX_DATAFILE_CACHED"); - logger.debug("Maximum datafile cached in MB: " + maxDataFileCached); + log.debug("Maximum datafile cached in MB: " + maxDataFileCached); if (maxDataFileCached == null) return Constant.CACHE_ALL_DATA_FILES; return Long.parseLong(maxDataFileCached); @@ -444,7 +449,7 @@ public String getTslLocation() { urlString = resource.toString(); } } catch (MalformedURLException e) { - logger.warn(e.getMessage()); + log.warn(e.getMessage()); } return urlString == null ? "" : urlString; } @@ -513,9 +518,14 @@ public String getTspSource() { * @return tspSource */ public String getTspSourceByCountry(String country) { - String tspSourceUrl = getConfigurationParameter("TSP_C_" + country + "_TSP_SOURCE"); - logger.debug("TSP Source by country " + country + ": " + tspSourceUrl); - return tspSourceUrl; + if (this.tspMap.containsKey(country)) { + String source = this.tspMap.get(country).get(ConfigurationParameter.TspCountrySource); + if (StringUtils.isNotBlank(source)) { + return source; + } + } + this.log.info("Source by country <{}> not found, using default TSP source", country); + return this.getTspSource(); } /** @@ -999,7 +1009,7 @@ public List getTrustedTerritories() { */ public boolean isTest() { boolean isTest = Mode.TEST.equals(this.mode); - logger.debug("Is test: " + isTest); + log.debug("Is test: " + isTest); return isTest; } @@ -1041,7 +1051,7 @@ protected ConfigurationRegistry getRegistry() { } private void initDefaultValues() { - logger.debug("------------------------ DEFAULTS ------------------------"); + log.debug("------------------------ DEFAULTS ------------------------"); this.tslManager = new TslManager(this); this.setConfigurationParameter(ConfigurationParameter.ConnectionTimeoutInMillis, String.valueOf(Constant.ONE_SECOND_IN_MILLISECONDS)); this.setConfigurationParameter(ConfigurationParameter.SocketTimeoutInMillis, String.valueOf(Constant.ONE_SECOND_IN_MILLISECONDS)); @@ -1069,12 +1079,12 @@ private void initDefaultValues() { this.trustedTerritories = Constant.Production.DEFAULT_TRUESTED_TERRITORIES; this.setJDigiDocParameter("SIGN_OCSP_REQUESTS", "false"); } - logger.debug("{} configuration: {}", this.mode, this.registry); + log.debug("{} configuration: {}", this.mode, this.registry); this.loadInitialConfigurationValues(); } private void loadInitialConfigurationValues() { - logger.debug("------------------------ LOADING INITIAL CONFIGURATION ------------------------"); + log.debug("------------------------ LOADING INITIAL CONFIGURATION ------------------------"); this.setJDigiDocConfigurationValue("DIGIDOC_SECURITY_PROVIDER", Constant.JDigiDoc.SECURITY_PROVIDER); this.setJDigiDocConfigurationValue("DIGIDOC_SECURITY_PROVIDER_NAME", Constant.JDigiDoc.SECURITY_PROVIDER_NAME); this.setJDigiDocConfigurationValue("KEY_USAGE_CHECK", Constant.JDigiDoc.KEY_USAGE_CHECK); @@ -1119,7 +1129,8 @@ private void loadInitialConfigurationValues() { this.setConfigurationParameter(ConfigurationParameter.SslKeystorePassword, this.getParameter(Constant.System.JAVAX_NET_SSL_KEY_STORE_PASSWORD, "SSL_KEYSTORE_PASSWORD")); this.setConfigurationParameter(ConfigurationParameter.SslTruststorePath, this.getParameter(Constant.System.JAVAX_NET_SSL_TRUST_STORE, "SSL_TRUSTSTORE_PATH")); this.setConfigurationParameter(ConfigurationParameter.SslTruststorePassword, this.getParameter(Constant.System.JAVAX_NET_SSL_TRUST_STORE_PASSWORD, "SSL_TRUSTSTORE_PASSWORD")); - this.updateTrustedTerritories(); + this.loadYamlTrustedTerritories(); + this.loadYamlTSPs(); } private Hashtable loadConfigurationSettings(InputStream stream) { @@ -1130,7 +1141,7 @@ private Hashtable loadConfigurationSettings(InputStream stream) } catch (Exception e) { ConfigurationException exception = new ConfigurationException("Configuration from " + configurationInputSourceName + " is not correctly formatted"); - logger.error(exception.getMessage()); + log.error(exception.getMessage()); throw exception; } IOUtils.closeQuietly(stream); @@ -1141,14 +1152,14 @@ private InputStream getResourceAsStream(String certFile) { InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(certFile); if (resourceAsStream == null) { String message = "File " + certFile + " not found in classpath."; - logger.error(message); + log.error(message); throw new ConfigurationException(message); } return resourceAsStream; } private String defaultIfNull(String configParameter, String defaultValue) { - logger.debug("Parameter: " + configParameter); + log.debug("Parameter: " + configParameter); if (configurationFromFile == null) return defaultValue; Object value = configurationFromFile.get(configParameter); if (value != null) { @@ -1201,7 +1212,7 @@ private boolean isValidIntegerParameter(String configParameter, String value) { } private void loadOCSPCertificates(LinkedHashMap digiDocCA, String caPrefix) { - logger.debug(""); + log.debug(""); String errorMessage; @SuppressWarnings("unchecked") ArrayList ocsps = (ArrayList) digiDocCA.get("OCSPS"); @@ -1231,6 +1242,38 @@ private void loadOCSPCertificates(LinkedHashMap digiDocCA, String caPrefix) { } } + private void loadYamlTSPs() { + List> tsps = (List>) this.configurationFromFile.get("TSPS"); + if (tsps == null) { + this.setConfigurationParameter(ConfigurationParameter.TspsCount, "0"); + return; + } + this.setConfigurationParameter(ConfigurationParameter.TspsCount, String.valueOf(tsps.size())); + List> entryPairs = Arrays.asList( + Pair.of("TSP_SOURCE", ConfigurationParameter.TspCountrySource), + Pair.of("TSP_KEYSTORE_PATH", ConfigurationParameter.TspCountryKeystorePath), + Pair.of("TSP_KEYSTORE_TYPE", ConfigurationParameter.TspCountryKeystoreType), + Pair.of("TSP_KEYSTORE_PASSWORD", ConfigurationParameter.TspCountryKeystorePassword) + ); + for (int i = 0; i < tsps.size(); i++) { + Map tsp = tsps.get(i); + Object country = tsp.get("TSP_C").toString(); + if (country != null) { + this.tspMap.put(country.toString(), new HashMap()); + for (Pair pair : entryPairs) { + Object entryValue = tsp.get(pair.getKey()); + if (entryValue != null) { + this.tspMap.get(country.toString()).put(pair.getValue(), entryValue.toString()); + } else { + this.logError(String.format("No value found for an entry <%s(%s)>", pair.getKey(), i + 1)); + } + } + } else { + this.logError(String.format("No value found for an entry ", i + 1)); + } + } + } + /** * Gives back all configuration parameters needed for jDigiDoc * @@ -1238,7 +1281,7 @@ private void loadOCSPCertificates(LinkedHashMap digiDocCA, String caPrefix) { */ private Hashtable mapToJDigiDocConfiguration() { - logger.debug("loading JDigiDoc configuration"); + log.debug("loading JDigiDoc configuration"); inputSourceParseErrors = new ArrayList<>(); loadInitialConfigurationValues(); reportFileParseErrors(); @@ -1246,7 +1289,7 @@ private Hashtable mapToJDigiDocConfiguration() { } private void loadCertificateAuthoritiesAndCertificates() { - logger.debug(""); + log.debug(""); @SuppressWarnings("unchecked") ArrayList digiDocCAs = (ArrayList) configurationFromFile.get("DIGIDOC_CAS"); if (digiDocCAs == null) { @@ -1271,12 +1314,12 @@ private void loadCertificateAuthoritiesAndCertificates() { } private void logError(String errorMessage) { - logger.error(errorMessage); + log.error(errorMessage); inputSourceParseErrors.add(errorMessage); } private void reportFileParseErrors() { - logger.debug(""); + log.debug(""); if (inputSourceParseErrors.size() > 0) { StringBuilder errorMessage = new StringBuilder(); errorMessage.append("Configuration from "); @@ -1289,7 +1332,7 @@ private void reportFileParseErrors() { } } - private void updateTrustedTerritories() { + private void loadYamlTrustedTerritories() { List territories = getStringListParameterFromFile("TRUSTED_TERRITORIES"); if (territories != null) { trustedTerritories = territories; @@ -1368,7 +1411,7 @@ private boolean getOCSPCertificates(String prefix, LinkedHashMap ocsp) { } private void loadCertificateAuthorityCerts(LinkedHashMap digiDocCA, String caPrefix) { - logger.debug("Loading CA certificates"); + log.debug("Loading CA certificates"); ArrayList certificateAuthorityCerts = this.getCACertsAsArray(digiDocCA); this.setJDigiDocParameter(String.format("%s_NAME", caPrefix), digiDocCA.get("NAME").toString()); this.setJDigiDocParameter(String.format("%s_TRADENAME", caPrefix), digiDocCA.get("TRADENAME").toString()); @@ -1386,10 +1429,10 @@ private ArrayList getCACertsAsArray(LinkedHashMap digiDocCa) { private void setConfigurationParameter(ConfigurationParameter parameter, String value) { if (StringUtils.isBlank(value)) { - logger.info("Parameter <{}> has blank value, hence will not be registered", parameter); + log.info("Parameter <{}> has blank value, hence will not be registered", parameter); return; } - logger.debug("Setting parameter <{}> to <{}>", parameter, value); + log.debug("Setting parameter <{}> to <{}>", parameter, value); this.registry.put(parameter, value); } @@ -1408,11 +1451,11 @@ private T getConfigurationParameter(ConfigurationParameter parameter, Class< private String getConfigurationParameter(ConfigurationParameter parameter) { if (!this.registry.containsKey(parameter)) { - logger.debug("Requested parameter <{}> not found", parameter); + log.debug("Requested parameter <{}> not found", parameter); return null; } String value = this.registry.get(parameter); - logger.debug("Requesting parameter <{}>. Returned value is <{}>", parameter, value); + log.debug("Requesting parameter <{}>. Returned value is <{}>", parameter, value); return value; } @@ -1438,16 +1481,16 @@ private String getParameter(String systemKey, String fileKey) { } private void setJDigiDocParameter(String key, String value) { - logger.debug("Setting JDigiDoc parameter <{}> to <{}>", key, value); + log.debug("Setting JDigiDoc parameter <{}> to <{}>", key, value); this.jDigiDocConfiguration.put(key, value); } private void log(Object jvmParam, Object fileParam, String sysParamKey, String fileKey) { if (jvmParam != null) { - logger.debug(String.format("JVM parameter <%s> detected and applied with value <%s>", sysParamKey, jvmParam)); + log.debug(String.format("JVM parameter <%s> detected and applied with value <%s>", sysParamKey, jvmParam)); } if (jvmParam == null && fileParam != null) { - logger.debug(String.format("YAML file parameter <%s> detected and applied with value <%s>", fileKey, fileParam)); + log.debug(String.format("YAML file parameter <%s> detected and applied with value <%s>", fileKey, fileParam)); } } diff --git a/src/main/java/org/digidoc4j/ConfigurationParameter.java b/src/main/java/org/digidoc4j/ConfigurationParameter.java index 9f69813f9..cca79c910 100644 --- a/src/main/java/org/digidoc4j/ConfigurationParameter.java +++ b/src/main/java/org/digidoc4j/ConfigurationParameter.java @@ -33,6 +33,11 @@ public enum ConfigurationParameter { SslKeystorePassword, SslTruststorePath, SslTruststorePassword, - SignOcspRequests + SignOcspRequests, + TspsCount, + TspCountrySource, + TspCountryKeystorePath, + TspCountryKeystoreType, + TspCountryKeystorePassword } diff --git a/src/main/java/org/digidoc4j/ConfigurationRegistry.java b/src/main/java/org/digidoc4j/ConfigurationRegistry.java index 6f4125ef7..fe2a2af50 100644 --- a/src/main/java/org/digidoc4j/ConfigurationRegistry.java +++ b/src/main/java/org/digidoc4j/ConfigurationRegistry.java @@ -31,6 +31,7 @@ public class ConfigurationRegistry extends HashMap signatures = container.getSignatures(); + Assert.assertTrue("Container invalid", container.validate().isValid()); + } + + @Test + public void signatureLTTSA(){ + OnlineTSPSource tspSource = new OnlineTSPSource("http://demo.sk.ee/tsa/"); + tspSource.setPolicyOid("0.4.0.2023.1.1"); + tspSource.setDataLoader(new TimestampDataLoader()); // content-type is different + byte[] digest = DSSUtils.digest(eu.europa.esig.dss.DigestAlgorithm.SHA512, "Hello world".getBytes()); + TimeStampToken timeStampResponse = tspSource.getTimeStampResponse(eu.europa.esig.dss.DigestAlgorithm.SHA512, digest); + Assert.assertNotNull(timeStampResponse); + } + @Test public void testGetSigningCertificateForBDoc() throws Exception { Container container = ContainerOpener.open("src/test/resources/testFiles/invalid-containers/asics_for_testing.bdoc"); diff --git a/src/test/java/org/digidoc4j/impl/DigiDoc4JTestHelper.java b/src/test/java/org/digidoc4j/impl/DigiDoc4JTestHelper.java index 3e68014c2..2773d7673 100644 --- a/src/test/java/org/digidoc4j/impl/DigiDoc4JTestHelper.java +++ b/src/test/java/org/digidoc4j/impl/DigiDoc4JTestHelper.java @@ -20,13 +20,53 @@ import java.nio.file.Paths; import java.security.Permission; +import org.apache.commons.lang.StringUtils; import org.digidoc4j.main.DigiDoc4J; import org.digidoc4j.main.DigiDoc4JUtilityException; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.internal.AssumptionViolatedException; +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class DigiDoc4JTestHelper extends ConfigurationSingeltonHolder { + @Rule + public TestWatcher watcher = new TestWatcher() { + + private final Logger log = LoggerFactory.getLogger(DigiDoc4JTestHelper.class); + + @Override + protected void starting(Description description) { + String starting = String.format("Starting --> %s.%s", description.getClassName(), description.getMethodName()); + this.log.info(StringUtils.rightPad("-", starting.length(), '-')); + this.log.info(starting); + this.log.info(StringUtils.rightPad("-", starting.length(), '-')); + } + + @Override + protected void succeeded(Description description) { + this.log.info("Finished --> {}.{}", description.getClassName(), description.getMethodName()); + } + + @Override + protected void failed(Throwable e, Description description) { + this.log.error(String.format("Finished --> %s.%s", description.getClassName(), description.getMethodName()), e); + } + + @Override + protected void skipped(AssumptionViolatedException e, Description description) { + String skipped = String.format("Skipped --> %s.%s", description.getClassName(), description.getMethodName()); + this.log.debug(StringUtils.rightPad("-", skipped.length(), '-')); + this.log.debug(skipped); + this.log.debug(StringUtils.rightPad("-", skipped.length(), '-')); + } + + }; + @BeforeClass public static void setConfigurationToTest() { ConfigurationSingeltonHolder.reset(); diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml index 92fd5cc8b..bcbd30460 100644 --- a/src/test/resources/logback-test.xml +++ b/src/test/resources/logback-test.xml @@ -1,7 +1,7 @@ - + System.out %d{dd.MM.yyyy HH:mm:ss.SSS} %-5p [%thread] [%logger{36}.%method:%line] - %m%n @@ -11,6 +11,14 @@ + + target/test.log + false + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + + @@ -18,6 +26,7 @@ - + + \ No newline at end of file diff --git a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml b/src/test/resources/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml similarity index 100% rename from testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml rename to src/test/resources/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml diff --git a/test/TmpTSP.java b/test/TmpTSP.java deleted file mode 100644 index e41f671cc..000000000 --- a/test/TmpTSP.java +++ /dev/null @@ -1,86 +0,0 @@ -import java.io.FileInputStream; -import java.security.KeyStore; -import java.security.cert.X509Certificate; -import java.util.List; - -import org.bouncycastle.tsp.TimeStampToken; -import org.digidoc4j.Configuration; -import org.digidoc4j.Container; -import org.digidoc4j.ContainerBuilder; -import org.digidoc4j.DigestAlgorithm; -import org.digidoc4j.Signature; -import org.digidoc4j.SignatureBuilder; -import org.digidoc4j.X509Cert; -import org.digidoc4j.exceptions.DigiDoc4JException; -import org.digidoc4j.signers.PKCS12SignatureToken; -import org.junit.Assert; -import org.junit.Test; - -import eu.europa.esig.dss.DSSUtils; -import eu.europa.esig.dss.client.http.commons.TimestampDataLoader; -import eu.europa.esig.dss.client.tsp.OnlineTSPSource; - -/** - * Created by Andrei on 11.09.2017. - */ -public class TmpTSP { - - @Test - public void conf(){ - Configuration configuration = new Configuration(); - configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); - configuration.getTsps(); - } - - @Test - public void signature(){ - Configuration configuration = new Configuration(Configuration.Mode.TEST); - configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); - configuration.getTsps(); - - Container container = ContainerBuilder - .aContainer() - .withConfiguration(configuration) - .build(); - - container.addDataFile("testFiles/helper-files/test.txt", "text/plain"); - - X509Certificate signerCert = getSignerCert(); - - Signature signature = SignatureBuilder. - aSignature(container). - withSignatureDigestAlgorithm(DigestAlgorithm.SHA512). - withSignatureToken(new PKCS12SignatureToken("testFiles/p12/signout.p12", "test".toCharArray())). - //withSigningCertificate(signerCert). - invokeSigning(); - - X509Cert cert = signature.getSigningCertificate(); - String subjectName = cert.getSubjectName(X509Cert.SubjectName.C); - - container.addSignature(signature); - Assert.assertTrue(container.validate().isValid()); - } - - private static X509Certificate getSignerCert() { - try { - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - try (FileInputStream stream = new FileInputStream("testFiles/p12/signout.p12")) { - keyStore.load(stream, "test".toCharArray()); - } - return (X509Certificate) keyStore.getCertificate("1"); - } catch (Exception e) { - throw new DigiDoc4JException("Loading signer cert failed"); - } - } - - @Test - public void signatureLTTSA(){ - OnlineTSPSource tspSource = new OnlineTSPSource("http://demo.sk.ee/tsa/"); - tspSource.setPolicyOid("0.4.0.2023.1.1"); - tspSource.setDataLoader(new TimestampDataLoader()); // content-type is different - - byte[] digest = DSSUtils.digest(eu.europa.esig.dss.DigestAlgorithm.SHA512, "Hello world".getBytes()); - TimeStampToken timeStampResponse = tspSource.getTimeStampResponse(eu.europa.esig.dss.DigestAlgorithm.SHA512, digest); - Assert.assertNotNull(timeStampResponse); - } -} From 2888d23c5bebaaa112febc845c485b87a42fdd8d Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Fri, 15 Sep 2017 13:31:27 +0300 Subject: [PATCH 09/15] dd4j-40: first version of loading tsps from yaml file Signed-off-by: Andrei Smirnov --- test/TmpTSP.java | 71 +++++++ .../digidoc_test_conf_tsp_source.yaml | 182 ++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 test/TmpTSP.java create mode 100644 testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml diff --git a/test/TmpTSP.java b/test/TmpTSP.java new file mode 100644 index 000000000..cfb68b429 --- /dev/null +++ b/test/TmpTSP.java @@ -0,0 +1,71 @@ +import java.io.FileInputStream; +import java.security.KeyStore; +import java.security.cert.X509Certificate; + +import org.digidoc4j.Configuration; +import org.digidoc4j.Container; +import org.digidoc4j.ContainerBuilder; +import org.digidoc4j.DigestAlgorithm; +import org.digidoc4j.Signature; +import org.digidoc4j.SignatureBuilder; +import org.digidoc4j.X509Cert; +import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.signers.PKCS12SignatureToken; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by Andrei on 11.09.2017. + */ +public class TmpTSP { + + @Test + public void conf(){ + Configuration configuration = new Configuration(); + configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); + configuration.getTsps(); + } + + @Test + public void signature(){ + Configuration configuration = new Configuration(Configuration.Mode.TEST); + configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); + configuration.getTsps(); + + Container container = ContainerBuilder + .aContainer() + .withConfiguration(configuration) + .build(); + + container.addDataFile("testFiles/helper-files/test.txt", "text/plain"); + + X509Certificate signerCert = getSignerCert(); + + Signature signature = SignatureBuilder. + aSignature(container). + withSignatureDigestAlgorithm(DigestAlgorithm.SHA512). + withSignatureToken(new PKCS12SignatureToken("testFiles/p12/signout.p12", "test".toCharArray())). + //withSigningCertificate(signerCert). + invokeSigning(); + + X509Cert cert = signature.getSigningCertificate(); + String subjectName = cert.getSubjectName(X509Cert.SubjectName.C); + if(configuration.getTspC().contains(subjectName)){ + + } + container.addSignature(signature); + Assert.assertTrue(container.validate().isValid()); + } + + private static X509Certificate getSignerCert() { + try { + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + try (FileInputStream stream = new FileInputStream("testFiles/p12/signout.p12")) { + keyStore.load(stream, "test".toCharArray()); + } + return (X509Certificate) keyStore.getCertificate("1"); + } catch (Exception e) { + throw new DigiDoc4JException("Loading signer cert failed"); + } + } +} diff --git a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml new file mode 100644 index 000000000..34546be17 --- /dev/null +++ b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml @@ -0,0 +1,182 @@ +TSP_SOURCE: http://demo.sk.ee/tsa +TSPS: + - TSP: + TSP_C: EE + TSP_SOURCE: http://demo.sk.ee/tsa + TSP_KEYSTORE_PATH: tspkeystorepath + TSP_KEYSTORE_TYPE: tspkeystoretype + TSP_KEYSTORE_PASSWORD: tspkeystorepassword + - TSP: + TSP_C: LV + TSP_SOURCE: http://demo.sk.ee/tsa + TSP_KEYSTORE_PATH: tspkeystorepath + TSP_KEYSTORE_TYPE: tspkeystoretype + TSP_KEYSTORE_PASSWORD: tspkeystorepassword + - TSP: + TSP_C: LT + TSP_SOURCE: http://demo.sk.ee/tsa + TSP_KEYSTORE_PATH: tspkeystorepath + TSP_KEYSTORE_TYPE: tspkeystoretype + TSP_KEYSTORE_PASSWORD: tspkeystorepassword + +DIGIDOC_CAS: +- DIGIDOC_CA: + NAME: AS Sertifitseerimiskeskus + TRADENAME: SK + CERTS: + - jar://certs/EID-SK.crt + - jar://certs/ESTEID-SK.crt + - jar://certs/ESTEID-SK 2007.crt + - jar://certs/EID-SK 2007.crt + - jar://certs/JUUR-SK.crt + - jar://certs/KLASS3-SK.crt + - jar://certs/EECCRCA.crt + - jar://certs/ESTEID-SK 2011.crt + - jar://certs/ESTEID-SK 2015.crt + - jar://certs/EID-SK 2011.crt + - jar://certs/KLASS3-SK 2010.crt + - jar://certs/KLASS3-SK 2010 EECCRCA.crt + - jar://certs/TEST-SK.crt + - jar://certs/TEST EECCRCA.crt + - jar://certs/TEST ESTEID-SK 2011.crt + - jar://certs/TEST ESTEID-SK 2015.crt + - jar://certs/TEST EID-SK 2011.crt + - jar://certs/TEST KLASS3 2010.crt + - jar://certs/TEST Juur-SK.crt + + OCSPS: + - OCSP: + CA_CN: ESTEID-SK + CA_CERT: jar://certs/ESTEID-SK 2007.crt + CN: ESTEID-SK 2007 OCSP RESPONDER + CERTS: + - jar://certs/ESTEID-SK 2007 OCSP.crt + URL: http://ocsp.sk.ee + - OCSP: + CA_CN: KLASS3-SK + CA_CERT: jar://certs/KLASS3-SK.crt + CN: KLASS3-SK OCSP RESPONDER + CERTS: + - jar://certs/KLASS3-SK OCSP.crt + - jar://certs/KLASS3-SK OCSP 2006.crt + URL: http://ocsp.sk.ee + - OCSP: + CA_CN: EID-SK + CA_CERT: jar://certs/EID-SK 2007.crt + CN: EID-SK 2007 OCSP RESPONDER + CERTS: + - jar://certs/EID-SK 2007 OCSP.crt + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK 2007 OCSP.crt + CN: EID-SK OCSP RESPONDER 2007 + CA_CERT: jar://certs/EID-SK 2007.crt + CA_CN: EID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CN: ESTEID-SK 2007 OCSP RESPONDER + CERTS: + - jar://certs/ESTEID-SK 2007 OCSP.crt + CA_CERT: jar://certs/ESTEID-SK 2007.crt + CA_CN: ESTEID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CN: ESTEID-SK 2007 OCSP RESPONDER 2010 + CERTS: + - jar://certs/ESTEID-SK 2007 OCSP 2010.crt + CA_CERT: jar://certs/ESTEID-SK 2007.crt + CA_CN: ESTEID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK 2007 OCSP 2010.crt + CN: EID-SK 2007 OCSP RESPONDER 2010 + CA_CERT: jar://certs/EID-SK 2007.crt + CA_CN: EID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK 2007 OCSP.crt + CN: EID-SK 2007 OCSP RESPONDER + CA_CERT: jar://certs/EID-SK 2007.crt + CA_CN: EID-SK 2007 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/ESTEID-SK OCSP 2005.crt + CN: ESTEID-SK OCSP RESPONDER 2005 + CA_CERT: jar://certs/ESTEID-SK.crt + CA_CN: ESTEID-SK + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/SK OCSP 2011.crt + CN: SK OCSP RESPONDER 2011 + CA_CERT: jar://certs/EECCRCA.crt + CA_CN: EE Certification Centre Root CA + URL: http://ocsp.sk.ee + - OCSP: + CA_CN: KLASS3-SK + CA_CERT: jar://certs/KLASS3-SK.crt + CN: KLASS3-SK OCSP RESPONDER 2009 + CERTS: + - jar://certs/KLASS3-SK OCSP 2009.crt + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/ESTEID-SK OCSP.crt + CN: ESTEID-SK OCSP RESPONDER + CA_CERT: jar://certs/ESTEID-SK.crt + CA_CN: ESTEID-SK + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/EID-SK OCSP.crt + - jar://certs/EID-SK OCSP 2006.crt + CN: EID-SK OCSP RESPONDER + CA_CERT: jar://certs/EID-SK.crt + CA_CN: EID-SK + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/KLASS3-SK 2010 OCSP.crt + CN: KLASS3-SK 2010 OCSP RESPONDER + CA_CERT: jar://certs/KLASS3-SK 2010.crt + CA_CN: KLASS3-SK 2010 + URL: http://ocsp.sk.ee + - OCSP: + CERTS: + - jar://certs/TEST-SK OCSP 2005.crt + CN: TEST-SK OCSP RESPONDER 2005 + CA_CERT: jar://certs/TEST-SK.crt + CA_CN: TEST-SK + URL: http://demo.sk.ee/ocsp + - OCSP: + CERTS: + - jar://certs/TEST SK OCSP 2011.crt + CN: TEST of SK OCSP RESPONDER 2011 + CA_CERT: jar://certs/TEST EECCRCA.crt + CA_CN: TEST of EE Certification Centre Root CA + URL: http://demo.sk.ee/ocsp + - OCSP: + CA_CN: TEST of ESTEID-SK 2011 + CA_CERT: jar://certs/TEST ESTEID-SK 2011.crt + CN: TEST of SK OCSP RESPONDER 2011 + CERTS: + - jar://certs/TEST SK OCSP 2011.crt + URL: http://demo.sk.ee/ocsp + - OCSP: + CERTS: + - jar://certs/TEST SK OCSP 2011.crt + CN: TEST of SK OCSP RESPONDER 2011 + CA_CERT: jar://certs/KLASS3-SK 2010.crt + CA_CN: KLASS3-SK 2010 + URL: http://demo.sk.ee/ocsp + - OCSP: + CERTS: + - jar://certs/SK_proxy_OCSP_responder_2009.pem.cer + CA_CN: KLASS3-SK + CA_CERT: jar://certs/KLASS3-SK.crt + CN: SK Proxy OCSP Responder 2009 + URL: http://ocsp.sk.ee \ No newline at end of file From 407b02e242e4fe666e331cf4c7549b1bb01d16cb Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Mon, 9 Oct 2017 11:44:21 +0300 Subject: [PATCH 10/15] dd4j-40: Using Baltic timestamp service fix --- test/TmpTSP.java | 19 +++++++++++++++++-- .../digidoc_test_conf_tsp_source.yaml | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/test/TmpTSP.java b/test/TmpTSP.java index cfb68b429..e41f671cc 100644 --- a/test/TmpTSP.java +++ b/test/TmpTSP.java @@ -1,7 +1,9 @@ import java.io.FileInputStream; import java.security.KeyStore; import java.security.cert.X509Certificate; +import java.util.List; +import org.bouncycastle.tsp.TimeStampToken; import org.digidoc4j.Configuration; import org.digidoc4j.Container; import org.digidoc4j.ContainerBuilder; @@ -14,6 +16,10 @@ import org.junit.Assert; import org.junit.Test; +import eu.europa.esig.dss.DSSUtils; +import eu.europa.esig.dss.client.http.commons.TimestampDataLoader; +import eu.europa.esig.dss.client.tsp.OnlineTSPSource; + /** * Created by Andrei on 11.09.2017. */ @@ -50,9 +56,7 @@ public void signature(){ X509Cert cert = signature.getSigningCertificate(); String subjectName = cert.getSubjectName(X509Cert.SubjectName.C); - if(configuration.getTspC().contains(subjectName)){ - } container.addSignature(signature); Assert.assertTrue(container.validate().isValid()); } @@ -68,4 +72,15 @@ private static X509Certificate getSignerCert() { throw new DigiDoc4JException("Loading signer cert failed"); } } + + @Test + public void signatureLTTSA(){ + OnlineTSPSource tspSource = new OnlineTSPSource("http://demo.sk.ee/tsa/"); + tspSource.setPolicyOid("0.4.0.2023.1.1"); + tspSource.setDataLoader(new TimestampDataLoader()); // content-type is different + + byte[] digest = DSSUtils.digest(eu.europa.esig.dss.DigestAlgorithm.SHA512, "Hello world".getBytes()); + TimeStampToken timeStampResponse = tspSource.getTimeStampResponse(eu.europa.esig.dss.DigestAlgorithm.SHA512, digest); + Assert.assertNotNull(timeStampResponse); + } } diff --git a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml index 34546be17..0877be1a8 100644 --- a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml +++ b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml @@ -14,7 +14,7 @@ TSPS: TSP_KEYSTORE_PASSWORD: tspkeystorepassword - TSP: TSP_C: LT - TSP_SOURCE: http://demo.sk.ee/tsa + TSP_SOURCE: https://tsa.balstamp.lt TSP_KEYSTORE_PATH: tspkeystorepath TSP_KEYSTORE_TYPE: tspkeystoretype TSP_KEYSTORE_PASSWORD: tspkeystorepassword From 49dab8f6d15d2fe37fcd328fdab7d33d9a975c0e Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Mon, 29 Jan 2018 10:05:20 +0200 Subject: [PATCH 11/15] Cleanup Signed-off-by: Indrek Jentson --- test/TmpTSP.java | 86 --------- .../digidoc_test_conf_tsp_source.yaml | 182 ------------------ 2 files changed, 268 deletions(-) delete mode 100644 test/TmpTSP.java delete mode 100644 testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml diff --git a/test/TmpTSP.java b/test/TmpTSP.java deleted file mode 100644 index e41f671cc..000000000 --- a/test/TmpTSP.java +++ /dev/null @@ -1,86 +0,0 @@ -import java.io.FileInputStream; -import java.security.KeyStore; -import java.security.cert.X509Certificate; -import java.util.List; - -import org.bouncycastle.tsp.TimeStampToken; -import org.digidoc4j.Configuration; -import org.digidoc4j.Container; -import org.digidoc4j.ContainerBuilder; -import org.digidoc4j.DigestAlgorithm; -import org.digidoc4j.Signature; -import org.digidoc4j.SignatureBuilder; -import org.digidoc4j.X509Cert; -import org.digidoc4j.exceptions.DigiDoc4JException; -import org.digidoc4j.signers.PKCS12SignatureToken; -import org.junit.Assert; -import org.junit.Test; - -import eu.europa.esig.dss.DSSUtils; -import eu.europa.esig.dss.client.http.commons.TimestampDataLoader; -import eu.europa.esig.dss.client.tsp.OnlineTSPSource; - -/** - * Created by Andrei on 11.09.2017. - */ -public class TmpTSP { - - @Test - public void conf(){ - Configuration configuration = new Configuration(); - configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); - configuration.getTsps(); - } - - @Test - public void signature(){ - Configuration configuration = new Configuration(Configuration.Mode.TEST); - configuration.loadConfiguration("testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml"); - configuration.getTsps(); - - Container container = ContainerBuilder - .aContainer() - .withConfiguration(configuration) - .build(); - - container.addDataFile("testFiles/helper-files/test.txt", "text/plain"); - - X509Certificate signerCert = getSignerCert(); - - Signature signature = SignatureBuilder. - aSignature(container). - withSignatureDigestAlgorithm(DigestAlgorithm.SHA512). - withSignatureToken(new PKCS12SignatureToken("testFiles/p12/signout.p12", "test".toCharArray())). - //withSigningCertificate(signerCert). - invokeSigning(); - - X509Cert cert = signature.getSigningCertificate(); - String subjectName = cert.getSubjectName(X509Cert.SubjectName.C); - - container.addSignature(signature); - Assert.assertTrue(container.validate().isValid()); - } - - private static X509Certificate getSignerCert() { - try { - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - try (FileInputStream stream = new FileInputStream("testFiles/p12/signout.p12")) { - keyStore.load(stream, "test".toCharArray()); - } - return (X509Certificate) keyStore.getCertificate("1"); - } catch (Exception e) { - throw new DigiDoc4JException("Loading signer cert failed"); - } - } - - @Test - public void signatureLTTSA(){ - OnlineTSPSource tspSource = new OnlineTSPSource("http://demo.sk.ee/tsa/"); - tspSource.setPolicyOid("0.4.0.2023.1.1"); - tspSource.setDataLoader(new TimestampDataLoader()); // content-type is different - - byte[] digest = DSSUtils.digest(eu.europa.esig.dss.DigestAlgorithm.SHA512, "Hello world".getBytes()); - TimeStampToken timeStampResponse = tspSource.getTimeStampResponse(eu.europa.esig.dss.DigestAlgorithm.SHA512, digest); - Assert.assertNotNull(timeStampResponse); - } -} diff --git a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml b/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml deleted file mode 100644 index 0877be1a8..000000000 --- a/testFiles/yaml-configurations/digidoc_test_conf_tsp_source.yaml +++ /dev/null @@ -1,182 +0,0 @@ -TSP_SOURCE: http://demo.sk.ee/tsa -TSPS: - - TSP: - TSP_C: EE - TSP_SOURCE: http://demo.sk.ee/tsa - TSP_KEYSTORE_PATH: tspkeystorepath - TSP_KEYSTORE_TYPE: tspkeystoretype - TSP_KEYSTORE_PASSWORD: tspkeystorepassword - - TSP: - TSP_C: LV - TSP_SOURCE: http://demo.sk.ee/tsa - TSP_KEYSTORE_PATH: tspkeystorepath - TSP_KEYSTORE_TYPE: tspkeystoretype - TSP_KEYSTORE_PASSWORD: tspkeystorepassword - - TSP: - TSP_C: LT - TSP_SOURCE: https://tsa.balstamp.lt - TSP_KEYSTORE_PATH: tspkeystorepath - TSP_KEYSTORE_TYPE: tspkeystoretype - TSP_KEYSTORE_PASSWORD: tspkeystorepassword - -DIGIDOC_CAS: -- DIGIDOC_CA: - NAME: AS Sertifitseerimiskeskus - TRADENAME: SK - CERTS: - - jar://certs/EID-SK.crt - - jar://certs/ESTEID-SK.crt - - jar://certs/ESTEID-SK 2007.crt - - jar://certs/EID-SK 2007.crt - - jar://certs/JUUR-SK.crt - - jar://certs/KLASS3-SK.crt - - jar://certs/EECCRCA.crt - - jar://certs/ESTEID-SK 2011.crt - - jar://certs/ESTEID-SK 2015.crt - - jar://certs/EID-SK 2011.crt - - jar://certs/KLASS3-SK 2010.crt - - jar://certs/KLASS3-SK 2010 EECCRCA.crt - - jar://certs/TEST-SK.crt - - jar://certs/TEST EECCRCA.crt - - jar://certs/TEST ESTEID-SK 2011.crt - - jar://certs/TEST ESTEID-SK 2015.crt - - jar://certs/TEST EID-SK 2011.crt - - jar://certs/TEST KLASS3 2010.crt - - jar://certs/TEST Juur-SK.crt - - OCSPS: - - OCSP: - CA_CN: ESTEID-SK - CA_CERT: jar://certs/ESTEID-SK 2007.crt - CN: ESTEID-SK 2007 OCSP RESPONDER - CERTS: - - jar://certs/ESTEID-SK 2007 OCSP.crt - URL: http://ocsp.sk.ee - - OCSP: - CA_CN: KLASS3-SK - CA_CERT: jar://certs/KLASS3-SK.crt - CN: KLASS3-SK OCSP RESPONDER - CERTS: - - jar://certs/KLASS3-SK OCSP.crt - - jar://certs/KLASS3-SK OCSP 2006.crt - URL: http://ocsp.sk.ee - - OCSP: - CA_CN: EID-SK - CA_CERT: jar://certs/EID-SK 2007.crt - CN: EID-SK 2007 OCSP RESPONDER - CERTS: - - jar://certs/EID-SK 2007 OCSP.crt - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/EID-SK 2007 OCSP.crt - CN: EID-SK OCSP RESPONDER 2007 - CA_CERT: jar://certs/EID-SK 2007.crt - CA_CN: EID-SK 2007 - URL: http://ocsp.sk.ee - - OCSP: - CN: ESTEID-SK 2007 OCSP RESPONDER - CERTS: - - jar://certs/ESTEID-SK 2007 OCSP.crt - CA_CERT: jar://certs/ESTEID-SK 2007.crt - CA_CN: ESTEID-SK 2007 - URL: http://ocsp.sk.ee - - OCSP: - CN: ESTEID-SK 2007 OCSP RESPONDER 2010 - CERTS: - - jar://certs/ESTEID-SK 2007 OCSP 2010.crt - CA_CERT: jar://certs/ESTEID-SK 2007.crt - CA_CN: ESTEID-SK 2007 - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/EID-SK 2007 OCSP 2010.crt - CN: EID-SK 2007 OCSP RESPONDER 2010 - CA_CERT: jar://certs/EID-SK 2007.crt - CA_CN: EID-SK 2007 - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/EID-SK 2007 OCSP.crt - CN: EID-SK 2007 OCSP RESPONDER - CA_CERT: jar://certs/EID-SK 2007.crt - CA_CN: EID-SK 2007 - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/ESTEID-SK OCSP 2005.crt - CN: ESTEID-SK OCSP RESPONDER 2005 - CA_CERT: jar://certs/ESTEID-SK.crt - CA_CN: ESTEID-SK - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/SK OCSP 2011.crt - CN: SK OCSP RESPONDER 2011 - CA_CERT: jar://certs/EECCRCA.crt - CA_CN: EE Certification Centre Root CA - URL: http://ocsp.sk.ee - - OCSP: - CA_CN: KLASS3-SK - CA_CERT: jar://certs/KLASS3-SK.crt - CN: KLASS3-SK OCSP RESPONDER 2009 - CERTS: - - jar://certs/KLASS3-SK OCSP 2009.crt - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/ESTEID-SK OCSP.crt - CN: ESTEID-SK OCSP RESPONDER - CA_CERT: jar://certs/ESTEID-SK.crt - CA_CN: ESTEID-SK - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/EID-SK OCSP.crt - - jar://certs/EID-SK OCSP 2006.crt - CN: EID-SK OCSP RESPONDER - CA_CERT: jar://certs/EID-SK.crt - CA_CN: EID-SK - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/KLASS3-SK 2010 OCSP.crt - CN: KLASS3-SK 2010 OCSP RESPONDER - CA_CERT: jar://certs/KLASS3-SK 2010.crt - CA_CN: KLASS3-SK 2010 - URL: http://ocsp.sk.ee - - OCSP: - CERTS: - - jar://certs/TEST-SK OCSP 2005.crt - CN: TEST-SK OCSP RESPONDER 2005 - CA_CERT: jar://certs/TEST-SK.crt - CA_CN: TEST-SK - URL: http://demo.sk.ee/ocsp - - OCSP: - CERTS: - - jar://certs/TEST SK OCSP 2011.crt - CN: TEST of SK OCSP RESPONDER 2011 - CA_CERT: jar://certs/TEST EECCRCA.crt - CA_CN: TEST of EE Certification Centre Root CA - URL: http://demo.sk.ee/ocsp - - OCSP: - CA_CN: TEST of ESTEID-SK 2011 - CA_CERT: jar://certs/TEST ESTEID-SK 2011.crt - CN: TEST of SK OCSP RESPONDER 2011 - CERTS: - - jar://certs/TEST SK OCSP 2011.crt - URL: http://demo.sk.ee/ocsp - - OCSP: - CERTS: - - jar://certs/TEST SK OCSP 2011.crt - CN: TEST of SK OCSP RESPONDER 2011 - CA_CERT: jar://certs/KLASS3-SK 2010.crt - CA_CN: KLASS3-SK 2010 - URL: http://demo.sk.ee/ocsp - - OCSP: - CERTS: - - jar://certs/SK_proxy_OCSP_responder_2009.pem.cer - CA_CN: KLASS3-SK - CA_CERT: jar://certs/KLASS3-SK.crt - CN: SK Proxy OCSP Responder 2009 - URL: http://ocsp.sk.ee \ No newline at end of file From f84acc022cd0f63a2e195a6e27805846df4b7e9e Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Wed, 31 Jan 2018 12:25:48 +0200 Subject: [PATCH 12/15] Addition to testContainerExtensionFromLTtoLTA Signed-off-by: Indrek Jentson --- pom.xml | 2 +- .../digidoc4j/impl/bdoc/ExtendingBDocContainerTest.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index a26d2b5a6..7838e5e8e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.digidoc4j digidoc4j jar - 2.0.0.RC.1 + 2.0.0.RC.2 DigiDoc4j DigiDoc4j is a Java library for digitally signing documents and creating digital signature containers of signed documents diff --git a/src/test/java/org/digidoc4j/impl/bdoc/ExtendingBDocContainerTest.java b/src/test/java/org/digidoc4j/impl/bdoc/ExtendingBDocContainerTest.java index e8f415ae3..5d46f4c7c 100644 --- a/src/test/java/org/digidoc4j/impl/bdoc/ExtendingBDocContainerTest.java +++ b/src/test/java/org/digidoc4j/impl/bdoc/ExtendingBDocContainerTest.java @@ -225,10 +225,13 @@ public void extendToWithMultipleSignaturesAndMultipleFiles() throws Exception { public void testContainerExtensionFromLTtoLTA() throws Exception { Container container = createContainerWithFile("src/test/resources/testFiles/helper-files/test.txt", "text/plain"); signContainer(container, LT); - container.extendSignatureProfile(LTA); assertNotNull(container.getSignatures().get(0).getOCSPCertificate()); - assertTrue(container.validate().isValid()); + boolean isValid = container.validate().isValid(); + if (!isValid) { + container.saveAsFile("src/test/resources/testFiles/invalid-containers/extLT2LTAError.bdoc"); + } + assertTrue(isValid); } @Test(expected = NotSupportedException.class) From 6721a62e01b9e735580c28eb42c27f9ed8de8a77 Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Wed, 31 Jan 2018 19:26:14 +0200 Subject: [PATCH 13/15] Some refactoring of Signature classes and utilities Signed-off-by: Indrek Jentson --- .../digidoc4j/impl/asic/AsicContainer.java | 51 +++--- .../impl/asic/AsicContainerCreator.java | 6 +- .../impl/asic/AsicSignatureBuilder.java | 35 ++-- ....java => AsicValidationReportBuilder.java} | 10 +- ...nResult.java => AsicValidationResult.java} | 8 +- .../impl/asic/TimeStampValidationResult.java | 3 +- .../impl/asic/asice/AsicEContainer.java | 69 +++++++- .../asic/asice/AsicEContainerValidator.java | 149 ++++++++++++++++++ .../asic/asice/AsicESignatureBuilder.java | 2 + .../impl/asic/asice/AsicESignatureOpener.java | 77 +++++++++ .../impl/asic/asice/bdoc/BDocContainer.java | 28 +++- .../asice/bdoc/BDocContainerValidator.java | 12 +- .../asic/asice/bdoc/BDocSignatureBuilder.java | 3 +- .../impl/asic/asics/AsicSContainer.java | 31 +++- .../impl/asic/manifest/ManifestValidator.java | 31 ++-- .../impl/asic/xades/SignatureExtender.java | 9 +- .../impl/asic/xades/XadesSignatureParser.java | 14 +- .../validation/SignatureValidationTask.java | 10 +- .../org/digidoc4j/SignatureBuilderTest.java | 4 +- .../impl/bdoc/BDocContainerTest.java | 7 +- .../impl/bdoc/SignatureTimeTest.java | 9 +- .../org/digidoc4j/main/DigiDoc4JTest.java | 18 +++ 22 files changed, 481 insertions(+), 105 deletions(-) rename src/main/java/org/digidoc4j/impl/asic/{asice/bdoc/BDocValidationReportBuilder.java => AsicValidationReportBuilder.java} (95%) rename src/main/java/org/digidoc4j/impl/asic/{asice/bdoc/BDocValidationResult.java => AsicValidationResult.java} (95%) create mode 100644 src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainerValidator.java create mode 100644 src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java b/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java index 59197f583..c67814fd6 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicContainer.java @@ -32,10 +32,10 @@ import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.exceptions.RemovingDataFileException; import org.digidoc4j.exceptions.TechnicalException; +import org.digidoc4j.impl.asic.asice.AsicEContainerValidator; import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocContainerValidator; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; -import org.digidoc4j.impl.asic.asice.bdoc.BDocSignatureOpener; import org.digidoc4j.impl.asic.asics.AsicSSignature; import org.digidoc4j.impl.asic.manifest.AsicManifest; import org.digidoc4j.impl.asic.xades.SignatureExtender; @@ -84,9 +84,11 @@ public AsicContainer(Configuration configuration) { * ASicContainer constructor * * @param containerPath + * @param containerType */ - public AsicContainer(String containerPath){ - configuration = Configuration.getInstance(); + public AsicContainer(String containerPath, String containerType){ + this.configuration = Configuration.getInstance(); + this.containerType = containerType; openContainer(containerPath); } @@ -95,9 +97,11 @@ public AsicContainer(String containerPath){ * * @param containerPath * @param configuration + * @param containerType */ - public AsicContainer(String containerPath, Configuration configuration){ + public AsicContainer(String containerPath, Configuration configuration, String containerType){ this.configuration = configuration; + this.containerType = containerType; openContainer(containerPath); } @@ -105,9 +109,11 @@ public AsicContainer(String containerPath, Configuration configuration){ * ASicContainer constructor * * @param stream + * @param containerType */ - public AsicContainer(InputStream stream){ + public AsicContainer(InputStream stream, String containerType){ configuration = Configuration.getInstance(); + this.containerType = containerType; openContainer(stream); } @@ -116,9 +122,11 @@ public AsicContainer(InputStream stream){ * * @param stream * @param configuration + * @param containerType */ - public AsicContainer(InputStream stream, Configuration configuration){ + public AsicContainer(InputStream stream, Configuration configuration, String containerType){ this.configuration = configuration; + this.containerType = containerType; openContainer(stream); } @@ -135,11 +143,21 @@ protected ValidationResult validateContainer() { return validateTimestampToken(); } else{ if (!isNewContainer()){ - BDocContainerValidator validator = new BDocContainerValidator(containerParseResult, getConfiguration()); - validator.setValidateManifest(!dataFilesHaveChanged); - return validator.validate(getSignatures()); - } else{ - return new BDocContainerValidator(getConfiguration()).validate(getSignatures()); + if (containerType.equals(DocumentType.BDOC.toString())) { + BDocContainerValidator validator = new BDocContainerValidator(containerParseResult, getConfiguration()); + validator.setValidateManifest(!dataFilesHaveChanged); + return validator.validate(getSignatures()); + } else { + AsicEContainerValidator validator = new AsicEContainerValidator(containerParseResult, getConfiguration()); + validator.setValidateManifest(!dataFilesHaveChanged); + return validator.validate(getSignatures()); + } + } else { + if (containerType.equals(DocumentType.BDOC.toString())) { + return new BDocContainerValidator(getConfiguration()).validate(getSignatures()); + } else { + return new AsicEContainerValidator(getConfiguration()).validate(getSignatures()); + } } } } @@ -170,16 +188,7 @@ public Configuration getConfiguration() { return configuration; } - 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; - } + protected abstract List parseSignatureFiles(List signatureFiles, List detachedContents); @Override public InputStream saveAsStream() { diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicContainerCreator.java b/src/main/java/org/digidoc4j/impl/asic/AsicContainerCreator.java index b1abaa69f..1cc01ab5b 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicContainerCreator.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicContainerCreator.java @@ -89,10 +89,10 @@ public InputStream fetchInputStreamOfFinalizedContainer() { public void writeAsiceMimeType(String containerType) { logger.debug("Writing asic mime type to asic zip file"); String mimeTypeString; - if (Constant.BDOC_CONTAINER_TYPE.equals(containerType)){ - mimeTypeString = MimeType.ASICE.getMimeTypeString(); - } else{ + if (Constant.ASICS_CONTAINER_TYPE.equals(containerType)){ mimeTypeString = MimeType.ASICS.getMimeTypeString(); + } else { + mimeTypeString = MimeType.ASICE.getMimeTypeString(); } byte[] mimeTypeBytes = mimeTypeString.getBytes(CHARSET); new BytesEntryCallback(getAsicMimeTypeZipEntry(mimeTypeBytes), mimeTypeBytes).write(); diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java b/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java index 9c882b48e..8a76c04e5 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java @@ -41,6 +41,8 @@ import org.digidoc4j.exceptions.TechnicalException; 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; @@ -67,7 +69,6 @@ public class AsicSignatureBuilder extends SignatureBuilder implements SignatureF private static final Logger logger = LoggerFactory.getLogger(AsicSignatureBuilder.class); private static final int hexMaxlen = 10; - private static final int maxTryCount = 5; protected transient XadesSigningDssFacade facade; private Date signingDate; private boolean isLTorLTAprofile = false; @@ -80,8 +81,6 @@ protected Signature invokeSigningProcess() { Signature result = null; byte[] signatureValue = null; try { - // TODO: Investigate instability (of BouncyCastle?) - // Sometimes sign returns value what causes error in finalizeSignature signatureValue = signatureToken.sign(signatureParameters.getDigestAlgorithm(), dataToSign); result = finalizeSignature(signatureValue); } catch (TechnicalException e) { @@ -135,10 +134,17 @@ protected Signature createSignature(DSSDocument signedDocument) { throw new DigiDoc4JException(e); } List detachedContents = detachedContentCreator.getDetachedContentList(); - BDocSignatureOpener signatureOpener = new BDocSignatureOpener(detachedContents, configuration); - List signatureList = signatureOpener.parse(signedDocument); - BDocSignature signature = signatureList.get(0); //Only one signature was created - validateOcspResponse(signature.getOrigin()); + 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()); + } else { + AsicESignatureOpener signatureOpener = new AsicESignatureOpener(detachedContents, configuration); + List signatureList = signatureOpener.parse(signedDocument); + signature = signatureList.get(0); //Only one signature was created + } policyDefinedByUser = null; logger.info("Signing asic successfully completed"); return signature; @@ -291,13 +297,7 @@ protected void setSignaturePolicy() { if (policyDefinedByUser != null && isDefinedAllPolicyValues()) { signaturePolicy = policyDefinedByUser; } - else { - signaturePolicy.setId("urn:oid:" + XadesSignatureValidator.TM_POLICY); - signaturePolicy.setDigestValue(decodeBase64("0xRLPsW1UIpxtermnTGE+5+5620UsWi5bYJY76Di3o0=")); - signaturePolicy.setQualifier("OIDAsURN"); - signaturePolicy.setDigestAlgorithm(SHA256); - signaturePolicy.setSpuri("https://www.sk.ee/repository/bdoc-spec21.pdf"); - } + // TM_POLICY is usable only for BDOC_TM signature facade.setSignaturePolicy(signaturePolicy); } @@ -356,6 +356,13 @@ protected boolean isTimeMarkProfile() { return signatureParameters.getSignatureProfile() == SignatureProfile.LT_TM; } + protected boolean isTimeStampProfile() { + if (signatureParameters.getSignatureProfile() == null) { + return false; + } + return signatureParameters.getSignatureProfile() == SignatureProfile.LT; + } + protected boolean isEpesProfile() { if (signatureParameters.getSignatureProfile() != null) { return signatureParameters.getSignatureProfile() == SignatureProfile.B_EPES; diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocValidationReportBuilder.java b/src/main/java/org/digidoc4j/impl/asic/AsicValidationReportBuilder.java similarity index 95% rename from src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocValidationReportBuilder.java rename to src/main/java/org/digidoc4j/impl/asic/AsicValidationReportBuilder.java index fe8018e4d..2d5c704b2 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocValidationReportBuilder.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicValidationReportBuilder.java @@ -8,7 +8,7 @@ * Version 2.1, February 1999 */ -package org.digidoc4j.impl.asic.asice.bdoc; +package org.digidoc4j.impl.asic; import java.io.ByteArrayInputStream; import java.io.File; @@ -40,15 +40,15 @@ import eu.europa.esig.dss.jaxb.simplereport.XmlPolicy; import eu.europa.esig.dss.validation.reports.Reports; -public class BDocValidationReportBuilder { +public class AsicValidationReportBuilder { - private static final Logger logger = LoggerFactory.getLogger(BDocValidationReportBuilder.class); + private static final Logger logger = LoggerFactory.getLogger(AsicValidationReportBuilder.class); private List manifestErrors; private List signatureValidationData; private String reportInXml; - public BDocValidationReportBuilder(List signatureValidationData, List manifestErrors) { - logger.debug("Initializing BDoc validation report builder"); + public AsicValidationReportBuilder(List signatureValidationData, List manifestErrors) { + logger.debug("Initializing ASiC validation report builder"); this.manifestErrors = manifestErrors; this.signatureValidationData = signatureValidationData; } diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocValidationResult.java b/src/main/java/org/digidoc4j/impl/asic/AsicValidationResult.java similarity index 95% rename from src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocValidationResult.java rename to src/main/java/org/digidoc4j/impl/asic/AsicValidationResult.java index 4d971aa20..6eb0bd99f 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocValidationResult.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicValidationResult.java @@ -8,7 +8,7 @@ * Version 2.1, February 1999 */ -package org.digidoc4j.impl.asic.asice.bdoc; +package org.digidoc4j.impl.asic; import java.nio.file.Path; import java.util.ArrayList; @@ -29,12 +29,12 @@ * * For BDOC the ValidationResult contains only information for the first signature of each signature XML file */ -public class BDocValidationResult implements ValidationResult { +public class AsicValidationResult implements ValidationResult { private List errors = new ArrayList<>(); private List warnings = new ArrayList<>(); private List containerErrorsOnly = new ArrayList<>(); - private BDocValidationReportBuilder reportBuilder; + private AsicValidationReportBuilder reportBuilder; private List simpleReports = new ArrayList<>(); @Override @@ -180,7 +180,7 @@ public void setWarnings(List warnings) { * * @param reportBuilder */ - public void setReportBuilder(BDocValidationReportBuilder reportBuilder) { + public void setReportBuilder(AsicValidationReportBuilder reportBuilder) { this.reportBuilder = reportBuilder; } } diff --git a/src/main/java/org/digidoc4j/impl/asic/TimeStampValidationResult.java b/src/main/java/org/digidoc4j/impl/asic/TimeStampValidationResult.java index 8fc83ff3c..5d0ddd0d0 100644 --- a/src/main/java/org/digidoc4j/impl/asic/TimeStampValidationResult.java +++ b/src/main/java/org/digidoc4j/impl/asic/TimeStampValidationResult.java @@ -9,7 +9,6 @@ import org.digidoc4j.exceptions.DigiDoc4JException; import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.exceptions.NotYetImplementedException; -import org.digidoc4j.impl.asic.asice.bdoc.BDocValidationReportBuilder; import org.digidoc4j.impl.asic.report.SignatureValidationReport; import eu.europa.esig.dss.validation.SignatureQualification; @@ -24,7 +23,7 @@ public class TimeStampValidationResult implements ValidationResult { private List errors = new ArrayList<>(); private List warnings = new ArrayList<>(); private List containerErrorsOnly = new ArrayList<>(); - private BDocValidationReportBuilder reportBuilder; + private AsicValidationReportBuilder reportBuilder; private List simpleReports = new ArrayList<>(); private String signedBy = ""; private String signedTime = ""; diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java b/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java index 8b502cb0a..3b5ce3fe2 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainer.java @@ -2,9 +2,12 @@ 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.Signature; import org.digidoc4j.SignatureProfile; import org.digidoc4j.impl.asic.AsicContainer; import org.digidoc4j.impl.asic.AsicContainerCreator; @@ -12,6 +15,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import eu.europa.esig.dss.DSSDocument; + /** * Created by Andrei on 7.11.2017. @@ -44,8 +49,17 @@ public AsicEContainer(Configuration configuration) { * @param containerPath */ public AsicEContainer(String containerPath) { - super(containerPath); - setType(Constant.ASICE_CONTAINER_TYPE); + super(containerPath, Constant.ASICE_CONTAINER_TYPE); + } + + /** + * AsicEContainer constructor for subclasses + * + * @param containerPath + * @param containerType + */ + protected AsicEContainer(String containerPath, String containerType) { + super(containerPath, containerType); } /** @@ -55,8 +69,18 @@ public AsicEContainer(String containerPath) { * @param configuration */ public AsicEContainer(String containerPath, Configuration configuration) { - super(containerPath, configuration); - setType(Constant.ASICE_CONTAINER_TYPE); + super(containerPath, configuration, Constant.ASICE_CONTAINER_TYPE); + } + + /** + * AsicEContainer constructor for subclasses + * + * @param containerPath + * @param configuration + * @param containerType + */ + protected AsicEContainer(String containerPath, Configuration configuration, String containerType) { + super(containerPath, configuration, containerType); } /** @@ -65,8 +89,16 @@ public AsicEContainer(String containerPath, Configuration configuration) { * @param stream */ public AsicEContainer(InputStream stream) { - super(stream); - setType(Constant.ASICE_CONTAINER_TYPE); + super(stream, Constant.ASICE_CONTAINER_TYPE); + } + + /** + * AsicEContainer constructor + * + * @param stream + */ + protected AsicEContainer(InputStream stream, String containerType) { + super(stream, containerType); } /** @@ -76,8 +108,17 @@ public AsicEContainer(InputStream stream) { * @param configuration */ public AsicEContainer(InputStream stream, Configuration configuration) { - super(stream, configuration); - setType(Constant.ASICE_CONTAINER_TYPE); + super(stream, configuration, Constant.ASICE_CONTAINER_TYPE); + } + + /** + * AsicEContainer constructor + * + * @param stream + * @param configuration + */ + protected AsicEContainer(InputStream stream, Configuration configuration, String containerType) { + super(stream, configuration, containerType); } @Override @@ -85,6 +126,18 @@ 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 String createUserAgent() { if (!getSignatures().isEmpty()) { SignatureProfile profile = getSignatures().get(0).getProfile(); diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainerValidator.java b/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainerValidator.java new file mode 100644 index 000000000..9ab764315 --- /dev/null +++ b/src/main/java/org/digidoc4j/impl/asic/asice/AsicEContainerValidator.java @@ -0,0 +1,149 @@ +/* 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.asice; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import org.digidoc4j.Configuration; +import org.digidoc4j.Signature; +import org.digidoc4j.SignatureValidationResult; +import org.digidoc4j.ValidationResult; +import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.exceptions.TechnicalException; +import org.digidoc4j.exceptions.UnsupportedFormatException; +import org.digidoc4j.impl.asic.AsicParseResult; +import org.digidoc4j.impl.asic.AsicValidationReportBuilder; +import org.digidoc4j.impl.asic.AsicValidationResult; +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.validation.SignatureValidationData; +import org.digidoc4j.impl.asic.xades.validation.SignatureValidationTask; +import org.digidoc4j.impl.asic.xades.validation.ThreadPoolManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import eu.europa.esig.dss.DSSDocument; + +public class AsicEContainerValidator implements Serializable { + + private final static Logger logger = LoggerFactory.getLogger(AsicEContainerValidator.class); + private List errors = new ArrayList<>(); + private List warnings = new ArrayList<>(); + private AsicParseResult containerParseResult; + private boolean validateManifest; + private List signatureValidationData = new ArrayList<>(); + private List manifestErrors; + private ThreadPoolManager threadPoolManager; + + public AsicEContainerValidator(Configuration configuration) { + threadPoolManager = new ThreadPoolManager(configuration); + validateManifest = false; + } + + public AsicEContainerValidator(AsicParseResult containerParseResult, Configuration configuration) { + this.containerParseResult = containerParseResult; + threadPoolManager = new ThreadPoolManager(configuration); + validateManifest = true; + } + + public ValidationResult validate(List signatures) { + logger.debug("Validating container"); + validateSignatures(signatures); + extractManifestErrors(signatures); + AsicValidationResult result = createValidationResult(); + logger.info("Is container valid: " + result.isValid()); + return result; + } + + private void validateSignatures(List signatures) { + List> validationData = startSignatureValidationInParallel(signatures); + extractValidatedSignatureErrors(validationData); + } + + private List> startSignatureValidationInParallel(List signatures) { + List> futures = new ArrayList<>(); + for (Signature signature : signatures) { + SignatureValidationTask validationExecutor = new SignatureValidationTask(signature); + Future validationDataFuture = threadPoolManager.submit(validationExecutor); + futures.add(validationDataFuture); + } + return futures; + } + + private void extractValidatedSignatureErrors(List> validationFutures) { + logger.debug("Extracting errors from the signatures"); + for (Future validationFuture : validationFutures) { + try { + SignatureValidationData validationData = validationFuture.get(); + extractSignatureErrors(validationData); + } catch (InterruptedException | ExecutionException e) { + logger.error("Error validating signatures on multiple threads: " + e.getMessage()); + throw new TechnicalException("Error validating signatures on multiple threads: " + e.getMessage(), e); + } + } + } + + public void setValidateManifest(boolean validateManifest) { + this.validateManifest = validateManifest; + } + + private void extractSignatureErrors(SignatureValidationData validationData) { + logger.debug("Extracting signature errors for signature " + validationData.getSignatureId()); + signatureValidationData.add(validationData); + SignatureValidationResult validationResult = validationData.getValidationResult(); + List signatureErrors = validationResult.getErrors(); + errors.addAll(signatureErrors); + warnings.addAll(validationResult.getWarnings()); + } + + private void extractManifestErrors(List signatures) { + logger.debug("Extracting manifest errors"); + manifestErrors = findManifestErrors(signatures); + errors.addAll(manifestErrors); + } + + private AsicValidationResult createValidationResult() { + AsicValidationReportBuilder reportBuilder = new AsicValidationReportBuilder(signatureValidationData, manifestErrors); + AsicValidationResult result = new AsicValidationResult(); + result.setErrors(errors); + result.setWarnings(warnings); + result.setContainerErrorsOnly(manifestErrors); + result.setReportBuilder(reportBuilder); + return result; + } + + private List findManifestErrors(List signatures) { + if (!validateManifest || containerParseResult == null) { + return Collections.emptyList(); + } + ManifestParser manifestParser = containerParseResult.getManifestParser(); + if (manifestParser == null || !manifestParser.containsManifestFile()) { + logger.error("Container is missing manifest.xml"); + List manifestExceptions = new ArrayList<>(); + manifestExceptions.add(new UnsupportedFormatException("Container does not contain a manifest file")); + return manifestExceptions; + } + List manifestExceptions = new ArrayList<>(); + List detachedContents = containerParseResult.getDetachedContents(); + List manifestErrorMessageList = new ManifestValidator(manifestParser, detachedContents, signatures).validateDocument(); + for (ManifestErrorMessage manifestErrorMessage : manifestErrorMessageList) { + manifestExceptions.add(new DigiDoc4JException(manifestErrorMessage.getErrorMessage(), manifestErrorMessage.getSignatureId())); + } + return manifestExceptions; + } + +} diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java b/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java index 8f9de9d6d..94a13cadc 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java +++ b/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureBuilder.java @@ -7,4 +7,6 @@ */ public class AsicESignatureBuilder extends AsicSignatureBuilder { + @Override + protected void setSignaturePolicy() {} } diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java b/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java new file mode 100644 index 000000000..cc0fea770 --- /dev/null +++ b/src/main/java/org/digidoc4j/impl/asic/asice/AsicESignatureOpener.java @@ -0,0 +1,77 @@ +/* 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.asice; + +import java.util.ArrayList; +import java.util.List; + +import org.digidoc4j.Configuration; +import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; +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.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 { + + private final static Logger logger = LoggerFactory.getLogger(AsicESignatureOpener.class); + private final List detachedContents; + private Configuration configuration; + private XadesSignatureParser xadesSignatureParser = new XadesSignatureParser(); + + /** + * Constructor + * @param detachedContents + * @param configuration + */ + public AsicESignatureOpener(List detachedContents, Configuration configuration) { + this.configuration = configuration; + this.detachedContents = detachedContents; + } + + /** + * Xades document parsing method. + * @param xadesDocument Given Xades document + * @return List of ASiCE signatures + */ + public List parse(DSSDocument xadesDocument) { + logger.debug("Parsing xades document"); + List signatures = new ArrayList<>(1); + AsicESignature asicSignature = createAsicESignature(xadesDocument); + signatures.add(asicSignature); + return signatures; + } + + 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 XadesSignatureValidator createSignatureValidator(XadesSignature signature) { + XadesSignatureValidatorFactory validatorFactory = new XadesSignatureValidatorFactory(); + validatorFactory.setConfiguration(configuration); + validatorFactory.setSignature(signature); + XadesSignatureValidator xadesValidator = validatorFactory.create(); + return xadesValidator; + } +} diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java index fdf273169..d938741ca 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainer.java @@ -12,14 +12,19 @@ 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.Signature; import org.digidoc4j.impl.asic.AsicContainerCreator; import org.digidoc4j.impl.asic.asice.AsicEContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import eu.europa.esig.dss.DSSDocument; + /** * Offers functionality for handling data files and signatures in a container. */ @@ -51,8 +56,7 @@ public BDocContainer(Configuration configuration) { * @param containerPath */ public BDocContainer(String containerPath) { - super(containerPath); - setType(Constant.BDOC_CONTAINER_TYPE); + super(containerPath, Constant.BDOC_CONTAINER_TYPE); } /** @@ -62,8 +66,7 @@ public BDocContainer(String containerPath) { * @param configuration */ public BDocContainer(String containerPath, Configuration configuration) { - super(containerPath, configuration); - setType(Constant.BDOC_CONTAINER_TYPE); + super(containerPath, configuration, Constant.BDOC_CONTAINER_TYPE); } /** @@ -72,8 +75,7 @@ public BDocContainer(String containerPath, Configuration configuration) { * @param stream */ public BDocContainer(InputStream stream) { - super(stream); - setType(Constant.BDOC_CONTAINER_TYPE); + super(stream, Constant.BDOC_CONTAINER_TYPE); } /** @@ -83,12 +85,22 @@ public BDocContainer(InputStream stream) { * @param configuration */ public BDocContainer(InputStream stream, Configuration configuration) { - super(stream, configuration); - setType(Constant.BDOC_CONTAINER_TYPE); + super(stream, 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; + } } diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainerValidator.java b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainerValidator.java index fc883548d..0a25aaecf 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainerValidator.java +++ b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocContainerValidator.java @@ -25,6 +25,8 @@ import org.digidoc4j.exceptions.TechnicalException; import org.digidoc4j.exceptions.UnsupportedFormatException; import org.digidoc4j.impl.asic.AsicParseResult; +import org.digidoc4j.impl.asic.AsicValidationReportBuilder; +import org.digidoc4j.impl.asic.AsicValidationResult; import org.digidoc4j.impl.asic.manifest.ManifestErrorMessage; import org.digidoc4j.impl.asic.manifest.ManifestParser; import org.digidoc4j.impl.asic.manifest.ManifestValidator; @@ -59,10 +61,10 @@ public BDocContainerValidator(AsicParseResult containerParseResult, Configuratio } public ValidationResult validate(List signatures) { - logger.debug("Validating container"); + logger.debug("Validating BDOC container"); validateSignatures(signatures); extractManifestErrors(signatures); - BDocValidationResult result = createValidationResult(); + AsicValidationResult result = createValidationResult(); logger.info("Is container valid: " + result.isValid()); return result; } @@ -114,9 +116,9 @@ private void extractManifestErrors(List signatures) { errors.addAll(manifestErrors); } - private BDocValidationResult createValidationResult() { - BDocValidationReportBuilder reportBuilder = new BDocValidationReportBuilder(signatureValidationData, manifestErrors); - BDocValidationResult result = new BDocValidationResult(); + private AsicValidationResult createValidationResult() { + AsicValidationReportBuilder reportBuilder = new AsicValidationReportBuilder(signatureValidationData, manifestErrors); + AsicValidationResult result = new AsicValidationResult(); result.setErrors(errors); result.setWarnings(warnings); result.setContainerErrorsOnly(manifestErrors); diff --git a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureBuilder.java b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureBuilder.java index d87780b62..0615736cf 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureBuilder.java +++ b/src/main/java/org/digidoc4j/impl/asic/asice/bdoc/BDocSignatureBuilder.java @@ -24,13 +24,14 @@ public static Policy createBDocSignaturePolicy() { } Policy signaturePolicy = new Policy(); signaturePolicy.setId("urn:oid:" + XadesSignatureValidator.TM_POLICY); - signaturePolicy.setDigestValue(decodeBase64("0xRLPsW1UIpxtermnTGE+5+5620UsWi5bYJY76Di3o0=")); + 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; } + @Override protected void setSignaturePolicy() { if (isTimeMarkProfile() || isEpesProfile()) { Policy signaturePolicy = createBDocSignaturePolicy(); diff --git a/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java b/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java index 21f9d0554..94066311e 100644 --- a/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java +++ b/src/main/java/org/digidoc4j/impl/asic/asics/AsicSContainer.java @@ -2,17 +2,24 @@ 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.SignatureProfile; import org.digidoc4j.impl.asic.AsicContainer; import org.digidoc4j.impl.asic.AsicContainerCreator; +import org.digidoc4j.impl.asic.asice.AsicESignature; +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; + /** * Created by Andrei on 7.11.2017. */ @@ -31,23 +38,19 @@ public AsicSContainer(Configuration configuration) { } public AsicSContainer(String containerPath) { - super(containerPath); - setType(Constant.ASICS_CONTAINER_TYPE); + super(containerPath, Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(String containerPath, Configuration configuration) { - super(containerPath, configuration); - setType(Constant.ASICS_CONTAINER_TYPE); + super(containerPath, configuration, Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(InputStream stream) { - super(stream); - setType(Constant.ASICS_CONTAINER_TYPE); + super(stream, Constant.ASICS_CONTAINER_TYPE); } public AsicSContainer(InputStream stream, Configuration configuration) { - super(stream, configuration); - setType(Constant.ASICS_CONTAINER_TYPE); + super(stream, configuration, Constant.ASICS_CONTAINER_TYPE); } @Override @@ -55,6 +58,18 @@ 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; + } + /** * Replace Data File in AsicS container * diff --git a/src/main/java/org/digidoc4j/impl/asic/manifest/ManifestValidator.java b/src/main/java/org/digidoc4j/impl/asic/manifest/ManifestValidator.java index f4be1fde9..cfc73b23a 100644 --- a/src/main/java/org/digidoc4j/impl/asic/manifest/ManifestValidator.java +++ b/src/main/java/org/digidoc4j/impl/asic/manifest/ManifestValidator.java @@ -22,7 +22,9 @@ import org.apache.xml.security.signature.Reference; import org.digidoc4j.Signature; import org.digidoc4j.exceptions.DigiDoc4JException; +import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; +import org.digidoc4j.impl.asic.xades.XadesSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Node; @@ -76,12 +78,14 @@ public static List validateEntries(Map validateEntries(Map 0 && twoPrim.size() > 0) { for (ManifestEntry manifestEntry : two) { - errorMessages.add(new ManifestErrorMessage("The signature file for signature " + signatureId + " has an entry for file " + errorMessages.add(new ManifestErrorMessage("The signature file for signature " + + signatureId + " has an entry for file " + manifestEntry.getFileName() + " with mimetype " + manifestEntry.getMimeType() + " but the manifest file does not have an entry for this file", signatureId)); } @@ -126,7 +131,7 @@ public List validateDocument() { Set signatureEntries = new HashSet<>(); for (Signature signature : signatures) { - signatureEntries = getSignatureEntries((BDocSignature) signature); + signatureEntries = getSignatureEntries(signature); errorMessages.addAll(validateEntries(manifestEntries, signatureEntries, signature.getId())); } @@ -151,7 +156,8 @@ private List validateFilesInContainer(Set s String alterName = fileInContainer.replaceAll("\\ ", "+"); if (!signatureEntriesFileNames.contains(fileInContainer) && !signatureEntriesFileNames.contains(alterName)) { logger.error("Container contains unsigned data file '" + fileInContainer + "'"); - errorMessages.add(new ManifestErrorMessage("Container contains a file named " + fileInContainer + " which is not found in the signature file")); + errorMessages.add(new ManifestErrorMessage("Container contains a file named " + + fileInContainer + " which is not found in the signature file")); } } return errorMessages; @@ -167,15 +173,22 @@ private Set getFileNamesFromManifestEntrySet(Set signatur return signatureEntriesFileNames; } - private Set getSignatureEntries(BDocSignature signature) { + private Set getSignatureEntries(Signature signature) { Set signatureEntries = new HashSet<>(); - List references = signature.getOrigin().getReferences(); + XadesSignature origin; + if (signature.getClass() == BDocSignature.class) { + origin = ((BDocSignature) signature).getOrigin(); + } else { + origin = ((AsicESignature) signature).getOrigin(); + } + List references = origin.getReferences(); for (Reference reference : references) { if (reference.getType().equals("")) { String mimeTypeString = null; - Node signatureNode = signature.getOrigin().getDssSignature().getSignatureElement(); - Node node = DomUtils.getNode(signatureNode, "./ds:SignedInfo/ds:Reference[@URI=\"" + reference.getURI() + "\"]"); + Node signatureNode = origin.getDssSignature().getSignatureElement(); + Node node = DomUtils.getNode(signatureNode, "./ds:SignedInfo/ds:Reference[@URI=\"" + + reference.getURI() + "\"]"); if (node != null) { String referenceId = node.getAttributes().getNamedItem("Id").getNodeValue(); mimeTypeString = DomUtils.getValue(signatureNode, diff --git a/src/main/java/org/digidoc4j/impl/asic/xades/SignatureExtender.java b/src/main/java/org/digidoc4j/impl/asic/xades/SignatureExtender.java index f52fdbd01..cdd636d7c 100644 --- a/src/main/java/org/digidoc4j/impl/asic/xades/SignatureExtender.java +++ b/src/main/java/org/digidoc4j/impl/asic/xades/SignatureExtender.java @@ -30,6 +30,7 @@ import org.digidoc4j.Signature; import org.digidoc4j.SignatureProfile; import org.digidoc4j.exceptions.NotSupportedException; +import org.digidoc4j.impl.asic.AsicSignature; import org.digidoc4j.impl.asic.SkDataLoader; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignatureBuilder; @@ -79,7 +80,7 @@ public List extend(List signaturesToExtend, SignaturePro prepareExtendingFacade(profile); List extendedSignatures = new ArrayList<>(); for (Signature signature : signaturesToExtend) { - DSSDocument extendedSignature = extendSignature((BDocSignature) signature, profile); + DSSDocument extendedSignature = extendSignature(signature, profile); extendedSignatures.add(extendedSignature); } logger.debug("Finished extending signatures"); @@ -95,10 +96,10 @@ private void prepareExtendingFacade(SignatureProfile profile) { setSignaturePolicy(profile); } - private DSSDocument extendSignature(BDocSignature signature, SignatureProfile profile) { - OCSPSource ocspSource = createOcspSource(profile, signature.getOrigin().getSignatureValue()); + private DSSDocument extendSignature(Signature signature, SignatureProfile profile) { + OCSPSource ocspSource = createOcspSource(profile, ((AsicSignature)signature).getOrigin().getSignatureValue()); extendingFacade.setOcspSource(ocspSource); - DSSDocument signatureDocument = signature.getSignatureDocument(); + DSSDocument signatureDocument = ((AsicSignature)signature).getSignatureDocument(); return extendingFacade.extendSignature(signatureDocument, detachedContents); } diff --git a/src/main/java/org/digidoc4j/impl/asic/xades/XadesSignatureParser.java b/src/main/java/org/digidoc4j/impl/asic/xades/XadesSignatureParser.java index d586cd91d..b93746c69 100644 --- a/src/main/java/org/digidoc4j/impl/asic/xades/XadesSignatureParser.java +++ b/src/main/java/org/digidoc4j/impl/asic/xades/XadesSignatureParser.java @@ -21,24 +21,32 @@ import eu.europa.esig.dss.x509.SignaturePolicy; import eu.europa.esig.dss.xades.validation.XAdESSignature; +/** + * XadesSignatureParser + */ public class XadesSignatureParser { private final static Logger logger = LoggerFactory.getLogger(XadesSignatureParser.class); + /** + * Method for converting Xades signature into Signature object. + * @param xadesReportGenerator + * @return + */ public XadesSignature parse(XadesValidationReportGenerator xadesReportGenerator) { logger.debug("Parsing XAdES signature"); XAdESSignature xAdESSignature = xadesReportGenerator.openDssSignature(); SignatureLevel signatureLevel = xAdESSignature.getDataFoundUpToLevel(); logger.debug("Signature profile is " + signatureLevel); - if(isEpesSignature(signatureLevel, xAdESSignature)) { + if (isEpesSignature(signatureLevel, xAdESSignature)) { logger.debug("Using EPES signature"); return new EpesSignature(xadesReportGenerator); } - if(isBesSignature(signatureLevel)) { + if (isBesSignature(signatureLevel)) { logger.debug("Using BES signature"); return new BesSignature(xadesReportGenerator); } - if(isTimeMarkSignature(xAdESSignature)) { + if (isTimeMarkSignature(xAdESSignature)) { logger.debug("Using Time Mark signature"); return new TimemarkSignature(xadesReportGenerator); } diff --git a/src/main/java/org/digidoc4j/impl/asic/xades/validation/SignatureValidationTask.java b/src/main/java/org/digidoc4j/impl/asic/xades/validation/SignatureValidationTask.java index e8e06a745..4d5a0526f 100644 --- a/src/main/java/org/digidoc4j/impl/asic/xades/validation/SignatureValidationTask.java +++ b/src/main/java/org/digidoc4j/impl/asic/xades/validation/SignatureValidationTask.java @@ -14,7 +14,9 @@ import org.digidoc4j.Signature; import org.digidoc4j.SignatureValidationResult; +import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; +import org.digidoc4j.impl.asic.asics.AsicSSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +38,13 @@ public SignatureValidationData call() throws Exception { validationData.setValidationResult(validationResult); validationData.setSignatureId(signature.getId()); validationData.setSignatureProfile(signature.getProfile()); - validationData.setReport(((BDocSignature) signature).getDssValidationReport()); + if (signature.getClass() == BDocSignature.class) { + validationData.setReport(((BDocSignature) signature).getDssValidationReport()); + } else if (signature.getClass() == AsicESignature.class) { + validationData.setReport(((AsicESignature) signature).getDssValidationReport()); + } else if (signature.getClass() == AsicSSignature.class) { + validationData.setReport(((AsicSSignature) signature).getDssValidationReport()); + } return validationData; } diff --git a/src/test/java/org/digidoc4j/SignatureBuilderTest.java b/src/test/java/org/digidoc4j/SignatureBuilderTest.java index 34afe7296..562ca54cc 100644 --- a/src/test/java/org/digidoc4j/SignatureBuilderTest.java +++ b/src/test/java/org/digidoc4j/SignatureBuilderTest.java @@ -33,6 +33,7 @@ import org.digidoc4j.exceptions.NotSupportedException; import org.digidoc4j.exceptions.SignatureTokenMissingException; import org.digidoc4j.impl.DigiDoc4JTestHelper; +import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.impl.asic.xades.validation.XadesSignatureValidator; import org.digidoc4j.signers.PKCS12SignatureToken; @@ -78,7 +79,6 @@ public void buildingDataToSign_shouldReturnDataToSign() throws Exception { assertNotNull(dataToSign); assertNotNull(dataToSign.getDataToSign()); assertNotNull(dataToSign.getSignatureParameters()); - assertEquals(939, dataToSign.getDataToSign().length); //SHA256 is always 256 bits long, equivalent to 32 bytes assertEquals(DigestAlgorithm.SHA256, dataToSign.getDigestAlgorithm()); } @@ -250,7 +250,7 @@ public void signatureProfileShouldBeSetProperlyForBEpes() throws Exception { assertNull(signature.getOCSPResponseCreationTime()); assertNull(signature.getTimeStampTokenCertificate()); assertNull(signature.getTimeStampCreationTime()); - BDocSignature bDocSignature = (BDocSignature) signature; + AsicESignature bDocSignature = (AsicESignature) signature; SignaturePolicy policyId = bDocSignature.getOrigin().getDssSignature().getPolicyId(); assertEquals(XadesSignatureValidator.TM_POLICY, policyId.getIdentifier()); } diff --git a/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java b/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java index 2e8b60a6b..de580b295 100644 --- a/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java +++ b/src/test/java/org/digidoc4j/impl/bdoc/BDocContainerTest.java @@ -70,6 +70,7 @@ import org.digidoc4j.exceptions.OCSPRequestFailedException; import org.digidoc4j.exceptions.UnsupportedFormatException; import org.digidoc4j.impl.DigiDoc4JTestHelper; +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; @@ -120,7 +121,7 @@ public void testSetDigestAlgorithmToSHA224() throws Exception { private void assertSettingDigestAlgorithm(String expectedDigestAlgorithm, DigestAlgorithm actualDigestAlgorithm) throws IOException { Container container = TestDataBuilder.createContainerWithFile(testFolder); - BDocSignature signature = (BDocSignature)SignatureBuilder. + AsicESignature signature = (AsicESignature)SignatureBuilder. aSignature(container). withSignatureDigestAlgorithm(actualDigestAlgorithm). withSignatureToken(PKCS12_SIGNER). @@ -132,7 +133,7 @@ private void assertSettingDigestAlgorithm(String expectedDigestAlgorithm, Digest @Test public void testDefaultDigestAlgorithm() throws Exception { Container container = TestDataBuilder.createContainerWithFile(testFolder); - BDocSignature signature = (BDocSignature)SignatureBuilder. + AsicESignature signature = (AsicESignature)SignatureBuilder. aSignature(container). withSignatureToken(PKCS12_SIGNER). invokeSigning(); @@ -1273,6 +1274,6 @@ public void containerWithSignaturePolicyByDefault() throws Exception { assertEquals("https://www.sk.ee/repository/bdoc-spec21.pdf", policyId.getUrl()); assertEquals("" + XadesSignatureValidator.TM_POLICY, policyId.getIdentifier()); assertEquals(eu.europa.esig.dss.DigestAlgorithm.SHA256, policyId.getDigestAlgorithm()); - assertEquals("0xRLPsW1UIpxtermnTGE+5+5620UsWi5bYJY76Di3o0=", policyId.getDigestValue()); + assertEquals("7pudpH4eXlguSZY2e/pNbKzGsq+fu//woYL1SZFws1A=", policyId.getDigestValue()); } } diff --git a/src/test/java/org/digidoc4j/impl/bdoc/SignatureTimeTest.java b/src/test/java/org/digidoc4j/impl/bdoc/SignatureTimeTest.java index 6abf58e8a..90f755059 100644 --- a/src/test/java/org/digidoc4j/impl/bdoc/SignatureTimeTest.java +++ b/src/test/java/org/digidoc4j/impl/bdoc/SignatureTimeTest.java @@ -6,6 +6,7 @@ import org.digidoc4j.Container; import org.digidoc4j.SignatureBuilder; import org.digidoc4j.SignatureProfile; +import org.digidoc4j.impl.asic.asice.AsicESignature; import org.digidoc4j.impl.asic.asice.bdoc.BDocSignature; import org.digidoc4j.signers.PKCS12SignatureToken; import org.digidoc4j.testutils.TestDataBuilder; @@ -39,7 +40,7 @@ public void signatureProfileLTTMTest() throws Exception { @Test public void signatureProfileLTTest() throws Exception { Container container = TestDataBuilder.createContainerWithFile(testFolder); - BDocSignature signature = (BDocSignature) SignatureBuilder + AsicESignature signature = (AsicESignature) SignatureBuilder .aSignature(container).withSignatureToken(testSignatureToken) .withSignatureProfile(SignatureProfile.LT).invokeSigning(); container.addSignature(signature); @@ -50,7 +51,7 @@ public void signatureProfileLTTest() throws Exception { @Test public void signatureProfileLTATest() throws Exception { Container container = TestDataBuilder.createContainerWithFile(testFolder); - BDocSignature signature = (BDocSignature) SignatureBuilder + AsicESignature signature = (AsicESignature) SignatureBuilder .aSignature(container) .withSignatureToken(testSignatureToken) .withSignatureProfile(SignatureProfile.LTA).invokeSigning(); @@ -62,7 +63,7 @@ public void signatureProfileLTATest() throws Exception { @Test public void signatureProfileB_BESTest() throws Exception { Container container = TestDataBuilder.createContainerWithFile(testFolder); - BDocSignature signature = (BDocSignature) SignatureBuilder + AsicESignature signature = (AsicESignature) SignatureBuilder .aSignature(container) .withSignatureToken(testSignatureToken) .withSignatureProfile(SignatureProfile.B_BES).invokeSigning(); @@ -74,7 +75,7 @@ public void signatureProfileB_BESTest() throws Exception { @Test public void signatureProfileB_EPESTest() throws Exception { Container container = TestDataBuilder.createContainerWithFile(testFolder); - BDocSignature signature = (BDocSignature) SignatureBuilder + AsicESignature signature = (AsicESignature) SignatureBuilder .aSignature(container) .withSignatureToken(testSignatureToken) .withSignatureProfile(SignatureProfile.B_EPES).invokeSigning(); diff --git a/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java b/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java index fba861ec9..dc339c5e6 100644 --- a/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java +++ b/src/test/java/org/digidoc4j/main/DigiDoc4JTest.java @@ -155,6 +155,24 @@ public void createsContainerWithSignatureProfileIsTSForBDoc() throws Exception { System.clearProperty("digidoc4j.mode"); } + @Test + public void createsContainerWithSignatureProfileIsTSForAsice() throws Exception { + String fileName = tmpDirPath + "test1.asice"; + Files.deleteIfExists(Paths.get(fileName)); + + String[] params = new String[]{"-in", fileName, "-add", "src/test/resources/testFiles/helper-files/test.txt", + "text/plain", "-pkcs12", "src/test/resources/testFiles/p12/signout.p12", "test", "-profile", "LT"}; + + System.setProperty("digidoc4j.mode", "TEST"); + callMainWithoutSystemExit(params); + + Container container = ContainerOpener.open(fileName); + assertEquals(SignatureProfile.LT, container.getSignature(0).getProfile()); + System.clearProperty("digidoc4j.mode"); + boolean isValid = container.validate().isValid(); + assertTrue(isValid); + } + @Test public void createsContainerWithSignatureProfileIsBESForBDoc() throws Exception { String fileName = tmpDirPath + "test1.bdoc"; From 56ea598a484c19df8013e4d5d52af27670699bc9 Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Thu, 1 Feb 2018 10:58:04 +0200 Subject: [PATCH 14/15] Fix for ASiCS validation problem Signed-off-by: Indrek Jentson --- .../java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java b/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java index 8a76c04e5..ace86b7b2 100644 --- a/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java +++ b/src/main/java/org/digidoc4j/impl/asic/AsicSignatureBuilder.java @@ -293,12 +293,9 @@ protected void setSignatureProfile(SignatureProfile profile) { } protected void setSignaturePolicy() { - Policy signaturePolicy = new Policy(); if (policyDefinedByUser != null && isDefinedAllPolicyValues()) { - signaturePolicy = policyDefinedByUser; + facade.setSignaturePolicy(policyDefinedByUser); } - // TM_POLICY is usable only for BDOC_TM signature - facade.setSignaturePolicy(signaturePolicy); } protected void setSignatureId() { From 26f64ed92e9f137c8ee1ef470725707492c4a254 Mon Sep 17 00:00:00 2001 From: Indrek Jentson Date: Thu, 1 Feb 2018 12:08:11 +0200 Subject: [PATCH 15/15] Preparation for release 2.0.0.RC.2 Signed-off-by: Indrek Jentson --- RELEASE-NOTES.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index e4285d56e..85d35be8f 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,5 +1,12 @@ DigiDoc4J Java library release notes ------------------------------------ +Release 2.0.0.RC.2 +------------------ +Summary of the major changes since 2.0.0.RC.1 +------------------------------------------ +* Added support for TLWellSigned parameter. +* Some refctoring in Signature classes and utilities. + Release 2.0.0.RC.1 ------------------ Summary of the major changes since 1.0.8.beta.2