You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by co...@apache.org on 2019/11/08 09:54:51 UTC

svn commit: r1869534 - in /santuario/xml-security-java/trunk/src: main/java/org/apache/xml/security/signature/XMLSignature.java test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java

Author: coheigea
Date: Fri Nov  8 09:54:50 2019
New Revision: 1869534

URL: http://svn.apache.org/viewvc?rev=1869534&view=rev
Log:
Enforce the name and namespace of a Signature Element

Modified:
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java
    santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java?rev=1869534&r1=1869533&r2=1869534&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java Fri Nov  8 09:54:50 2019
@@ -502,6 +502,12 @@ public final class XMLSignature extends
         throws XMLSignatureException, XMLSecurityException {
         super(element, baseURI);
 
+        if (!(Constants.SignatureSpecNS.equals(element.getNamespaceURI())
+            && Constants._TAG_SIGNATURE.equals(element.getLocalName()))) {
+            Object[] exArgs = { element.getLocalName() };
+            throw new XMLSignatureException("signature.Verification.InvalidElement", exArgs);
+        }
+
         // check out SignedInfo child
         Element signedInfoElem = XMLUtils.getNextElement(element.getFirstChild());
 

Modified: santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java?rev=1869534&r1=1869533&r2=1869534&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java (original)
+++ santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java Fri Nov  8 09:54:50 2019
@@ -392,6 +392,74 @@ public class CreateSignatureTest {
         }
     }
 
+    @org.junit.jupiter.api.Test
+    public void testWrongSignatureName() throws Exception {
+        PrivateKey privateKey = kp.getPrivate();
+        Document doc = XMLUtils.newDocument();
+        Element root = doc.createElementNS("", "RootElement");
+
+        doc.appendChild(root);
+        root.appendChild(doc.createTextNode("Some simple text\n"));
+
+        Element canonElem =
+            XMLUtils.createElementInSignatureSpace(doc, Constants._TAG_CANONICALIZATIONMETHOD);
+        canonElem.setAttributeNS(
+            null, Constants._ATT_ALGORITHM, Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS
+        );
+
+        SignatureAlgorithm signatureAlgorithm =
+            new SignatureAlgorithm(doc, XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1);
+        XMLSignature sig =
+            new XMLSignature(doc, null, signatureAlgorithm.getElement(), canonElem);
+        String id = "12345";
+        sig.setId(id);
+
+        ObjectContainer object = new ObjectContainer(doc);
+        SignatureProperties signatureProperties = new SignatureProperties(doc);
+        String sigPropertiesId = "54321";
+        signatureProperties.setId(sigPropertiesId);
+        SignatureProperty signatureProperty = new SignatureProperty(doc, "#" + id);
+        signatureProperties.addSignatureProperty(signatureProperty);
+        object.appendChild(signatureProperties.getElement());
+        signatureProperties.getElement().setIdAttributeNS(null, "Id", true);
+        sig.appendObject(object);
+        sig.addDocument("#" + sigPropertiesId);
+
+        root.appendChild(sig.getElement());
+
+        sig.addKeyInfo(kp.getPublic());
+        sig.sign(privateKey);
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+        XMLUtils.outputDOMc14nWithComments(doc, bos);
+        String signedContent = new String(bos.toByteArray());
+        // Now change the Signature Element to be "SomeSignature" instead
+        signedContent = signedContent.replaceAll("ds:Signature ", "ds:SomeSignature ");
+        signedContent = signedContent.replaceAll("</ds:Signature>", "</ds:SomeSignature>");
+
+        // Verify the signature
+        Document doc2 = null;
+        try (InputStream is = new ByteArrayInputStream(signedContent.getBytes())) {
+            doc2 = XMLUtils.read(is, false);
+        }
+
+        XPathFactory xpf = XPathFactory.newInstance();
+        XPath xpath = xpf.newXPath();
+        xpath.setNamespaceContext(new DSNamespaceContext());
+
+        String expression = "//ds:SomeSignature[1]";
+        Element sigElement =
+            (Element) xpath.evaluate(expression, doc2, XPathConstants.NODE);
+
+        try {
+            new XMLSignature(sigElement, "");
+            fail("Failure expected on an incorrect Signature element name");
+        } catch (XMLSignatureException ex) {
+            // expected
+        }
+    }
+
     private String doSign() throws Exception {
         PrivateKey privateKey = kp.getPrivate();
         Document doc = XMLUtils.newDocument();