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

noreply at shibboleth.net noreply at shibboleth.net
Wed Apr 10 05:51:09 EDT 2013


Author: iay
Date: Wed Apr 10 05:51:09 2013
New Revision: 234

URL: http://svn.shibboleth.net/view/java-metadata-aggregator?rev=234&view=rev
Log:
MDA-87 assist debugging of signature creation by making pre-digest data available
Logs the pre-digest data at debug level if the debugPreDigest property is set.

Modified:
    trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureSigningStage.java

Modified: trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureSigningStage.java
URL: http://svn.shibboleth.net/view/java-metadata-aggregator/trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureSigningStage.java?rev=234&r1=233&r2=234&view=diff
==============================================================================
--- trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureSigningStage.java (original)
+++ trunk/aggregator-pipeline/src/main/java/net/shibboleth/metadata/dom/XMLSignatureSigningStage.java Wed Apr 10 05:51:09 2013
@@ -17,6 +17,7 @@
 
 package net.shibboleth.metadata.dom;
 
+import java.io.InputStreamReader;
 import java.math.BigInteger;
 import java.security.PrivateKey;
 import java.security.PublicKey;
@@ -36,6 +37,7 @@
 import javax.xml.crypto.dsig.SignatureMethod;
 import javax.xml.crypto.dsig.SignedInfo;
 import javax.xml.crypto.dsig.Transform;
+import javax.xml.crypto.dsig.XMLSignContext;
 import javax.xml.crypto.dsig.XMLSignature;
 import javax.xml.crypto.dsig.XMLSignatureFactory;
 import javax.xml.crypto.dsig.dom.DOMSignContext;
@@ -71,6 +73,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.io.CharStreams;
 
 /**
  * A pipeline stage that creates, and adds, an enveloped signature for each element in the given {@link DomElementItem}
@@ -234,6 +237,12 @@
      */
     private boolean includeX509IssuerSerial;
 
+    /** Whether to debug digest operations by logging the pre-digest data stream. Default value: <code>false</code> */
+    private boolean debugPreDigest;
+    
+    /**
+     * Constructor.
+     */
     public XMLSignatureSigningStage() {
         shaVariant = ShaVariant.SHA256;
         certificates = Collections.emptyList();
@@ -619,6 +628,27 @@
     }
 
     /**
+     * Gets whether logging of the pre-digest data stream is enabled.
+     * 
+     * @return whether logging of the pre-digest data stream is enabled
+     */
+    public boolean isDebugPreDigest() {
+        return debugPreDigest;
+    }
+    
+    /**
+     * Sets whether logging of the pre-digest data stream is enabled.
+     * 
+     * @param debug whether logging of the pre-digest data stream is enabled
+     */
+    public synchronized void setDebugPreDigest(final boolean debug) {
+        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+
+        debugPreDigest = debug;
+    }
+    
+    /**
      * Gets the signature algorithm used when signing.
      * 
      * @return signature algorithm used when signing
@@ -641,7 +671,22 @@
         Element element = item.unwrap();
         XMLSignature signature = xmlSigFactory.newXMLSignature(buildSignedInfo(element), buildKeyInfo());
         try {
-            signature.sign(new DOMSignContext(privKey, element, element.getFirstChild()));
+            XMLSignContext context = new DOMSignContext(privKey, element, element.getFirstChild());
+            
+            // Enable caching reference values if required for debugging.
+            if (isDebugPreDigest() && log.isDebugEnabled()) {
+                context.setProperty("javax.xml.crypto.dsig.cacheReference", Boolean.TRUE);
+            }
+            
+            // Perform the signature operation
+            signature.sign(context);
+            
+            // Log the pre-digest data for debugging
+            if (isDebugPreDigest() && log.isDebugEnabled()) {
+                Reference ref = (Reference) signature.getSignedInfo().getReferences().get(0);
+                String preDigest = CharStreams.toString(new InputStreamReader(ref.getDigestInputStream(), "UTF-8"));
+                log.debug("pre digest: {}", preDigest);
+            }
         } catch (Exception e) {
             log.error("Unable to create signature for element", e);
             throw new StageProcessingException("Unable to create signature for element", e);



More information about the commits mailing list