/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/
package org.digidoc4j.impl.bdoc.xades;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.digidoc4j.Configuration;
import org.digidoc4j.SignatureProfile;
import org.digidoc4j.exceptions.InvalidSignatureException;
import org.digidoc4j.utils.Helper;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.europa.esig.dss.DSSDocument;
import eu.europa.esig.dss.FileDocument;
import eu.europa.esig.dss.xades.validation.XAdESSignature;
public class XadesSignatureParserTest {
private final static Logger logger = LoggerFactory.getLogger(XadesSignatureParserTest.class);
private static Configuration configuration = new Configuration(Configuration.Mode.TEST);
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
private List<DSSDocument> detachedContents;
@Before
public void setUp() throws Exception {
DSSDocument signedFile = new FileDocument("testFiles/test.txt");
detachedContents = Arrays.asList(signedFile);
}
@Test
public void parseBesSignature() throws Exception {
XadesValidationReportGenerator xadesReportGenerator = createXadesReportGenerator("testFiles/xades/test-bes-signature.xml");
XadesSignature signature = new XadesSignatureParser().parse(xadesReportGenerator);
assertEquals(SignatureProfile.B_BES, signature.getProfile());
logger.debug("Getting signature id");
assertEquals("id-693869a500c60f0dc262f7287f033d5d", signature.getId());
logger.debug("Getting signature method");
assertEquals("http://www.w3.org/2001/04/xmlenc#sha256", signature.getSignatureMethod());
logger.debug("Getting signing time");
assertEquals(new Date(1454928400000L), signature.getSigningTime());
logger.debug("Getting city");
assertEquals("Tallinn", signature.getCity());
logger.debug("Getting state");
assertEquals("Harjumaa", signature.getStateOrProvince());
logger.debug("Getting postal code");
assertEquals("13456", signature.getPostalCode());
logger.debug("Getting country name");
assertEquals("Estonia", signature.getCountryName());
logger.debug("Getting signer roles");
assertEquals("Manager", signature.getSignerRoles().get(0));
assertEquals("Suspicious Fisherman", signature.getSignerRoles().get(1));
logger.debug("Getting signing certificate");
assertNotNull(signature.getSigningCertificate());
logger.debug("Getting signing cert subject name");
assertTrue(StringUtils.startsWith(signature.getSigningCertificate().issuerName(), "C=EE,O=AS Sertifitseerimiskeskus"));
logger.debug("Getting signature as a byte array");
logger.debug("Asserting null values");
assertNull(signature.getOCSPCertificate());
assertNull(signature.getOCSPResponseCreationTime());
assertNull(signature.getTimeStampTokenCertificate());
assertNull(signature.getTimeStampCreationTime());
assertNull(signature.getTrustedSigningTime());
logger.debug("Finished testing BES signature");
}
@Test
public void parseBDocTmSignature() throws Exception {
XadesValidationReportGenerator xadesReportGenerator = createXadesReportGenerator("testFiles/xades/test-bdoc-tm.xml");
XadesSignature signature = new XadesSignatureParser().parse(xadesReportGenerator);
assertEquals(SignatureProfile.LT_TM, signature.getProfile());
assertEquals("id-a4fc49d6d0d7f647f6f2f4edde485943", signature.getId());
logger.debug("Getting OCSP certificate");
logger.debug("Getting OCSP time");
assertNotNull(signature.getOCSPResponseCreationTime());
assertEquals(new Date(1454685580000L), signature.getOCSPResponseCreationTime());
logger.debug("Getting trusted signing time");
assertEquals(signature.getOCSPResponseCreationTime(), signature.getTrustedSigningTime());
assertNull(signature.getTimeStampTokenCertificate());
assertNull(signature.getTimeStampCreationTime());
logger.debug("Finished testing Timemark signature");
}
@Test
public void parseBdocTsSignature() throws Exception {
XadesValidationReportGenerator xadesReportGenerator = createXadesReportGenerator("testFiles/xades/test-bdoc-ts.xml");
XadesSignature signature = new XadesSignatureParser().parse(xadesReportGenerator);
assertEquals(SignatureProfile.LT, signature.getProfile());
assertEquals("S0", signature.getId());
logger.debug("Getting timestamp time");
assertEquals(new Date(1454090316000L), signature.getTimeStampCreationTime());
logger.debug("Checking trusted time");
assertEquals(signature.getTimeStampCreationTime(), signature.getTrustedSigningTime());
logger.debug("Finished testing Timestamp signature");
}
@Test
public void parseBDocTsaSignature() throws Exception {
XadesValidationReportGenerator xadesReportGenerator = createXadesReportGenerator("testFiles/xades/test-bdoc-tsa.xml");
XadesSignature signature = new XadesSignatureParser().parse(xadesReportGenerator);
assertEquals(SignatureProfile.LTA, signature.getProfile());
assertEquals("id-168ef7d05729874fab1a88705b09b5bb", signature.getId());
assertEquals("http://www.w3.org/2001/04/xmlenc#sha256", signature.getSignatureMethod());
assertEquals(new Date(1455032287000L), signature.getSigningTime());
assertTrue(StringUtils.startsWith(signature.getSigningCertificate().issuerName(), "C=EE,O=AS Sertifitseerimiskeskus"));
assertEquals(new Date(1455032289000L), signature.getOCSPResponseCreationTime());
assertEquals(new Date(1455032288000L), signature.getTimeStampCreationTime());
assertEquals(signature.getTimeStampCreationTime(), signature.getTrustedSigningTime());
}
@Test
public void serializeSignature() throws Exception {
XadesValidationReportGenerator xadesReportGenerator = createXadesReportGenerator("testFiles/xades/test-bdoc-tsa.xml");
XadesSignature signature = new XadesSignatureParser().parse(xadesReportGenerator);
String serializedPath = testFolder.newFile().getPath();
Helper.serialize(signature, serializedPath);
signature = Helper.deserializer(serializedPath);
assertEquals("id-168ef7d05729874fab1a88705b09b5bb", signature.getId());
XAdESSignature dssSignature = signature.getDssSignature();
assertNotNull(dssSignature.getReferences());
}
@Test(expected = InvalidSignatureException.class)
public void parsingInvalidSignatureFile_shouldThrowException() throws Exception {
XadesValidationReportGenerator xadesReportGenerator = createXadesReportGenerator("testFiles/test.txt");
new XadesSignatureParser().parse(xadesReportGenerator);
}
private XadesValidationReportGenerator createXadesReportGenerator(String signaturePath) {
DSSDocument signatureDocument = new FileDocument(signaturePath);
XadesValidationReportGenerator generator = new XadesValidationReportGenerator(signatureDocument, detachedContents, configuration);
return generator;
}
}