aboutsummaryrefslogtreecommitdiff
path: root/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/TransformerUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/TransformerUtils.java')
-rw-r--r--moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/TransformerUtils.java518
1 files changed, 518 insertions, 0 deletions
diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/TransformerUtils.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/TransformerUtils.java
new file mode 100644
index 0000000..b069a60
--- /dev/null
+++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/TransformerUtils.java
@@ -0,0 +1,518 @@
+package at.gv.egovernment.moa.spss.server.webservice.binding;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.security.cert.CertificateEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBElement;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import at.gv.egiz.moasig.MetaInfoType;
+import at.gv.egiz.moasig.PublicAuthorityType;
+import at.gv.egiz.moasig.QualifiedCertificate;
+import at.gv.egiz.moasig.SecureSignatureCreationDevice;
+import at.gv.egovernment.moa.spss.MOAApplicationException;
+import at.gv.egovernment.moa.spss.api.SPSSFactory;
+import at.gv.egovernment.moa.spss.api.cmsverify.CMSContent;
+import at.gv.egovernment.moa.spss.api.cmsverify.CMSDataObject;
+import at.gv.egovernment.moa.spss.api.common.Content;
+import at.gv.egovernment.moa.spss.api.common.MetaInfo;
+import at.gv.egovernment.moa.spss.api.common.XMLDataObjectAssociation;
+import at.gv.egovernment.moa.spss.api.xmlsign.CreateSignatureEnvironmentProfile;
+import at.gv.egovernment.moa.spss.api.xmlsign.CreateSignatureInfo;
+import at.gv.egovernment.moa.spss.api.xmlsign.CreateSignatureLocation;
+import at.gv.egovernment.moa.spss.api.xmlsign.CreateTransformsInfo;
+import at.gv.egovernment.moa.spss.api.xmlsign.CreateTransformsInfoProfile;
+import at.gv.egovernment.moa.spss.api.xmlsign.DataObjectInfo;
+import at.gv.egovernment.moa.spss.api.xmlsign.SingleSignatureInfo;
+import iaik.utils.RFC2253NameParser;
+import iaik.utils.RFC2253NameParserException;
+
+public class TransformerUtils {
+
+ /** The factory to create API objects. */
+ private SPSSFactory factory;
+
+ /**
+ * Create a new <code>CreateXMLSignatureRequestParser</code>.
+ */
+ public TransformerUtils() {
+ this.factory = SPSSFactory.getInstance();
+ }
+
+ public SingleSignatureInfo buildSingleSignatureInfo(
+ at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo singleSignatureInfo)
+ throws MOAApplicationException {
+
+ List dataObjectInfos = new ArrayList();
+
+ Iterator<at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo.DataObjectInfo> dataObjectInfoIterator = singleSignatureInfo
+ .getDataObjectInfo().iterator();
+
+ while (dataObjectInfoIterator.hasNext()) {
+ dataObjectInfos.add(buildDataObjectInfo(dataObjectInfoIterator.next()));
+ }
+
+ at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo.CreateSignatureInfo createSignatureInfoWeb = singleSignatureInfo
+ .getCreateSignatureInfo();
+
+ CreateSignatureInfo createSignatureInfo = buildCreateSignatureInfo(createSignatureInfoWeb);
+
+ boolean securityLayerConform = singleSignatureInfo.isSecurityLayerConformity();
+
+ return factory.createSingleSignatureInfo(dataObjectInfos, createSignatureInfo, securityLayerConform);
+ }
+
+ public DataObjectInfo buildDataObjectInfo(
+ at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo.DataObjectInfo dataObjectInfo)
+ throws MOAApplicationException {
+ String structure = dataObjectInfo.getStructure();
+ boolean childOfManifest = dataObjectInfo.isChildOfManifest();
+
+ Content dataObject = buildContent(dataObjectInfo.getDataObject());
+
+ CreateTransformsInfoProfile createTransformsInfoProfile = parseCreateTransformsInfoProfile(
+ dataObjectInfo.getCreateTransformsInfoProfile());
+
+ return factory.createDataObjectInfo(structure, childOfManifest, dataObject, createTransformsInfoProfile);
+ }
+
+ public CreateSignatureInfo buildCreateSignatureInfo(
+ at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo.CreateSignatureInfo createSignatureInfo)
+ throws MOAApplicationException {
+ // TODO:
+ if (createSignatureInfo == null) {
+ return null;
+ } else {
+ Content environment = buildContent(createSignatureInfo.getCreateSignatureEnvironment());
+ CreateSignatureEnvironmentProfile environmentProfile = parseCreateSignatureEnvironmentProfile(
+ createSignatureInfo);
+ return factory.createCreateSignatureInfo(environment, environmentProfile);
+ }
+ }
+
+ public CreateSignatureEnvironmentProfile parseCreateSignatureEnvironmentProfile(
+ at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo.CreateSignatureInfo createSignatureInfo)
+ throws MOAApplicationException {
+ if (createSignatureInfo.getCreateSignatureEnvironmentProfile() != null) {
+ return parseCreateSignatureEnvironmentProfile(createSignatureInfo.getCreateSignatureEnvironmentProfile());
+ } else {
+ String profileID = createSignatureInfo.getCreateSignatureEnvironmentProfileID();
+ return factory.createCreateSignatureEnvironmentProfile(profileID);
+ }
+ }
+
+ public CreateTransformsInfoProfile parseCreateTransformsInfoProfile(
+ at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo.DataObjectInfo dataObjectInfo)
+ throws MOAApplicationException {
+ if (dataObjectInfo.getCreateTransformsInfoProfile() != null) {
+ at.gv.egiz.moasig.CreateTransformsInfoProfile createTransformsInfoProfile = dataObjectInfo
+ .getCreateTransformsInfoProfile();
+ return parseCreateTransformsInfoProfile(createTransformsInfoProfile);
+ } else {
+ String profileID = dataObjectInfo.getCreateTransformsInfoProfileID();
+ return factory.createCreateTransformsInfoProfile(profileID);
+ }
+ }
+
+ /**
+ * Parse a <code>CreateTransformsInfoProfile</code> DOM element.
+ *
+ * @param profileElem
+ * The <code>CreateTransformsInfoProfile</code> element to parse.
+ * @return The <code>CreateTransformsInfoProfile</code> API object
+ * containing the data from the <code>profileElem</code>.
+ * @throws MOAApplicationException
+ * An error occurred parsing the DOM element.
+ */
+ public CreateTransformsInfoProfile parseCreateTransformsInfoProfile(
+ at.gv.egiz.moasig.CreateTransformsInfoProfile createTransformsInfoProfile) throws MOAApplicationException {
+ CreateTransformsInfo createTransformsInfo = parseCreateTransformsInfo(
+ createTransformsInfoProfile.getCreateTransformsInfo());
+ List supplements = parseSupplements(createTransformsInfoProfile.getSupplement());
+ return factory.createCreateTransformsInfoProfile(createTransformsInfo, supplements);
+ }
+
+ /**
+ * Parse a <code>XMLDataObjectAssociationType</code> kind of DOM element.
+ *
+ * @param assocElem
+ * The <code>XMLDataObjectAssociationType</code> kind of DOM
+ * elmeent to parse.
+ * @return The <code>XMLDataObjectAssociation</code> API object containing
+ * the data from the <code>XMLDataObjectAssociationType</code> DOM
+ * element.
+ * @throws MOAApplicationException
+ */
+ public XMLDataObjectAssociation parseXMLDataObjectAssociation(
+ at.gv.egiz.moasig.XMLDataObjectAssociationType xmlDataObjectAssociationType)
+ throws MOAApplicationException {
+
+ MetaInfo metaInfo = parseMetaInfo(xmlDataObjectAssociationType.getMetaInfo());
+
+ Content content = buildContent(xmlDataObjectAssociationType.getContent());
+
+ return factory.createXMLDataObjectAssociation(metaInfo, content);
+ }
+
+ /**
+ * Parse a <code>CreateSignatureEnvironmentProfile</code> DOM element.
+ *
+ * @param profileElem
+ * The <code>CreateSignatureEnvironmentProfile</code> DOM element
+ * to parse.
+ * @return The <code>CreateSignatureEnvironmentProfile</code> API object
+ * containing the data from the <code>profileElem</code>.
+ * @throws MOAApplicationException
+ */
+ public CreateSignatureEnvironmentProfile parseCreateSignatureEnvironmentProfile(
+ at.gv.egiz.moasig.CreateSignatureEnvironmentProfile createSignatureEnvironmentProfile)
+ throws MOAApplicationException {
+
+ CreateSignatureLocation createSignatureLocation = parseCreateSignatureLocation(
+ createSignatureEnvironmentProfile.getCreateSignatureLocation());
+ List supplements = parseSupplements(createSignatureEnvironmentProfile.getSupplement());
+
+ return factory.createCreateSignatureEnvironmentProfile(createSignatureLocation, supplements);
+ }
+
+ /**
+ * Parse a <code>CreateSignatureLocation</code> DOM element contained in a
+ * <code>CreateSignatureEnvironmentProfile</code>.
+ *
+ * @param profileElem
+ * The <code>CreateSignatureEnvironmentProfile</code> DOM element
+ * containing the <code>CreateSignatureLocation</code>.
+ * @return The <code>CreateSignatureLocation</code> API object containing
+ * the data from the <code>CreateSignatureLocation</code> DOM
+ * element.
+ */
+ private CreateSignatureLocation parseCreateSignatureLocation(
+ at.gv.egiz.moasig.CreateSignatureLocationType createSignatureLocationType) {
+
+ String xPathExpression = createSignatureLocationType.getValue();
+ Map namespaceDeclarations = new HashMap();// DOMUtils.getNamespaceDeclarations(locationElem);
+ int index = createSignatureLocationType.getIndex().intValue();
+ // Integer.parseInt(indexStr);
+
+ return factory.createCreateSignatureLocation(xPathExpression, index, namespaceDeclarations);
+ }
+
+ /**
+ * Parse all <code>Supplement</code> DOM elements contained in a given
+ * parent DOM element.
+ *
+ * @param supplementsParentElem
+ * The DOM element being the parent of the
+ * <code>Supplement</code>s.
+ * @return A <code>List</code> of <code>Supplement</code> API objects
+ * containing the data from the <code>Supplement</code> DOM
+ * elements.
+ * @throws MOAApplicationException
+ */
+ private List parseSupplements(List<at.gv.egiz.moasig.XMLDataObjectAssociationType> supplementsList)
+ throws MOAApplicationException {
+ List supplements = new ArrayList();
+ Iterator<at.gv.egiz.moasig.XMLDataObjectAssociationType> supplementsIterator = supplementsList.iterator();
+
+ while (supplementsIterator.hasNext()) {
+ at.gv.egiz.moasig.XMLDataObjectAssociationType xmlDataObjectAssociationType = supplementsIterator.next();
+ XMLDataObjectAssociation supplement = parseXMLDataObjectAssociation(xmlDataObjectAssociationType);
+ supplements.add(supplement);
+ }
+ return supplements;
+ }
+
+ /**
+ * Parse the <code>CreateTransformsInfo</code> DOM element contained in a
+ * <code>CreateTransformsInfoProfile</code>.
+ *
+ * @param profileElem
+ * The <code>CreateTransformsInfoProfile</code> DOM element
+ * containing the <code>CreateTransformsInfo</code>.
+ * @return The <code>CreateTransformsInfo</code> API object containinig the
+ * data from the <code>CreateTransformsInfo</code> DOM element.
+ * @throws MOAApplicationException
+ * An error occurred parsing the
+ * <code>CreateTransformsInfo</code> DOM element.
+ */
+ public CreateTransformsInfo parseCreateTransformsInfo(at.gv.egiz.moasig.TransformsInfoType transformsInfoType)
+ throws MOAApplicationException {
+ MetaInfo finalDataMetaInfo = null;
+ List transforms = null;
+ if (transformsInfoType != null) {
+ if (transformsInfoType.getMoaTransforms() != null) {
+ if (transformsInfoType.getMoaTransforms() != null) {
+ // Transform Parser with MoaTransformsType
+ at.gv.egovernment.moa.spss.server.webservice.binding.TransformParser parser = new at.gv.egovernment.moa.spss.server.webservice.binding.TransformParser();
+ transforms = parser.parseTransforms(transformsInfoType.getMoaTransforms());
+ }
+ }
+
+ finalDataMetaInfo = parseMetaInfo(transformsInfoType.getFinalDataMetaInfo());
+ }
+ return factory.createCreateTransformsInfo(transforms, finalDataMetaInfo);
+ }
+
+ public Content buildContent(at.gv.egiz.moasig.DataObjectInfoType.DataObject dataObject)
+ throws MOAApplicationException {
+ String referenceURI = dataObject.getReference();
+ if (dataObject.getBase64Content() != null) {
+ return factory.createContent(new ByteArrayInputStream(dataObject.getBase64Content()), referenceURI);
+ } else if (dataObject.getLocRefContent() != null) {
+ String locationReferenceURI = dataObject.getLocRefContent();
+ return factory.createContent(locationReferenceURI, referenceURI);
+ } else {
+ return factory.createContent(referenceURI);
+ }
+ }
+
+ public Content buildContent(at.gv.egiz.moasig.ContentOptionalRefType contentBaseType)
+ throws MOAApplicationException {
+
+ String referenceURI = contentBaseType.getReference();
+
+ if (contentBaseType.getBase64Content() != null) {
+ return factory.createContent(new ByteArrayInputStream(contentBaseType.getBase64Content()), referenceURI);
+ } else if (contentBaseType.getLocRefContent() != null) {
+ String locationReferenceURI = contentBaseType.getLocRefContent();
+ return factory.createContent(locationReferenceURI, referenceURI);
+ } else {
+ return factory.createContent(referenceURI);
+ }
+ }
+
+ public MetaInfo parseMetaInfo(at.gv.egiz.moasig.FinalDataMetaInfoType metaInfoElem) {
+ SPSSFactory factory = SPSSFactory.getInstance();
+
+ String mimeType = metaInfoElem.getMimeType();
+ String description = metaInfoElem.getDescription();
+ String type = metaInfoElem.getType();
+ // TODO: any type not supported
+
+ return factory.createMetaInfo(mimeType, description, null, type);
+ }
+
+ public MetaInfo parseMetaInfo(at.gv.egiz.moasig.MetaInfoType metaInfoElem) {
+ SPSSFactory factory = SPSSFactory.getInstance();
+
+ String mimeType = metaInfoElem.getMimeType();
+ String description = metaInfoElem.getDescription();
+ // TODO: any and type not supported
+
+ return factory.createMetaInfo(mimeType, description, null, null);
+ }
+
+ public at.gv.egiz.moasig.KeyInfoType buildSignerInfo(at.gv.egovernment.moa.spss.api.common.SignerInfo signerInfo)
+ throws MOAApplicationException {
+ at.gv.egiz.moasig.KeyInfoType infoType = new at.gv.egiz.moasig.KeyInfoType();
+
+ at.gv.egiz.moasig.X509DataType x509DataType = new at.gv.egiz.moasig.X509DataType();
+
+ at.gv.egiz.moasig.ObjectFactory of = new at.gv.egiz.moasig.ObjectFactory();
+
+ // Set Issuer
+
+ at.gv.egiz.moasig.X509IssuerSerialType x509IssuerSerialType = new at.gv.egiz.moasig.X509IssuerSerialType();
+
+ x509IssuerSerialType.setX509IssuerName(signerInfo.getSignerCertificate().getIssuerDN().getName());
+ x509IssuerSerialType.setX509SerialNumber(signerInfo.getSignerCertificate().getSerialNumber());
+
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName()
+ .add(of.createX509DataTypeX509IssuerSerial(x509IssuerSerialType));
+
+ // Set Subject
+ try {
+ RFC2253NameParser parser = new RFC2253NameParser(
+ signerInfo.getSignerCertificate().getSubjectDN().getName());
+ String subjectRfc2253 = parser.parse().getRFC2253String();
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName()
+ .add(of.createX509DataTypeX509SubjectName(subjectRfc2253));
+ } catch (RFC2253NameParserException e) {
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName().add(
+ of.createX509DataTypeX509SubjectName(signerInfo.getSignerCertificate().getSubjectDN().getName()));
+ }
+
+ // Set Certificate
+ try {
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName()
+ .add(of.createX509DataTypeX509Certificate(signerInfo.getSignerCertificate().getEncoded()));
+ } catch (CertificateEncodingException e) {
+ throw new MOAApplicationException("2245", null, e);
+ }
+
+ // Qualified Cert
+
+ if (signerInfo.isQualifiedCertificate()) {
+ QualifiedCertificate qualifiedCertificate = of.createQualifiedCertificate();
+ if ("TLS".compareToIgnoreCase(signerInfo.getQCSource()) == 0) {
+ qualifiedCertificate.setSource(signerInfo.getQCSource());
+ }
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName().add(qualifiedCertificate);
+ }
+
+ // Public Authority
+
+ if (signerInfo.isPublicAuthority()) {
+ PublicAuthorityType publicAuthorityType = of.createPublicAuthorityType();
+
+ if (signerInfo.getPublicAuhtorityID() != null) {
+ publicAuthorityType.setCode(signerInfo.getPublicAuhtorityID());
+ }
+
+ JAXBElement<PublicAuthorityType> publicAuthority = of.createPublicAuthority(publicAuthorityType);
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName().add(publicAuthority);
+ }
+
+ // ssCD
+
+ if (signerInfo.isSSCD()) {
+ SecureSignatureCreationDevice sscd = of.createSecureSignatureCreationDevice();
+ sscd.setSource(signerInfo.getSSCDSource());
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName().add(sscd);
+ }
+
+ if (signerInfo.getIssuerCountryCode() != null) {
+ x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName()
+ .add(of.createIssuingCountry(signerInfo.getIssuerCountryCode()));
+ }
+
+ return infoType;
+ }
+
+ public at.gv.egiz.moasig.CheckResultType buildCheckResult(
+ at.gv.egovernment.moa.spss.api.common.CheckResult checkResult) {
+ at.gv.egiz.moasig.CheckResultType checkResultType = new at.gv.egiz.moasig.CheckResultType();
+ checkResultType.setCode(BigInteger.valueOf(checkResult.getCode()));
+
+ if (checkResult.getInfo() != null) {
+ at.gv.egiz.moasig.AnyChildrenType anyInfos = new at.gv.egiz.moasig.AnyChildrenType();
+
+ for (int idx = 0; idx < checkResult.getInfo().getLength(); idx++) {
+ Node node = checkResult.getInfo().item(idx);
+ if (node instanceof Element) {
+ anyInfos.getContent().add((Element) node);
+ }
+ }
+
+ checkResultType.setInfo(anyInfos);
+ }
+ return checkResultType;
+ }
+
+ /**
+ * Parse a the <code>DataObject</code> DOM element contained in a given
+ * <code>VerifyCMSSignatureRequest</code> DOM element.
+ *
+ * @param requestElem
+ * The <code>VerifyCMSSignatureRequest</code> DOM element to
+ * parse.
+ * @return The <code>CMSDataObject</code> API object containing the data
+ * from the <code>DataObject</code> DOM element.
+ */
+ public CMSDataObject parseDataObject(at.gv.egiz.moasig.CMSDataObjectRequiredMetaType cmsDataObject) {
+
+ if (cmsDataObject != null) {
+ MetaInfo metaInfo = null;
+
+ MetaInfoType metaInfoType = cmsDataObject.getMetaInfo();
+
+ if (metaInfoType != null) {
+ metaInfo = this.parseMetaInfo(metaInfoType);
+ }
+
+ at.gv.egiz.moasig.CMSContentBaseType cmsContent = cmsDataObject.getContent();
+
+ CMSContent content = parseContent(cmsContent);
+
+ BigDecimal excludeByteRangeFrom = null;
+
+ if (cmsDataObject.getFrom() != null) {
+ excludeByteRangeFrom = new BigDecimal(cmsDataObject.getFrom());
+ }
+
+ BigDecimal excludeByteRangeTo = null;
+ if (cmsDataObject.getTo() != null) {
+ excludeByteRangeTo = new BigDecimal(cmsDataObject.getTo());
+ }
+
+ return factory.createCMSDataObject(metaInfo, content, excludeByteRangeFrom, excludeByteRangeTo);
+
+ } else {
+ return null;
+ }
+
+ }
+
+ /**
+ * Parse a the <code>DataObject</code> DOM element contained in a given
+ * <code>VerifyCMSSignatureRequest</code> DOM element.
+ *
+ * @param requestElem
+ * The <code>VerifyCMSSignatureRequest</code> DOM element to
+ * parse.
+ * @return The <code>CMSDataObject</code> API object containing the data
+ * from the <code>DataObject</code> DOM element.
+ */
+ public CMSDataObject parseDataObject(at.gv.egiz.moasig.CMSDataObjectOptionalMetaType cmsDataObject) {
+
+ if (cmsDataObject != null) {
+ MetaInfo metaInfo = null;
+
+ MetaInfoType metaInfoType = cmsDataObject.getMetaInfo();
+
+ if (metaInfoType != null) {
+ metaInfo = this.parseMetaInfo(metaInfoType);
+ }
+
+ at.gv.egiz.moasig.CMSContentBaseType cmsContent = cmsDataObject.getContent();
+
+ CMSContent content = parseContent(cmsContent);
+
+ BigDecimal excludeByteRangeFrom = null;
+
+ if (cmsDataObject.getFrom() != null) {
+ excludeByteRangeFrom = new BigDecimal(cmsDataObject.getFrom());
+ }
+
+ BigDecimal excludeByteRangeTo = null;
+ if (cmsDataObject.getTo() != null) {
+ excludeByteRangeTo = new BigDecimal(cmsDataObject.getTo());
+ }
+
+ return factory.createCMSDataObject(metaInfo, content, excludeByteRangeFrom, excludeByteRangeTo);
+
+ } else {
+ return null;
+ }
+
+ }
+
+ /**
+ * Parse the content contained in a <code>CMSContentBaseType</code> kind of
+ * DOM element.
+ *
+ * @param contentElem
+ * The <code>CMSContentBaseType</code> kind of element to parse.
+ * @return A <code>CMSDataObject</code> API object containing the data from
+ * the given DOM element.
+ */
+ public CMSContent parseContent(at.gv.egiz.moasig.CMSContentBaseType cmsContent) {
+
+ if (cmsContent.getBase64Content() != null) {
+ InputStream binaryContent = new ByteArrayInputStream(cmsContent.getBase64Content());
+ return factory.createCMSContent(binaryContent);
+ } else {
+ return factory.createCMSContent(cmsContent.getReference());
+ }
+ }
+}