removed new dependency on joda
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@825294 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1833764495
commit
ccf7a6d89f
@ -142,8 +142,6 @@ under the License.
|
|||||||
<property name="ooxml.xalan.url" value="${repository.m2}/maven2/xalan/xalan/2.7.1/xalan-2.7.1.jar"/>
|
<property name="ooxml.xalan.url" value="${repository.m2}/maven2/xalan/xalan/2.7.1/xalan-2.7.1.jar"/>
|
||||||
<property name="ooxml.xalan-serializer.jar" location="${ooxml.lib}/serializer-2.7.1.jar"/>
|
<property name="ooxml.xalan-serializer.jar" location="${ooxml.lib}/serializer-2.7.1.jar"/>
|
||||||
<property name="ooxml.xalan-serializer.url" value="${repository.m2}/maven2/xalan/serializer/2.7.1/serializer-2.7.1.jar"/>
|
<property name="ooxml.xalan-serializer.url" value="${repository.m2}/maven2/xalan/serializer/2.7.1/serializer-2.7.1.jar"/>
|
||||||
<property name="ooxml.joda-time.jar" location="${ooxml.lib}/joda-time-1.6.jar"/>
|
|
||||||
<property name="ooxml.joda-time.url" value="${repository.m2}/maven2/joda-time/joda-time/1.6/joda-time-1.6.jar"/>
|
|
||||||
<!-- BouncyCastle is used only for OOXML Digital Signature tests -->
|
<!-- BouncyCastle is used only for OOXML Digital Signature tests -->
|
||||||
<property name="ooxml.bcprov.jar" location="${ooxml.lib}/bcprov-jdk15-140.jar"/>
|
<property name="ooxml.bcprov.jar" location="${ooxml.lib}/bcprov-jdk15-140.jar"/>
|
||||||
<property name="ooxml.bcprov.url" value="${repository.m2}/maven2/bouncycastle/bcprov-jdk15/140/bcprov-jdk15-140.jar"/>
|
<property name="ooxml.bcprov.url" value="${repository.m2}/maven2/bouncycastle/bcprov-jdk15/140/bcprov-jdk15-140.jar"/>
|
||||||
@ -375,7 +373,6 @@ under the License.
|
|||||||
<available file="${ooxml.xmlsec.jar}"/>
|
<available file="${ooxml.xmlsec.jar}"/>
|
||||||
<available file="${ooxml.xalan.jar}"/>
|
<available file="${ooxml.xalan.jar}"/>
|
||||||
<available file="${ooxml.xalan-serializer.jar}"/>
|
<available file="${ooxml.xalan-serializer.jar}"/>
|
||||||
<available file="${ooxml.joda-time.jar}"/>
|
|
||||||
<available file="${ooxml.bcprov.jar}"/>
|
<available file="${ooxml.bcprov.jar}"/>
|
||||||
</and>
|
</and>
|
||||||
<isset property="disconnected"/>
|
<isset property="disconnected"/>
|
||||||
@ -419,10 +416,6 @@ under the License.
|
|||||||
<param name="sourcefile" value="${ooxml.xalan-serializer.url}"/>
|
<param name="sourcefile" value="${ooxml.xalan-serializer.url}"/>
|
||||||
<param name="destfile" value="${ooxml.xalan-serializer.jar}"/>
|
<param name="destfile" value="${ooxml.xalan-serializer.jar}"/>
|
||||||
</antcall>
|
</antcall>
|
||||||
<antcall target="downloadfile">
|
|
||||||
<param name="sourcefile" value="${ooxml.joda-time.url}"/>
|
|
||||||
<param name="destfile" value="${ooxml.joda-time.jar}"/>
|
|
||||||
</antcall>
|
|
||||||
<antcall target="downloadfile">
|
<antcall target="downloadfile">
|
||||||
<param name="sourcefile" value="${ooxml.bcprov.url}"/>
|
<param name="sourcefile" value="${ooxml.bcprov.url}"/>
|
||||||
<param name="destfile" value="${ooxml.bcprov.jar}"/>
|
<param name="destfile" value="${ooxml.bcprov.jar}"/>
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/* ====================================================================
|
/* ====================================================================
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
@ -29,8 +28,10 @@ import java.io.InputStream;
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.InvalidAlgorithmParameterException;
|
import java.security.InvalidAlgorithmParameterException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.TimeZone;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipInputStream;
|
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.poi.ooxml.signature.service.signer.SignatureAspect;
|
||||||
import org.apache.xml.security.utils.Constants;
|
import org.apache.xml.security.utils.Constants;
|
||||||
import org.apache.xpath.XPathAPI;
|
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.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
@ -73,19 +70,14 @@ import org.xml.sax.SAXException;
|
|||||||
/**
|
/**
|
||||||
* Office OpenXML Signature Aspect implementation.
|
* 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 static final Log LOG = LogFactory.getLog(OOXMLSignatureAspect.class);
|
||||||
|
|
||||||
private final AbstractOOXMLSignatureService signatureService;
|
private final AbstractOOXMLSignatureService _signatureService;
|
||||||
|
|
||||||
/**
|
|
||||||
* Main constructor.
|
|
||||||
*
|
|
||||||
* @param ooxmlUrl
|
|
||||||
*/
|
|
||||||
public OOXMLSignatureAspect(AbstractOOXMLSignatureService signatureService) {
|
public OOXMLSignatureAspect(AbstractOOXMLSignatureService signatureService) {
|
||||||
this.signatureService = signatureService;
|
_signatureService = signatureService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void preSign(XMLSignatureFactory signatureFactory, Document document, String signatureId, List<Reference> references, List<XMLObject> objects)
|
public void preSign(XMLSignatureFactory signatureFactory, Document document, String signatureId, List<Reference> references, List<XMLObject> objects)
|
||||||
@ -98,7 +90,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
|
|
||||||
private void addManifestObject(XMLSignatureFactory signatureFactory, Document document, String signatureId, List<Reference> references,
|
private void addManifestObject(XMLSignatureFactory signatureFactory, Document document, String signatureId, List<Reference> references,
|
||||||
List<XMLObject> objects) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
|
List<XMLObject> objects) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
|
||||||
Manifest manifest = constructManifest(signatureFactory, document);
|
Manifest manifest = constructManifest(signatureFactory);
|
||||||
String objectId = "idPackageObject"; // really has to be this value.
|
String objectId = "idPackageObject"; // really has to be this value.
|
||||||
List<XMLStructure> objectContent = new LinkedList<XMLStructure>();
|
List<XMLStructure> objectContent = new LinkedList<XMLStructure>();
|
||||||
objectContent.add(manifest);
|
objectContent.add(manifest);
|
||||||
@ -112,12 +104,12 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
references.add(reference);
|
references.add(reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Manifest constructManifest(XMLSignatureFactory signatureFactory, Document document) throws NoSuchAlgorithmException,
|
private Manifest constructManifest(XMLSignatureFactory signatureFactory) throws NoSuchAlgorithmException,
|
||||||
InvalidAlgorithmParameterException {
|
InvalidAlgorithmParameterException {
|
||||||
List<Reference> manifestReferences = new LinkedList<Reference>();
|
List<Reference> manifestReferences = new LinkedList<Reference>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
addRelationshipsReferences(signatureFactory, document, manifestReferences);
|
addRelationshipsReferences(signatureFactory, manifestReferences);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("error: " + e.getMessage(), e);
|
throw new RuntimeException("error: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
@ -145,7 +137,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
return manifest;
|
return manifest;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSignatureTime(XMLSignatureFactory signatureFactory, Document document, String signatureId, List<XMLStructure> objectContent) {
|
private static void addSignatureTime(XMLSignatureFactory signatureFactory, Document document, String signatureId, List<XMLStructure> objectContent) {
|
||||||
/*
|
/*
|
||||||
* SignatureTime
|
* SignatureTime
|
||||||
*/
|
*/
|
||||||
@ -155,9 +147,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
formatElement.setTextContent("YYYY-MM-DDThh:mm:ssTZD");
|
formatElement.setTextContent("YYYY-MM-DDThh:mm:ssTZD");
|
||||||
signatureTimeElement.appendChild(formatElement);
|
signatureTimeElement.appendChild(formatElement);
|
||||||
Element valueElement = document.createElementNS("http://schemas.openxmlformats.org/package/2006/digital-signature", "mdssi:Value");
|
Element valueElement = document.createElementNS("http://schemas.openxmlformats.org/package/2006/digital-signature", "mdssi:Value");
|
||||||
DateTime dateTime = new DateTime(DateTimeZone.UTC);
|
String now = formatTimestampAsISO8601(System.currentTimeMillis());
|
||||||
DateTimeFormatter fmt = ISODateTimeFormat.dateTimeNoMillis();
|
|
||||||
String now = fmt.print(dateTime);
|
|
||||||
LOG.debug("now: " + now);
|
LOG.debug("now: " + now);
|
||||||
valueElement.setTextContent(now);
|
valueElement.setTextContent(now);
|
||||||
signatureTimeElement.appendChild(valueElement);
|
signatureTimeElement.appendChild(valueElement);
|
||||||
@ -172,6 +162,34 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
objectContent.add(signatureProperties);
|
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<Reference> references,
|
private void addSignatureInfo(XMLSignatureFactory signatureFactory, Document document, String signatureId, List<Reference> references,
|
||||||
List<XMLObject> objects) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
|
List<XMLObject> objects) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
|
||||||
List<XMLStructure> objectContent = new LinkedList<XMLStructure>();
|
List<XMLStructure> objectContent = new LinkedList<XMLStructure>();
|
||||||
@ -200,10 +218,10 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
references.add(reference);
|
references.add(reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addRelationshipsReferences(XMLSignatureFactory signatureFactory, Document document, List<Reference> manifestReferences) throws IOException,
|
private void addRelationshipsReferences(XMLSignatureFactory signatureFactory, List<Reference> manifestReferences) throws IOException,
|
||||||
ParserConfigurationException, SAXException, TransformerException, NoSuchAlgorithmException,
|
ParserConfigurationException, SAXException, NoSuchAlgorithmException,
|
||||||
InvalidAlgorithmParameterException {
|
InvalidAlgorithmParameterException {
|
||||||
URL ooxmlUrl = this.signatureService.getOfficeOpenXMLDocumentURL();
|
URL ooxmlUrl = _signatureService.getOfficeOpenXMLDocumentURL();
|
||||||
InputStream inputStream = ooxmlUrl.openStream();
|
InputStream inputStream = ooxmlUrl.openStream();
|
||||||
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
|
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
|
||||||
ZipEntry zipEntry;
|
ZipEntry zipEntry;
|
||||||
@ -212,11 +230,11 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Document relsDocument = loadDocumentNoClose(zipInputStream);
|
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<Reference> manifestReferences) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
|
List<Reference> manifestReferences) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
|
||||||
LOG.debug("relationships: " + zipEntryName);
|
LOG.debug("relationships: " + zipEntryName);
|
||||||
RelationshipTransformParameterSpec parameterSpec = new RelationshipTransformParameterSpec();
|
RelationshipTransformParameterSpec parameterSpec = new RelationshipTransformParameterSpec();
|
||||||
@ -267,7 +285,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
InvalidAlgorithmParameterException {
|
InvalidAlgorithmParameterException {
|
||||||
List<String> documentResourceNames;
|
List<String> documentResourceNames;
|
||||||
try {
|
try {
|
||||||
documentResourceNames = getResourceNames(this.signatureService.getOfficeOpenXMLDocumentURL(), contentType);
|
documentResourceNames = getResourceNames(_signatureService.getOfficeOpenXMLDocumentURL(), contentType);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@ -318,7 +336,7 @@ public class OOXMLSignatureAspect implements SignatureAspect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Document findDocument(String zipEntryName) throws IOException, ParserConfigurationException, SAXException {
|
protected Document findDocument(String zipEntryName) throws IOException, ParserConfigurationException, SAXException {
|
||||||
URL ooxmlUrl = this.signatureService.getOfficeOpenXMLDocumentURL();
|
URL ooxmlUrl = _signatureService.getOfficeOpenXMLDocumentURL();
|
||||||
InputStream inputStream = ooxmlUrl.openStream();
|
InputStream inputStream = ooxmlUrl.openStream();
|
||||||
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
|
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
|
||||||
ZipEntry zipEntry;
|
ZipEntry zipEntry;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/* ====================================================================
|
/* ====================================================================
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
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.CertificateFactory;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.security.spec.RSAKeyGenParameterSpec;
|
import java.security.spec.RSAKeyGenParameterSpec;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
@ -53,6 +54,7 @@ import javax.xml.transform.TransformerFactory;
|
|||||||
import javax.xml.transform.dom.DOMSource;
|
import javax.xml.transform.dom.DOMSource;
|
||||||
import javax.xml.transform.stream.StreamResult;
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
|
||||||
|
import org.apache.poi.util.HexRead;
|
||||||
import org.bouncycastle.asn1.ASN1InputStream;
|
import org.bouncycastle.asn1.ASN1InputStream;
|
||||||
import org.bouncycastle.asn1.ASN1Sequence;
|
import org.bouncycastle.asn1.ASN1Sequence;
|
||||||
import org.bouncycastle.asn1.DERIA5String;
|
import org.bouncycastle.asn1.DERIA5String;
|
||||||
@ -71,18 +73,18 @@ import org.bouncycastle.asn1.x509.X509Extensions;
|
|||||||
import org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
|
import org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
|
||||||
import org.bouncycastle.jce.X509Principal;
|
import org.bouncycastle.jce.X509Principal;
|
||||||
import org.bouncycastle.x509.X509V3CertificateGenerator;
|
import org.bouncycastle.x509.X509V3CertificateGenerator;
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
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() {
|
private PkiTestUtils() {
|
||||||
super();
|
// no instances of this class
|
||||||
}
|
}
|
||||||
|
|
||||||
static KeyPair generateKeyPair() throws Exception {
|
static KeyPair generateKeyPair() throws Exception {
|
||||||
@ -107,17 +109,21 @@ public class PkiTestUtils {
|
|||||||
return new AuthorityKeyIdentifier(info);
|
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,
|
X509Certificate issuerCertificate, PrivateKey issuerPrivateKey, boolean caFlag, int pathLength, String crlUri,
|
||||||
String ocspUri, KeyUsage keyUsage) throws IOException, InvalidKeyException, IllegalStateException,
|
String ocspUri, KeyUsage keyUsage) throws IOException, InvalidKeyException, IllegalStateException,
|
||||||
NoSuchAlgorithmException, SignatureException, CertificateException {
|
NoSuchAlgorithmException, SignatureException, CertificateException {
|
||||||
|
|
||||||
|
Date notBefore = makeDate(2010, 1, 1);
|
||||||
|
Date notAfter = makeDate(2011, 1, 1);
|
||||||
|
|
||||||
String signatureAlgorithm = "SHA1withRSA";
|
String signatureAlgorithm = "SHA1withRSA";
|
||||||
X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();
|
X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();
|
||||||
certificateGenerator.reset();
|
certificateGenerator.reset();
|
||||||
certificateGenerator.setPublicKey(subjectPublicKey);
|
certificateGenerator.setPublicKey(subjectPublicKey);
|
||||||
certificateGenerator.setSignatureAlgorithm(signatureAlgorithm);
|
certificateGenerator.setSignatureAlgorithm(signatureAlgorithm);
|
||||||
certificateGenerator.setNotBefore(notBefore.toDate());
|
certificateGenerator.setNotBefore(notBefore);
|
||||||
certificateGenerator.setNotAfter(notAfter.toDate());
|
certificateGenerator.setNotAfter(notAfter);
|
||||||
X509Principal issuerDN;
|
X509Principal issuerDN;
|
||||||
if (null != issuerCertificate) {
|
if (null != issuerCertificate) {
|
||||||
issuerDN = new X509Principal(issuerCertificate.getSubjectX500Principal().toString());
|
issuerDN = new X509Principal(issuerCertificate.getSubjectX500Principal().toString());
|
||||||
@ -173,6 +179,13 @@ public class PkiTestUtils {
|
|||||||
return certificate;
|
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 {
|
static Document loadDocument(InputStream documentInputStream) throws ParserConfigurationException, SAXException, IOException {
|
||||||
InputSource inputSource = new InputSource(documentInputStream);
|
InputSource inputSource = new InputSource(documentInputStream);
|
||||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/* ====================================================================
|
/* ====================================================================
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
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.lang.ArrayUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
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.AbstractOOXMLSignatureService;
|
||||||
import org.apache.poi.ooxml.signature.service.signer.ooxml.OOXMLProvider;
|
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.signer.ooxml.OOXMLSignatureVerifier;
|
||||||
import org.apache.poi.ooxml.signature.service.spi.DigestInfo;
|
import org.apache.poi.ooxml.signature.service.spi.DigestInfo;
|
||||||
import org.bouncycastle.asn1.x509.KeyUsage;
|
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 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) {
|
public OOXMLTestSignatureService(URL ooxmlUrl) {
|
||||||
this.temporaryDataStorage = new TemporaryTestDataStorage();
|
_temporaryDataStorage = new TemporaryTestDataStorage();
|
||||||
this.signedOOXMLOutputStream = new ByteArrayOutputStream();
|
_signedOOXMLOutputStream = new ByteArrayOutputStream();
|
||||||
this.ooxmlUrl = ooxmlUrl;
|
_ooxmlUrl = ooxmlUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected URL getOfficeOpenXMLDocumentURL() {
|
protected URL getOfficeOpenXMLDocumentURL() {
|
||||||
return this.ooxmlUrl;
|
return _ooxmlUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected OutputStream getSignedOfficeOpenXMLDocumentOutputStream() {
|
protected OutputStream getSignedOfficeOpenXMLDocumentOutputStream() {
|
||||||
return this.signedOOXMLOutputStream;
|
return _signedOOXMLOutputStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getSignedOfficeOpenXMLDocumentData() {
|
public byte[] getSignedOfficeOpenXMLDocumentData() {
|
||||||
return this.signedOOXMLOutputStream.toByteArray();
|
return _signedOOXMLOutputStream.toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected TemporaryDataStorage getTemporaryDataStorage() {
|
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[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
|
||||||
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
||||||
|
|
||||||
DateTime notBefore = new DateTime();
|
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), signerDn, null, keyPair.getPrivate(), true, 0,
|
||||||
DateTime notAfter = notBefore.plusYears(1);
|
|
||||||
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), signerDn, notBefore, notAfter, null, keyPair.getPrivate(), true, 0,
|
|
||||||
null, null, new KeyUsage(KeyUsage.nonRepudiation));
|
null, null, new KeyUsage(KeyUsage.nonRepudiation));
|
||||||
|
|
||||||
// operate: postSign
|
// operate: postSign
|
||||||
|
@ -69,7 +69,6 @@ import org.apache.xpath.XPathAPI;
|
|||||||
import org.bouncycastle.asn1.x509.KeyUsage;
|
import org.bouncycastle.asn1.x509.KeyUsage;
|
||||||
import org.jcp.xml.dsig.internal.dom.DOMReference;
|
import org.jcp.xml.dsig.internal.dom.DOMReference;
|
||||||
import org.jcp.xml.dsig.internal.dom.DOMXMLSignature;
|
import org.jcp.xml.dsig.internal.dom.DOMXMLSignature;
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.Node;
|
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[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
|
||||||
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
||||||
|
|
||||||
DateTime notBefore = new DateTime();
|
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
|
||||||
DateTime notAfter = notBefore.plusYears(1);
|
|
||||||
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
|
|
||||||
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
|
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[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
|
||||||
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
||||||
|
|
||||||
DateTime notBefore = new DateTime();
|
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
|
||||||
DateTime notAfter = notBefore.plusYears(1);
|
|
||||||
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
|
|
||||||
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
|
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[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
|
||||||
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
||||||
|
|
||||||
DateTime notBefore = new DateTime();
|
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
|
||||||
DateTime notAfter = notBefore.plusYears(1);
|
|
||||||
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
|
|
||||||
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
|
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[] digestInfoValue = ArrayUtils.addAll(PkiTestUtils.SHA1_DIGEST_INFO_PREFIX, digestInfo.digestValue);
|
||||||
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
byte[] signatureValue = cipher.doFinal(digestInfoValue);
|
||||||
|
|
||||||
DateTime notBefore = new DateTime();
|
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", null, keyPair.getPrivate(), true,
|
||||||
DateTime notAfter = notBefore.plusYears(1);
|
|
||||||
X509Certificate certificate = PkiTestUtils.generateCertificate(keyPair.getPublic(), "CN=Test", notBefore, notAfter, null, keyPair.getPrivate(), true,
|
|
||||||
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
|
0, null, null, new KeyUsage(KeyUsage.nonRepudiation));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user