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
* Supplement
s.
* @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());
}
}
}