[java-metadata-aggregator COMMIT] in /trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom: XMLSignatu...

noreply at shibboleth.net noreply at shibboleth.net
Sat Oct 12 12:14:42 EDT 2013


Author: iay
Date: Sat Oct 12 12:14:42 2013
New Revision: 266

URL: http://svn.shibboleth.net/view/java-metadata-aggregator?rev=266&view=rev
Log:
MDA-112 signature validation stage should protect against wrapping attacks
Replace most of the validation logic used in the validation stage with a port of the equivalent code from the XmlSecTool application, encapsulated in a hopefully reusable class.

Added:
    trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureValidator.java   (with props)
Modified:
    trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureValidationStage.java

Modified: trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureValidationStage.java
URL: http://svn.shibboleth.net/view/java-metadata-aggregator/trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureValidationStage.java?rev=266&r1=265&r2=266&view=diff
==============================================================================
--- trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureValidationStage.java (original)
+++ trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureValidationStage.java Sat Oct 12 12:14:42 2013
@@ -19,7 +19,6 @@
 
 import java.security.PublicKey;
 import java.security.cert.Certificate;
-import java.util.List;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -27,18 +26,15 @@
 
 import net.shibboleth.metadata.ErrorStatus;
 import net.shibboleth.metadata.WarningStatus;
+import net.shibboleth.metadata.dom.XMLSignatureValidator.ValidationException;
 import net.shibboleth.metadata.pipeline.BaseIteratingStage;
 import net.shibboleth.metadata.pipeline.StageProcessingException;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.xml.ElementSupport;
 import net.shibboleth.utilities.java.support.xml.SerializeSupport;
 
 import org.apache.xml.security.Init;
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.signature.XMLSignature;
-import org.apache.xml.security.signature.XMLSignatureException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
@@ -76,6 +72,9 @@
 
     /** Public key used to verify the Element signature. */
     private PublicKey verificationKey;
+    
+    /** Validator used for all signatures validated by this stage instance. */
+    private XMLSignatureValidator validator;
 
     /**
      * Gets whether the Element is required to be signed.
@@ -165,16 +164,27 @@
 
     /** {@inheritDoc} */
     protected boolean doExecute(@Nonnull final DomElementItem item) throws StageProcessingException {
-        final Element signatureElement = getSignatureElement(item.unwrap());
-        if (signatureElement == null) {
-            if (signatureRequired) {
-                log.debug("DOM Element was not signed and signature is required");
-                item.getItemMetadata().put(
-                        new ErrorStatus(getId(), "DOM Element was not signed but signatures are required"));
-            } else {
-                log.debug("DOM Element is not signed, no verification performed");
+        
+        final Element docElement = item.unwrap();
+        
+        // Step 1: locate the signature element within the document.
+        Element signatureElement;
+        try {
+            signatureElement = validator.getSignatureElement(docElement);
+            if (signatureElement == null) {
+                if (signatureRequired) {
+                    log.debug("DOM Element was not signed and signature is required");
+                    item.getItemMetadata().put(
+                            new ErrorStatus(getId(), "DOM Element was not signed but signatures are required"));
+                } else {
+                    log.debug("DOM Element is not signed, no verification performed");
+                }
+                return true;
             }
-
+        } catch (ValidationException e) {
+            // pass on an error from signature location (e.g., multiple signatures)
+            log.debug("setting status: ", e.getMessage());
+            item.getItemMetadata().put(new ErrorStatus(getId(), e.getMessage()));
             return true;
         }
 
@@ -182,80 +192,26 @@
             log.debug("DOM Element contained Signature element\n{}", SerializeSupport.prettyPrintXML(signatureElement));
         }
 
-        if (!signatureVerified(signatureElement)) {
+        try {
+            validator.verifySignature(docElement, signatureElement);
+        } catch (ValidationException e) {
+            final String message = "element signature is invalid: " + e.getMessage();
+            log.debug("setting status: ", message);
             if (validSignatureRequired) {

[... 89 lines stripped ...]


More information about the commits mailing list