/** * This is the utility method that loads the data from the inputstream determined by the inputstream parameter into a * {@link org.w3c.dom.Document}. * * @param inputStream * @return */ public static Document load(final InputStream inputStream) throws DSSException { final Document document = DSSXMLUtils.buildDOM(inputStream); return document; }
/** * @return */ public List<Element> getSignatureObjects() { final NodeList list = DSSXMLUtils.getNodeList(signatureElement, XPathQueryHolder.XPATH_OBJECT); final List<Element> references = new ArrayList<Element>(list.getLength()); for (int ii = 0; ii < list.getLength(); ii++) { final Node node = list.item(ii); final Element element = (Element) node; if (DSSXMLUtils.getElement(element, xPathQueryHolder.XPATH__QUALIFYING_PROPERTIES_SIGNED_PROPERTIES) != null) { // ignore signed properties continue; } references.add(element); } return references; }
private TimestampReference createRevocationTimestampReference(Element element) { String digestAlgorithm = DSSXMLUtils.getNode(element, xPathQueryHolder.XPATH__DIGEST_METHOD_ALGORITHM).getTextContent(); digestAlgorithm = DigestAlgorithm.forXML(digestAlgorithm).getName(); final String digestValue = DSSXMLUtils.getElement(element, xPathQueryHolder.XPATH__DIGEST_VALUE).getTextContent(); final TimestampReference revocationReference = new TimestampReference(digestAlgorithm, digestValue); return revocationReference; }
@Override public Date getSigningTime() { final Element signingTimeEl = DSSXMLUtils.getElement(signatureElement, xPathQueryHolder.XPATH_SIGNING_TIME); if (signingTimeEl == null) { return null; } final String text = signingTimeEl.getTextContent(); return DSSXMLUtils.getDate(text); }
private void writeCanonicalizedValue(final String xPathString, final String canonicalizationMethod, final ByteArrayOutputStream buffer) throws IOException { final Element element = DSSXMLUtils.getElement(signatureElement, xPathString); if (element != null) { final byte[] canonicalizedValue = DSSXMLUtils.canonicalizeSubtree(canonicalizationMethod, element); buffer.write(canonicalizedValue); } }
/** * This method writes formatted {@link org.w3c.dom.Node} to the outputStream. * * @param dssDocument * @param out */ public static void printDocument(final DSSDocument dssDocument, final OutputStream out) { final byte[] bytes = dssDocument.getBytes(); final Document document = DSSXMLUtils.buildDOM(bytes); printDocument(document, out, false); }
final Document root = DSSXMLUtils.buildDOM(signature); final Element signatureEl = (Element) root.getDocumentElement().getFirstChild(); final String idIdentifier = DSSXMLUtils.getIDIdentifier(signatureEl); if (signatureId.equals(idIdentifier)) { final Document signatureDOM = DSSXMLUtils.createDocument(ASiCNamespaces.ASiC, ASiCService.ASICS_NS); for (int j = 0; j < signatures.size(); j++) { final Document doc = DSSXMLUtils.buildDOM(signature); final Node signatureElement = doc.getDocumentElement().getFirstChild(); newElement.appendChild(signatureElement); return new InMemoryDocument(DSSXMLUtils.serializeNode(signatureDOM));
/** * This method returns the list of ds:Object elements for the current signature element. * * @return */ public NodeList getObjects() { return DSSXMLUtils.getNodeList(signatureElement, xPathQueryHolder.XPATH_OBJECT); }
public Element getQualifyingPropertiesDom() { return DSSXMLUtils.getElement(signatureElement, xPathQueryHolder.XPATH_QUALIFYING_PROPERTIES); } }
/** * An ID attribute can only be dereferenced if it is declared in the validation context. This behaviour is caused by the fact that the attribute does not have attached type of * information. Another solution is to parse the XML against some DTD or XML schema. This process adds the necessary type of information to each ID attribute. * * @param element */ public static void recursiveIdBrowse(final Element element) { for (int ii = 0; ii < element.getChildNodes().getLength(); ii++) { final Node node = element.getChildNodes().item(ii); if (node.getNodeType() == Node.ELEMENT_NODE) { final Element childElement = (Element) node; setIDIdentifier(childElement); recursiveIdBrowse(childElement); } } }
signatureValueDom.appendChild(signatureValueNode); final Document originalDocumentDom = DSSXMLUtils.buildDOM(detachedDocument); final Node copiedNode = originalDocumentDom.importNode(signatureDom, true); DSSXMLUtils.getElement(originalDocumentDom, params.getXPathLocationString()).appendChild(copiedNode); } else { originalDocumentDom.getDocumentElement().appendChild(copiedNode); byte[] documentBytes = DSSXMLUtils.transformDomToByteArray(originalDocumentDom); final InMemoryDocument inMemoryDocument = new InMemoryDocument(documentBytes); inMemoryDocument.setMimeType(MimeType.XML);
for (final Element signatureReference : signatureReferences) { final String type = DSSXMLUtils.getValue(signatureReference, "@Type"); if (xadesSignature.getXPathQueryHolder().XADES_SIGNED_PROPERTIES.equals(type)) { continue; final String uri = DSSXMLUtils.getValue(signatureReference, "@URI"); final List<String> transformations = getTransformationNames(signatureReference); if (DSSUtils.isBlank(uri)) { if (xPointerQuery) { final String id = DSSXMLUtils.getIDIdentifier(signatureReference); final XPointerSignatureScope xPointerSignatureScope = new XPointerSignatureScope(id, uri); result.add(xPointerSignatureScope); Element signedElement = DSSXMLUtils.getElement(xadesSignature.getSignatureElement(), xPathString); if (signedElement != null) { if (unsignedObjects.remove(signedElement)) { .getElement(xadesSignature.getSignatureElement().getOwnerDocument().getDocumentElement(), "//*" + "[@Id='" + xmlIdOfSignedElement + "']"); if (signedElement != null) {
final Document document = DSSXMLUtils.buildDOM(dssDocument); DSSXMLUtils.recursiveIdBrowse(document.getDocumentElement()); final String uri_id = uri.substring(1); nodeToTransform = document.getElementById(uri_id); transformedReferenceBytes = DSSXMLUtils.serializeNode(nodeToTransform); } else { transformedReferenceBytes = applyTransformations(dssDocument, transforms, nodeToTransform, transformedReferenceBytes);
/** * Creates dss document that retains the data in memory * * @param bytes array of bytes representing the document * @param name the file name if the data originates from a file */ public AsicManifestDocument(final byte[] bytes, final String name) { this.bytes = bytes; this.name = name; this.mimeType = MimeType.XML; final Document document = DSSXMLUtils.buildDOM(bytes); signatureUri = DSSXMLUtils.getValue(document, "/asic:ASiCManifest/asic:SigReference/@URI"); if (DSSUtils.isBlank(signatureUri)) { throw new DSSException("The AsicManifest file must contains the URI of the related signature."); } }
private byte[] applyTransformations(DSSDocument dssDocument, final List<DSSTransform> transforms, Node nodeToTransform, byte[] transformedReferenceBytes) { for (final DSSTransform transform : transforms) { final String transformAlgorithm = transform.getAlgorithm(); if (Transforms.TRANSFORM_XPATH.equals(transformAlgorithm)) { final DSSTransformXPath transformXPath = new DSSTransformXPath(transform); // At the moment it is impossible to go through a medium other than byte array (Set<Node>, octet stream, Node). Further investigation is needed. final byte[] transformedBytes = nodeToTransform == null ? transformXPath.transform(dssDocument) : transformXPath.transform(nodeToTransform); dssDocument = new InMemoryDocument(transformedBytes); nodeToTransform = DSSXMLUtils.buildDOM(dssDocument); } else if (DSSXMLUtils.canCanonicalize(transformAlgorithm)) { if (nodeToTransform == null) { nodeToTransform = DSSXMLUtils.buildDOM(dssDocument); } transformedReferenceBytes = DSSXMLUtils.canonicalizeSubtree(transformAlgorithm, nodeToTransform); // The supposition is made that the last transformation is the canonicalization break; } else if (CanonicalizationMethod.ENVELOPED.equals(transformAlgorithm)) { // do nothing the new signature is not existing yet! // removeExistingSignatures(document); } else { throw new DSSException("The transformation is not implemented yet, please transform the reference before signing!"); } } return transformedReferenceBytes; }
/** * Creates SigningTime DOM object element. */ private void incorporateSigningTime() { final Date signingDate = params.bLevel().getSigningDate(); final XMLGregorianCalendar xmlGregorianCalendar = DSSXMLUtils.createXMLGregorianCalendar(signingDate); final String xmlSigningTime = xmlGregorianCalendar.toXMLFormat(); // <SigningTime>2013-11-23T11:22:52Z</SigningTime> final Element signingTimeDom = documentDom.createElementNS(XAdES, XADES_SIGNING_TIME); signedSignaturePropertiesDom.appendChild(signingTimeDom); final Text textNode = documentDom.createTextNode(xmlSigningTime); signingTimeDom.appendChild(textNode); }
final Element crlRefsDom = DSSXMLUtils.addElement(documentDom, completeRevocationRefsDom, XAdESNamespaces.XAdES, "xades:CRLRefs"); final Element crlRefDom = DSSXMLUtils.addElement(documentDom, crlRefsDom, XAdESNamespaces.XAdES, "xades:CRLRef"); final Element digestAlgAndValueDom = DSSXMLUtils.addElement(documentDom, crlRefDom, XAdESNamespaces.XAdES, "xades:DigestAlgAndValue"); DSSXMLUtils.addTextElement(documentDom, crlRefDom, XAdESNamespaces.XAdES, "xades:Issuer", issuerX500PrincipalName); XMLGregorianCalendar xmlGregorianCalendar = DSSXMLUtils.createXMLGregorianCalendar(thisUpdate); final String thisUpdateAsXmlFormat = xmlGregorianCalendar.toXMLFormat(); DSSXMLUtils.addTextElement(documentDom, crlRefDom, XAdESNamespaces.XAdES, "xades:IssueTime", thisUpdateAsXmlFormat);
final byte[] bytesToCanonicalize = DSSXMLUtils.serializeNode(node); canonicalizedValue = DSSXMLUtils.canonicalize(canonicalizationMethod, bytesToCanonicalize); } else { canonicalizedValue = DSSXMLUtils.canonicalizeSubtree(canonicalizationMethod, node); final Node qualifyingProperties = DSSXMLUtils.getElement(node, xPathQueryHolder.XPATH__QUALIFYING_PROPERTIES); if (qualifyingProperties != null) { continue; byte[] canonicalizedValue = DSSXMLUtils.canonicalizeSubtree(canonicalizationMethod, node); buffer.write(canonicalizedValue);
private List<String> getTransformationNames(final Element signatureReference) { final NodeList nodeList = DSSXMLUtils.getNodeList(signatureReference, "./ds:Transforms/ds:Transform"); final List<String> algorithms = new ArrayList<String>(nodeList.getLength()); for (int ii = 0; ii < nodeList.getLength(); ii++) { final Element transformation = (Element) nodeList.item(ii); final String algorithm = DSSXMLUtils.getValue(transformation, "@Algorithm"); if (transformationToIgnore.contains(algorithm)) { continue; } if (presentableTransformationNames.containsKey(algorithm)) { algorithms.add(presentableTransformationNames.get(algorithm)); } else { algorithms.add(algorithm); } } return algorithms; } }
/** * @param xPathQuery XPath query * @return */ private List<CertificateToken> getCertificates(final String xPathQuery) { final List<CertificateToken> list = new ArrayList<CertificateToken>(); final NodeList nodeList = DSSXMLUtils.getNodeList(signatureElement, xPathQuery); for (int ii = 0; ii < nodeList.getLength(); ii++) { final Element certificateElement = (Element) nodeList.item(ii); final byte[] derEncoded = DSSUtils.base64Decode(certificateElement.getTextContent()); final X509Certificate cert = DSSUtils.loadCertificate(derEncoded); final CertificateToken certToken = addCertificate(cert); if (!list.contains(certToken)) { final String idIdentifier = DSSXMLUtils.getIDIdentifier(certificateElement); certToken.setXmlId(idIdentifier); list.add(certToken); } } return list; }