package eu.europa.esig.dss.asic.signature.asice; import java.util.List; import javax.xml.crypto.dsig.XMLSignature; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; import eu.europa.esig.dss.DSSDocument; import eu.europa.esig.dss.DigestAlgorithm; import eu.europa.esig.dss.DomUtils; import eu.europa.esig.dss.MimeType; import eu.europa.esig.dss.asic.ASiCNamespace; /** * This class is used to generate the ASiCManifest.xml content (ASiC-E) * * Sample: * * <pre> * <code> * <asic:ASiCManifest xmlns:asic="http://uri.etsi.org/02918/v1.2.1#"> * <asic:SigReference MimeType="application/pkcs7-signature" URI="META-INF/signature001.p7s"> * <asic:DataObjectReference URI="document.txt"> * <DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> * <DigestValue xmlns="http://www.w3.org/2000/09/xmldsig#">OuL0HMJE899y+uJtyNnTt5B/gFrrw8adNczI+9w9GDQ=</DigestValue> * </asic:DataObjectReference> * </asic:SigReference> * </asic:ASiCManifest> * </code> * </pre> */ public class ASiCEWithCAdESManifestBuilder { private final List<DSSDocument> documents; private final DigestAlgorithm digestAlgorithm; private final String signatureUri; public ASiCEWithCAdESManifestBuilder(List<DSSDocument> documents, DigestAlgorithm digestAlgorithm, String signatureUri) { this.documents = documents; this.digestAlgorithm = digestAlgorithm; this.signatureUri = signatureUri; } public Document build() { final Document documentDom = DomUtils.buildDOM(); final Element asicManifestDom = documentDom.createElementNS(ASiCNamespace.NS, ASiCNamespace.ASIC_MANIFEST); documentDom.appendChild(asicManifestDom); final Element sigReferenceDom = DomUtils.addElement(documentDom, asicManifestDom, ASiCNamespace.NS, ASiCNamespace.SIG_REFERENCE); sigReferenceDom.setAttribute("URI", signatureUri); sigReferenceDom.setAttribute("MimeType", MimeType.PKCS7.getMimeTypeString()); for (DSSDocument document : documents) { final String detachedDocumentName = document.getName(); final Element dataObjectReferenceDom = DomUtils.addElement(documentDom, asicManifestDom, ASiCNamespace.NS, ASiCNamespace.DATA_OBJECT_REFERENCE); dataObjectReferenceDom.setAttribute("URI", detachedDocumentName); final Element digestMethodDom = DomUtils.addElement(documentDom, dataObjectReferenceDom, XMLSignature.XMLNS, "DigestMethod"); digestMethodDom.setAttribute("Algorithm", digestAlgorithm.getXmlId()); final Element digestValueDom = DomUtils.addElement(documentDom, dataObjectReferenceDom, XMLSignature.XMLNS, "DigestValue"); final Text textNode = documentDom.createTextNode(document.getDigest(digestAlgorithm)); digestValueDom.appendChild(textNode); } return documentDom; } }