diff --git a/build.xml b/build.xml
index 8b9b3550d..c5f90d9b8 100644
--- a/build.xml
+++ b/build.xml
@@ -1,5 +1,5 @@
-
+
@@ -142,8 +142,6 @@ under the License.
-
-
@@ -157,7 +155,7 @@ under the License.
-
+
@@ -175,12 +173,12 @@ under the License.
+ description="JDK version of generated class files"/>
-
-
-
+
+
+
@@ -224,7 +222,7 @@ under the License.
-
+
@@ -290,7 +288,7 @@ under the License.
-
+
@@ -375,7 +373,6 @@ under the License.
-
@@ -419,10 +416,6 @@ under the License.
-
-
-
-
@@ -482,7 +475,7 @@ under the License.
-
@@ -605,7 +598,7 @@ under the License.
-
@@ -638,9 +631,9 @@ under the License.
-
-
-
+
+
+
@@ -669,9 +662,9 @@ under the License.
-
-
-
+
+
+
@@ -681,7 +674,7 @@ under the License.
-
+
@@ -695,9 +688,9 @@ under the License.
-
-
-
+
+
+
@@ -731,9 +724,9 @@ under the License.
-
-
-
+
+
+
@@ -762,9 +755,9 @@ under the License.
-
-
-
+
+
+
@@ -772,7 +765,7 @@ under the License.
-
+
@@ -789,8 +782,8 @@ under the License.
-
-
+
+
@@ -819,9 +812,9 @@ under the License.
-
-
-
+
+
+
@@ -843,9 +836,9 @@ under the License.
-
-
-
+
+
+
@@ -1094,7 +1087,7 @@ FORREST_HOME environment variable!
-
+
@@ -1107,7 +1100,7 @@ FORREST_HOME environment variable!
-
+
@@ -1120,7 +1113,7 @@ FORREST_HOME environment variable!
-
+
@@ -1133,7 +1126,7 @@ FORREST_HOME environment variable!
-
+
@@ -1148,7 +1141,7 @@ FORREST_HOME environment variable!
-
+
@@ -1251,7 +1244,7 @@ FORREST_HOME environment variable!
JDepend is not available. You must download JDepend from
<http://www.clarkware.com/software/JDepend.html> and include the
JAR file in your classpath.
-
+
diff --git a/src/ooxml/java/org/apache/poi/ooxml/signature/service/signer/ooxml/OOXMLSignatureAspect.java b/src/ooxml/java/org/apache/poi/ooxml/signature/service/signer/ooxml/OOXMLSignatureAspect.java
index df6956664..067dfece8 100644
--- a/src/ooxml/java/org/apache/poi/ooxml/signature/service/signer/ooxml/OOXMLSignatureAspect.java
+++ b/src/ooxml/java/org/apache/poi/ooxml/signature/service/signer/ooxml/OOXMLSignatureAspect.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -29,8 +28,10 @@ import java.io.InputStream;
import java.net.URL;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
+import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
+import java.util.TimeZone;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -57,10 +58,6 @@ import org.apache.poi.ooxml.signature.service.signer.NoCloseInputStream;
import org.apache.poi.ooxml.signature.service.signer.SignatureAspect;
import org.apache.xml.security.utils.Constants;
import org.apache.xpath.XPathAPI;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.joda.time.format.DateTimeFormatter;
-import org.joda.time.format.ISODateTimeFormat;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -73,19 +70,14 @@ import org.xml.sax.SAXException;
/**
* Office OpenXML Signature Aspect implementation.
*/
-public class OOXMLSignatureAspect implements SignatureAspect {
+final class OOXMLSignatureAspect implements SignatureAspect {
private static final Log LOG = LogFactory.getLog(OOXMLSignatureAspect.class);
- private final AbstractOOXMLSignatureService signatureService;
+ private final AbstractOOXMLSignatureService _signatureService;
- /**
- * Main constructor.
- *
- * @param ooxmlUrl
- */
public OOXMLSignatureAspect(AbstractOOXMLSignatureService signatureService) {
- this.signatureService = signatureService;
+ _signatureService = signatureService;
}
public void preSign(XMLSignatureFactory signatureFactory, Document document, String signatureId, List references, List objects)
@@ -98,7 +90,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
private void addManifestObject(XMLSignatureFactory signatureFactory, Document document, String signatureId, List references,
List objects) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
- Manifest manifest = constructManifest(signatureFactory, document);
+ Manifest manifest = constructManifest(signatureFactory);
String objectId = "idPackageObject"; // really has to be this value.
List objectContent = new LinkedList();
objectContent.add(manifest);
@@ -112,12 +104,12 @@ public class OOXMLSignatureAspect implements SignatureAspect {
references.add(reference);
}
- private Manifest constructManifest(XMLSignatureFactory signatureFactory, Document document) throws NoSuchAlgorithmException,
+ private Manifest constructManifest(XMLSignatureFactory signatureFactory) throws NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
List manifestReferences = new LinkedList();
try {
- addRelationshipsReferences(signatureFactory, document, manifestReferences);
+ addRelationshipsReferences(signatureFactory, manifestReferences);
} catch (Exception e) {
throw new RuntimeException("error: " + e.getMessage(), e);
}
@@ -145,7 +137,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
return manifest;
}
- private void addSignatureTime(XMLSignatureFactory signatureFactory, Document document, String signatureId, List objectContent) {
+ private static void addSignatureTime(XMLSignatureFactory signatureFactory, Document document, String signatureId, List objectContent) {
/*
* SignatureTime
*/
@@ -155,9 +147,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
formatElement.setTextContent("YYYY-MM-DDThh:mm:ssTZD");
signatureTimeElement.appendChild(formatElement);
Element valueElement = document.createElementNS("http://schemas.openxmlformats.org/package/2006/digital-signature", "mdssi:Value");
- DateTime dateTime = new DateTime(DateTimeZone.UTC);
- DateTimeFormatter fmt = ISODateTimeFormat.dateTimeNoMillis();
- String now = fmt.print(dateTime);
+ String now = formatTimestampAsISO8601(System.currentTimeMillis());
LOG.debug("now: " + now);
valueElement.setTextContent(now);
signatureTimeElement.appendChild(valueElement);
@@ -172,6 +162,34 @@ public class OOXMLSignatureAspect implements SignatureAspect {
objectContent.add(signatureProperties);
}
+ /**
+ * @return text formatted "YYYY-MM-DDThh:mm:ssTZD"
+ */
+ static String formatTimestampAsISO8601(long ts) {
+ Calendar c = Calendar.getInstance();
+ c.setTimeInMillis(ts);
+ c.setTimeZone(TimeZone.getTimeZone("UTC"));
+ char[] buf = "yyyy-mm-ddThh:mm:ssZ".toCharArray();
+ itoa(buf, 0, 4, c.get(Calendar.YEAR));
+ itoa(buf, 5, 2, c.get(Calendar.MONTH)+1);
+ itoa(buf, 8, 2, c.get(Calendar.DAY_OF_MONTH));
+ itoa(buf, 11, 2, c.get(Calendar.HOUR_OF_DAY));
+ itoa(buf, 14, 2, c.get(Calendar.MINUTE));
+ itoa(buf, 17, 2, c.get(Calendar.SECOND));
+ return new String(buf);
+ }
+
+ private static void itoa(char[] buf, int start, int len, int value) {
+ int acc = value;
+ int i=start+len-1;
+ while (i>=start) {
+ int d = acc % 10;
+ acc /= 10;
+ buf[i] = (char) ('0' + d);
+ i--;
+ }
+ }
+
private void addSignatureInfo(XMLSignatureFactory signatureFactory, Document document, String signatureId, List references,
List objects) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
List objectContent = new LinkedList();
@@ -200,10 +218,10 @@ public class OOXMLSignatureAspect implements SignatureAspect {
references.add(reference);
}
- private void addRelationshipsReferences(XMLSignatureFactory signatureFactory, Document document, List manifestReferences) throws IOException,
- ParserConfigurationException, SAXException, TransformerException, NoSuchAlgorithmException,
+ private void addRelationshipsReferences(XMLSignatureFactory signatureFactory, List manifestReferences) throws IOException,
+ ParserConfigurationException, SAXException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
- URL ooxmlUrl = this.signatureService.getOfficeOpenXMLDocumentURL();
+ URL ooxmlUrl = _signatureService.getOfficeOpenXMLDocumentURL();
InputStream inputStream = ooxmlUrl.openStream();
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
ZipEntry zipEntry;
@@ -212,11 +230,11 @@ public class OOXMLSignatureAspect implements SignatureAspect {
continue;
}
Document relsDocument = loadDocumentNoClose(zipInputStream);
- addRelationshipsReference(signatureFactory, document, zipEntry.getName(), relsDocument, manifestReferences);
+ addRelationshipsReference(signatureFactory, zipEntry.getName(), relsDocument, manifestReferences);
}
}
- private void addRelationshipsReference(XMLSignatureFactory signatureFactory, Document document, String zipEntryName, Document relsDocument,
+ private void addRelationshipsReference(XMLSignatureFactory signatureFactory, String zipEntryName, Document relsDocument,
List manifestReferences) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
LOG.debug("relationships: " + zipEntryName);
RelationshipTransformParameterSpec parameterSpec = new RelationshipTransformParameterSpec();
@@ -267,7 +285,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
InvalidAlgorithmParameterException {
List documentResourceNames;
try {
- documentResourceNames = getResourceNames(this.signatureService.getOfficeOpenXMLDocumentURL(), contentType);
+ documentResourceNames = getResourceNames(_signatureService.getOfficeOpenXMLDocumentURL(), contentType);
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -318,7 +336,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
}
protected Document findDocument(String zipEntryName) throws IOException, ParserConfigurationException, SAXException {
- URL ooxmlUrl = this.signatureService.getOfficeOpenXMLDocumentURL();
+ URL ooxmlUrl = _signatureService.getOfficeOpenXMLDocumentURL();
InputStream inputStream = ooxmlUrl.openStream();
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
ZipEntry zipEntry;
diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/AllOOXMLSignatureTests.java b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/AllOOXMLSignatureTests.java
new file mode 100644
index 000000000..8fd20148c
--- /dev/null
+++ b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/AllOOXMLSignatureTests.java
@@ -0,0 +1,36 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ooxml.signature.service.signer;
+
+import org.apache.poi.ooxml.signature.service.signer.ooxml.TestOOXMLSignatureAspect;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+
+public final class AllOOXMLSignatureTests {
+
+ public static Test suite() {
+ TestSuite result = new TestSuite(AllOOXMLSignatureTests.class.getName());
+ result.addTestSuite(TestAbstractOOXMLSignatureService.class);
+ result.addTestSuite(TestAbstractXmlSignatureService.class);
+ result.addTestSuite(TestOOXMLSignatureAspect.class);
+ result.addTestSuite(TestOOXMLSignatureVerifier.class);
+ return result;
+ }
+}
diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/PkiTestUtils.java b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/PkiTestUtils.java
index a307ee090..40a8875dc 100644
--- a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/PkiTestUtils.java
+++ b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/PkiTestUtils.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -40,6 +39,8 @@ import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.RSAKeyGenParameterSpec;
+import java.util.Calendar;
+import java.util.Date;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -53,6 +54,7 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
+import org.apache.poi.util.HexRead;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DERIA5String;
@@ -71,18 +73,18 @@ import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
import org.bouncycastle.jce.X509Principal;
import org.bouncycastle.x509.X509V3CertificateGenerator;
-import org.joda.time.DateTime;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
-public class PkiTestUtils {
+final class PkiTestUtils {
- public static final byte[] SHA1_DIGEST_INFO_PREFIX = new byte[] { 0x30, 0x1f, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14 };
+ public static final byte[] SHA1_DIGEST_INFO_PREFIX =
+ HexRead.readFromString( "30 1f 30 07 06 05 2b 0e 03 02 1a 04 14");
private PkiTestUtils() {
- super();
+ // no instances of this class
}
static KeyPair generateKeyPair() throws Exception {
@@ -107,17 +109,21 @@ public class PkiTestUtils {
return new AuthorityKeyIdentifier(info);
}
- static X509Certificate generateCertificate(PublicKey subjectPublicKey, String subjectDn, DateTime notBefore, DateTime notAfter,
+ public static X509Certificate generateCertificate(PublicKey subjectPublicKey, String subjectDn,
X509Certificate issuerCertificate, PrivateKey issuerPrivateKey, boolean caFlag, int pathLength, String crlUri,
String ocspUri, KeyUsage keyUsage) throws IOException, InvalidKeyException, IllegalStateException,
NoSuchAlgorithmException, SignatureException, CertificateException {
+
+ Date notBefore = makeDate(2010, 1, 1);
+ Date notAfter = makeDate(2011, 1, 1);
+
String signatureAlgorithm = "SHA1withRSA";
X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();
certificateGenerator.reset();
certificateGenerator.setPublicKey(subjectPublicKey);
certificateGenerator.setSignatureAlgorithm(signatureAlgorithm);
- certificateGenerator.setNotBefore(notBefore.toDate());
- certificateGenerator.setNotAfter(notAfter.toDate());
+ certificateGenerator.setNotBefore(notBefore);
+ certificateGenerator.setNotAfter(notAfter);
X509Principal issuerDN;
if (null != issuerCertificate) {
issuerDN = new X509Principal(issuerCertificate.getSubjectX500Principal().toString());
@@ -173,6 +179,13 @@ public class PkiTestUtils {
return certificate;
}
+ private static Date makeDate(int year, int month, int day) {
+ Calendar c = Calendar.getInstance();
+ c.set(year, month, day, 0, 0, 0);
+ c.set(Calendar.MILLISECOND, 0);
+ return c.getTime();
+ }
+
static Document loadDocument(InputStream documentInputStream) throws ParserConfigurationException, SAXException, IOException {
InputSource inputSource = new InputSource(documentInputStream);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractOOXMLSignatureService.java b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractOOXMLSignatureService.java
index d6cc51c65..5aa8b0b5c 100644
--- a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractOOXMLSignatureService.java
+++ b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractOOXMLSignatureService.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -42,13 +41,11 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.poi.ooxml.signature.service.signer.TemporaryDataStorage;
import org.apache.poi.ooxml.signature.service.signer.ooxml.AbstractOOXMLSignatureService;
import org.apache.poi.ooxml.signature.service.signer.ooxml.OOXMLProvider;
import org.apache.poi.ooxml.signature.service.signer.ooxml.OOXMLSignatureVerifier;
import org.apache.poi.ooxml.signature.service.spi.DigestInfo;
import org.bouncycastle.asn1.x509.KeyUsage;
-import org.joda.time.DateTime;
@@ -62,35 +59,35 @@ public class TestAbstractOOXMLSignatureService extends TestCase {
private static class OOXMLTestSignatureService extends AbstractOOXMLSignatureService {
- private final URL ooxmlUrl;
+ private final URL _ooxmlUrl;
- private final TemporaryTestDataStorage temporaryDataStorage;
+ private final TemporaryTestDataStorage _temporaryDataStorage;
- private final ByteArrayOutputStream signedOOXMLOutputStream;
+ private final ByteArrayOutputStream _signedOOXMLOutputStream;
public OOXMLTestSignatureService(URL ooxmlUrl) {
- this.temporaryDataStorage = new TemporaryTestDataStorage();
- this.signedOOXMLOutputStream = new ByteArrayOutputStream();
- this.ooxmlUrl = ooxmlUrl;
+ _temporaryDataStorage = new TemporaryTestDataStorage();
+ _signedOOXMLOutputStream = new ByteArrayOutputStream();
+ _ooxmlUrl = ooxmlUrl;
}
@Override
protected URL getOfficeOpenXMLDocumentURL() {
- return this.ooxmlUrl;
+ return _ooxmlUrl;
}
@Override
protected OutputStream getSignedOfficeOpenXMLDocumentOutputStream() {
- return this.signedOOXMLOutputStream;
+ return _signedOOXMLOutputStream;
}
public byte[] getSignedOfficeOpenXMLDocumentData() {
- return this.signedOOXMLOutputStream.toByteArray();
+ return _signedOOXMLOutputStream.toByteArray();
}
@Override
protected TemporaryDataStorage getTemporaryDataStorage() {
- return this.temporaryDataStorage;
+ return _temporaryDataStorage;
}
}
@@ -189,9 +186,7 @@ public class TestAbstractOOXMLSignatureService extends TestCase {
byte[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
byte[] signatureValue = cipher.doFinal(digestInfoValue);
- DateTime notBefore = new DateTime();
- DateTime notAfter = notBefore.plusYears(1);
- X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), signerDn, notBefore, notAfter, null, keyPair.getPrivate(), true, 0,
+ X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), signerDn, null, keyPair.getPrivate(), true, 0,
null, null, new KeyUsage(KeyUsage.nonRepudiation));
// operate: postSign
diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractXmlSignatureService.java b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractXmlSignatureService.java
index 538c96d0b..352cc3e35 100644
--- a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractXmlSignatureService.java
+++ b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/TestAbstractXmlSignatureService.java
@@ -69,7 +69,6 @@ import org.apache.xpath.XPathAPI;
import org.bouncycastle.asn1.x509.KeyUsage;
import org.jcp.xml.dsig.internal.dom.DOMReference;
import org.jcp.xml.dsig.internal.dom.DOMXMLSignature;
-import org.joda.time.DateTime;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -215,9 +214,7 @@ public final class TestAbstractXmlSignatureService extends TestCase {
byte[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
byte[] signatureValue = cipher.doFinal(digestInfoValue);
- DateTime notBefore = new DateTime();
- DateTime notAfter = notBefore.plusYears(1);
- X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
+ X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
/*
@@ -313,9 +310,7 @@ public final class TestAbstractXmlSignatureService extends TestCase {
byte[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
byte[] signatureValue = cipher.doFinal(digestInfoValue);
- DateTime notBefore = new DateTime();
- DateTime notAfter = notBefore.plusYears(1);
- X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
+ X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
/*
@@ -395,9 +390,7 @@ public final class TestAbstractXmlSignatureService extends TestCase {
byte[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
byte[] signatureValue = cipher.doFinal(digestInfoValue);
- DateTime notBefore = new DateTime();
- DateTime notAfter = notBefore.plusYears(1);
- X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
+ X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
/*
@@ -475,9 +468,7 @@ public final class TestAbstractXmlSignatureService extends TestCase {
byte[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
byte[] signatureValue = cipher.doFinal(digestInfoValue);
- DateTime notBefore = new DateTime();
- DateTime notAfter = notBefore.plusYears(1);
- X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
+ X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
/*
diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/ooxml/TestOOXMLSignatureAspect.java b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/ooxml/TestOOXMLSignatureAspect.java
new file mode 100644
index 000000000..aeee8f0d9
--- /dev/null
+++ b/src/ooxml/testcases/org/apache/poi/ooxml/signature/service/signer/ooxml/TestOOXMLSignatureAspect.java
@@ -0,0 +1,40 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ooxml.signature.service.signer.ooxml;
+
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import junit.framework.TestCase;
+
+public final class TestOOXMLSignatureAspect extends TestCase {
+
+ private static final TimeZone TIME_ZONE_UTC = TimeZone.getTimeZone("UTC");
+
+ public void testFormatTimestampAsISO8601() {
+ assertEquals("2010-06-05T04:03:02Z", OOXMLSignatureAspect.formatTimestampAsISO8601(makeTimestamp(2010, 6, 5, 4, 3, 2)));
+ }
+
+ private static long makeTimestamp(int year, int month, int day, int hour, int minute, int second) {
+ Calendar c = Calendar.getInstance();
+ c.setTimeZone(TIME_ZONE_UTC);
+ c.set(year, month-1, day, hour, minute, second);
+ c.set(Calendar.MILLISECOND, 0);
+ return c.getTimeInMillis();
+ }
+}