package at.gv.egiz.asic.impl.verifier; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.gv.egiz.asic.ReferenceType; import at.gv.egiz.asic.XAdESSignaturesType; import at.gv.egiz.asic.api.ASiC; import at.gv.egiz.asic.api.ASiCEntry; import at.gv.egiz.asic.api.ASiCFormat; import at.gv.egiz.asic.api.ASiCVerificationResult; import at.gv.egiz.asic.impl.AsicSignedFilesContainer; import at.gv.egovernment.moa.spss.MOAApplicationException; import at.gv.egovernment.moa.spss.MOAException; import at.gv.egovernment.moa.spss.MOARuntimeException; 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.XMLDataObjectAssociation; import at.gv.egovernment.moa.spss.api.xmlverify.SupplementProfile; 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.VerifyXMLSignatureRequest; import at.gv.egovernment.moa.spss.server.invoke.XMLSignatureVerificationInvoker; import at.gv.egovernment.moaspss.util.URLEncoder; import jakarta.xml.bind.JAXB; /** * Created by Andreas Fitzek on 6/17/16. */ public class SimpleXAdESVerifier extends XAdESVerifier { private static final Logger logger = LoggerFactory.getLogger(SimpleXAdESVerifier.class); @Override public void verify(ASiC asic, String trustProfileID, Date date, List response) throws MOAException { // XAdES try { final ASiCEntry xadesSignature = asic.getSignaturesEntries().get(0); XAdESSignaturesType xAdESSignaturesType = null; try { xAdESSignaturesType = JAXB.unmarshal(xadesSignature.getContents(), XAdESSignaturesType.class); } catch (final Throwable ex) { logger.warn("Failed to process xml signature: ex"); throw new MOAApplicationException("asic.0003", null, ex); } if (xAdESSignaturesType == null) { throw new MOAApplicationException("asic.0003", null); } final int signatureSize = xAdESSignaturesType.getSignature().size(); try { xadesSignature.getContents().reset(); } catch (final IOException e) { throw new MOARuntimeException("asic.0003", null, e); } final Map namespaces = new HashMap(); namespaces.put("asic", "http://uri.etsi.org/02918/v1.2.1#"); namespaces.put("ds", "http://www.w3.org/2000/09/xmldsig#"); for (int i = 0; i < signatureSize; i++) { final List signedFiles = new ArrayList<>(); final Iterator it = xAdESSignaturesType.getSignature().get(i).getSignedInfo() .getReference().iterator(); while (it.hasNext()) { final ReferenceType refType = it.next(); if (!refType.getURI().startsWith("#")) { signedFiles.add(new AsicSignedFilesContainer(refType.getURI(), refType.getDigestMethod() .getAlgorithm())); } } final boolean addAll = signedFiles.isEmpty() && asic.getDataEntries().size() == 1; final Iterator dataEntryIterator = asic.getDataEntries().iterator(); final Content content = SPSSFactory.getInstance().createContent(xadesSignature.getContents(), null); final List supplementsList = new ArrayList(); while (dataEntryIterator.hasNext()) { final ASiCEntry dataEntry = dataEntryIterator.next(); final String uriName = URLEncoder.encode(dataEntry.getEntryName(), "UTF-8") .replaceAll("\\+", "%20") .replaceAll("\\%21", "!") .replaceAll("\\%27", "'") // .replaceAll("\\%28", "(") // .replaceAll("\\%29", ")") .replaceAll("\\%7E", "~"); final Content dataContent = SPSSFactory.getInstance().createContent(dataEntry.getContents(), uriName); final XMLDataObjectAssociation association = SPSSFactory.getInstance() .createXMLDataObjectAssociation(null, dataContent); final SupplementProfile profile = SPSSFactory.getInstance().createSupplementProfile(association); supplementsList.add(profile); if (addAll) { signedFiles.add(new AsicSignedFilesContainer(dataEntry.getEntryName(), null)); } } final String location = "(//ds:Signature)[" + (i + 1) + "]"; final VerifySignatureLocation verifySignatureLocation = SPSSFactory.getInstance() .createVerifySignatureLocation( location, namespaces); final VerifySignatureInfo verifySignatureInfo = SPSSFactory.getInstance().createVerifySignatureInfo( content, verifySignatureLocation); final VerifyXMLSignatureRequest verifyXMLSignatureRequest = SPSSFactory.getInstance() .createVerifyXMLSignatureRequest( date, verifySignatureInfo, supplementsList, null, false, trustProfileID, true); response.add(new ASiCVerificationResult(signedFiles, XMLSignatureVerificationInvoker.getInstance().verifyXMLSignature(verifyXMLSignatureRequest))); } } catch (final UnsupportedEncodingException e) { logger.error("UTF8 encoding not supported by system. MOA will not work on this system!", e); throw new MOARuntimeException("asic.0003", null, e); } } @Override public boolean handles(ASiC asic) { return super.handles(asic) && ASiCFormat.ASiCS.equals(asic.getFormat()); } }