diff options
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.java | 518 |
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()); + } + } +} |