private void buildAsicManifest(final SignatureParameters underlyingParameters, final DSSDocument detachedDocument, final OutputStream outputStream) {
final ASiCParameters asicParameters = underlyingParameters.aSiC();
final Document documentDom = DSSXMLUtils.buildDOM();
final Element asicManifestDom = documentDom.createElementNS(ASiCNamespaces.ASiC, "asic:ASiCManifest");
documentDom.appendChild(asicManifestDom);
final Element sigReferenceDom = DSSXMLUtils.addElement(documentDom, asicManifestDom, ASiCNamespaces.ASiC, "asic:SigReference");
final String signatureName = getSignatureFileName(asicParameters);
sigReferenceDom.setAttribute("URI", signatureName);
final String signatureMimeType = getSignatureMimeType(asicParameters);
sigReferenceDom.setAttribute("MimeType", signatureMimeType);
DSSDocument currentDetachedDocument = detachedDocument;
do {
final String detachedDocumentName = currentDetachedDocument.getName();
final Element dataObjectReferenceDom = DSSXMLUtils.addElement(documentDom, sigReferenceDom, ASiCNamespaces.ASiC, "asic:DataObjectReference");
dataObjectReferenceDom.setAttribute("URI", detachedDocumentName);
final Element digestMethodDom = DSSXMLUtils.addElement(documentDom, dataObjectReferenceDom, XMLSignature.XMLNS, "DigestMethod");
final DigestAlgorithm digestAlgorithm = underlyingParameters.getDigestAlgorithm();
digestMethodDom.setAttribute("Algorithm", digestAlgorithm.getXmlId());
final Element digestValueDom = DSSXMLUtils.addElement(documentDom, dataObjectReferenceDom, XMLSignature.XMLNS, "DigestValue");
final byte[] digest = DSSUtils.digest(digestAlgorithm, currentDetachedDocument.getBytes());
final String base64Encoded = DSSUtils.base64Encode(digest);
final Text textNode = documentDom.createTextNode(base64Encoded);
digestValueDom.appendChild(textNode);
currentDetachedDocument = currentDetachedDocument.getNextDocument();
} while (currentDetachedDocument != null);
storeXmlDom(outputStream, documentDom);
}