only refactorings to break up the long method

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1849130 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2018-12-17 22:29:03 +00:00
parent 17a7cb609b
commit 9f3c99c25c
1 changed files with 100 additions and 75 deletions

View File

@ -24,10 +24,12 @@
package org.apache.poi.poifs.crypt.dsig.facets; package org.apache.poi.poifs.crypt.dsig.facets;
import static java.util.Collections.singletonList;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -58,21 +60,18 @@ import org.etsi.uri.x01903.v13.CertIDType;
import org.etsi.uri.x01903.v13.ClaimedRolesListType; import org.etsi.uri.x01903.v13.ClaimedRolesListType;
import org.etsi.uri.x01903.v13.DataObjectFormatType; import org.etsi.uri.x01903.v13.DataObjectFormatType;
import org.etsi.uri.x01903.v13.DigestAlgAndValueType; import org.etsi.uri.x01903.v13.DigestAlgAndValueType;
import org.etsi.uri.x01903.v13.IdentifierType;
import org.etsi.uri.x01903.v13.ObjectIdentifierType; import org.etsi.uri.x01903.v13.ObjectIdentifierType;
import org.etsi.uri.x01903.v13.QualifyingPropertiesDocument; import org.etsi.uri.x01903.v13.QualifyingPropertiesDocument;
import org.etsi.uri.x01903.v13.QualifyingPropertiesType; import org.etsi.uri.x01903.v13.QualifyingPropertiesType;
import org.etsi.uri.x01903.v13.SigPolicyQualifiersListType;
import org.etsi.uri.x01903.v13.SignaturePolicyIdType; import org.etsi.uri.x01903.v13.SignaturePolicyIdType;
import org.etsi.uri.x01903.v13.SignaturePolicyIdentifierType; import org.etsi.uri.x01903.v13.SignaturePolicyIdentifierType;
import org.etsi.uri.x01903.v13.SignedDataObjectPropertiesType;
import org.etsi.uri.x01903.v13.SignedPropertiesType; import org.etsi.uri.x01903.v13.SignedPropertiesType;
import org.etsi.uri.x01903.v13.SignedSignaturePropertiesType; import org.etsi.uri.x01903.v13.SignedSignaturePropertiesType;
import org.etsi.uri.x01903.v13.SignerRoleType; import org.etsi.uri.x01903.v13.SignerRoleType;
import org.w3.x2000.x09.xmldsig.DigestMethodType; import org.w3.x2000.x09.xmldsig.DigestMethodType;
import org.w3.x2000.x09.xmldsig.X509IssuerSerialType; import org.w3.x2000.x09.xmldsig.X509IssuerSerialType;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Node;
/** /**
* XAdES Signature Facet. Implements XAdES v1.4.1 which is compatible with XAdES * XAdES Signature Facet. Implements XAdES v1.4.1 which is compatible with XAdES
@ -92,7 +91,7 @@ public class XAdESSignatureFacet extends SignatureFacet {
private static final String XADES_TYPE = "http://uri.etsi.org/01903#SignedProperties"; private static final String XADES_TYPE = "http://uri.etsi.org/01903#SignedProperties";
private Map<String, String> dataObjectFormatMimeTypes = new HashMap<>(); private final Map<String, String> dataObjectFormatMimeTypes = new HashMap<>();
@Override @Override
@ -116,96 +115,122 @@ public class XAdESSignatureFacet extends SignatureFacet {
SignedSignaturePropertiesType signedSignatureProperties = signedProperties.addNewSignedSignatureProperties(); SignedSignaturePropertiesType signedSignatureProperties = signedProperties.addNewSignedSignatureProperties();
// SigningTime // SigningTime
addSigningTime(signedSignatureProperties);
// SigningCertificate
addCertificate(signedSignatureProperties);
// ClaimedRole
addXadesRole(signedSignatureProperties);
// XAdES-EPES
addPolicy(signedSignatureProperties);
// DataObjectFormat
addMimeTypes(signedProperties);
// add XAdES ds:Object
objects.add(addXadesObject(document, qualifyingProperties));
// add XAdES ds:Reference
references.add(addXadesReference());
}
private void addSigningTime(SignedSignaturePropertiesType signedSignatureProperties) {
Calendar xmlGregorianCalendar = Calendar.getInstance(TimeZone.getTimeZone("Z"), Locale.ROOT); Calendar xmlGregorianCalendar = Calendar.getInstance(TimeZone.getTimeZone("Z"), Locale.ROOT);
xmlGregorianCalendar.setTime(signatureConfig.getExecutionTime()); xmlGregorianCalendar.setTime(signatureConfig.getExecutionTime());
xmlGregorianCalendar.clear(Calendar.MILLISECOND); xmlGregorianCalendar.clear(Calendar.MILLISECOND);
signedSignatureProperties.setSigningTime(xmlGregorianCalendar); signedSignatureProperties.setSigningTime(xmlGregorianCalendar);
}
// SigningCertificate private void addCertificate(SignedSignaturePropertiesType signedSignatureProperties) {
if (signatureConfig.getSigningCertificateChain() == null List<X509Certificate> chain = signatureConfig.getSigningCertificateChain();
|| signatureConfig.getSigningCertificateChain().isEmpty()) { if (chain == null || chain.isEmpty()) {
throw new RuntimeException("no signing certificate chain available"); throw new RuntimeException("no signing certificate chain available");
} }
CertIDListType signingCertificates = signedSignatureProperties.addNewSigningCertificate(); CertIDListType signingCertificates = signedSignatureProperties.addNewSigningCertificate();
CertIDType certId = signingCertificates.addNewCert(); CertIDType certId = signingCertificates.addNewCert();
X509Certificate certificate = signatureConfig.getSigningCertificateChain().get(0); setCertID(certId, signatureConfig, signatureConfig.isXadesIssuerNameNoReverseOrder(), chain.get(0));
setCertID(certId, signatureConfig, signatureConfig.isXadesIssuerNameNoReverseOrder(), certificate); }
// ClaimedRole private void addXadesRole(SignedSignaturePropertiesType signedSignatureProperties) {
String role = signatureConfig.getXadesRole(); String role = signatureConfig.getXadesRole();
if (role != null && !role.isEmpty()) { if (role == null || role.isEmpty()) {
SignerRoleType signerRole = signedSignatureProperties.addNewSignerRole(); return;
signedSignatureProperties.setSignerRole(signerRole);
ClaimedRolesListType claimedRolesList = signerRole.addNewClaimedRoles();
AnyType claimedRole = claimedRolesList.addNewClaimedRole();
XmlString roleString = XmlString.Factory.newInstance();
roleString.setStringValue(role);
insertXChild(claimedRole, roleString);
} }
// XAdES-EPES SignerRoleType signerRole = signedSignatureProperties.addNewSignerRole();
signedSignatureProperties.setSignerRole(signerRole);
ClaimedRolesListType claimedRolesList = signerRole.addNewClaimedRoles();
AnyType claimedRole = claimedRolesList.addNewClaimedRole();
XmlString roleString = XmlString.Factory.newInstance();
roleString.setStringValue(role);
insertXChild(claimedRole, roleString);
}
private void addPolicy(SignedSignaturePropertiesType signedSignatureProperties) {
SignaturePolicyService policyService = signatureConfig.getSignaturePolicyService(); SignaturePolicyService policyService = signatureConfig.getSignaturePolicyService();
if (policyService != null) { if (policyService == null) {
SignaturePolicyIdentifierType signaturePolicyIdentifier = if (signatureConfig.isXadesSignaturePolicyImplied()) {
signedSignatureProperties.addNewSignaturePolicyIdentifier(); signedSignatureProperties.
addNewSignaturePolicyIdentifier().
SignaturePolicyIdType signaturePolicyId = signaturePolicyIdentifier.addNewSignaturePolicyId(); addNewSignaturePolicyImplied();
ObjectIdentifierType objectIdentifier = signaturePolicyId.addNewSigPolicyId();
objectIdentifier.setDescription(policyService.getSignaturePolicyDescription());
IdentifierType identifier = objectIdentifier.addNewIdentifier();
identifier.setStringValue(policyService.getSignaturePolicyIdentifier());
byte[] signaturePolicyDocumentData = policyService.getSignaturePolicyDocument();
DigestAlgAndValueType sigPolicyHash = signaturePolicyId.addNewSigPolicyHash();
setDigestAlgAndValue(sigPolicyHash, signaturePolicyDocumentData, signatureConfig.getDigestAlgo());
String signaturePolicyDownloadUrl = policyService.getSignaturePolicyDownloadUrl();
if (null != signaturePolicyDownloadUrl) {
SigPolicyQualifiersListType sigPolicyQualifiers = signaturePolicyId.addNewSigPolicyQualifiers();
AnyType sigPolicyQualifier = sigPolicyQualifiers.addNewSigPolicyQualifier();
XmlString spUriElement = XmlString.Factory.newInstance();
spUriElement.setStringValue(signaturePolicyDownloadUrl);
insertXChild(sigPolicyQualifier, spUriElement);
} }
} else if (signatureConfig.isXadesSignaturePolicyImplied()) { return;
SignaturePolicyIdentifierType signaturePolicyIdentifier =
signedSignatureProperties.addNewSignaturePolicyIdentifier();
signaturePolicyIdentifier.addNewSignaturePolicyImplied();
} }
// DataObjectFormat SignaturePolicyIdentifierType policyId =
if (!dataObjectFormatMimeTypes.isEmpty()) { signedSignatureProperties.addNewSignaturePolicyIdentifier();
SignedDataObjectPropertiesType signedDataObjectProperties =
signedProperties.addNewSignedDataObjectProperties();
List<DataObjectFormatType> dataObjectFormats = signedDataObjectProperties SignaturePolicyIdType signaturePolicyId = policyId.addNewSignaturePolicyId();
.getDataObjectFormatList();
for (Map.Entry<String, String> dataObjectFormatMimeType : this.dataObjectFormatMimeTypes ObjectIdentifierType oit = signaturePolicyId.addNewSigPolicyId();
.entrySet()) { oit.setDescription(policyService.getSignaturePolicyDescription());
DataObjectFormatType dataObjectFormat = DataObjectFormatType.Factory.newInstance(); oit.addNewIdentifier().setStringValue(policyService.getSignaturePolicyIdentifier());
dataObjectFormat.setObjectReference("#" + dataObjectFormatMimeType.getKey());
dataObjectFormat.setMimeType(dataObjectFormatMimeType.getValue()); byte[] signaturePolicyDocumentData = policyService.getSignaturePolicyDocument();
dataObjectFormats.add(dataObjectFormat); DigestAlgAndValueType sigPolicyHash = signaturePolicyId.addNewSigPolicyHash();
} setDigestAlgAndValue(sigPolicyHash, signaturePolicyDocumentData, signatureConfig.getDigestAlgo());
String signaturePolicyDownloadUrl = policyService.getSignaturePolicyDownloadUrl();
if (signaturePolicyDownloadUrl == null) {
return;
}
AnyType sigPolicyQualifier =
signaturePolicyId.addNewSigPolicyQualifiers().addNewSigPolicyQualifier();
XmlString spUriElement = XmlString.Factory.newInstance();
spUriElement.setStringValue(signaturePolicyDownloadUrl);
insertXChild(sigPolicyQualifier, spUriElement);
}
private void addMimeTypes(SignedPropertiesType signedProperties) {
if (dataObjectFormatMimeTypes.isEmpty()) {
return;
} }
// add XAdES ds:Object List<DataObjectFormatType> dataObjectFormats =
List<XMLStructure> xadesObjectContent = new ArrayList<>(); signedProperties.
Element qualDocElSrc = (Element)qualifyingProperties.getDomNode(); addNewSignedDataObjectProperties().
Element qualDocEl = (Element)document.importNode(qualDocElSrc, true); getDataObjectFormatList();
xadesObjectContent.add(new DOMStructure(qualDocEl));
XMLObject xadesObject = getSignatureFactory().newXMLObject(xadesObjectContent, null, null, null);
objects.add(xadesObject);
// add XAdES ds:Reference dataObjectFormatMimeTypes.forEach((key,value) -> {
List<Transform> transforms = new ArrayList<>(); DataObjectFormatType dof = DataObjectFormatType.Factory.newInstance();
Transform exclusiveTransform = newTransform(CanonicalizationMethod.INCLUSIVE); dof.setObjectReference("#" + key);
transforms.add(exclusiveTransform); dof.setMimeType(value);
Reference reference = newReference dataObjectFormats.add(dof);
("#"+signatureConfig.getXadesSignatureId(), transforms, XADES_TYPE, null, null); });
references.add(reference); }
private XMLObject addXadesObject(Document document, QualifyingPropertiesType qualifyingProperties) {
Node qualDocElSrc = qualifyingProperties.getDomNode();
Node qualDocEl = document.importNode(qualDocElSrc, true);
List<XMLStructure> xadesObjectContent = Arrays.asList(new DOMStructure(qualDocEl));
return getSignatureFactory().newXMLObject(xadesObjectContent, null, null, null);
}
private Reference addXadesReference() throws XMLSignatureException {
List<Transform> transforms = singletonList(newTransform(CanonicalizationMethod.INCLUSIVE));
return newReference("#"+signatureConfig.getXadesSignatureId(), transforms, XADES_TYPE, null, null);
} }
/** /**