diff options
Diffstat (limited to 'moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/XMLVerifySignatureBindingImpl.java')
-rw-r--r-- | moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/XMLVerifySignatureBindingImpl.java | 503 |
1 files changed, 503 insertions, 0 deletions
diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/XMLVerifySignatureBindingImpl.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/XMLVerifySignatureBindingImpl.java new file mode 100644 index 0000000..8295aed --- /dev/null +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/webservice/binding/XMLVerifySignatureBindingImpl.java @@ -0,0 +1,503 @@ +package at.gv.egovernment.moa.spss.server.webservice.binding; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.security.cert.CertificateEncodingException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import javax.xml.bind.JAXBElement; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; + +import org.apache.commons.io.IOUtils; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import at.gv.egiz.moasig.MoaTransformsType; +import at.gv.egiz.moasig.PublicAuthorityType; +import at.gv.egiz.moasig.QualifiedCertificate; +import at.gv.egiz.moasig.SecureSignatureCreationDevice; +import at.gv.egiz.moasig.TransformParameterType; +import at.gv.egiz.moasig.TransformParameterType.Hash; +import at.gv.egiz.moasig.VerifyXMLSignatureResponseType; +import at.gv.egiz.moasig.XMLDataObjectAssociationType; +import at.gv.egovernment.moa.spss.MOAApplicationException; +import at.gv.egovernment.moa.spss.api.SPSSFactory; +import at.gv.egovernment.moa.spss.api.common.Content; +import at.gv.egovernment.moa.spss.api.common.ContentBinary; +import at.gv.egovernment.moa.spss.api.common.ContentXML; +import at.gv.egovernment.moa.spss.api.common.InputData; +import at.gv.egovernment.moa.spss.api.common.XMLDataObjectAssociation; +import at.gv.egovernment.moa.spss.api.xmlverify.AdESFormResults; +import at.gv.egovernment.moa.spss.api.xmlverify.ReferenceInfo; +import at.gv.egovernment.moa.spss.api.xmlverify.SignatureManifestCheckParams; +import at.gv.egovernment.moa.spss.api.xmlverify.SupplementProfile; +import at.gv.egovernment.moa.spss.api.xmlverify.TransformParameter; +import at.gv.egovernment.moa.spss.api.xmlverify.VerifySignatureInfo; +import at.gv.egovernment.moa.spss.api.xmlverify.VerifySignatureLocation; +import at.gv.egovernment.moa.spss.api.xmlverify.VerifyTransformsInfoProfile; +import at.gv.egovernment.moa.spss.api.xmlverify.VerifyXMLSignatureRequest; +import at.gv.egovernment.moa.spss.api.xmlverify.VerifyXMLSignatureResponse; +import at.gv.egovernment.moa.spss.server.webservice.XMLVerifySignatureBinding; +import at.gv.egovernment.moa.util.DOMUtils; +import iaik.utils.RFC2253NameParser; +import iaik.utils.RFC2253NameParserException; + +public class XMLVerifySignatureBindingImpl implements XMLVerifySignatureBinding { + + /** The <code>SPSSFactory</code> for creating new API objects. */ + private SPSSFactory factory = SPSSFactory.getInstance(); + + private TransformerUtils transformerUtils = new TransformerUtils(); + + private TransformParser transformParser = new TransformParser(); + + @Override + public VerifyXMLSignatureRequest buildXMLRequest( + at.gv.egiz.moasig.VerifyXMLSignatureRequest verifyXMLSignatureRequest) throws MOAApplicationException { + Date dateTime = null; + if (verifyXMLSignatureRequest.getDateTime() != null) { + dateTime = verifyXMLSignatureRequest.getDateTime().toGregorianCalendar().getTime(); + } + boolean returnHashInputData = false; + returnHashInputData = (verifyXMLSignatureRequest.getReturnHashInputData() != null); + String trustProfileID = verifyXMLSignatureRequest.getTrustProfileID(); + VerifySignatureInfo verifySignatureInfo = parseVerifySignatureInfo( + verifyXMLSignatureRequest.getVerifySignatureInfo()); + List supplementProfiles = parseSupplementProfiles(verifyXMLSignatureRequest); + + SignatureManifestCheckParams signatureManifestCheckParams = this + .parseSignatureManifestCheckParams(verifyXMLSignatureRequest.getSignatureManifestCheckParams()); // TODO + return factory.createVerifyXMLSignatureRequest(dateTime, verifySignatureInfo, supplementProfiles, + signatureManifestCheckParams, returnHashInputData, trustProfileID); + } + + @Override + public VerifyXMLSignatureResponseType buildXMLResponse(VerifyXMLSignatureResponse response) + throws MOAApplicationException { + VerifyXMLSignatureResponseType verifyXMLSignatureResponseType = new VerifyXMLSignatureResponseType(); + + verifyXMLSignatureResponseType.setSignerInfo(this.transformerUtils.buildSignerInfo(response.getSignerInfo())); + + if (response.getHashInputDatas() != null && !response.getHashInputDatas().isEmpty()) { + for (Iterator iter = response.getHashInputDatas().iterator(); iter.hasNext();) { + InputData inputData = (InputData) iter.next(); + verifyXMLSignatureResponseType.getHashInputData().add(buildInputData(inputData)); + } + } + + if (response.getReferenceInputDatas() != null && !response.getReferenceInputDatas().isEmpty()) { + for (Iterator iter = response.getReferenceInputDatas().iterator(); iter.hasNext();) { + InputData inputData = (InputData) iter.next(); + verifyXMLSignatureResponseType.getReferenceInputData().add(buildInputData(inputData)); + } + } + + // add the SignatureCheck + verifyXMLSignatureResponseType.setSignatureCheck(buildReferencesCheckResult(response.getSignatureCheck())); + + // add the SignatureManifestCheck + if (response.getSignatureManifestCheck() != null) { + verifyXMLSignatureResponseType.setSignatureManifestCheck(buildReferencesCheckResult(response.getSignatureManifestCheck())); + } + + // add the XMLDsigManifestChecks + if(response.getXMLDsigManifestChecks() != null) { + List xmlDsigManifestChecks = response.getXMLDsigManifestChecks(); + Iterator iter = xmlDsigManifestChecks.iterator(); + while(iter.hasNext()) { + Object xmlDsigManifestCheck = iter.next(); + verifyXMLSignatureResponseType.getXMLDSIGManifestCheck().add( + buildManifestCheckResult((at.gv.egovernment.moa.spss.api.xmlverify.ManifestRefsCheckResult) + xmlDsigManifestCheck)); + } + } + + // add the CertificateCheck + verifyXMLSignatureResponseType.setCertificateCheck(this.transformerUtils.buildCheckResult(response.getCertificateCheck())); + + if(response.getAdESFormResults() != null) { + Iterator formIterator = response.getAdESFormResults().iterator(); + + while(formIterator.hasNext()) { + AdESFormResults adESFormResult = (AdESFormResults)formIterator.next(); + verifyXMLSignatureResponseType.getFormCheckResult().add( + buildFormResult(adESFormResult)); + } + + } + + return verifyXMLSignatureResponseType; + } + + private at.gv.egiz.moasig.InputDataType buildInputData(InputData inputData) throws MOAApplicationException { + at.gv.egiz.moasig.InputDataType inputDataType = new at.gv.egiz.moasig.InputDataType(); + inputDataType.setPartOf(inputData.getPartOf()); + + if(inputData.getReferringReferenceNumber() != InputData.REFERER_NONE_) { + inputDataType.setReferringSigReference(BigInteger.valueOf(inputData.getReferringReferenceNumber())); + } + + switch(inputData.getContentType()) { + case Content.XML_CONTENT: + ContentXML contentXml = (ContentXML) inputData; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + iaik.xml.crypto.utils.DOMUtils.serialize(DOMUtils.nodeList2DocumentFragment( + contentXml.getXMLContent()).getOwnerDocument(), + baos); + inputDataType.setBase64Content(baos.toByteArray()); + } catch (TransformerException e) { + throw new MOAApplicationException("2200", null, e); + } catch (ParserConfigurationException e) { + throw new MOAApplicationException("2200", null, e); + } + + break; + case Content.BINARY_CONTENT: + ContentBinary contentBinary = (ContentBinary) inputData; + try { + inputDataType.setBase64Content(IOUtils.toByteArray(contentBinary.getBinaryContent())); + } catch (IOException e) { + throw new MOAApplicationException("2200", null, e); + } + break; + } + return inputDataType; + } + + private at.gv.egiz.moasig.FormResultType buildFormResult(AdESFormResults adESFormResults) { + at.gv.egiz.moasig.FormResultType formResult = new at.gv.egiz.moasig.FormResultType(); + formResult.setCode(BigInteger.valueOf(adESFormResults.getCode())); + formResult.setName(adESFormResults.getName()); + return formResult; + } + + private at.gv.egiz.moasig.ManifestRefsCheckResultType buildManifestCheckResult( + at.gv.egovernment.moa.spss.api.xmlverify.ManifestRefsCheckResult referencesCheckResult) { + at.gv.egiz.moasig.ManifestRefsCheckResultType referencesCheckResultType = new at.gv.egiz.moasig.ManifestRefsCheckResultType(); + + if (referencesCheckResult.getInfo() != null) { + at.gv.egiz.moasig.ObjectFactory of = new at.gv.egiz.moasig.ObjectFactory(); + at.gv.egiz.moasig.AnyChildrenType anyInfos = new at.gv.egiz.moasig.AnyChildrenType(); + + if (referencesCheckResult.getInfo().getFailedReferences() != null) { + for (int idx = 0; idx < referencesCheckResult.getInfo().getFailedReferences().length; idx++) { + anyInfos.getContent().add(of.createFailedReference( + BigInteger.valueOf(referencesCheckResult.getInfo().getFailedReferences()[idx]))); + } + } + + if (referencesCheckResult.getInfo().getAnyOtherInfo() != null) { + for (int idx = 0; idx < referencesCheckResult.getInfo().getAnyOtherInfo().getLength(); idx++) { + Node node = referencesCheckResult.getInfo().getAnyOtherInfo().item(idx); + if (node instanceof Element) { + anyInfos.getContent().add((Element) node); + } + } + } + + anyInfos.getContent().add(of.createReferringSigReference( + BigInteger.valueOf(referencesCheckResult.getInfo().getReferringSignatureReference()))); + + referencesCheckResultType.setInfo(anyInfos); + + } + + referencesCheckResultType.setCode(BigInteger.valueOf(referencesCheckResult.getCode())); + return referencesCheckResultType; + } + + private at.gv.egiz.moasig.ReferencesCheckResultType buildReferencesCheckResult( + at.gv.egovernment.moa.spss.api.xmlverify.ReferencesCheckResult referencesCheckResult) { + at.gv.egiz.moasig.ReferencesCheckResultType referencesCheckResultType = new at.gv.egiz.moasig.ReferencesCheckResultType(); + + if (referencesCheckResult.getInfo() != null) { + at.gv.egiz.moasig.ObjectFactory of = new at.gv.egiz.moasig.ObjectFactory(); + at.gv.egiz.moasig.AnyChildrenType anyInfos = new at.gv.egiz.moasig.AnyChildrenType(); + + if (referencesCheckResult.getInfo().getFailedReferences() != null) { + for (int idx = 0; idx < referencesCheckResult.getInfo().getFailedReferences().length; idx++) { + anyInfos.getContent().add(of.createFailedReference( + BigInteger.valueOf(referencesCheckResult.getInfo().getFailedReferences()[idx]))); + } + } + + if (referencesCheckResult.getInfo().getAnyOtherInfo() != null) { + for (int idx = 0; idx < referencesCheckResult.getInfo().getAnyOtherInfo().getLength(); idx++) { + Node node = referencesCheckResult.getInfo().getAnyOtherInfo().item(idx); + if (node instanceof Element) { + anyInfos.getContent().add((Element) node); + } + } + } + + referencesCheckResultType.setInfo(anyInfos); + } + + referencesCheckResultType.setCode(BigInteger.valueOf(referencesCheckResult.getCode())); + return referencesCheckResultType; + } + + + + /** + * Parse the <code>VerifySignatureInfo</code> DOM element contained in the + * <code>VerifyXMLSignatureRequest</code> DOM element. + * + * @param requestElem + * The <code>VerifyXMLSignatureRequest</code> DOM element + * containing the <code>VerifySignatureInfo</code> DOM element. + * @return The <code>VerifySignatureInfo</code> API object containing the + * data from the DOM element. + * @throws MOAApplicationException + */ + private VerifySignatureInfo parseVerifySignatureInfo( + at.gv.egiz.moasig.VerifyXMLSignatureRequestType.VerifySignatureInfo verifySignatureInfo) + throws MOAApplicationException { + Content verifySignatureEnvironment = transformerUtils + .buildContent(verifySignatureInfo.getVerifySignatureEnvironment()); + + String xPathExpression = verifySignatureInfo.getVerifySignatureLocation(); + + VerifySignatureLocation verifySignatureLocation = factory.createVerifySignatureLocation(xPathExpression, + new HashMap()); + + return factory.createVerifySignatureInfo(verifySignatureEnvironment, verifySignatureLocation); + } + + /** + * Parse the supplement profiles contained in the given + * <code>VerifyXMLSignatureRequest</code> DOM element. + * + * @param requestElem + * The <code>VerifyXMLSignatureRequest</code> DOM element. + * @return A <code>List</code> of <code>SupplementProfile</code> API objects + * containing the data from the <code>SupplementProfile</code> DOM + * elements. + * @throws MOAApplicationException + */ + private List parseSupplementProfiles(at.gv.egiz.moasig.VerifyXMLSignatureRequest verifyXMLSignatureRequest) + throws MOAApplicationException { + List supplementProfiles = new ArrayList(); + List<Object> supplementElements = verifyXMLSignatureRequest.getSupplementProfileOrSupplementProfileID(); + if (supplementElements != null) { + Iterator<Object> supplementElementsIterator = supplementElements.iterator(); + while (supplementElementsIterator.hasNext()) { + Object object = supplementElementsIterator.next(); + SupplementProfile profile; + if (object instanceof XMLDataObjectAssociationType) { + XMLDataObjectAssociationType xmlDataObjectAssociationType = (XMLDataObjectAssociationType) object; + profile = parseSupplementProfile(xmlDataObjectAssociationType); + } else if (object instanceof String) { + String profileID = (String) object; + profile = factory.createSupplementProfile(profileID); + } else { + throw new MOAApplicationException( + "Invalid object in moa:SupplementProfile | moa:SupplementProfileID", null); + } + + supplementProfiles.add(profile); + } + } + + return supplementProfiles; + } + + public SupplementProfile parseSupplementProfile(XMLDataObjectAssociationType xmlDataObjectAssociationType) + throws MOAApplicationException { + XMLDataObjectAssociation supplementProfile = this.transformerUtils + .parseXMLDataObjectAssociation(xmlDataObjectAssociationType); + + return factory.createSupplementProfile(supplementProfile); + } + + /** + * Parse the <code>SignatureManifestCheckParams</code> DOM element contained + * in the given <code>VerifyXMLSignatureRequest</code> DOM element. + * + * @param requestElem + * The <code>VerifyXMLSignatureRequest</code> DOM element. + * @return The <code>SignatureManifestCheckParams</code> API object + * containing the data from the + * <code>SignatureManifestCheckParams</code> DOM element. + * @throws MOAApplicationException + * An error occurred parsing the + * <code>SignatureManifestCheckParams</code> DOM element. + */ + private SignatureManifestCheckParams parseSignatureManifestCheckParams( + at.gv.egiz.moasig.VerifyXMLSignatureRequestType.SignatureManifestCheckParams signatureManifestCheckParams) + throws MOAApplicationException { + + if (signatureManifestCheckParams == null) { + return null; + } + + boolean returnReferencInputData = signatureManifestCheckParams.isReturnReferenceInputData(); + List<at.gv.egiz.moasig.VerifyTransformsDataType> referenceInfos = signatureManifestCheckParams + .getReferenceInfo(); + List referenceInfosBuild = parseReferenceInfos(referenceInfos); + + return factory.createSignatureManifestCheckParams(referenceInfosBuild, returnReferencInputData); + } + + /** + * Parse the <code>ReferenceInfo</code> DOM elements contained in a + * <code>SignatureManifestCheckParams</code> DOM element. + * + * @param paramsElem + * The <code>SignatureManifestCheckParams</code> DOM element + * containing the <code>ReferenceInfo</code> DOM elements. + * @return A <code>List</code> of <code>RefernceInfo</code> API objects + * containing the data from the <code>ReferenceInfo</code> DOM + * elements. + * @throws MOAApplicationException + * An error occurred parsing the <code>ReferenceInfo</code> DOM + * elements. + */ + private List parseReferenceInfos(List<at.gv.egiz.moasig.VerifyTransformsDataType> referenceInfosWeb) + throws MOAApplicationException { + + List referenceInfos = new ArrayList(); + + if (referenceInfosWeb != null) { + + Iterator<at.gv.egiz.moasig.VerifyTransformsDataType> referenceInfosIterator = referenceInfosWeb.iterator(); + + while (referenceInfosIterator.hasNext()) { + at.gv.egiz.moasig.VerifyTransformsDataType verifyTransformsDataType = referenceInfosIterator.next(); + + ReferenceInfo referenceInfo = parseReferenceInfo(verifyTransformsDataType); + referenceInfos.add(referenceInfo); + } + + } + return referenceInfos; + } + + /** + * Parse a <code>ReferenceInfo</code> DOM element. + * + * @param refInfoElem + * The <code>ReferenceInfo</code> DOM element to parse. + * @return The <code>ReferenceInfo</code> API object containing the data + * from the given <code>ReferenceInfo</code> DOM element. + * @throws MOAApplicationException + * An error occurred parsing the <code>ReferenceInfo</code> DOM + * element. + */ + private ReferenceInfo parseReferenceInfo(at.gv.egiz.moasig.VerifyTransformsDataType verifyTransformsDataType) + throws MOAApplicationException { + List profiles = parseVerifyTransformsInfoProfiles(verifyTransformsDataType); + return factory.createReferenceInfo(profiles); + } + + /** + * Parse the <code>VerifyTransformsInfoProfile</code> DOM elements contained + * in a <code>ReferenceInfo</code> DOM element. + * + * @param refInfoElem + * <code>ReferenceInfo</code> DOM element containing the + * <code>VerifyTransformsInfoProfile</code> DOM elements. + * @return A <code>List</code> of <code>VerifyTransformsInfoProfile</code> + * API objects containing the profile data. + * @throws MOAApplicationException + * An error occurred building the + * <code>VerifyTransformsInfoProfile</code>s. + */ + private List parseVerifyTransformsInfoProfiles(at.gv.egiz.moasig.VerifyTransformsDataType verifyTransformsDataType) + throws MOAApplicationException { + + List profiles = new ArrayList(); + + List<Object> transformsList = verifyTransformsDataType + .getVerifyTransformsInfoProfileOrVerifyTransformsInfoProfileID(); + Iterator<Object> transformsListIterator = transformsList.iterator(); + + while (transformsListIterator.hasNext()) { + Object object = transformsListIterator.next(); + + if (object instanceof at.gv.egiz.moasig.VerifyTransformsInfoProfile) { + at.gv.egiz.moasig.VerifyTransformsInfoProfile verifyTransformsInfoProfile = (at.gv.egiz.moasig.VerifyTransformsInfoProfile) object; + } else if (object instanceof String) { + String profileID = (String) object; + profiles.add(factory.createVerifyTransformsInfoProfile(profileID)); + } else { + throw new MOAApplicationException("Invalid object in VerifyTransformsData", null); + } + } + return profiles; + } + + /** + * Parse a <code>VerifyTransformsInfoProfile</code> DOM element. + * + * @param profileElem + * The <code>VerifyTransformsInfoProfile</code> DOM element to + * parse. + * @return A <code>VerifyTransformsInfoProfile</code> API object containing + * the information from the <code>VerifyTransformsInfoProfile</code> + * DOM element. + * @throws MOAApplicationException + * An error occurred parsing the + * <code>VerifyTransformsInfoProfile</code>. + */ + public VerifyTransformsInfoProfile parseVerifyTransformsInfoProfile( + at.gv.egiz.moasig.VerifyTransformsInfoProfile verifyTransformsInfoProfile) throws MOAApplicationException { + List transforms = null; + List transformParameters = new ArrayList(); + List<TransformParameterType> transformParams = verifyTransformsInfoProfile.getTransformParameter(); + Iterator<TransformParameterType> transformParamIterator = transformParams.iterator(); + + MoaTransformsType moaTransforms = verifyTransformsInfoProfile.getMoaTransforms(); + + if (moaTransforms != null) { + transforms = transformParser.parseTransforms(moaTransforms); + } + + while (transformParamIterator.hasNext()) { + TransformParameterType transformParameter = transformParamIterator.next(); + transformParameters.add(parseTransformParameter(transformParameter)); + } + + return factory.createVerifyTransformsInfoProfile(transforms, transformParameters); + } + + /** + * Parse a <code>TransformParameter</code> DOM element. + * + * @param paramElem + * The <code>TransformParameter</code> DOM element to parse. + * @return The <code>TransformParameter</code> API object containing the + * information from the <code>TransformParameter</code> DOM element. + * @throws MOAApplicationException + * An error occurred parsing the <code>TransformParameter</code> + * DOM element. + */ + private TransformParameter parseTransformParameter(TransformParameterType transformParameter) + throws MOAApplicationException { + String uri = transformParameter.getURI(); + if (transformParameter.getBase64Content() != null) { + InputStream binaryContent = new ByteArrayInputStream(transformParameter.getBase64Content()); + return factory.createTransformParameter(uri, binaryContent); + } else if (transformParameter.getHash() != null) { + Hash hash = transformParameter.getHash(); + String digestMethodStr = ""; + + if (hash.getDigestMethod() != null) { + digestMethodStr = hash.getDigestMethod().getAlgorithm(); + } + byte[] digestValue = hash.getDigestValue(); + return factory.createTransformParameter(uri, digestMethodStr, digestValue); + } else { + return factory.createTransformParameter(uri); + } + } +} |