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 CreateXMLSignatureRequestParser. */ public TransformerUtils() { this.factory = SPSSFactory.getInstance(); } public SingleSignatureInfo buildSingleSignatureInfo( at.gv.egiz.moasig.CreateXMLSignatureRequestType.SingleSignatureInfo singleSignatureInfo) throws MOAApplicationException { List dataObjectInfos = new ArrayList(); Iterator 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 CreateTransformsInfoProfile DOM element. * * @param profileElem * The CreateTransformsInfoProfile element to parse. * @return The CreateTransformsInfoProfile API object * containing the data from the profileElem. * @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 XMLDataObjectAssociationType kind of DOM element. * * @param assocElem * The XMLDataObjectAssociationType kind of DOM * elmeent to parse. * @return The XMLDataObjectAssociation API object containing * the data from the XMLDataObjectAssociationType 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 CreateSignatureEnvironmentProfile DOM element. * * @param profileElem * The CreateSignatureEnvironmentProfile DOM element * to parse. * @return The CreateSignatureEnvironmentProfile API object * containing the data from the profileElem. * @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 CreateSignatureLocation DOM element contained in a * CreateSignatureEnvironmentProfile. * * @param profileElem * The CreateSignatureEnvironmentProfile DOM element * containing the CreateSignatureLocation. * @return The CreateSignatureLocation API object containing * the data from the CreateSignatureLocation 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 Supplement DOM elements contained in a given * parent DOM element. * * @param supplementsParentElem * The DOM element being the parent of the * Supplements. * @return A List of Supplement API objects * containing the data from the Supplement DOM * elements. * @throws MOAApplicationException */ private List parseSupplements(List supplementsList) throws MOAApplicationException { List supplements = new ArrayList(); Iterator 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 CreateTransformsInfo DOM element contained in a * CreateTransformsInfoProfile. * * @param profileElem * The CreateTransformsInfoProfile DOM element * containing the CreateTransformsInfo. * @return The CreateTransformsInfo API object containinig the * data from the CreateTransformsInfo DOM element. * @throws MOAApplicationException * An error occurred parsing the * CreateTransformsInfo 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 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 DataObject DOM element contained in a given * VerifyCMSSignatureRequest DOM element. * * @param requestElem * The VerifyCMSSignatureRequest DOM element to * parse. * @return The CMSDataObject API object containing the data * from the DataObject 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 DataObject DOM element contained in a given * VerifyCMSSignatureRequest DOM element. * * @param requestElem * The VerifyCMSSignatureRequest DOM element to * parse. * @return The CMSDataObject API object containing the data * from the DataObject 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 CMSContentBaseType kind of * DOM element. * * @param contentElem * The CMSContentBaseType kind of element to parse. * @return A CMSDataObject 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()); } } }